diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a33ca4..fae50d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -477,6 +477,29 @@ from MIT to Apache License 2.0; README and container/package metadata now use the same SPDX identity. +## [0.5.2] - 2026-08-04 + +### Docs +- Update README.md +- Update TODO.md +- Update project/README.md +- Update project/context.md +- Update project/ticket-018/README.md +- Update project/ticket-018/changelog.md + +### Other +- Update project/analysis.toon.yaml +- Update project/calls.mmd +- Update project/calls.png +- Update project/calls.toon.yaml +- Update project/calls.yaml +- Update project/compact_flow.mmd +- Update project/compact_flow.png +- Update project/evolution.toon.yaml +- Update project/flow.mmd +- Update project/flow.png +- ... and 38 more files + ## [0.5.1] - 2026-08-01 ### Docs diff --git a/README.md b/README.md index 9be4fe9..b26d310 100644 --- a/README.md +++ b/README.md @@ -3,18 +3,16 @@ ## AI Cost Tracking -![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.1-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green) -![AI Cost](https://img.shields.io/badge/AI%20Cost-$3.86-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-36.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey) +![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.2-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green) +![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.69-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-50.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey) -- πŸ€– **LLM usage:** $3.8584 (110 commits) -- πŸ‘€ **Human dev:** ~$3603 (36.0h @ $100/h, 30min dedup) +- πŸ€– **LLM usage:** $7.6898 (128 commits) +- πŸ‘€ **Human dev:** ~$4997 (50.0h @ $100/h, 30min dedup) -Generated on 2026-08-01 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next) +Generated on 2026-08-04 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next) --- - - ![License](https://img.shields.io/badge/license-Apache--2.0-green) `todo2code` buduje wspΓ³lny **Intent Evidence DSL** z poleceΕ„, historii Git, aktualnego kodu, list zadaΕ„, changelogu i dokumentacji. NastΔ™pnie Ε‚Δ…czy rekordy w graf przepΕ‚ywu wiedzy, wykrywa rozbieΕΌnoΕ›ci i generuje raport dla zespoΕ‚u. diff --git a/TODO.md b/TODO.md index cb25068..7ce22cb 100644 --- a/TODO.md +++ b/TODO.md @@ -2,14 +2,6 @@ ## Active tickets -- [ ] [`ticket-020`](project/ticket-020/README.md) β€” implement a role-bound - trusted intake boundary with persistent manager/user/dev assignments, - CQRS/event sourcing, strict schemas, Protobuf, Python/TypeScript CLI, MCP and - A2A parity. Current state: `BLOCKED / VALIDATION`; implementation, full Node - verification and Docker core E2E pass. Policy 0.8.0 accepts tickets 018 and - 020 in parallel; the global gate now reports only ticket-019's declared - dependency, conflict, ownership and overlap violations. - - [ ] [`ticket-019`](project/ticket-019/README.md) β€” publish the dependency-free Python SDK as the root PyPI distribution `todo2code` through `goal -a`, with one root `pyproject.toml` and SDK-only artifacts. Current state: @@ -21,15 +13,26 @@ validator, trusted approval boundary, reusable governance CI, stack-specific gates and pinned adoption in `todo2code`; extend it with safe concurrent workstreams, dependency-aware intents and non-overlapping write scopes. - Current state: `IN_PROGRESS / EDIT` for the approved AC-18..AC-25: add a + Current state: `IN_PROGRESS / WAIT_FOR_APPROVAL` for the approved AC-11..AC-25: pinned, read-only and attested `koru / code-review` PR check plus a required - ruleset. The workflow and live fail-closed semantic probe are verified; - ruleset `20186914` is staged for activation after the bootstrap evidence merge. + ruleset. `koru / code-review` and `governance / enforce` now run as required + checks on `main`; the ruleset is active with no bypass actors. Earlier AC-11..AC-16 pass; AC-17 and the pre-existing publication/external governance blockers remain recorded separately. ## Completed tickets +- [x] [`ticket-020`](project/ticket-020/README.md) β€” add deterministic + trusted intake boundary with CQRS/event sourcing, strict schemas, Protobuf, + Python/TypeScript CLI, MCP and A2A parity. Current state: `DONE`; + implementation and verification passes, and the implementation is complete. + +- [x] [`ticket-022`](project/ticket-022/README.md) β€” add bounded, read-only Git + evidence extraction for umbrella workspaces such as Subactor. Current state: + `DONE`; 337 tests and Docker smoke pass. The Subactor run now extracts 326 + commits from 39 member repositories, adds 41,792 net relations and reduces + same-snapshot diagnostics by 275. + - [x] [`ticket-017`](project/ticket-017/README.md) β€” repaired mutating command help, Polish prohibition polarity and repository-bound path resolution; independently audited the concurrent path/action-planning baseline and added diff --git a/VERSION b/VERSION index 4b9fcbe..cb0c939 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.1 +0.5.2 diff --git a/adapters/tensorflow/package.json b/adapters/tensorflow/package.json index cacb522..881cf05 100644 --- a/adapters/tensorflow/package.json +++ b/adapters/tensorflow/package.json @@ -1,6 +1,6 @@ { "name": "@todo2code/tensorflow-adapter-runtime", - "version": "0.5.1", + "version": "0.5.2", "private": true, "description": "Isolated optional TensorFlow runtime for todo2code action classification.", "license": "Apache-2.0", diff --git a/examples/backend/src/request-handlers.ts b/examples/backend/src/request-handlers.ts new file mode 100644 index 0000000..474fa2c --- /dev/null +++ b/examples/backend/src/request-handlers.ts @@ -0,0 +1,88 @@ +import { type IncomingMessage, type ServerResponse } from 'node:http'; +import { EventStore } from './store.js'; +import { validateEventPayload } from './validation.js'; + +const MAX_BODY_BYTES = 64 * 1024; + +export async function handleRequest( + request: IncomingMessage, + response: ServerResponse, + store: EventStore, +): Promise { + const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`); + if (url.pathname === '/health' && request.method === 'GET') { + return handleHealth(response, store); + } + if (url.pathname === '/events' && request.method === 'POST') { + return handleEventPublish(request, response, store); + } + if (url.pathname === '/events' && request.method === 'GET') { + return handleEventList(response, url.searchParams, store); + } + sendJson(response, 404, { error: 'not found' }); +} + +async function handleHealth(response: ServerResponse, store: EventStore): Promise { + sendJson(response, 200, { status: 'ok', events: store.size() }); +} + +async function handleEventPublish(request: IncomingMessage, response: ServerResponse, store: EventStore): Promise { + const body = await readBody(request); + let payload: unknown; + try { + payload = JSON.parse(body || '{}'); + } catch { + sendJson(response, 400, { error: 'invalid JSON body' }); + return; + } + + const validation = validateEventPayload(payload); + if (!validation.valid) { + process.stderr.write(`rejected event: ${validation.reason}\n`); + sendJson(response, 400, { error: validation.reason }); + return; + } + + const event = store.enqueueEvent(validation.agent, validation.action, validation.object); + sendJson(response, 202, { id: event.id }); +} + +async function handleEventList(response: ServerResponse, params: URLSearchParams, store: EventStore): Promise { + const offset = parseOffset(params.get('offset')); + const limit = parseLimit(params.get('limit')); + sendJson(response, 200, store.listEvents( + offset, + limit, + )); +} + +function parseOffset(value: string | null): number { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : 0; +} + +function parseLimit(value: string | null): number { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : 50; +} + +async function readBody(request: IncomingMessage): Promise { + const chunks: Buffer[] = []; + let size = 0; + for await (const chunk of request) { + const buffer = Buffer.from(chunk as Buffer); + size += buffer.byteLength; + if (size > MAX_BODY_BYTES) throw new Error('request body too large'); + chunks.push(buffer); + } + return Buffer.concat(chunks).toString('utf8'); +} + +function sendJson(response: ServerResponse, status: number, payload: unknown): void { + const body = JSON.stringify(payload); + response.writeHead(status, { + 'content-type': 'application/json; charset=utf-8', + 'content-length': Buffer.byteLength(body), + }); + response.end(body); +} diff --git a/examples/backend/src/server.ts b/examples/backend/src/server.ts index 8cbdc68..fd658e5 100644 --- a/examples/backend/src/server.ts +++ b/examples/backend/src/server.ts @@ -3,11 +3,9 @@ // Mirrors the todo2code house style: node: builtins only, explicit body limits // and no framework, so `t2c extract ast` sees plain TypeScript declarations. -import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http'; +import { createServer, type Server, type ServerResponse } from 'node:http'; import { EventStore } from './store.js'; -import { validateEventPayload } from './validation.js'; - -const MAX_BODY_BYTES = 64 * 1024; +import { handleRequest } from './request-handlers.js'; export interface BackendOptions { host?: string; @@ -25,60 +23,6 @@ export function createBackend(options: BackendOptions = {}): { server: Server; s return { server, store }; } -async function handleRequest(request: IncomingMessage, response: ServerResponse, store: EventStore): Promise { - const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`); - - if (request.method === 'GET' && url.pathname === '/health') { - sendJson(response, 200, { status: 'ok', events: store.size() }); - return; - } - - if (request.method === 'POST' && url.pathname === '/events') { - const body = await readBody(request); - let payload: unknown; - try { - payload = JSON.parse(body || '{}'); - } catch { - sendJson(response, 400, { error: 'invalid JSON body' }); - return; - } - const validation = validateEventPayload(payload); - if (!validation.valid) { - // Every rejection is logged with its reason, per the acceptance criteria. - process.stderr.write(`rejected event: ${validation.reason}\n`); - sendJson(response, 400, { error: validation.reason }); - return; - } - const event = store.enqueueEvent(validation.agent, validation.action, validation.object); - sendJson(response, 202, { id: event.id }); - return; - } - - if (request.method === 'GET' && url.pathname === '/events') { - const offset = Number(url.searchParams.get('offset') ?? '0'); - const limit = Number(url.searchParams.get('limit') ?? '50'); - sendJson(response, 200, store.listEvents( - Number.isFinite(offset) ? offset : 0, - Number.isFinite(limit) ? limit : 50, - )); - return; - } - - sendJson(response, 404, { error: 'not found' }); -} - -async function readBody(request: IncomingMessage): Promise { - const chunks: Buffer[] = []; - let size = 0; - for await (const chunk of request) { - const buffer = Buffer.from(chunk as Buffer); - size += buffer.byteLength; - if (size > MAX_BODY_BYTES) throw new Error('request body too large'); - chunks.push(buffer); - } - return Buffer.concat(chunks).toString('utf8'); -} - function sendJson(response: ServerResponse, status: number, payload: unknown): void { const body = JSON.stringify(payload); response.writeHead(status, { diff --git a/package-lock.json b/package-lock.json index 62e7ab9..0bd72c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "todo2code", - "version": "0.5.1", + "version": "0.5.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "todo2code", - "version": "0.5.1", + "version": "0.5.2", "license": "Apache-2.0", "dependencies": { "typescript": ">=5.8.3 <7" diff --git a/package.json b/package.json index ef29513..6dbef49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "todo2code", - "version": "0.5.1", + "version": "0.5.2", "description": "todo2code (t2c): audited intent and team-communication extraction, evidence graphs, origin-to-workspace comparison and grounded summaries through CLI, MCP and A2A.", "type": "module", "private": true, diff --git a/project/README.md b/project/README.md index d156a04..19770e7 100644 --- a/project/README.md +++ b/project/README.md @@ -331,10 +331,10 @@ code2llm ./ -f yaml --separate-orphans --- -**Generated by**: `code2llm ./ -f all --readme` -**Analysis Date**: 2026-08-01 -**Total Functions**: 3285 -**Total Classes**: 348 -**Modules**: 262 +**Generated by**: `code2llm ./ -f all --readme` +**Analysis Date**: 2026-08-04 +**Total Functions**: 4129 +**Total Classes**: 404 +**Modules**: 281 For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm diff --git a/project/TICKETS.md b/project/TICKETS.md index 93dabd6..071ccc8 100644 --- a/project/TICKETS.md +++ b/project/TICKETS.md @@ -26,4 +26,5 @@ of `project/README.md`, which remains a generated technical-analysis artifact. | **ticket-018** | [`README.md`](./ticket-018/README.md) | [`preprompt.md`](./ticket-018/preprompt.md) | - | [`ai-codex.md`](./ticket-018/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-018/ai-codex-logs.txt) | [`changelog.md`](./ticket-018/changelog.md) | | **ticket-019** | [`README.md`](./ticket-019/README.md) | [`preprompt.md`](./ticket-019/preprompt.md) | - | [`ai-codex.md`](./ticket-019/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-019/ai-codex-logs.txt) | [`changelog.md`](./ticket-019/changelog.md) | | **ticket-020** | [`README.md`](./ticket-020/README.md) | [`preprompt.md`](./ticket-020/preprompt.md) | - | [`ai-codex.md`](./ticket-020/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-020/ai-codex-logs.txt) | [`changelog.md`](./ticket-020/changelog.md) | +| **ticket-022** | [`README.md`](./ticket-022/README.md) | [`preprompt.md`](./ticket-022/preprompt.md) | - | [`ai-codex.md`](./ticket-022/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-022/ai-codex-logs.txt) | [`changelog.md`](./ticket-022/changelog.md) | diff --git a/project/analysis.toon.yaml b/project/analysis.toon.yaml index 0298a5c..6590bfc 100644 --- a/project/analysis.toon.yaml +++ b/project/analysis.toon.yaml @@ -1,137 +1,133 @@ -# code2llm | 262f 45160L | typescript:117,md:52,json:32,python:15,javascript:15,rust:7,go:6,shell:6,php:4,yml:2,toml:2,txt:1,java:1 | 2026-08-01 -# generated in 0.21s -# CCΜ…=4.0 | critical:120/3285 | dups:0 | cycles:0 +# code2llm | 281f 43441L | typescript:173,json:40,python:16,javascript:15,shell:8,rust:7,go:6,php:4,toml:3,yaml:2,yml:2,java:1,proto:1,txt:1 | 2026-08-04 +# generated in 0.31s +# CCΜ…=3.1 | critical:24/4129 | dups:0 | cycles:0 HEALTH[20]: - πŸ”΄ GOD src/synthesis/code-change-plan.ts = 1310L, 10 classes, 127m, max CC=47 - πŸ”΄ GOD src/semantic/reranker.ts = 509L, 11 classes, 35m, max CC=27 - πŸ”΄ GOD src/core/schema.ts = 922L, 4 classes, 124m, max CC=23 - πŸ”΄ GOD src/communication/llm.ts = 514L, 8 classes, 53m, max CC=12 - πŸ”΄ GOD src/core/types.ts = 673L, 41 classes, 0m, max CC=0.0 - 🟑 CC main CC=95 (limit:15) - 🟑 CC handleDiff CC=24 (limit:15) - 🟑 CC handleExtract CC=16 (limit:15) - 🟑 CC diffUiHtml CC=52 (limit:15) + πŸ”΄ GOD src/diff/reality.ts = 690L, 4 classes, 89m, max CC=15 + 🟑 CC generationMetadata CC=17 (limit:15) 🟑 CC compareGraphs CC=15 (limit:15) - 🟑 CC DEFAULT_MIN_INTERVAL_MS CC=19 (limit:15) - 🟑 CC DEFAULT_SCAN_INTERVAL_MS CC=19 (limit:15) - 🟑 CC watchRepository CC=19 (limit:15) - 🟑 CC classifyAction CC=17 (limit:15) - 🟑 CC proposeCodeChangePlans CC=17 (limit:15) - 🟑 CC paths CC=16 (limit:15) - 🟑 CC assertCodeChangeReviewPatch CC=23 (limit:15) - 🟑 CC assertCodeChangeSourcePatch CC=47 (limit:15) - 🟑 CC assertCodeChangeSourcePatchSet CC=18 (limit:15) - 🟑 CC normalizeUnifiedDiff CC=17 (limit:15) + 🟑 CC looksLikeJson CC=20 (limit:15) + 🟑 CC buildRealityTotals CC=15 (limit:15) + 🟑 CC persistPipelineArtifacts CC=17 (limit:15) + 🟑 CC persistFailedRunState CC=19 (limit:15) + 🟑 CC assertRerankerDecision CC=17 (limit:15) + 🟑 CC assertGeneration CC=16 (limit:15) + 🟑 CC validateOperationStep CC=23 (limit:15) + 🟑 CC collectAgentActionIssues CC=15 (limit:15) + 🟑 CC parseFile CC=38 (limit:15) + 🟑 CC makefile CC=28 (limit:15) + 🟑 CC visited CC=15 (limit:15) + 🟑 CC visit CC=15 (limit:15) + 🟑 CC main CC=27 (limit:15) + 🟑 CC iter_python_files CC=16 (limit:15) + 🟑 CC run CC=26 (limit:15) + 🟑 CC baseUrl CC=17 (limit:15) + 🟑 CC token CC=17 (limit:15) -REFACTOR[6]: - 1. split src/synthesis/code-change-plan.ts (god module) - 2. split src/semantic/reranker.ts (god module) - 3. split src/core/schema.ts (god module) - 4. split src/communication/llm.ts (god module) - 5. split src/core/types.ts (god module) - 6. split 15 high-CC methods (CC>15) +REFACTOR[2]: + 1. split src/diff/reality.ts (god module) + 2. split 19 high-CC methods (CC>15) -PIPELINES[1882]: - [1] Src [parsed]: parsed β†’ printHelp +PIPELINES[2116]: + [1] Src [main]: main β†’ arguments PURITY: 100% pure - [2] Src [command]: command β†’ printHelp + [2] Src [new]: new PURITY: 100% pure - [3] Src [config]: config + [3] Src [visit_item_mod]: visit_item_mod β†’ qualified PURITY: 100% pure - [4] Src [graphFile]: graphFile + [4] Src [visit_item_use]: visit_item_use β†’ add β†’ excerpt PURITY: 100% pure - [5] Src [diagnosticsPath]: diagnosticsPath β†’ optionNumber β†’ optionString + [5] Src [visit_item_struct]: visit_item_struct β†’ type_item β†’ qualified PURITY: 100% pure - [6] Src [diagnostics]: diagnostics β†’ optionNumber β†’ optionString + [6] Src [visit_item_enum]: visit_item_enum β†’ type_item β†’ qualified PURITY: 100% pure - [7] Src [result]: result β†’ execFileAsync + [7] Src [visit_item_trait]: visit_item_trait β†’ type_item β†’ qualified PURITY: 100% pure - [8] Src [graphPath]: graphPath + [8] Src [visit_item_type]: visit_item_type β†’ type_item β†’ qualified PURITY: 100% pure - [9] Src [output]: output + [9] Src [visit_item_const]: visit_item_const β†’ qualified PURITY: 100% pure - [10] Src [synthesisPath]: synthesisPath + [10] Src [visit_item_static]: visit_item_static β†’ qualified PURITY: 100% pure - [11] Src [patch]: patch + [11] Src [visit_item_fn]: visit_item_fn β†’ qualified PURITY: 100% pure - [12] Src [audit]: audit + [12] Src [visit_item_impl]: visit_item_impl PURITY: 100% pure - [13] Src [receipt]: receipt + [13] Src [visit_impl_item_fn]: visit_impl_item_fn β†’ add β†’ excerpt PURITY: 100% pure - [14] Src [actor]: actor + [14] Src [visit_expr_call]: visit_expr_call β†’ add β†’ excerpt PURITY: 100% pure - [15] Src [approvalHash]: approvalHash + [15] Src [visit_expr_method_call]: visit_expr_method_call β†’ add β†’ excerpt PURITY: 100% pure - [16] Src [plansPath]: plansPath + [16] Src [MAX_BODY_BYTES]: MAX_BODY_BYTES β†’ handleHealth β†’ sendJson PURITY: 100% pure - [17] Src [inputPath]: inputPath + [17] Src [handleRequest]: handleRequest β†’ handleHealth β†’ sendJson PURITY: 100% pure - [18] Src [isPlanSet]: isPlanSet β†’ optionString + [18] Src [url]: url PURITY: 100% pure - [19] Src [patchPath]: patchPath + [19] Src [body]: body PURITY: 100% pure - [20] Src [planPath]: planPath + [20] Src [validation]: validation β†’ sendJson PURITY: 100% pure - [21] Src [beforeGraphPath]: beforeGraphPath + [21] Src [event]: event β†’ sendJson PURITY: 100% pure - [22] Src [afterGraphPath]: afterGraphPath + [22] Src [ALLOWED_ACTIONS]: ALLOWED_ACTIONS β†’ invalid PURITY: 100% pure - [23] Src [root]: root β†’ optionString + [23] Src [validateEventPayload]: validateEventPayload β†’ invalid PURITY: 100% pure - [24] Src [taskFile]: taskFile β†’ optionNullableString + [24] Src [record]: record β†’ invalid PURITY: 100% pure - [25] Src [controller]: controller β†’ optionNumber β†’ optionString + [25] Src [agent]: agent β†’ invalid PURITY: 100% pure - [26] Src [stop]: stop β†’ optionNumber β†’ optionString + [26] Src [action]: action β†’ invalid PURITY: 100% pure - [27] Src [stamp]: stamp β†’ file + [27] Src [object]: object β†’ invalid PURITY: 100% pure - [28] Src [mode]: mode β†’ optionNumber β†’ optionString + [28] Src [enqueueEvent]: enqueueEvent PURITY: 100% pure - [29] Src [svg]: svg β†’ optionNumber β†’ optionString + [29] Src [listEvents]: listEvents PURITY: 100% pure - [30] Src [html]: html β†’ optionNumber β†’ optionString + [30] Src [start]: start PURITY: 100% pure - [31] Src [beforeFile]: beforeFile + [31] Src [store]: store β†’ sendJson PURITY: 100% pure - [32] Src [afterFile]: afterFile + [32] Src [server]: server β†’ sendJson PURITY: 100% pure - [33] Src [diff]: diff β†’ optionNumber β†’ optionString + [33] Src [body]: body PURITY: 100% pure - [34] Src [context]: context β†’ optionString + [34] Src [startBackend]: startBackend β†’ createBackend β†’ sendJson PURITY: 100% pure - [35] Src [maxRows]: maxRows β†’ optionString + [35] Src [port]: port PURITY: 100% pure - [36] Src [view]: view β†’ optionNumber β†’ optionString + [36] Src [host]: host PURITY: 100% pure - [37] Src [extractor]: extractor β†’ optionString + [37] Src [fetchEvents]: fetchEvents PURITY: 100% pure - [38] Src [moduleRoot]: moduleRoot + [38] Src [url]: url PURITY: 100% pure - [39] Src [sourceEnv]: sourceEnv + [39] Src [response]: response PURITY: 100% pure - [40] Src [targetEnv]: targetEnv + [40] Src [payload]: payload PURITY: 100% pure - [41] Src [task]: task + [41] Src [publishEvent]: publishEvent PURITY: 100% pure - [42] Src [sourceIgnore]: sourceIgnore + [42] Src [toRows]: toRows β†’ classifyEvent PURITY: 100% pure - [43] Src [targetIgnore]: targetIgnore + [43] Src [renderTable]: renderTable β†’ headerRow PURITY: 100% pure - [44] Src [options]: options + [44] Src [table]: table PURITY: 100% pure - [45] Src [next]: next + [45] Src [head]: head PURITY: 100% pure - [46] Src [name]: name + [46] Src [body]: body PURITY: 100% pure - [47] Src [number]: number + [47] Src [tr]: tr PURITY: 100% pure - [48] Src [invokedPath]: invokedPath β†’ main β†’ printHelp + [48] Src [renderError]: renderError PURITY: 100% pure - [49] Src [diffUiHtml]: diffUiHtml β†’ byId + [49] Src [message]: message PURITY: 100% pure - [50] Src [maxFiles]: maxFiles β†’ relative β†’ visit + [50] Src [mountPanel]: mountPanel β†’ createState PURITY: 100% pure LAYERS: @@ -141,149 +137,212 @@ LAYERS: golang/ CCΜ„=5.3 ←in:0 β†’out:0 β”‚ ast_extract.go 368L 3C 15m CC=14 ←0 β”‚ - src/ CCΜ„=4.2 ←in:0 β†’out:0 - β”‚ !! code-change-plan.ts 1310L 10C 127m CC=47 ←6 - β”‚ !! schema.ts 922L 4C 124m CC=23 ←0 - β”‚ !! cli.ts 827L 1C 83m CC=95 ←0 - β”‚ !! actions.ts 700L 0C 74m CC=83 ←0 - β”‚ !! types.ts 673L 41C 0m CC=0.0 ←0 - β”‚ !! reality.ts 609L 3C 73m CC=26 ←0 - β”‚ !! run.ts 602L 1C 64m CC=53 ←0 - β”‚ !! analyzer.ts 542L 3C 72m CC=48 ←0 - β”‚ !! llm.ts 514L 8C 53m CC=12 ←0 - β”‚ !! a2a-task-store.ts 513L 3C 81m CC=11 ←0 - β”‚ !! reranker.ts 509L 11C 35m CC=27 ←0 - β”‚ !! text.ts 491L 0C 51m CC=34 ←0 - β”‚ !! linker.ts 489L 4C 72m CC=18 ←0 - β”‚ !! markdown-llm.ts 458L 6C 38m CC=19 ←0 - β”‚ !! communication.ts 422L 4C 70m CC=76 ←0 - β”‚ !! gold-types.ts 378L 15C 11m CC=32 ←0 + python/ CCΜ„=4.2 ←in:0 β†’out:1 + β”‚ !! ast_extract 221L 1C 18m CC=16 ←0 + β”‚ requirements.txt 1L 0C 0m CC=0.0 ←0 + β”‚ + scripts/ CCΜ„=3.4 ←in:0 β†’out:0 + β”‚ audit-changelog-sample.mjs 226L 0C 39m CC=11 ←0 + β”‚ examples-check.sh 210L 0C 3m CC=0.0 ←0 + β”‚ live-contract-check.mjs 200L 0C 26m CC=5 ←0 + β”‚ rerank-embedding-shortlist.mjs 191L 0C 27m CC=14 ←0 + β”‚ !! rank-intent-graph-embeddings 174L 0C 3m CC=27 ←0 + β”‚ live-model-comparison.mjs 125L 0C 15m CC=13 ←0 + β”‚ e2e.sh 109L 0C 3m CC=0.0 ←0 + β”‚ !! verify-env-contract.mjs 103L 0C 15m CC=28 ←0 + β”‚ evaluate-embedding-pairs 101L 0C 2m CC=9 ←0 + β”‚ verify-generated-analysis.mjs 88L 0C 14m CC=8 ←0 + β”‚ verify-module-boundaries.mjs 87L 0C 16m CC=7 ←0 + β”‚ !! verify-no-llm-imports.mjs 78L 0C 6m CC=15 ←0 + β”‚ sync-generated-readme-metadata.mjs 66L 0C 14m CC=4 ←0 + β”‚ smoke.sh 57L 0C 0m CC=0.0 ←0 + β”‚ assert-demollm-run.mjs 45L 0C 9m CC=2 ←0 + β”‚ verify-workflow-yaml.mjs 43L 0C 9m CC=11 ←0 + β”‚ normalize-generated-analysis-roots.mjs 38L 0C 7m CC=4 ←0 + β”‚ docker-smoke.sh 36L 0C 1m CC=0.0 ←0 + β”‚ verify-structured-responses.mjs 35L 0C 7m CC=8 ←0 + β”‚ generate-response-schemas.mjs 27L 0C 4m CC=2 ←0 + β”‚ vallm-compatible 25L 0C 1m CC=2 ←0 + β”‚ package 25L 0C 0m CC=0.0 ←0 + β”‚ a2a-request.sh 23L 0C 0m CC=0.0 ←0 + β”‚ mcp-request.sh 11L 0C 0m CC=0.0 ←0 + β”‚ + src/ CCΜ„=3.1 ←in:0 β†’out:0 + β”‚ !! cli.ts 942L 1C 124m CC=13 ←0 + β”‚ !! actions.ts 806L 1C 106m CC=13 ←0 + β”‚ !! reality.ts 690L 4C 89m CC=15 ←0 + β”‚ !! analyzer.ts 596L 3C 81m CC=15 ←0 + β”‚ !! a2a-task-store.ts 560L 3C 88m CC=11 ←0 + β”‚ !! text.ts 530L 0C 61m CC=14 ←0 + β”‚ gold-cases.ts 489L 4C 62m CC=8 ←0 + β”‚ diagnostics.ts 459L 1C 59m CC=11 ←0 + β”‚ implementation-source-patch-apply-core.ts 434L 6C 50m CC=13 ←0 + β”‚ !! validation.ts 429L 0C 69m CC=23 ←0 + β”‚ !! gold-types.ts 405L 15C 17m CC=17 ←0 + β”‚ git.ts 397L 6C 57m CC=11 ←0 + β”‚ implementation-source-patch-assert.ts 397L 2C 52m CC=11 ←0 + β”‚ !! run.ts 384L 4C 33m CC=20 ←0 + β”‚ markdown-llm-helpers.ts 383L 5C 30m CC=14 ←0 β”‚ todo-patch.ts 372L 5C 52m CC=12 ←0 - β”‚ !! gold-cases.ts 366L 4C 42m CC=18 ←0 - β”‚ !! diagnostics.ts 361L 0C 40m CC=40 ←1 - β”‚ !! openrouter.ts 338L 7C 39m CC=31 ←0 + β”‚ docs-deterministic.ts 369L 3C 43m CC=11 ←0 + β”‚ implementation-helpers.ts 357L 5C 33m CC=10 ←0 + β”‚ communication-file-helpers.ts 342L 2C 45m CC=14 ←0 + β”‚ workspace.ts 342L 3C 54m CC=12 ←0 + β”‚ intake-contract.ts 334L 7C 34m CC=14 ←0 β”‚ summarizer.ts 333L 5C 27m CC=10 ←0 + β”‚ a2a.ts 332L 0C 47m CC=9 ←0 β”‚ gold.ts 329L 3C 31m CC=14 ←0 - β”‚ workspace.ts 327L 3C 54m CC=12 ←0 - β”‚ a2a.ts 320L 0C 45m CC=9 ←0 - β”‚ contract-check.ts 317L 6C 39m CC=14 ←0 - β”‚ !! nl-llm.ts 316L 5C 45m CC=18 ←0 - β”‚ mcp-tools.ts 307L 1C 10m CC=8 ←0 - β”‚ !! docs-deterministic.ts 304L 1C 33m CC=18 ←0 - β”‚ !! validation.ts 281L 0C 47m CC=84 ←0 + β”‚ mcp-tools.ts 323L 1C 10m CC=10 ←0 + β”‚ code-change.ts 322L 0C 35m CC=11 ←0 + β”‚ communication-helpers.ts 320L 3C 45m CC=14 ←0 + β”‚ contract-check.ts 317L 6C 39m CC=14 ←2 + β”‚ result.ts 311L 0C 23m CC=7 ←0 + β”‚ intent.ts 309L 4C 37m CC=12 ←0 + β”‚ runtime-cycle.ts 306L 1C 35m CC=9 ←0 + β”‚ !! run-persistence.ts 297L 0C 28m CC=19 ←0 + β”‚ watcher.ts 292L 6C 42m CC=12 ←0 + β”‚ reranker-llm.ts 291L 2C 35m CC=9 ←0 + β”‚ intake-service.ts 291L 2C 48m CC=13 ←0 + β”‚ linker.ts 286L 1C 52m CC=8 ←3 + β”‚ implementation-review.ts 274L 3C 33m CC=7 ←0 β”‚ docs-llm.ts 269L 1C 28m CC=12 ←0 - β”‚ tasks-llm.ts 266L 4C 22m CC=11 ←1 + β”‚ implementation-helpers-plans.ts 269L 3C 36m CC=9 ←0 + β”‚ typescript.ts 266L 1C 26m CC=8 ←0 + β”‚ tasks-llm.ts 266L 4C 22m CC=11 ←0 + β”‚ nl-llm-helpers.ts 261L 3C 31m CC=11 ←0 β”‚ mcp.ts 261L 2C 38m CC=9 ←0 β”‚ text-render.ts 251L 2C 33m CC=13 ←0 - β”‚ !! watcher.ts 243L 4C 37m CC=19 ←0 - β”‚ !! text.ts 239L 1C 48m CC=19 ←2 + β”‚ candidate.ts 250L 1C 19m CC=8 ←0 + β”‚ code-change.ts 250L 19C 0m CC=0.0 ←0 + β”‚ openrouter-request.ts 242L 4C 30m CC=9 ←0 + β”‚ openrouter.ts 240L 5C 31m CC=13 ←0 + β”‚ utils.ts 239L 0C 42m CC=8 ←0 β”‚ diff.ts 235L 1C 38m CC=11 ←0 - β”‚ env.ts 227L 1C 20m CC=13 ←0 - β”‚ !! a2a-history.ts 226L 3C 37m CC=18 ←0 + β”‚ implementation-source-patch-create.ts 235L 3C 30m CC=6 ←0 + β”‚ implementation-source-patch-apply-diff.ts 233L 3C 31m CC=11 ←0 + β”‚ code-change-path.ts 232L 0C 23m CC=11 ←0 + β”‚ env.ts 231L 1C 20m CC=13 ←0 β”‚ structured-schema.ts 218L 5C 25m CC=10 ←0 - β”‚ model-comparison.ts 218L 4C 21m CC=12 ←2 - β”‚ !! reranker-llm.ts 210L 2C 24m CC=25 ←0 + β”‚ model-comparison.ts 218L 4C 21m CC=12 ←0 + β”‚ identity.ts 216L 3C 33m CC=12 ←0 + β”‚ intent.ts 212L 13C 0m CC=0.0 ←0 + β”‚ io.ts 211L 2C 30m CC=11 ←0 + β”‚ conclusions.ts 210L 0C 21m CC=9 ←0 β”‚ configuration.ts 208L 1C 38m CC=10 ←0 - β”‚ !! code-change-path.ts 204L 0C 14m CC=38 ←0 + β”‚ git.ts 208L 4C 27m CC=6 ←0 + β”‚ implementation.ts 208L 4C 21m CC=12 ←0 β”‚ ignore.ts 200L 3C 23m CC=10 ←0 β”‚ docs-record.ts 193L 0C 34m CC=14 ←0 - β”‚ !! a2a-message.ts 184L 0C 33m CC=57 ←0 - β”‚ git.ts 180L 3C 26m CC=13 ←0 - β”‚ !! io.ts 177L 1C 32m CC=15 ←0 + β”‚ run-helpers.ts 188L 0C 18m CC=11 ←0 + β”‚ a2a-card.ts 181L 0C 7m CC=3 ←0 + β”‚ markdown-llm.ts 178L 2C 11m CC=9 ←0 + β”‚ pipeline.ts 173L 7C 0m CC=0.0 ←0 β”‚ task-synthesis-materialize.ts 172L 0C 35m CC=5 ←0 β”‚ typescript.ts 172L 6C 16m CC=2 ←0 - β”‚ !! record.ts 172L 2C 9m CC=18 ←0 - β”‚ a2a-card.ts 169L 0C 7m CC=3 ←0 + β”‚ a2a-run-list-item.ts 171L 2C 29m CC=8 ←0 β”‚ ast.ts 167L 2C 15m CC=12 ←0 β”‚ id.ts 167L 0C 16m CC=5 ←0 - β”‚ !! typescript.ts 166L 0C 19m CC=43 ←0 - β”‚ !! git.ts 161L 3C 21m CC=22 ←0 - β”‚ a2a-types.ts 160L 9C 14m CC=10 ←0 + β”‚ a2a-types.ts 164L 9C 14m CC=10 ←0 + β”‚ nl-llm.ts 163L 2C 19m CC=10 ←0 + β”‚ linker-candidates.ts 163L 1C 23m CC=10 ←0 + β”‚ intake-store.ts 161L 3C 19m CC=11 ←0 + β”‚ markdown-paths.ts 158L 2C 22m CC=12 ←0 + β”‚ record.ts 158L 2C 10m CC=6 ←0 + β”‚ intake-protobuf.ts 158L 0C 29m CC=13 ←0 + β”‚ intake_cli 156L 0C 6m CC=10 ←0 β”‚ types.ts 155L 8C 0m CC=0.0 ←0 + β”‚ text.ts 153L 0C 34m CC=6 ←0 + β”‚ diff-ui.ts 152L 0C 7m CC=5 ←0 + β”‚ text-myers.ts 152L 3C 27m CC=9 ←0 β”‚ docs-chunks.ts 147L 0C 29m CC=8 ←0 + β”‚ symbol-resolution.ts 146L 3C 22m CC=10 ←0 + β”‚ !! a2a-message-command.ts 144L 0C 30m CC=20 ←1 + β”‚ implementation-helpers-acceptance.ts 141L 2C 15m CC=4 ←0 β”‚ content-cache.ts 139L 4C 12m CC=5 ←0 + β”‚ classifier.ts 135L 4C 32m CC=6 ←0 β”‚ gold-extraction.ts 127L 0C 13m CC=5 ←0 + β”‚ implementation-semantic.ts 125L 1C 13m CC=9 ←0 + β”‚ a2a-message.ts 125L 0C 19m CC=12 ←0 β”‚ subactor.ts 122L 1C 9m CC=13 ←0 - β”‚ !! markdown-paths.ts 122L 1C 17m CC=17 ←0 - β”‚ !! symbol-resolution.ts 120L 3C 16m CC=15 ←0 β”‚ validation.ts 113L 2C 28m CC=11 ←0 + β”‚ validation.ts 111L 0C 11m CC=7 ←0 β”‚ nl.ts 107L 1C 12m CC=10 ←0 + β”‚ types.ts 106L 11C 0m CC=0.0 ←0 β”‚ svg.ts 104L 2C 7m CC=2 ←0 - β”‚ !! identity.ts 100L 3C 14m CC=30 ←0 β”‚ changelog.ts 99L 0C 16m CC=11 ←0 β”‚ records.ts 97L 0C 10m CC=6 ←0 - β”‚ !! classifier.ts 96L 4C 27m CC=17 ←0 + β”‚ a2a-history.ts 96L 1C 17m CC=13 ←0 β”‚ todo.ts 93L 0C 18m CC=5 ←0 β”‚ changelog-signal.ts 89L 0C 12m CC=8 ←0 β”‚ mcp-resources.ts 88L 0C 13m CC=6 ←0 β”‚ contract.ts 84L 0C 7m CC=1 ←0 + β”‚ linker-relations.ts 83L 3C 7m CC=7 ←0 + β”‚ governed-intake.proto 78L 0C 0m CC=0.0 ←0 + β”‚ implementation-helpers-close.ts 75L 2C 10m CC=4 ←0 + β”‚ implementation-source-patch-diff.ts 74L 0C 16m CC=6 ←0 β”‚ task-synthesis-payload.ts 70L 0C 8m CC=3 ←0 β”‚ docs-types.ts 68L 7C 0m CC=0.0 ←0 β”‚ markdown-block.ts 67L 1C 3m CC=10 ←0 β”‚ task-synthesis-contract.ts 66L 3C 6m CC=1 ←0 β”‚ artifact.ts 66L 2C 10m CC=6 ←0 β”‚ payload.ts 65L 0C 8m CC=12 ←0 + β”‚ communication.ts 63L 1C 7m CC=7 ←0 β”‚ capability-evidence.ts 62L 0C 14m CC=10 ←0 + β”‚ implementation-targets.ts 61L 0C 9m CC=5 ←0 β”‚ render.ts 61L 0C 13m CC=10 ←0 + β”‚ run-summary.ts 58L 1C 4m CC=5 ←0 β”‚ target.ts 57L 0C 12m CC=9 ←0 β”‚ security.ts 55L 0C 11m CC=7 ←0 β”‚ index.ts 53L 0C 0m CC=0.0 ←0 β”‚ gold-metrics.ts 50L 1C 11m CC=4 ←0 - β”‚ !! diff-ui.ts 48L 0C 9m CC=52 ←0 β”‚ external.ts 48L 1C 5m CC=9 ←0 + β”‚ diagnostics.ts 45L 2C 0m CC=0.0 ←0 β”‚ gold-cli.ts 44L 0C 10m CC=12 ←0 β”‚ docs-schema.ts 43L 0C 5m CC=1 ←0 β”‚ reranker-response.ts 42L 1C 5m CC=1 ←0 β”‚ python.ts 39L 0C 6m CC=2 ←0 β”‚ text-types.ts 39L 4C 0m CC=0.0 ←0 + β”‚ implementation-helpers.ts 39L 0C 0m CC=0.0 ←0 + β”‚ intake-actions.ts 38L 0C 10m CC=6 ←0 + β”‚ participant-registry-v2.schema.json 36L 0C 0m CC=0.0 ←0 β”‚ markdown.ts 35L 1C 4m CC=4 ←0 - β”‚ compile-cli.ts 34L 0C 7m CC=10 ←0 β”‚ php.ts 34L 0C 6m CC=2 ←0 + β”‚ compile-cli.ts 34L 0C 7m CC=10 ←0 + β”‚ constants.ts 31L 0C 14m CC=1 ←0 β”‚ unsupported.ts 30L 0C 4m CC=5 ←0 + β”‚ implementation-helpers-shared.ts 29L 0C 2m CC=1 ←0 + β”‚ !! record-metadata.ts 27L 0C 3m CC=17 ←0 + β”‚ implementation-indexing.ts 25L 0C 4m CC=4 ←3 β”‚ failure.ts 25L 1C 3m CC=7 ←0 β”‚ grounding.ts 24L 0C 5m CC=5 ←0 β”‚ rust.ts 20L 0C 2m CC=1 ←0 - β”‚ java.ts 20L 0C 2m CC=1 ←0 β”‚ go.ts 20L 0C 2m CC=1 ←0 + β”‚ java.ts 20L 0C 2m CC=1 ←0 β”‚ types.ts 20L 2C 0m CC=0.0 ←0 + β”‚ event-v1.schema.json 20L 0C 0m CC=0.0 ←0 + β”‚ envelope-v1.schema.json 20L 0C 0m CC=0.0 ←0 β”‚ audit.ts 19L 0C 1m CC=1 ←0 + β”‚ !! diff-ui-script.ts 17L 0C 8m CC=15 ←0 + β”‚ implementation-diagnostics.ts 17L 0C 2m CC=2 ←0 + β”‚ command-v1.schema.json 17L 0C 0m CC=0.0 ←0 + β”‚ query-v1.schema.json 11L 0C 0m CC=0.0 ←0 + β”‚ diagnostic-v1.schema.json 11L 0C 0m CC=0.0 ←0 β”‚ mcp-errors.ts 10L 1C 2m CC=3 ←0 + β”‚ git-binary.ts 10L 0C 2m CC=1 ←0 + β”‚ implementation-source-patch.ts 9L 0C 0m CC=0.0 ←0 + β”‚ result-v1.schema.json 9L 0C 0m CC=0.0 ←0 + β”‚ index.ts 8L 0C 0m CC=0.0 ←0 + β”‚ implementation-source-patch-apply.ts 8L 0C 0m CC=0.0 ←0 + β”‚ index.ts 4L 0C 0m CC=0.0 ←0 + β”‚ index.ts 4L 0C 0m CC=0.0 ←0 β”‚ version.ts 2L 0C 0m CC=0.0 ←0 β”‚ version.ts 2L 0C 0m CC=0.0 ←0 + β”‚ index.ts 1L 0C 0m CC=0.0 ←0 + β”‚ implementation.ts 1L 0C 0m CC=0.0 ←0 + β”‚ llm.ts 1L 0C 0m CC=0.0 ←0 β”‚ - python/ CCΜ„=4.2 ←in:0 β†’out:5 - β”‚ !! ast_extract 221L 1C 18m CC=16 ←0 - β”‚ requirements.txt 1L 0C 0m CC=0.0 ←0 - β”‚ - scripts/ CCΜ„=3.4 ←in:0 β†’out:0 - β”‚ audit-changelog-sample.mjs 226L 0C 39m CC=11 ←0 - β”‚ examples-check.sh 210L 0C 3m CC=0.0 ←0 - β”‚ live-contract-check.mjs 200L 0C 26m CC=5 ←0 - β”‚ rerank-embedding-shortlist.mjs 191L 0C 27m CC=14 ←0 - β”‚ !! rank-intent-graph-embeddings 174L 0C 3m CC=27 ←0 - β”‚ live-model-comparison.mjs 125L 0C 15m CC=13 ←0 - β”‚ e2e.sh 109L 0C 3m CC=0.0 ←0 - β”‚ !! verify-env-contract.mjs 103L 0C 15m CC=28 ←0 - β”‚ evaluate-embedding-pairs 101L 0C 2m CC=9 ←0 - β”‚ verify-generated-analysis.mjs 88L 0C 14m CC=8 ←0 - β”‚ verify-module-boundaries.mjs 87L 0C 16m CC=7 ←0 - β”‚ !! verify-no-llm-imports.mjs 78L 0C 6m CC=15 ←0 - β”‚ sync-generated-readme-metadata.mjs 66L 0C 14m CC=4 ←0 - β”‚ smoke.sh 57L 0C 0m CC=0.0 ←0 - β”‚ assert-demollm-run.mjs 45L 0C 9m CC=2 ←0 - β”‚ verify-workflow-yaml.mjs 43L 0C 9m CC=11 ←0 - β”‚ docker-smoke.sh 36L 0C 1m CC=0.0 ←0 - β”‚ verify-structured-responses.mjs 35L 0C 7m CC=8 ←0 - β”‚ normalize-generated-analysis-roots.mjs 34L 0C 7m CC=4 ←0 - β”‚ generate-response-schemas.mjs 27L 0C 4m CC=2 ←0 - β”‚ README.md 27L 0C 0m CC=0.0 ←0 - β”‚ vallm-compatible 25L 0C 1m CC=2 ←0 - β”‚ package 25L 0C 0m CC=0.0 ←0 - β”‚ a2a-request.sh 23L 0C 0m CC=0.0 ←0 - β”‚ mcp-request.sh 11L 0C 0m CC=0.0 ←0 - β”‚ - java/ CCΜ„=3.0 ←in:0 β†’out:0 - β”‚ JavaAstExtract.java 260L 1C 12m CC=10 ←0 + java/ CCΜ„=3.0 ←in:2 β†’out:0 + β”‚ JavaAstExtract.java 260L 1C 12m CC=10 ←1 β”‚ sdk/ CCΜ„=2.7 ←in:0 β†’out:0 β”‚ client 469L 7C 45m CC=7 ←0 @@ -299,70 +358,54 @@ LAYERS: β”‚ actions.go 136L 0C 18m CC=3 ←0 β”‚ basic.php 112L 0C 0m CC=0.0 ←0 β”‚ !! basic.rs 108L 0C 3m CC=20 ←0 - β”‚ README.md 107L 0C 0m CC=0.0 ←0 β”‚ actions.rs 100L 1C 20m CC=4 ←0 β”‚ basic 95L 0C 1m CC=11 ←0 β”‚ !! basic.ts 84L 0C 19m CC=17 ←0 - β”‚ README.md 68L 0C 0m CC=0.0 ←0 β”‚ lib.rs 49L 0C 0m CC=0.0 ←0 β”‚ error.rs 37L 2C 2m CC=2 ←0 β”‚ local_runtime 36L 0C 1m CC=1 ←0 β”‚ __init__ 33L 0C 0m CC=0.0 ←0 + β”‚ package.json 32L 0C 0m CC=0.0 ←0 β”‚ todo2code.go 30L 0C 0m CC=0.0 ←0 - β”‚ package.json 28L 0C 0m CC=0.0 ←0 β”‚ Error.php 25L 1C 2m CC=1 ←0 - β”‚ README.md 24L 0C 0m CC=0.0 ←0 - β”‚ README.md 23L 0C 0m CC=0.0 ←0 - β”‚ README.md 21L 0C 0m CC=0.0 ←0 β”‚ tsconfig.json 20L 0C 0m CC=0.0 ←0 - β”‚ README.md 20L 0C 0m CC=0.0 ←0 β”‚ composer.json 18L 0C 0m CC=0.0 ←0 β”‚ Cargo.toml 17L 0C 0m CC=0.0 ←0 + β”‚ pyproject.toml 17L 0C 0m CC=0.0 ←0 β”‚ __init__ 13L 0C 0m CC=0.0 ←0 β”‚ __init__ 1L 0C 0m CC=0.0 ←0 β”‚ - examples/ CCΜ„=2.4 ←in:0 β†’out:0 - β”‚ !! server.ts 99L 1C 18m CC=16 ←0 + examples/ CCΜ„=2.3 ←in:0 β†’out:0 + β”‚ request-handlers.ts 88L 0C 18m CC=9 ←0 β”‚ render.ts 64L 1C 12m CC=4 ←0 - β”‚ api.ts 50L 3C 6m CC=6 ←0 + β”‚ api.ts 50L 3C 6m CC=6 ←1 β”‚ store.ts 48L 3C 4m CC=1 ←0 - β”‚ README.md 46L 0C 0m CC=0.0 ←0 + β”‚ server.ts 43L 1C 8m CC=4 ←0 β”‚ app.ts 43L 1C 7m CC=4 ←0 - β”‚ README.md 35L 0C 0m CC=0.0 ←0 + β”‚ participants.json 37L 0C 0m CC=0.0 ←0 β”‚ validation.ts 31L 1C 7m CC=10 ←0 β”‚ python 23L 0C 0m CC=0.0 ←0 - β”‚ task.md 18L 0C 0m CC=0.0 ←0 - β”‚ task.md 17L 0C 0m CC=0.0 ←0 β”‚ typescript.mjs 16L 0C 1m CC=1 ←0 β”‚ tsconfig.json 15L 0C 0m CC=0.0 ←0 β”‚ tsconfig.json 14L 0C 0m CC=0.0 ←0 β”‚ runtime.ts 13L 1C 2m CC=2 ←0 - β”‚ CHANGELOG.md 11L 0C 0m CC=0.0 ←0 - β”‚ CHANGELOG.md 11L 0C 0m CC=0.0 ←0 - β”‚ CHANGELOG.md 11L 0C 0m CC=0.0 ←0 β”‚ helper 9L 0C 2m CC=1 ←0 - β”‚ task.md 9L 0C 0m CC=0.0 ←0 - β”‚ ARCHITECTURE.md 9L 0C 0m CC=0.0 ←0 - β”‚ TODO.md 8L 0C 0m CC=0.0 ←0 - β”‚ TODO.md 7L 0C 0m CC=0.0 ←0 - β”‚ TODO.md 7L 0C 0m CC=0.0 ←0 β”‚ rust-ast/ CCΜ„=1.9 ←in:0 β†’out:0 β”‚ main.rs 322L 3C 23m CC=9 ←0 β”‚ Cargo.toml 12L 0C 0m CC=0.0 ←0 β”‚ ./ CCΜ„=0.0 ←in:0 β†’out:0 - β”‚ !! README.md 871L 0C 0m CC=0.0 ←0 - β”‚ !! CHANGELOG.md 670L 0C 0m CC=0.0 ←0 - β”‚ TODO.md 391L 0C 0m CC=0.0 ←0 - β”‚ Makefile 129L 0C 0m CC=0.0 ←0 - β”‚ package.json 48L 0C 0m CC=0.0 ←0 + β”‚ !! goal.yaml 530L 0C 0m CC=0.0 ←0 + β”‚ Makefile 132L 0C 0m CC=0.0 ←0 + β”‚ project.sh 124L 0C 3m CC=0.0 ←0 + β”‚ project2.sh 79L 0C 0m CC=0.0 ←0 + β”‚ package.json 52L 0C 0m CC=0.0 ←0 β”‚ Dockerfile 45L 0C 0m CC=0.0 ←0 - β”‚ CONTRIBUTION.md 37L 0C 0m CC=0.0 ←0 β”‚ compose.e2e.yml 27L 0C 0m CC=0.0 ←0 β”‚ tsconfig.json 23L 0C 0m CC=0.0 ←0 β”‚ docker-compose.yml 18L 0C 0m CC=0.0 ←0 - β”‚ TASK.md 10L 0C 0m CC=0.0 ←0 + β”‚ nlp2uri.yaml 8L 0C 0m CC=0.0 ←0 β”‚ schemas/ CCΜ„=0.0 ←in:0 β†’out:0 β”‚ !! gold-dataset.schema.json 585L 0C 0m CC=0.0 ←0 @@ -382,67 +425,35 @@ LAYERS: β”‚ participant-synthesis.schema.json 39L 0C 0m CC=0.0 ←0 β”‚ variable-contract.schema.json 38L 0C 0m CC=0.0 ←0 β”‚ code-change-source-apply-receipt.schema.json 31L 0C 0m CC=0.0 ←0 - β”‚ participant-registry.schema.json 27L 0C 0m CC=0.0 ←0 β”‚ code-change-review.schema.json 27L 0C 0m CC=0.0 ←0 + β”‚ participant-registry.schema.json 27L 0C 0m CC=0.0 ←0 β”‚ code-change-close-result.schema.json 26L 0C 0m CC=0.0 ←0 β”‚ code-change-plan-set.schema.json 22L 0C 0m CC=0.0 ←0 β”‚ code-change-source-patch-set.schema.json 18L 0C 0m CC=0.0 ←0 β”‚ - prompts/ CCΜ„=0.0 ←in:0 β†’out:0 - β”‚ tasks-from-dsl.system.md 52L 0C 0m CC=0.0 ←0 - β”‚ summarize.system.md 51L 0C 0m CC=0.0 ←0 - β”‚ docs-to-intent.system.md 23L 0C 0m CC=0.0 ←0 - β”‚ nl-to-intent.system.md 15L 0C 0m CC=0.0 ←0 - β”‚ communication-to-intent.system.md 7L 0C 0m CC=0.0 ←0 - β”‚ markdown-to-intent.system.md 5L 0C 0m CC=0.0 ←0 + adapters/ CCΜ„=0.0 ←in:0 β†’out:0 + β”‚ package.json 14L 0C 0m CC=0.0 ←0 β”‚ evaluation/ CCΜ„=0.0 ←in:0 β†’out:0 β”‚ !! dataset.json 2410L 0C 0m CC=0.0 ←0 β”‚ !! dataset.json 761L 0C 0m CC=0.0 ←0 - β”‚ README.md 87L 0C 0m CC=0.0 ←0 - β”‚ - docs/ CCΜ„=0.0 ←in:0 β†’out:0 - β”‚ !! SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md 872L 0C 0m CC=0.0 ←0 - β”‚ !! original-monitoring-design.md 872L 0C 0m CC=0.0 ←0 - β”‚ !! TEST_REPORT.md 587L 0C 0m CC=0.0 ←0 - β”‚ PIPELINE_DSL_NL.md 464L 0C 0m CC=0.0 ←0 - β”‚ DSL.md 457L 0C 0m CC=0.0 ←0 - β”‚ READINESS.md 442L 0C 0m CC=0.0 ←0 - β”‚ ALL_DIAGRAMS.md 410L 0C 0m CC=0.0 ←0 - β”‚ CLI_GUIDE.md 328L 0C 0m CC=0.0 ←0 - β”‚ GROK-PLAN.md 269L 0C 0m CC=0.0 ←0 - β”‚ TEAM_COMMUNICATION.md 268L 0C 0m CC=0.0 ←0 - β”‚ OPTIMIZATION.md 249L 0C 0m CC=0.0 ←0 - β”‚ ARCHITECTURE.md 200L 0C 0m CC=0.0 ←0 - β”‚ VALIDATION.md 198L 0C 0m CC=0.0 ←0 - β”‚ DEMOLLM.md 175L 0C 0m CC=0.0 ←0 - β”‚ CODE_CHANGE_PLANS.md 173L 0C 0m CC=0.0 ←0 - β”‚ PROTOCOLS.md 124L 0C 0m CC=0.0 ←0 - β”‚ E2E.md 52L 0C 0m CC=0.0 ←0 - β”‚ SECURITY.md 50L 0C 0m CC=0.0 ←0 - β”‚ REQUIREMENTS.md 39L 0C 0m CC=0.0 ←0 - β”‚ SUBACTOR_OPERATION_DSL.md 33L 0C 0m CC=0.0 ←0 - β”‚ README.md 22L 0C 0m CC=0.0 ←0 - β”‚ - adapters/ CCΜ„=0.0 ←in:0 β†’out:0 - β”‚ package.json 10L 0C 0m CC=0.0 ←0 β”‚ COUPLING: - scripts.research src.synthesis sdk.python src.live src.diff python src.graph - scripts.research ── 2 7 2 !! fan-out - src.synthesis ←2 ── ←6 ←1 hub - sdk.python 6 ── 2 !! fan-out - src.live ←7 ── hub - src.diff ←2 ── ←4 hub - python 1 4 ── - src.graph ←2 ── + scripts.research sdk.python src.live src.synthesis src.graph java examples.frontend python + scripts.research ── 7 1 1 !! fan-out + sdk.python ── 4 1 2 1 !! fan-out + src.live ←7 ── hub + src.synthesis ←1 ←4 ── hub + src.graph ←1 ←1 ── ←1 + java ←2 ── + examples.frontend ←1 ── + python 1 ── CYCLES: none - HUB: src.diff/ (fan-in=6) - HUB: src.synthesis/ (fan-in=9) HUB: src.live/ (fan-in=7) + HUB: src.synthesis/ (fan-in=5) + SMELL: scripts.research/ fan-out=9 β†’ split needed SMELL: sdk.python/ fan-out=8 β†’ split needed - SMELL: scripts.research/ fan-out=11 β†’ split needed EXTERNAL: validation: run `vallm batch .` β†’ validation.toon diff --git a/project/calls.mmd b/project/calls.mmd index 878d00d..8ce239f 100644 --- a/project/calls.mmd +++ b/project/calls.mmd @@ -1,445 +1,615 @@ flowchart LR %% generated in 0.04s + subgraph examples__backend + examples__backend__src__request_handlers__handleHealth["handleHealth"] + examples__backend__src__validation__agent["agent"] + examples__backend__src__request_handlers__size["size"] + examples__backend__src__server__createBackend["createBackend"] + examples__backend__src__request_handlers__handleEventList["handleEventList"] + examples__backend__src__request_handlers__handleRequest["handleRequest"] + examples__backend__src__validation__invalid["invalid"] + examples__backend__src__server__sendJson["sendJson"] + examples__backend__src__request_handlers__handleEventPublish["handleEventPublish"] + examples__backend__src__request_handlers__parseOffset["parseOffset"] + examples__backend__src__validation__record["record"] + examples__backend__src__request_handlers__event["event"] + examples__backend__src__request_handlers__parseLimit["parseLimit"] + examples__backend__src__request_handlers__validation["validation"] + examples__backend__src__server__startBackend["startBackend"] + examples__backend__src__server__store["store"] + examples__backend__src__request_handlers__readBody["readBody"] + examples__backend__src__request_handlers__sendJson["sendJson"] + examples__backend__src__validation__ALLOWED_ACTIONS["ALLOWED_ACTIONS"] + examples__backend__src__validation__validateEventPayload["validateEventPayload"] + examples__backend__src__validation__action["action"] + examples__backend__src__request_handlers__MAX_BODY_BYTES["MAX_BODY_BYTES"] + examples__backend__src__server__server["server"] + examples__backend__src__validation__object["object"] + end + subgraph examples__frontend + examples__frontend__src__app__state["state"] + examples__frontend__src__render__renderTable["renderTable"] + examples__frontend__src__app__refresh["refresh"] + examples__frontend__src__render__headerRow["headerRow"] + examples__frontend__src__app__mountPanel["mountPanel"] + examples__frontend__src__app__reload["reload"] + examples__frontend__src__render__classifyEvent["classifyEvent"] + examples__frontend__src__render__toRows["toRows"] + examples__frontend__src__app__createState["createState"] + end + subgraph examples__src + examples__src__runtime__executeContract["executeContract"] + examples__src__runtime__validateContract["validateContract"] + end + subgraph java__JavaAstExtract + java__JavaAstExtract__JavaAstExtract__slash["slash"] + java__JavaAstExtract__JavaAstExtract__collect["collect"] + java__JavaAstExtract__JavaAstExtract__json["json"] + java__JavaAstExtract__JavaAstExtract__map["map"] + java__JavaAstExtract__JavaAstExtract__try["try"] + java__JavaAstExtract__JavaAstExtract__containsIgnored["containsIgnored"] + java__JavaAstExtract__JavaAstExtract__escape["escape"] + java__JavaAstExtract__JavaAstExtract__add["add"] + java__JavaAstExtract__JavaAstExtract__emit["emit"] + java__JavaAstExtract__JavaAstExtract__main["main"] + end + subgraph rust_ast__src + rust_ast__src__main__visit_item_use["visit_item_use"] + rust_ast__src__main__visit_impl_item_fn["visit_impl_item_fn"] + rust_ast__src__main__visit_item_static["visit_item_static"] + rust_ast__src__main__visit_item_const["visit_item_const"] + rust_ast__src__main__add["add"] + rust_ast__src__main__visit_item_mod["visit_item_mod"] + rust_ast__src__main__visit_item_fn["visit_item_fn"] + rust_ast__src__main__qualified["qualified"] + rust_ast__src__main__modifiers["modifiers"] + rust_ast__src__main__visit_item_type["visit_item_type"] + rust_ast__src__main__visit_item_enum["visit_item_enum"] + rust_ast__src__main__slash["slash"] + rust_ast__src__main__visit_expr_call["visit_expr_call"] + rust_ast__src__main__visit_item_trait["visit_item_trait"] + rust_ast__src__main__excerpt["excerpt"] + rust_ast__src__main__main["main"] + rust_ast__src__main__type_item["type_item"] + rust_ast__src__main__collect_files["collect_files"] + rust_ast__src__main__visit_expr_method_call["visit_expr_method_call"] + rust_ast__src__main__arguments["arguments"] + rust_ast__src__main__visit_item_struct["visit_item_struct"] + end subgraph src__cli + src__cli__main["main"] + src__cli__svg["svg"] + src__cli__handleExtractAst["handleExtractAst"] + src__cli__handleDiagnose["handleDiagnose"] src__cli__handleExtract["handleExtract"] - src__cli__optionLlmMode["optionLlmMode"] - src__cli__maxRows["maxRows"] - src__cli__optionBoolean["optionBoolean"] - src__cli__optionPipelineTaskMode["optionPipelineTaskMode"] - src__cli__formatWatchEvent["formatWatchEvent"] - src__cli__diff["diff"] - src__cli__handleWatch["handleWatch"] - src__cli__file["file"] - src__cli__initProject["initProject"] + src__cli__result["result"] src__cli__taskFile["taskFile"] - src__cli__optionNumber["optionNumber"] - src__cli__printHelp["printHelp"] - src__cli__invokedPath["invokedPath"] - src__cli__optionSummaryMode["optionSummaryMode"] - src__cli__svg["svg"] - src__cli__handleReality["handleReality"] - src__cli__stamp["stamp"] src__cli__handleCommunication["handleCommunication"] - src__cli__result["result"] - src__cli__parsed["parsed"] - src__cli__mode["mode"] - src__cli__main["main"] - src__cli__extractor["extractor"] - src__cli__execFileAsync["execFileAsync"] - src__cli__optionNullableString["optionNullableString"] - src__cli__html["html"] + src__cli__isPlanSet["isPlanSet"] src__cli__doctor["doctor"] - src__cli__optionNlMode["optionNlMode"] - src__cli__command["command"] + src__cli__handleLink["handleLink"] src__cli__emitExtraction["emitExtraction"] src__cli__parseArgs["parseArgs"] - src__cli__isPlanSet["isPlanSet"] - src__cli__stop["stop"] - src__cli__diagnosticsPath["diagnosticsPath"] - src__cli__root["root"] src__cli__handleDiff["handleDiff"] - src__cli__optionList["optionList"] - src__cli__optionString["optionString"] src__cli__optionTaskMode["optionTaskMode"] - src__cli__diagnostics["diagnostics"] - src__cli__context["context"] - src__cli__controller["controller"] + src__cli__handleCompareWorkspace["handleCompareWorkspace"] + src__cli__handleEvaluateCodeChange["handleEvaluateCodeChange"] + src__cli__handleWatch["handleWatch"] + src__cli__handleExtractCommunication["handleExtractCommunication"] + src__cli__handleGraphDiff["handleGraphDiff"] + src__cli__emitJson["emitJson"] src__cli__view["view"] + src__cli__controller["controller"] + src__cli__handleApplySourcePatch["handleApplySourcePatch"] + src__cli__buildDiffPayload["buildDiffPayload"] + src__cli__context["context"] + src__cli__handleRenderTodo["handleRenderTodo"] + src__cli__handleExtractDocs["handleExtractDocs"] + src__cli__printHelp["printHelp"] + src__cli__optionNullableString["optionNullableString"] + src__cli__optionPipelineTaskMode["optionPipelineTaskMode"] + src__cli__handleReality["handleReality"] + src__cli__optionString["optionString"] + src__cli__handleProposeTodo["handleProposeTodo"] + src__cli__resolveMainCommand["resolveMainCommand"] + src__cli__handleExtractConfig["handleExtractConfig"] + src__cli__buildCommonPipelineOptions["buildCommonPipelineOptions"] + src__cli__diff["diff"] + src__cli__optionNumber["optionNumber"] + src__cli__handler["handler"] + src__cli__resolvePipelineRoot["resolvePipelineRoot"] + src__cli__root["root"] + src__cli__handleIntake["handleIntake"] + src__cli__handleProposeSourcePatch["handleProposeSourcePatch"] + src__cli__handleProposeCodeChange["handleProposeCodeChange"] + src__cli__optionNlMode["optionNlMode"] + src__cli__commandHandlers["commandHandlers"] + src__cli__execFileAsync["execFileAsync"] + src__cli__optionList["optionList"] + src__cli__handleExtractGit["handleExtractGit"] + src__cli__handleExtractNl["handleExtractNl"] + src__cli__command["command"] + src__cli__formatWatchEvent["formatWatchEvent"] + src__cli__diagnosticsPath["diagnosticsPath"] + src__cli__handleRenderCodeChange["handleRenderCodeChange"] + src__cli__handleSummarize["handleSummarize"] + src__cli__reportPipelineDegradation["reportPipelineDegradation"] + src__cli__file["file"] + src__cli__handleExtractMarkdown["handleExtractMarkdown"] + src__cli__pipeline["pipeline"] + src__cli__buildWorkspaceComparisonOptions["buildWorkspaceComparisonOption"] + src__cli__handleExtractRuntime["handleExtractRuntime"] + src__cli__absolute["absolute"] + src__cli__resolveWatchTaskFile["resolveWatchTaskFile"] + src__cli__diagnostics["diagnostics"] + src__cli__parsed["parsed"] + src__cli__initProject["initProject"] + src__cli__invokedPath["invokedPath"] + src__cli__handleCloseCodeChange["handleCloseCodeChange"] + src__cli__buildGitDiff["buildGitDiff"] + src__cli__stop["stop"] + src__cli__handleApplyTodo["handleApplyTodo"] + src__cli__optionBoolean["optionBoolean"] + src__cli__optionLlmMode["optionLlmMode"] + src__cli__parseDiffMode["parseDiffMode"] + src__cli__stamp["stamp"] + src__cli__optionSummaryMode["optionSummaryMode"] + src__cli__buildFileDiff["buildFileDiff"] + src__cli__handlePipeline["handlePipeline"] + src__cli__buildPipelineOptions["buildPipelineOptions"] end - subgraph src__operations - src__operations__validation__dateString["dateString"] - src__operations__validation__exactKeys["exactKeys"] - src__operations__validation__principals["principals"] - src__operations__validation__objectValue["objectValue"] - src__operations__validation__nonBlank["nonBlank"] - src__operations__validation__uniqueStrings["uniqueStrings"] - src__operations__validation__assertVariableContract["assertVariableContract"] - src__operations__validation__assertPrincipalList["assertPrincipalList"] - end - subgraph src__pipeline - src__pipeline__run__docs["docs"] - src__pipeline__run__configurationExtraction["configurationExtraction"] - src__pipeline__run__reason["reason"] - src__pipeline__run__persistFailedRun["persistFailedRun"] - src__pipeline__run__manifestConfiguration["manifestConfiguration"] - src__pipeline__run__stageValue["stageValue"] - src__pipeline__run__runPipeline["runPipeline"] - src__pipeline__run__failedAudit["failedAudit"] - src__pipeline__run__communicationInputPresent["communicationInputPresent"] - src__pipeline__run__communicationStartedAt["communicationStartedAt"] - src__pipeline__run__communicationAudit["communicationAudit"] - src__pipeline__run__values["values"] - src__pipeline__run__message["message"] - src__pipeline__run__knownAudit["knownAudit"] - src__pipeline__run__aborted["aborted"] - src__pipeline__run__failureCode["failureCode"] - src__pipeline__run__includeCommunication["includeCommunication"] - src__pipeline__run__skippedAudit["skippedAudit"] - src__pipeline__run__collectTargetHints["collectTargetHints"] - end - subgraph src__semantic - src__semantic__reranker__validDate["validDate"] - src__semantic__reranker__createSemanticCandidateSet["createSemanticCandidateSet"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticCandidateSet["assertSemanticCandidateSet"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates["rerankSemanticCandidates"] - src__semantic__reranker__assertSemanticVerdictReason["assertSemanticVerdictReason"] - src__semantic__reranker__roundedConfidence["roundedConfidence"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord["projectRecord"] - src__semantic__reranker__values["values"] - src__semantic__reranker__requiredText["requiredText"] - src__semantic__reranker__acceptedDeclarations["acceptedDeclarations"] - src__semantic__reranker__records["records"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__model["model"] - src__semantic__reranker__validateGeneration["validateGeneration"] - src__semantic__reranker__validateRetrieval["validateRetrieval"] - src__semantic__reranker__validateVerdictReason["validateVerdictReason"] - src__semantic__reranker__assertGroundedQuote["assertGroundedQuote"] - src__semantic__reranker__seenIds["seenIds"] - src__semantic__reranker__quote["quote"] - src__semantic__reranker__applyAcceptedSemanticRelations["applyAcceptedSemanticRelations"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult["assertSemanticRerankResult"] - src__semantic__reranker__assertSemanticRerankResult["assertSemanticRerankResult"] - src__semantic__reranker__byDeclaration["byDeclaration"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__payload["payload"] - src__semantic__reranker__seenDecisions["seenDecisions"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__modelRevision["modelRevision"] - src__semantic__reranker__decisions["decisions"] - src__semantic__reranker__assertSemanticCandidateSet["assertSemanticCandidateSet"] - src__semantic__reranker__createSemanticRerankResult["createSemanticRerankResult"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshot["assertTrackedSnapshot"] - src__semantic__reranker__seenPairs["seenPairs"] - src__semantic__reranker__boundedScore["boundedScore"] - end - subgraph src__services - src__services__actions__value["value"] - src__services__actions__patch["patch"] - src__services__actions__afterPath["afterPath"] - src__services__actions__beforeInput["beforeInput"] - src__services__actions__graph["graph"] - src__services__actions__numberValue["numberValue"] - src__services__actions__llmModeValue["llmModeValue"] - src__services__actions__scopedPath["scopedPath"] - src__services__actions__root["root"] - src__services__actions__afterDiagnostics["afterDiagnostics"] - src__services__actions__analysis["analysis"] - src__services__actions__conclusions["conclusions"] - src__services__actions__executeAction["executeAction"] - src__services__actions__nullableString["nullableString"] - src__services__actions__title["title"] - src__services__actions__booleanValue["booleanValue"] - src__services__actions__nlModeValue["nlModeValue"] - src__services__actions__before["before"] - src__services__actions__beforeDiagnostics["beforeDiagnostics"] - src__services__actions__todoPath["todoPath"] - src__services__actions__stringValue["stringValue"] - src__services__actions__resolveRoot["resolveRoot"] - src__services__actions__receiptPath["receiptPath"] - src__services__actions__after["after"] - src__services__actions__filterCommunicationGraph["filterCommunicationGraph"] - src__services__actions__afterInput["afterInput"] - src__services__actions__svg["svg"] - src__services__actions__result["result"] - src__services__actions__proposals["proposals"] - src__services__actions__diff["diff"] - src__services__actions__readRecords["readRecords"] - src__services__actions__diagnostics["diagnostics"] - src__services__actions__afterGraph["afterGraph"] - src__services__actions__summaryModeValue["summaryModeValue"] - src__services__actions__nullableScopedPath["nullableScopedPath"] - src__services__actions__stringList["stringList"] - src__services__actions__view["view"] - src__services__actions__withTextDiffViews["withTextDiffViews"] - src__services__actions__beforeGraph["beforeGraph"] - src__services__actions__hasInputValue["hasInputValue"] - src__services__actions__beforePath["beforePath"] - end - subgraph src__summary - src__summary__summarizer__client["client"] - src__summary__summarizer__SummaryAttemptError__conclusions["conclusions"] - src__summary__render__renderConclusion["renderConclusion"] - src__summary__render__actions["actions"] - src__summary__summarizer__SummaryAttemptError__readPrompt["readPrompt"] - src__summary__render__renderRecords["renderRecords"] - src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection["summarizeWithCorrection"] - src__summary__render__confidence["confidence"] - src__summary__summarizer__systemPrompt["systemPrompt"] - src__summary__summarizer__SummaryAttemptError__deterministicConclusions["deterministicConclusions"] - src__summary__render__recordCitations["recordCitations"] - src__summary__summarizer__SummaryAttemptError__summaryMode["summaryMode"] - src__summary__summarizer__SummaryAttemptError__materializeConclusions["materializeConclusions"] - src__summary__summarizer__payload["payload"] - src__summary__summarizer__SummaryAttemptError__parsed["parsed"] - src__summary__summarizer__SummaryAttemptError__sortedUnique["sortedUnique"] - src__summary__summarizer__mode["mode"] - src__summary__summarizer__summarizeGraph["summarizeGraph"] - src__summary__summarizer__SummaryAttemptError__generationMetadata["generationMetadata"] - src__summary__render__renderSummaryMarkdown["renderSummaryMarkdown"] - src__summary__summarizer__SummaryAttemptError__assertConclusions["assertConclusions"] - end - subgraph src__synthesis - src__synthesis__code_change_plan__buildChanges["buildChanges"] - src__synthesis__task_synthesis_contract__taskIds["taskIds"] - src__synthesis__task_synthesis_materialize__proposalKeys["proposalKeys"] - src__synthesis__code_change_plan__assertSourcePatchStrings["assertSourcePatchStrings"] - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse["materializeTaskSynthesisRespon"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions["assertConclusions"] - src__synthesis__todo_patch__uniqueStrings["uniqueStrings"] - src__synthesis__code_change_plan__relatedRecords["relatedRecords"] - src__synthesis__task_synthesis_materialize__normalizeLocalKeys["normalizeLocalKeys"] - src__synthesis__todo_patch__result["result"] - src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria["normalizeAcceptanceCriteria"] - src__synthesis__task_synthesis_materialize__proposalDrafts["proposalDrafts"] - src__synthesis__task_synthesis_materialize__conclusionByKey["conclusionByKey"] - src__synthesis__todo_patch__orderedSelected["orderedSelected"] - src__synthesis__code_change_plan__fileHashesAfter["fileHashesAfter"] - src__synthesis__todo_patch__diagnosticReportFingerprint["diagnosticReportFingerprint"] - src__synthesis__validation__dependencyFirstPriorityOrder["dependencyFirstPriorityOrder"] - src__synthesis__code_change_plan__collectTarget["collectTarget"] - src__synthesis__validation__sharedTicket["sharedTicket"] - src__synthesis__task_synthesis_materialize__diagnosticIds["diagnosticIds"] - src__synthesis__todo_patch__inline["inline"] - src__synthesis__code_change_plan__planHash["planHash"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals["synthesizeTodoProposals"] - src__synthesis__code_change_plan__assertExistingSourceReceipt["assertExistingSourceReceipt"] - src__synthesis__task_synthesis_contract__nonBlank["nonBlank"] - src__synthesis__todo_patch__selected["selected"] - src__synthesis__code_change_plan__assertCodeChangeSourcePatch["assertCodeChangeSourcePatch"] - src__synthesis__code_change_plan__conclusionsByDiagnostic["conclusionsByDiagnostic"] - src__synthesis__code_change_plan__descriptionFor["descriptionFor"] - src__synthesis__code_change_plan__applyUnifiedDiffToText["applyUnifiedDiffToText"] - src__synthesis__code_change_plan__changes["changes"] - src__synthesis__todo_patch__applyTodoPatch["applyTodoPatch"] - src__synthesis__task_synthesis_materialize__sortedUnique["sortedUnique"] - src__synthesis__code_change_plan__rollbackFor["rollbackFor"] - src__synthesis__todo_patch__markdown["markdown"] - src__synthesis__code_change_plan__instructionFor["instructionFor"] - src__synthesis__code_change_path__isPlannablePath["isPlannablePath"] - src__synthesis__task_synthesis_materialize__normalizeRawTarget["normalizeRawTarget"] - src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown["renderCodeChangeReviewMarkdown"] - src__synthesis__code_change_plan__applyCodeChangeSourcePatch["applyCodeChangeSourcePatch"] - src__synthesis__code_change_plan__createCodeChangeReviewPatch["createCodeChangeReviewPatch"] - src__synthesis__code_change_plan__unifiedDiff["unifiedDiff"] - src__synthesis__todo_patch__applied["applied"] - src__synthesis__code_change_plan__index["index"] - src__synthesis__code_change_plan__planIds["planIds"] - src__synthesis__code_change_plan__confidenceFor["confidenceFor"] - src__synthesis__code_change_plan__candidates["candidates"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__client["client"] - src__synthesis__todo_patch__renderTodoPatchMarkdown["renderTodoPatchMarkdown"] - src__synthesis__todo_patch__sourceTodo["sourceTodo"] - src__synthesis__code_change_plan__priorityRank["priorityRank"] - src__synthesis__todo_patch__current["current"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow["fallbackOrThrow"] - src__synthesis__todo_patch__renderTargets["renderTargets"] - src__synthesis__todo_patch__assertReceipt["assertReceipt"] - src__synthesis__validation__duplicateEvidence["duplicateEvidence"] - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT["RAW_PROPOSAL_CONTRACT"] - src__synthesis__todo_patch__uniqueIds["uniqueIds"] - src__synthesis__code_change_plan__rawDiff["rawDiff"] - src__synthesis__code_change_plan__deterministicGeneration["deterministicGeneration"] - src__synthesis__code_change_plan__patchHash["patchHash"] - src__synthesis__code_change_plan__proposalsByDiagnostic["proposalsByDiagnostic"] - src__synthesis__todo_patch__wasAlreadyAppended["wasAlreadyAppended"] - src__synthesis__task_synthesis_materialize__proposals["proposals"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__startedAt["startedAt"] - src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet["assertCodeChangeSourcePatchSet"] - src__synthesis__todo_patch__duplicates["duplicates"] - src__synthesis__task_synthesis_materialize__proposalIdByKey["proposalIdByKey"] - src__synthesis__code_change_plan__acceptedCount["acceptedCount"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__payload["payload"] - src__synthesis__code_change_plan__indexProposalsByDiagnostic["indexProposalsByDiagnostic"] - src__synthesis__todo_patch__classified["classified"] - src__synthesis__code_change_plan__object["object"] - src__synthesis__code_change_plan__patchIds["patchIds"] - src__synthesis__code_change_path__isUsefulCodeChangePath["isUsefulCodeChangePath"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__generationMetadata["generationMetadata"] - src__synthesis__task_synthesis_materialize__conclusions["conclusions"] - src__synthesis__code_change_plan__conclusions["conclusions"] - src__synthesis__code_change_plan__set["set"] - src__synthesis__validation__intersects["intersects"] - src__synthesis__validation__target["target"] - src__synthesis__code_change_plan__uniqueSorted["uniqueSorted"] - src__synthesis__todo_patch__renderIds["renderIds"] - src__synthesis__code_change_plan__startsWithImperative["startsWithImperative"] - src__synthesis__code_change_plan__assertSourcePatchIds["assertSourcePatchIds"] - src__synthesis__validation__sharedPath["sharedPath"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesisAudit["synthesisAudit"] - src__synthesis__code_change_plan__createCodeChangeSourcePatch["createCodeChangeSourcePatch"] - src__synthesis__code_change_plan__recordsById["recordsById"] - src__synthesis__task_synthesis_contract__taskStrings["taskStrings"] - src__synthesis__code_change_plan__now["now"] - src__synthesis__task_synthesis_materialize__keys["keys"] - src__synthesis__code_change_plan__target["target"] - src__synthesis__todo_patch__isoDate["isoDate"] - src__synthesis__code_change_plan__acceptances["acceptances"] - src__synthesis__todo_patch__currentHash["currentHash"] - src__synthesis__validation__validateAndClassifyTodoProposals["validateAndClassifyTodoProposa"] - src__synthesis__todo_patch__createTodoPatch["createTodoPatch"] - src__synthesis__code_change_plan__markdown["markdown"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__readPrompt["readPrompt"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__prompt["prompt"] - src__synthesis__todo_patch__normalizePath["normalizePath"] - src__synthesis__code_change_plan__plansById["plansById"] - src__synthesis__todo_patch__hash["hash"] - src__synthesis__todo_patch__rendered["rendered"] - src__synthesis__code_change_plan__record["record"] - src__synthesis__task_synthesis_materialize__conclusionIdByKey["conclusionIdByKey"] - src__synthesis__code_change_plan__normalizeUnifiedDiff["normalizeUnifiedDiff"] - src__synthesis__validation__proposalWords["proposalWords"] - src__synthesis__code_change_plan__titleFor["titleFor"] - src__synthesis__todo_patch__writeTodoPatchArtifacts["writeTodoPatchArtifacts"] - src__synthesis__code_change_plan__acceptanceCriteriaFor["acceptanceCriteriaFor"] - src__synthesis__code_change_plan__paths["paths"] - src__synthesis__validation__similarity["similarity"] - src__synthesis__code_change_plan__assertSourceApplyReceipt["assertSourceApplyReceipt"] - src__synthesis__todo_patch__assertApproval["assertApproval"] - src__synthesis__todo_patch__artifact["artifact"] - src__synthesis__todo_patch__appendPatch["appendPatch"] - src__synthesis__code_change_plan__indexConclusionsByDiagnostic["indexConclusionsByDiagnostic"] - src__synthesis__code_change_plan__exactSourcePatchKeys["exactSourcePatchKeys"] - src__synthesis__code_change_plan__exactSourcePatchSet["exactSourcePatchSet"] - src__synthesis__code_change_plan__splitKeep["splitKeep"] - src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT["RAW_CONCLUSION_CONTRACT"] - src__synthesis__task_synthesis_materialize__parsed["parsed"] - src__synthesis__code_change_plan__riskFor["riskFor"] - src__synthesis__todo_patch__now["now"] - src__synthesis__task_synthesis_materialize__normalizeStringArray["normalizeStringArray"] - src__synthesis__todo_patch__recovered["recovered"] - src__synthesis__validation__jaccard["jaccard"] - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection["synthesizeWithCorrection"] - src__synthesis__todo_patch__object["object"] - src__synthesis__todo_patch__exactKeys["exactKeys"] - src__synthesis__code_change_plan__createCodeChangeSourcePatchSet["createCodeChangeSourcePatchSet"] - src__synthesis__code_change_plan__renderIds["renderIds"] - src__synthesis__validation__words["words"] - src__synthesis__todo_patch__nonBlank["nonBlank"] - src__synthesis__task_synthesis_materialize__mapKeys["mapKeys"] - src__synthesis__code_change_plan__evaluateCodeChangeAcceptance["evaluateCodeChangeAcceptance"] - src__synthesis__validation__sharedSymbol["sharedSymbol"] - src__synthesis__todo_patch__assertTodoPatchArtifact["assertTodoPatchArtifact"] - src__synthesis__code_change_plan__proposals["proposals"] - src__synthesis__code_change_plan__generatedAt["generatedAt"] - src__synthesis__todo_patch__sameArray["sameArray"] - src__synthesis__code_change_plan__matchingConclusions["matchingConclusions"] - src__synthesis__todo_patch__atomicWrite["atomicWrite"] - src__synthesis__code_change_plan__inline["inline"] - src__synthesis__code_change_plan__matchingProposals["matchingProposals"] - end - subgraph src__tf - src__tf__classifier__classifyAction["classifyAction"] - src__tf__classifier__dynamicImport["dynamicImport"] - src__tf__classifier__vectorize["vectorize"] - src__tf__classifier__importer["importer"] - src__tf__classifier__loadClassifier["loadClassifier"] - src__tf__classifier__loadAssets["loadAssets"] - end - subgraph src__watch - src__watch__watcher__waitMs["waitMs"] - src__watch__watcher__diffSnapshots["diffSnapshots"] - src__watch__watcher__emit["emit"] - src__watch__watcher__snapshot["snapshot"] - src__watch__watcher__describeDelta["describeDelta"] - src__watch__watcher__visit["visit"] - src__watch__watcher__relative["relative"] - src__watch__watcher__sleep["sleep"] - src__watch__watcher__lastReportStartedAt["lastReportStartedAt"] - src__watch__watcher__current["current"] - src__watch__watcher__defaultSleep["defaultSleep"] - src__watch__watcher__pending["pending"] - src__watch__watcher__onAbort["onAbort"] - src__watch__watcher__generate["generate"] - src__watch__watcher__watchRepository["watchRepository"] - src__watch__watcher__absolute["absolute"] - src__watch__watcher__finish["finish"] - src__watch__watcher__result["result"] - src__watch__watcher__now["now"] - src__watch__watcher__maxFiles["maxFiles"] - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS["DEFAULT_MIN_INTERVAL_MS"] - src__watch__watcher__scanTree["scanTree"] - src__watch__watcher__delta["delta"] - src__watch__watcher__absoluteRoot["absoluteRoot"] - src__watch__watcher__runReport["runReport"] - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS["DEFAULT_SCAN_INTERVAL_MS"] - src__watch__watcher__timer["timer"] - src__watch__watcher__startedAt["startedAt"] - end - subgraph src__web - src__web__diff_ui__loadRuns["loadRuns"] - src__web__diff_ui__fillSelect["fillSelect"] - src__web__diff_ui__requestHeaders["requestHeaders"] - src__web__diff_ui__compareGraphs["compareGraphs"] - src__web__diff_ui__byId["byId"] - src__web__diff_ui__selectedRun["selectedRun"] - src__web__diff_ui__diffUiHtml["diffUiHtml"] - src__web__diff_ui__updateMeta["updateMeta"] - src__web__diff_ui__formatBytes["formatBytes"] + subgraph src__extractors + src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage["errorMessage"] + src__extractors__nl__absolute["absolute"] + src__extractors__markdown_paths__addBasenameIndexMatch["addBasenameIndexMatch"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract["markdownResponseContract"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichment["enrichment"] + src__extractors__git__extractChangedSymbols["extractChangedSymbols"] + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent["extractDocumentationIntent"] + src__extractors__nl__confidence["confidence"] + src__extractors__runtime_cycle__sourcePathFor["sourcePathFor"] + src__extractors__docs_deterministic__primePathMapper["primePathMapper"] + src__extractors__markdown_paths__buildBasenameIndex["buildBasenameIndex"] + src__extractors__docs_chunks__sectionText["sectionText"] + src__extractors__docs_deterministic__heading["heading"] + src__extractors__communication_helpers__nestedRoleIndex["nestedRoleIndex"] + src__extractors__ast__isIntentRecords["isIntentRecords"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownRecords["enrichMarkdownRecords"] + src__extractors__todo__body["body"] + src__extractors__communication_file_helpers__buildLocalWarnings["buildLocalWarnings"] + src__extractors__runtime_cycle__MAX_PER_SECTION["MAX_PER_SECTION"] + src__extractors__markdown_paths__createMarkdownPathResolver["createMarkdownPathResolver"] + src__extractors__docs_deterministic__parseBulletStatement["parseBulletStatement"] + src__extractors__docs_record__anchorToSource["anchorToSource"] + src__extractors__docs_record__allowedAction["allowedAction"] + src__extractors__communication_helpers__listValue["listValue"] + src__extractors__todo__resolvedPaths["resolvedPaths"] + src__extractors__communication_file_helpers__appendRegistryAlignmentWarnings["appendRegistryAlignmentWarning"] + src__extractors__markdown_llm__MarkdownLlmRequiredError__client["client"] + src__extractors__runtime_cycle__proposalAction["proposalAction"] + src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited["extractNlIntentAudited"] + src__extractors__docs_deterministic__qualifyingStatement["qualifyingStatement"] + src__extractors__runtime_cycle__results["results"] + src__extractors__docs_deterministic__resolver["resolver"] + src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks["loadDocumentChunks"] + src__extractors__docs_schema__documentRecord["documentRecord"] + src__extractors__configuration__uniqueEntries["uniqueEntries"] + src__extractors__runtime_cycle__tags["tags"] + src__extractors__nl_llm_helpers__NlAttemptError__action["action"] + src__extractors__git__resolveDiscoveryPrefix["resolveDiscoveryPrefix"] + src__extractors__docs_record__hasTarget["hasTarget"] + src__extractors__configuration__yamlOrAssignmentEntries["yamlOrAssignmentEntries"] + src__extractors__docs_deterministic__extractDocumentationBaseline["extractDocumentationBaseline"] + src__extractors__configuration__entry["entry"] + src__extractors__todo__match["match"] + src__extractors__docs_chunks__workerCount["workerCount"] + src__extractors__git__registerDiscoveredRepository["registerDiscoveredRepository"] + src__extractors__communication_helpers__match["match"] + src__extractors__todo__checked["checked"] + src__extractors__ast__records__moduleRecords["moduleRecords"] + src__extractors__runtime_cycle__proposalRecord["proposalRecord"] + src__extractors__runtime_cycle__factsMetadata["factsMetadata"] + src__extractors__git__extractGitIntent["extractGitIntent"] + src__extractors__docs_schema__target["target"] + src__extractors__nl__object["object"] + src__extractors__communication_helpers__heading["heading"] + src__extractors__configuration__bounded["bounded"] + src__extractors__ast__external__execFileAsync["execFileAsync"] + src__extractors__communication_file_helpers__hasExplicitEnvelopeMetadata["hasExplicitEnvelopeMetadata"] + src__extractors__nl_llm__NlLlmRequiredError__client["client"] + src__extractors__git__root["root"] + src__extractors__runtime_cycle__violationRecord["violationRecord"] + src__extractors__todo__text["text"] + src__extractors__communication_helpers__inferGovernanceIdentityFromFilename["inferGovernanceIdentityFromFil"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch["enrichSplitBatch"] + src__extractors__configuration__tomlEntries["tomlEntries"] + src__extractors__ast__records__adapterRecords["adapterRecords"] + src__extractors__communication_helpers__raw["raw"] + src__extractors__markdown_paths__basenames["basenames"] + src__extractors__changelog__relative["relative"] + src__extractors__git__readStats["readStats"] + src__extractors__runtime_cycle__jsonScalar["jsonScalar"] + src__extractors__docs_deterministic__match["match"] + src__extractors__docs_record__OBJECT_PLACEHOLDERS["OBJECT_PLACEHOLDERS"] + src__extractors__git__runGit["runGit"] + src__extractors__git__readCommits["readCommits"] + src__extractors__markdown_paths__headingScopes["headingScopes"] + src__extractors__ast__isExtractionResult["isExtractionResult"] + src__extractors__markdown_paths__index["index"] + src__extractors__communication_file_helpers__envelope["envelope"] + src__extractors__nl_llm_helpers__NlAttemptError__NL_RECORD_CONTRACT["NL_RECORD_CONTRACT"] + src__extractors__todo__block["block"] + src__extractors__nl_llm_helpers__NlAttemptError__resolveAction["resolveAction"] + src__extractors__configuration__lines["lines"] + src__extractors__docs_chunks__markdownSections["markdownSections"] + src__extractors__markdown_paths__readBasenameDirectoryEntries["readBasenameDirectoryEntries"] + src__extractors__git__extractRepositoryGitIntent["extractRepositoryGitIntent"] + src__extractors__todo__raw["raw"] + src__extractors__runtime_cycle__text["text"] + src__extractors__communication_helpers__basename["basename"] + src__extractors__git__filterDiscoveryChildren["filterDiscoveryChildren"] + src__extractors__configuration__parsed["parsed"] + src__extractors__docs_schema__documentResponseSchema["documentResponseSchema"] + src__extractors__configuration__isConfigurationPath["isConfigurationPath"] + src__extractors__docs_record__resolveAction["resolveAction"] + src__extractors__nl_llm_helpers__NlAttemptError__resolveModality["resolveModality"] + src__extractors__git__readChangedFiles["readChangedFiles"] + src__extractors__docs_record__modality["modality"] + src__extractors__git__processDiscoveryDirectory["processDiscoveryDirectory"] + src__extractors__docs_deterministic__parseParagraphStatement["parseParagraphStatement"] + src__extractors__docs_llm__DocumentationLlmRequiredError__selectWithinBudget["selectWithinBudget"] + src__extractors__communication_helpers__item["item"] + src__extractors__docs_deterministic__parseFenceBlock["parseFenceBlock"] + src__extractors__configuration__fileAggregate["fileAggregate"] + src__extractors__nl_llm_helpers__NlAttemptError__clampLine["clampLine"] + src__extractors__markdown_paths__createBasenameIndexState["createBasenameIndexState"] + src__extractors__nl__sourcePath["sourcePath"] + src__extractors__git__readDiscoveryEntries["readDiscoveryEntries"] + src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText["nonEmptyText"] + src__extractors__git__mapWithConcurrency["mapWithConcurrency"] + src__extractors__docs_chunks__prioritizeDocumentChunks["prioritizeDocumentChunks"] + src__extractors__nl__assertNlExtractionOptions["assertNlExtractionOptions"] + src__extractors__nl_llm_helpers__NlAttemptError__NL_ACTION_SET["NL_ACTION_SET"] + src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow["fallbackOrThrow"] + src__extractors__configuration__pair["pair"] + src__extractors__nl__action["action"] + src__extractors__docs_deterministic__action["action"] + src__extractors__runtime_cycle__extractRuntimeCycleIntent["extractRuntimeCycleIntent"] + src__extractors__configuration__jsonEntries["jsonEntries"] + src__extractors__nl_llm_helpers__NlAttemptError__statementText["statementText"] + src__extractors__runtime_cycle__watched["watched"] + src__extractors__docs_record__fallback["fallback"] + src__extractors__communication_helpers__fileParts["fileParts"] + src__extractors__changelog__extractChangelog["extractChangelog"] + src__extractors__nl_llm_helpers__NlAttemptError__allowedAction["allowedAction"] + src__extractors__docs_chunks__needles["needles"] + src__extractors__docs_chunks__chunkPriority["chunkPriority"] + src__extractors__configuration__heading["heading"] + src__extractors__git__count["count"] + src__extractors__nl__extractNlIntent["extractNlIntent"] + src__extractors__communication_file_helpers__appendIdentityWarnings["appendIdentityWarnings"] + src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder["isPlaceholder"] + src__extractors__nl_llm_helpers__NlAttemptError__NL_MODALITY_SET["NL_MODALITY_SET"] + src__extractors__communication_helpers__nestedParticipant["nestedParticipant"] + src__extractors__docs_deterministic__codeBlockRecord["codeBlockRecord"] + src__extractors__nl_llm_helpers__NlAttemptError__resolveObject["resolveObject"] + src__extractors__docs_deterministic__handleDocumentationLine["handleDocumentationLine"] + src__extractors__docs_chunks__sectionLines["sectionLines"] + src__extractors__configuration__relative["relative"] + src__extractors__communication_helpers__nestedRole["nestedRole"] + src__extractors__docs_chunks__takeLineBatch["takeLineBatch"] + src__extractors__configuration__match["match"] + src__extractors__changelog__lines["lines"] + src__extractors__docs_record__isPlaceholder["isPlaceholder"] + src__extractors__docs_record__allowedLifecycle["allowedLifecycle"] + src__extractors__nl_llm_helpers__NlAttemptError__nlStrings["nlStrings"] + src__extractors__markdown_paths__isRepositoryPath["isRepositoryPath"] + src__extractors__git__result["result"] + src__extractors__todo__lines["lines"] + src__extractors__communication_helpers__normalize["normalize"] + src__extractors__git__execFileAsync["execFileAsync"] + src__extractors__configuration__extractConfigurationIntent["extractConfigurationIntent"] + src__extractors__docs_deterministic__statementRecord["statementRecord"] + src__extractors__docs_deterministic__root["root"] + src__extractors__markdown_paths__repositoryRoot["repositoryRoot"] + src__extractors__nl__detectMissingFields["detectMissingFields"] + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord["toIntentRecord"] + src__extractors__ast__external__result["result"] + src__extractors__todo__extractTodo["extractTodo"] + src__extractors__communication_helpers__parseEnvelope["parseEnvelope"] + src__extractors__docs_record__resolveModality["resolveModality"] + src__extractors__todo__task["task"] + src__extractors__communication_helpers__inferIdentityFromPathAndFilename["inferIdentityFromPathAndFilena"] + src__extractors__docs_deterministic__targetsOf["targetsOf"] + src__extractors__markdown_paths__isNestedCheckout["isNestedCheckout"] + src__extractors__communication_helpers__unquote["unquote"] + src__extractors__docs_chunks__item["item"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__outcomes["outcomes"] + src__extractors__markdown_paths__scanDirectoryForBasenames["scanDirectoryForBasenames"] + src__extractors__docs_deterministic__convertDocument["convertDocument"] + src__extractors__ast__external__runExternalAstAdapter["runExternalAstAdapter"] + src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk["extractChunk"] + src__extractors__docs_schema__strings["strings"] + src__extractors__runtime_cycle__label["label"] + src__extractors__todo__extractExplicitId["extractExplicitId"] + src__extractors__nl_llm_helpers__NlAttemptError__normalizedText["normalizedText"] + src__extractors__communication_helpers__sameStrings["sameStrings"] + src__extractors__communication_file_helpers__appendTimestampWarnings["appendTimestampWarnings"] + src__extractors__docs_llm__DocumentationLlmRequiredError__requireConfiguredClient["requireConfiguredClient"] + src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt["sourceExcerpt"] + src__extractors__docs_deterministic__parseSectionHeading["parseSectionHeading"] + src__extractors__communication_helpers__inferIdentity["inferIdentity"] + src__extractors__git__takeNextDiscoveryDirectory["takeNextDiscoveryDirectory"] + src__extractors__communication_helpers__isTicketEvidenceFile["isTicketEvidenceFile"] + src__extractors__markdown_paths__headingDirectories["headingDirectories"] + src__extractors__communication_file_helpers__appendA2aAgentWarnings["appendA2aAgentWarnings"] + src__extractors__todo__inferOwner["inferOwner"] + src__extractors__runtime_cycle__probeRecord["probeRecord"] + src__extractors__docs_record__target["target"] + src__extractors__git__createDiscoveryState["createDiscoveryState"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering["enrichBatchCovering"] + src__extractors__docs_chunks__worker["worker"] + src__extractors__nl_llm__NlLlmRequiredError__assertNlExtractionOptions["assertNlExtractionOptions"] + src__extractors__docs_llm__DocumentationLlmRequiredError__files["files"] + src__extractors__markdown_llm__MarkdownLlmRequiredError__extractMarkdownIntentAudited["extractMarkdownIntentAudited"] + src__extractors__git__gitMarkerState["gitMarkerState"] + src__extractors__runtime_cycle__parseCycle["parseCycle"] + src__extractors__communication_file_helpers__shouldSkipCommunicationFile["shouldSkipCommunicationFile"] + src__extractors__configuration__dockerEntries["dockerEntries"] + src__extractors__git__isGitWorkTree["isGitWorkTree"] + src__extractors__communication_helpers__communicationSegments["communicationSegments"] + src__extractors__changelog__body["body"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownBatchWithCorrection["enrichMarkdownBatchWithCorrect"] + src__extractors__configuration__configurationFormat["configurationFormat"] + src__extractors__docs_deterministic__marker["marker"] + src__extractors__configuration__findKeyLine["findKeyLine"] + src__extractors__communication_file_helpers__inferred["inferred"] + src__extractors__todo__heading["heading"] + src__extractors__docs_chunks__flush["flush"] + src__extractors__communication_helpers__isCommunicationType["isCommunicationType"] + src__extractors__communication_helpers__normalizeType["normalizeType"] + src__extractors__configuration__files["files"] + src__extractors__docs_deterministic__readParagraph["readParagraph"] + src__extractors__docs_record__linesFromChunk["linesFromChunk"] + src__extractors__nl__inferActor["inferActor"] + src__extractors__docs_record__action["action"] + src__extractors__docs_record__clampLine["clampLine"] + src__extractors__runtime_cycle__boundedArray["boundedArray"] + src__extractors__docs_chunks__splitLongSection["splitLongSection"] + src__extractors__todo__classified["classified"] + src__extractors__git__state["state"] + src__extractors__runtime_cycle__driftRecord["driftRecord"] + src__extractors__configuration__entries["entries"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__emptyCoverage["emptyCoverage"] + src__extractors__todo__relative["relative"] + src__extractors__docs_chunks__chunkMarkdown["chunkMarkdown"] + src__extractors__communication_file_helpers__appendRoleAndParticipantWarnings["appendRoleAndParticipantWarnin"] + src__extractors__nl__classified["classified"] + src__extractors__docs_chunks__index["index"] + src__extractors__todo__action["action"] + src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow["fallbackOrThrow"] + src__extractors__communication_helpers__isCommunicationNoise["isCommunicationNoise"] + src__extractors__nl_llm_helpers__NlAttemptError__lines["lines"] + src__extractors__configuration__configurationRecords["configurationRecords"] + src__extractors__docs_record__toDocumentIntentRecord["toDocumentIntentRecord"] + src__extractors__docs_record__allowedModality["allowedModality"] + src__extractors__docs_llm__DocumentationLlmRequiredError__readPrompt["readPrompt"] + src__extractors__communication_helpers__flush["flush"] + src__extractors__docs_record__keywordOverlap["keywordOverlap"] + src__extractors__changelog__changelogAction["changelogAction"] + src__extractors__configuration__MAX_ENTRIES_PER_FILE["MAX_ENTRIES_PER_FILE"] + src__extractors__git__hasMoreDiscoveryWork["hasMoreDiscoveryWork"] + src__extractors__configuration__line["line"] + src__extractors__docs_record__statementText["statementText"] + src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings["strings"] + src__extractors__nl__body["body"] + src__extractors__docs_record__resolveTarget["resolveTarget"] + src__extractors__git__discoverGitRepositories["discoverGitRepositories"] + src__extractors__git__finishDiscovery["finishDiscovery"] + src__extractors__nl__missing["missing"] + src__extractors__docs_chunks__mapConcurrent["mapConcurrent"] + src__extractors__docs_schema__documentResponseContract["documentResponseContract"] + src__extractors__nl_llm_helpers__NlAttemptError__allowedModality["allowedModality"] + src__extractors__markdown_paths__state["state"] + src__extractors__docs_record__resolveObject["resolveObject"] end + rust_ast__src__main__main --> rust_ast__src__main__arguments + rust_ast__src__main__main --> rust_ast__src__main__collect_files + rust_ast__src__main__main --> rust_ast__src__main__slash + rust_ast__src__main__collect_files --> rust_ast__src__main__slash + rust_ast__src__main__add --> rust_ast__src__main__excerpt + rust_ast__src__main__visit_item_mod --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_mod --> rust_ast__src__main__add + rust_ast__src__main__visit_item_use --> rust_ast__src__main__add + rust_ast__src__main__visit_item_struct --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_enum --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_trait --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_type --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_const --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_const --> rust_ast__src__main__add + rust_ast__src__main__visit_item_const --> rust_ast__src__main__modifiers + rust_ast__src__main__visit_item_static --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_static --> rust_ast__src__main__add + rust_ast__src__main__visit_item_static --> rust_ast__src__main__modifiers + rust_ast__src__main__visit_item_fn --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_fn --> rust_ast__src__main__add + rust_ast__src__main__visit_impl_item_fn --> rust_ast__src__main__add + rust_ast__src__main__visit_expr_call --> rust_ast__src__main__add + rust_ast__src__main__visit_expr_method_call --> rust_ast__src__main__add + rust_ast__src__main__type_item --> rust_ast__src__main__qualified + rust_ast__src__main__type_item --> rust_ast__src__main__add + rust_ast__src__main__type_item --> rust_ast__src__main__modifiers + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleHealth + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleEventPublish + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleEventList + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleHealth + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleEventPublish + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleEventList + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleHealth --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleHealth --> examples__backend__src__request_handlers__size + examples__backend__src__request_handlers__handleEventPublish --> examples__backend__src__request_handlers__readBody + examples__backend__src__request_handlers__handleEventPublish --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__validation --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__event --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__parseOffset + examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__parseLimit + examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__sendJson + examples__backend__src__validation__ALLOWED_ACTIONS --> examples__backend__src__validation__invalid + examples__backend__src__validation__validateEventPayload --> examples__backend__src__validation__invalid + examples__backend__src__validation__record --> examples__backend__src__validation__invalid + examples__backend__src__validation__agent --> examples__backend__src__validation__invalid + examples__backend__src__validation__action --> examples__backend__src__validation__invalid + examples__backend__src__validation__object --> examples__backend__src__validation__invalid + examples__backend__src__server__createBackend --> examples__backend__src__server__sendJson + examples__backend__src__server__store --> examples__backend__src__server__sendJson + examples__backend__src__server__server --> examples__backend__src__server__sendJson + examples__backend__src__server__startBackend --> examples__backend__src__server__createBackend + examples__frontend__src__render__toRows --> examples__frontend__src__render__classifyEvent + examples__frontend__src__render__renderTable --> examples__frontend__src__render__headerRow + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__createState + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__refresh + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__reload + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__state + examples__frontend__src__app__state --> examples__frontend__src__app__refresh + examples__frontend__src__app__reload --> examples__frontend__src__app__refresh + examples__src__runtime__executeContract --> examples__src__runtime__validateContract + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__add + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__emit + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__collect + java__JavaAstExtract__JavaAstExtract__emit --> java__JavaAstExtract__JavaAstExtract__json + java__JavaAstExtract__JavaAstExtract__emit --> java__JavaAstExtract__JavaAstExtract__map + java__JavaAstExtract__JavaAstExtract__collect --> java__JavaAstExtract__JavaAstExtract__try + java__JavaAstExtract__JavaAstExtract__collect --> java__JavaAstExtract__JavaAstExtract__containsIgnored + java__JavaAstExtract__JavaAstExtract__try --> java__JavaAstExtract__JavaAstExtract__slash + java__JavaAstExtract__JavaAstExtract__json --> java__JavaAstExtract__JavaAstExtract__escape src__cli__main --> src__cli__printHelp src__cli__main --> src__cli__parseArgs - src__cli__main --> src__cli__initProject + src__cli__main --> src__cli__resolveMainCommand + src__cli__main --> src__cli__commandHandlers src__cli__parsed --> src__cli__printHelp src__cli__command --> src__cli__printHelp + src__cli__commandHandlers --> src__cli__initProject + src__cli__commandHandlers --> src__cli__doctor + src__cli__handleLink --> src__cli__emitJson + src__cli__handleLink --> src__cli__optionString + src__cli__handleDiagnose --> src__cli__emitJson + src__cli__handleDiagnose --> src__cli__optionString + src__cli__handleSummarize --> src__cli__optionString + src__cli__handleSummarize --> src__cli__optionSummaryMode src__cli__diagnosticsPath --> src__cli__optionNumber src__cli__diagnosticsPath --> src__cli__optionBoolean src__cli__diagnostics --> src__cli__optionNumber src__cli__diagnostics --> src__cli__optionBoolean src__cli__result --> src__cli__execFileAsync + src__cli__handleProposeTodo --> src__cli__optionString + src__cli__handleProposeTodo --> src__cli__optionTaskMode + src__cli__handleRenderTodo --> src__cli__optionString + src__cli__handleApplyTodo --> src__cli__optionString + src__cli__handleProposeCodeChange --> src__cli__optionString + src__cli__handleRenderCodeChange --> src__cli__optionString + src__cli__handleProposeSourcePatch --> src__cli__optionString src__cli__isPlanSet --> src__cli__optionString + src__cli__handleApplySourcePatch --> src__cli__optionString + src__cli__handleEvaluateCodeChange --> src__cli__optionString + src__cli__handleCloseCodeChange --> src__cli__optionString + src__cli__handleCompareWorkspace --> src__cli__resolvePipelineRoot + src__cli__handleCompareWorkspace --> src__cli__buildWorkspaceComparisonOptions src__cli__root --> src__cli__optionString src__cli__root --> src__cli__optionNullableString src__cli__root --> src__cli__optionLlmMode - src__cli__handleWatch --> src__cli__optionNullableString - src__cli__handleWatch --> src__cli__optionList - src__cli__handleWatch --> src__cli__optionBoolean - src__cli__handleWatch --> src__cli__optionString + src__cli__handlePipeline --> src__cli__resolvePipelineRoot + src__cli__handlePipeline --> src__cli__buildPipelineOptions + src__cli__handlePipeline --> src__cli__optionNullableString + src__cli__handlePipeline --> src__cli__reportPipelineDegradation + src__cli__handleWatch --> src__cli__resolvePipelineRoot + src__cli__handleWatch --> src__cli__resolveWatchTaskFile + src__cli__handleWatch --> src__cli__buildPipelineOptions src__cli__handleWatch --> src__cli__optionNumber - src__cli__handleWatch --> src__cli__optionNlMode - src__cli__taskFile --> src__cli__optionNullableString - src__cli__taskFile --> src__cli__optionList - src__cli__taskFile --> src__cli__optionBoolean - src__cli__taskFile --> src__cli__optionString + src__cli__handleWatch --> src__cli__optionBoolean src__cli__taskFile --> src__cli__optionNumber - src__cli__taskFile --> src__cli__optionNlMode - src__cli__taskFile --> src__cli__optionLlmMode - src__cli__taskFile --> src__cli__optionPipelineTaskMode + src__cli__taskFile --> src__cli__optionBoolean + src__cli__taskFile --> src__cli__formatWatchEvent + src__cli__pipeline --> src__cli__optionNumber + src__cli__pipeline --> src__cli__optionBoolean + src__cli__pipeline --> src__cli__formatWatchEvent src__cli__controller --> src__cli__optionNumber src__cli__controller --> src__cli__optionBoolean src__cli__controller --> src__cli__formatWatchEvent src__cli__stop --> src__cli__optionNumber src__cli__stop --> src__cli__optionBoolean src__cli__stop --> src__cli__formatWatchEvent + src__cli__buildPipelineOptions --> src__cli__buildCommonPipelineOptions + src__cli__buildCommonPipelineOptions --> src__cli__optionNullableString + src__cli__buildCommonPipelineOptions --> src__cli__optionList + src__cli__buildCommonPipelineOptions --> src__cli__optionBoolean + src__cli__buildCommonPipelineOptions --> src__cli__optionString + src__cli__buildCommonPipelineOptions --> src__cli__optionNumber + src__cli__buildCommonPipelineOptions --> src__cli__optionNlMode + src__cli__buildCommonPipelineOptions --> src__cli__optionLlmMode + src__cli__buildCommonPipelineOptions --> src__cli__optionPipelineTaskMode + src__cli__resolveWatchTaskFile --> src__cli__optionNullableString + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionString + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionNullableString + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionList + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionBoolean + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionLlmMode + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionNumber src__cli__formatWatchEvent --> src__cli__file src__cli__stamp --> src__cli__file + src__cli__handleDiff --> src__cli__parseDiffMode + src__cli__handleDiff --> src__cli__handleGraphDiff + src__cli__handleDiff --> src__cli__buildDiffPayload src__cli__handleDiff --> src__cli__optionString src__cli__handleDiff --> src__cli__optionNumber - src__cli__mode --> src__cli__optionNumber src__cli__svg --> src__cli__optionNumber src__cli__svg --> src__cli__optionBoolean - src__cli__html --> src__cli__optionNumber + src__cli__parseDiffMode --> src__cli__optionString + src__cli__handleGraphDiff --> src__cli__optionString + src__cli__handleGraphDiff --> src__cli__optionNumber src__cli__diff --> src__cli__optionNumber + src__cli__buildDiffPayload --> src__cli__buildFileDiff + src__cli__buildDiffPayload --> src__cli__buildGitDiff + src__cli__buildFileDiff --> src__cli__optionNumber src__cli__context --> src__cli__optionString src__cli__context --> src__cli__optionBoolean src__cli__context --> src__cli__optionNumber - src__cli__maxRows --> src__cli__optionString - src__cli__maxRows --> src__cli__optionBoolean - src__cli__maxRows --> src__cli__optionNumber + src__cli__buildGitDiff --> src__cli__optionNumber + src__cli__buildGitDiff --> src__cli__optionString + src__cli__buildGitDiff --> src__cli__optionBoolean src__cli__handleReality --> src__cli__optionString src__cli__handleReality --> src__cli__optionNumber src__cli__handleReality --> src__cli__optionBoolean src__cli__view --> src__cli__optionNumber src__cli__view --> src__cli__optionBoolean src__cli__handleExtract --> src__cli__optionString - src__cli__handleExtract --> src__cli__optionNlMode - src__cli__handleExtract --> src__cli__emitExtraction - src__cli__handleExtract --> src__cli__optionNumber - src__cli__extractor --> src__cli__optionString - src__cli__extractor --> src__cli__optionNlMode - src__cli__extractor --> src__cli__emitExtraction + src__cli__handleExtract --> src__cli__handler + src__cli__handleExtractNl --> src__cli__optionString + src__cli__handleExtractNl --> src__cli__optionNlMode + src__cli__handleExtractNl --> src__cli__emitExtraction + src__cli__handleExtractGit --> src__cli__optionNumber + src__cli__handleExtractGit --> src__cli__emitExtraction + src__cli__handleExtractAst --> src__cli__emitExtraction + src__cli__handleExtractConfig --> src__cli__emitExtraction + src__cli__handleExtractRuntime --> src__cli__emitExtraction + src__cli__handleExtractMarkdown --> src__cli__optionNullableString + src__cli__handleExtractMarkdown --> src__cli__optionLlmMode + src__cli__handleExtractMarkdown --> src__cli__emitExtraction + src__cli__handleExtractDocs --> src__cli__optionList + src__cli__handleExtractDocs --> src__cli__emitExtraction + src__cli__handleExtractCommunication --> src__cli__optionString + src__cli__handleExtractCommunication --> src__cli__optionNullableString + src__cli__handleExtractCommunication --> src__cli__optionLlmMode + src__cli__handleExtractCommunication --> src__cli__emitExtraction src__cli__handleCommunication --> src__cli__optionString src__cli__handleCommunication --> src__cli__optionNullableString src__cli__handleCommunication --> src__cli__optionLlmMode src__cli__handleCommunication --> src__cli__optionNumber src__cli__handleCommunication --> src__cli__optionBoolean + src__cli__handleIntake --> src__cli__optionString + src__cli__handleIntake --> src__cli__optionBoolean + src__cli__absolute --> src__cli__optionString src__cli__doctor --> src__cli__execFileAsync src__cli__optionNumber --> src__cli__optionString src__cli__optionList --> src__cli__optionString @@ -450,427 +620,296 @@ flowchart LR src__cli__optionSummaryMode --> src__cli__optionBoolean src__cli__optionPipelineTaskMode --> src__cli__optionString src__cli__invokedPath --> src__cli__main - src__web__diff_ui__diffUiHtml --> src__web__diff_ui__byId - src__web__diff_ui__requestHeaders --> src__web__diff_ui__byId - src__web__diff_ui__formatBytes --> src__web__diff_ui__selectedRun - src__web__diff_ui__formatBytes --> src__web__diff_ui__byId - src__web__diff_ui__selectedRun --> src__web__diff_ui__byId - src__web__diff_ui__selectedRun --> src__web__diff_ui__formatBytes - src__web__diff_ui__updateMeta --> src__web__diff_ui__selectedRun - src__web__diff_ui__updateMeta --> src__web__diff_ui__byId - src__web__diff_ui__updateMeta --> src__web__diff_ui__formatBytes - src__web__diff_ui__fillSelect --> src__web__diff_ui__byId - src__web__diff_ui__fillSelect --> src__web__diff_ui__updateMeta - src__web__diff_ui__loadRuns --> src__web__diff_ui__byId - src__web__diff_ui__loadRuns --> src__web__diff_ui__requestHeaders - src__web__diff_ui__compareGraphs --> src__web__diff_ui__byId - src__web__diff_ui__compareGraphs --> src__web__diff_ui__requestHeaders - src__watch__watcher__scanTree --> src__watch__watcher__relative - src__watch__watcher__maxFiles --> src__watch__watcher__relative - src__watch__watcher__maxFiles --> src__watch__watcher__visit - src__watch__watcher__absoluteRoot --> src__watch__watcher__relative - src__watch__watcher__absoluteRoot --> src__watch__watcher__visit - src__watch__watcher__visit --> src__watch__watcher__relative - src__watch__watcher__absolute --> src__watch__watcher__visit - src__watch__watcher__relative --> src__watch__watcher__visit - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__now - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__scanTree - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__emit - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__generate - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__sleep - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__diffSnapshots - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__now - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__scanTree - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__emit - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__generate - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__sleep - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__diffSnapshots - src__watch__watcher__watchRepository --> src__watch__watcher__now - src__watch__watcher__watchRepository --> src__watch__watcher__scanTree - src__watch__watcher__watchRepository --> src__watch__watcher__emit - src__watch__watcher__watchRepository --> src__watch__watcher__generate - src__watch__watcher__watchRepository --> src__watch__watcher__sleep - src__watch__watcher__watchRepository --> src__watch__watcher__diffSnapshots - src__watch__watcher__result --> src__watch__watcher__emit - src__watch__watcher__result --> src__watch__watcher__now - src__watch__watcher__snapshot --> src__watch__watcher__emit - src__watch__watcher__lastReportStartedAt --> src__watch__watcher__now - src__watch__watcher__lastReportStartedAt --> src__watch__watcher__generate - src__watch__watcher__pending --> src__watch__watcher__now - src__watch__watcher__pending --> src__watch__watcher__generate - src__watch__watcher__current --> src__watch__watcher__describeDelta - src__watch__watcher__current --> src__watch__watcher__emit - src__watch__watcher__delta --> src__watch__watcher__describeDelta - src__watch__watcher__delta --> src__watch__watcher__emit - src__watch__watcher__waitMs --> src__watch__watcher__emit - src__watch__watcher__generate --> src__watch__watcher__emit - src__watch__watcher__generate --> src__watch__watcher__now - src__watch__watcher__generate --> src__watch__watcher__runReport - src__watch__watcher__generate --> src__watch__watcher__scanTree - src__watch__watcher__startedAt --> src__watch__watcher__runReport - src__watch__watcher__startedAt --> src__watch__watcher__emit - src__watch__watcher__startedAt --> src__watch__watcher__now - src__watch__watcher__defaultSleep --> src__watch__watcher__finish - src__watch__watcher__timer --> src__watch__watcher__finish - src__watch__watcher__onAbort --> src__watch__watcher__finish - src__tf__classifier__dynamicImport --> src__tf__classifier__importer - src__tf__classifier__loadClassifier --> src__tf__classifier__dynamicImport - src__tf__classifier__loadClassifier --> src__tf__classifier__loadAssets - src__tf__classifier__classifyAction --> src__tf__classifier__loadClassifier - src__tf__classifier__classifyAction --> src__tf__classifier__vectorize - src__synthesis__validation__validateAndClassifyTodoProposals --> src__synthesis__validation__duplicateEvidence - src__synthesis__validation__validateAndClassifyTodoProposals --> src__synthesis__validation__dependencyFirstPriorityOrder - src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__words - src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__intersects - src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__jaccard - src__synthesis__validation__proposalWords --> src__synthesis__validation__words - src__synthesis__validation__target --> src__synthesis__validation__jaccard - src__synthesis__validation__target --> src__synthesis__validation__words - src__synthesis__validation__sharedTicket --> src__synthesis__validation__jaccard - src__synthesis__validation__sharedTicket --> src__synthesis__validation__words - src__synthesis__validation__sharedSymbol --> src__synthesis__validation__jaccard - src__synthesis__validation__sharedSymbol --> src__synthesis__validation__words - src__synthesis__validation__sharedPath --> src__synthesis__validation__jaccard - src__synthesis__validation__sharedPath --> src__synthesis__validation__words - src__synthesis__validation__similarity --> src__synthesis__validation__jaccard - src__synthesis__validation__similarity --> src__synthesis__validation__words - src__synthesis__todo_patch__createTodoPatch --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__orderedSelected --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__markdown --> src__synthesis__todo_patch__normalizePath - src__synthesis__todo_patch__markdown --> src__synthesis__todo_patch__diagnosticReportFingerprint - src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__inline - src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__renderTargets - src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__renderIds - src__synthesis__todo_patch__writeTodoPatchArtifacts --> src__synthesis__todo_patch__createTodoPatch - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertTodoPatchArtifact - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertApproval - src__synthesis__todo_patch__current --> src__synthesis__todo_patch__assertReceipt - src__synthesis__todo_patch__now --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__now --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__now --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__result --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__result --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__result --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__isoDate - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__hash - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__nonBlank - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__assertApproval --> src__synthesis__todo_patch__nonBlank - src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__nonBlank - src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__isoDate - src__synthesis__todo_patch__renderTargets --> src__synthesis__todo_patch__inline - src__synthesis__todo_patch__rendered --> src__synthesis__todo_patch__inline - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__readPrompt - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection - src__synthesis__tasks_llm__TaskSynthesisAttemptError__startedAt --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions - src__synthesis__tasks_llm__TaskSynthesisAttemptError__client --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow - src__synthesis__tasks_llm__TaskSynthesisAttemptError__prompt --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection - src__synthesis__tasks_llm__TaskSynthesisAttemptError__payload --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__generationMetadata - src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesisAudit - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeLocalKeys - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__parsed --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__parsed --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__proposalKeys --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__proposalKeys --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusions --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__conclusions --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__diagnosticIds --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__proposalIdByKey --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__proposals --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__keys --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__mapKeys --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__mapKeys --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__sortedUnique --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__normalizeRawTarget --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT --> src__synthesis__task_synthesis_contract__nonBlank - src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT --> src__synthesis__task_synthesis_contract__taskIds - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__nonBlank - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__taskStrings - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__taskIds - src__synthesis__code_change_plan__generatedAt --> src__synthesis__code_change_plan__createCodeChangeSourcePatch - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__relatedRecords --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__matchingProposals --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__matchingConclusions --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__target --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__changes --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__planHash --> src__synthesis__code_change_plan__confidenceFor - src__synthesis__code_change_plan__planIds --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance - src__synthesis__code_change_plan__acceptances --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance - src__synthesis__code_change_plan__acceptedCount --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__indexProposalsByDiagnostic --> src__synthesis__code_change_plan__set - src__synthesis__code_change_plan__index --> src__synthesis__code_change_plan__set - src__synthesis__code_change_plan__indexConclusionsByDiagnostic --> src__synthesis__code_change_plan__set - src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__assertSourcePatchStrings - src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__normalizeUnifiedDiff - src__synthesis__code_change_plan__buildChanges --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__titleFor --> src__synthesis__code_change_plan__startsWithImperative - src__synthesis__code_change_plan__record --> src__synthesis__code_change_plan__startsWithImperative - src__synthesis__code_change_plan__object --> src__synthesis__code_change_plan__startsWithImperative - src__synthesis__code_change_plan__acceptanceCriteriaFor --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__riskFor --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__rollbackFor --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__createCodeChangeReviewPatch --> src__synthesis__code_change_plan__priorityRank - src__synthesis__code_change_plan__markdown --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown --> src__synthesis__code_change_plan__inline - src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown --> src__synthesis__code_change_plan__renderIds - src__synthesis__code_change_plan__rawDiff --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__rawDiff --> src__synthesis__code_change_plan__instructionFor - src__synthesis__code_change_plan__unifiedDiff --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__unifiedDiff --> src__synthesis__code_change_plan__instructionFor - src__synthesis__code_change_plan__patchHash --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__createCodeChangeSourcePatch - src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertSourcePatchIds - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertSourcePatchStrings - src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__plansById --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__patchIds --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__applyCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__applyCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertExistingSourceReceipt - src__synthesis__code_change_plan__now --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__fileHashesAfter --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__assertExistingSourceReceipt --> src__synthesis__code_change_plan__assertSourceApplyReceipt - src__synthesis__code_change_plan__assertSourceApplyReceipt --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__assertSourceApplyReceipt --> src__synthesis__code_change_plan__exactSourcePatchSet - src__synthesis__code_change_plan__applyUnifiedDiffToText --> src__synthesis__code_change_plan__normalizeUnifiedDiff - src__synthesis__code_change_plan__applyUnifiedDiffToText --> src__synthesis__code_change_plan__splitKeep - src__synthesis__code_change_path__isUsefulCodeChangePath --> src__synthesis__code_change_path__isPlannablePath - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__assertConclusions - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__summaryMode - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__readPrompt - src__summary__summarizer__mode --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__mode --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__client --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__client --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection - src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection - src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection --> src__summary__summarizer__SummaryAttemptError__materializeConclusions - src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__SummaryAttemptError__conclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__materializeConclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__materializeConclusions --> src__summary__summarizer__SummaryAttemptError__assertConclusions - src__summary__summarizer__SummaryAttemptError__parsed --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__deterministicConclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__deterministicConclusions --> src__summary__summarizer__SummaryAttemptError__assertConclusions - src__summary__render__renderSummaryMarkdown --> src__summary__render__renderRecords - src__summary__render__renderSummaryMarkdown --> src__summary__render__renderConclusion - src__summary__render__renderSummaryMarkdown --> src__summary__render__recordCitations - src__summary__render__actions --> src__summary__render__recordCitations - src__summary__render__confidence --> src__summary__render__recordCitations - src__summary__render__renderConclusion --> src__summary__render__recordCitations - src__services__actions__executeAction --> src__services__actions__resolveRoot - src__services__actions__executeAction --> src__services__actions__scopedPath - src__services__actions__executeAction --> src__services__actions__nlModeValue - src__services__actions__executeAction --> src__services__actions__numberValue - src__services__actions__executeAction --> src__services__actions__nullableScopedPath - src__services__actions__root --> src__services__actions__scopedPath - src__services__actions__root --> src__services__actions__nlModeValue - src__services__actions__root --> src__services__actions__numberValue - src__services__actions__root --> src__services__actions__nullableScopedPath - src__services__actions__root --> src__services__actions__llmModeValue - src__services__actions__analysis --> src__services__actions__booleanValue - src__services__actions__graph --> src__services__actions__booleanValue - src__services__actions__graph --> src__services__actions__numberValue - src__services__actions__diagnostics --> src__services__actions__booleanValue - src__services__actions__diagnostics --> src__services__actions__numberValue - src__services__actions__result --> src__services__actions__stringValue - src__services__actions__result --> src__services__actions__booleanValue - src__services__actions__result --> src__services__actions__numberValue - src__services__actions__todoPath --> src__services__actions__stringValue - src__services__actions__receiptPath --> src__services__actions__stringValue - src__services__actions__conclusions --> src__services__actions__numberValue - src__services__actions__proposals --> src__services__actions__numberValue - src__services__actions__patch --> src__services__actions__stringValue - src__services__actions__beforeGraph --> src__services__actions__hasInputValue - src__services__actions__beforeDiagnostics --> src__services__actions__hasInputValue - src__services__actions__afterGraph --> src__services__actions__hasInputValue - src__services__actions__afterDiagnostics --> src__services__actions__hasInputValue - src__services__actions__value --> src__services__actions__hasInputValue - src__services__actions__beforeInput --> src__services__actions__numberValue - src__services__actions__afterInput --> src__services__actions__numberValue - src__services__actions__before --> src__services__actions__numberValue - src__services__actions__after --> src__services__actions__numberValue - src__services__actions__diff --> src__services__actions__stringValue - src__services__actions__diff --> src__services__actions__numberValue - src__services__actions__svg --> src__services__actions__numberValue - src__services__actions__beforePath --> src__services__actions__stringValue - src__services__actions__beforePath --> src__services__actions__numberValue - src__services__actions__afterPath --> src__services__actions__stringValue - src__services__actions__afterPath --> src__services__actions__numberValue - src__services__actions__view --> src__services__actions__booleanValue - src__services__actions__view --> src__services__actions__numberValue - src__services__actions__filterCommunicationGraph --> src__services__actions__stringValue - src__services__actions__filterCommunicationGraph --> src__services__actions__booleanValue - src__services__actions__nlModeValue --> src__services__actions__llmModeValue - src__services__actions__summaryModeValue --> src__services__actions__llmModeValue - src__services__actions__summaryModeValue --> src__services__actions__booleanValue - src__services__actions__withTextDiffViews --> src__services__actions__stringValue - src__services__actions__withTextDiffViews --> src__services__actions__booleanValue - src__services__actions__withTextDiffViews --> src__services__actions__numberValue - src__services__actions__title --> src__services__actions__booleanValue - src__services__actions__title --> src__services__actions__numberValue - src__services__actions__scopedPath --> src__services__actions__stringValue - src__services__actions__nullableScopedPath --> src__services__actions__nullableString - src__services__actions__readRecords --> src__services__actions__stringList - src__semantic__reranker__createSemanticCandidateSet --> src__semantic__reranker__requiredText - src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__validDate - src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__validateRetrieval - src__semantic__reranker__records --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__records --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__records --> src__semantic__reranker__requiredText - src__semantic__reranker__seenIds --> src__semantic__reranker__boundedScore - src__semantic__reranker__seenPairs --> src__semantic__reranker__boundedScore - src__semantic__reranker__byDeclaration --> src__semantic__reranker__boundedScore - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__assertSemanticCandidateSet - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__requiredText - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__decisions --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__decisions --> src__semantic__reranker__requiredText - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__assertSemanticCandidateSet - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validDate - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validateGeneration - src__semantic__reranker__seenDecisions --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__seenDecisions --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__seenDecisions --> src__semantic__reranker__requiredText - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__requiredText - src__semantic__reranker__applyAcceptedSemanticRelations --> src__semantic__reranker__assertSemanticRerankResult - src__semantic__reranker__applyAcceptedSemanticRelations --> src__semantic__reranker__values - src__semantic__reranker__validateRetrieval --> src__semantic__reranker__requiredText - src__semantic__reranker__validateGeneration --> src__semantic__reranker__requiredText - src__semantic__reranker__validateVerdictReason --> src__semantic__reranker__assertSemanticVerdictReason - src__semantic__reranker__assertGroundedQuote --> src__semantic__reranker__requiredText - src__semantic__reranker__quote --> src__semantic__reranker__requiredText - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticCandidateSet - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshot - src__semantic__reranker_llm__SemanticRerankerRequiredError__model --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult - src__semantic__reranker_llm__SemanticRerankerRequiredError__modelRevision --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult - src__semantic__reranker_llm__SemanticRerankerRequiredError__payload --> src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord - src__pipeline__run__runPipeline --> src__pipeline__run__skippedAudit - src__pipeline__run__docs --> src__pipeline__run__collectTargetHints - src__pipeline__run__docs --> src__pipeline__run__values - src__pipeline__run__configurationExtraction --> src__pipeline__run__skippedAudit - src__pipeline__run__includeCommunication --> src__pipeline__run__skippedAudit - src__pipeline__run__communicationStartedAt --> src__pipeline__run__skippedAudit - src__pipeline__run__communicationAudit --> src__pipeline__run__skippedAudit - src__pipeline__run__communicationInputPresent --> src__pipeline__run__skippedAudit - src__pipeline__run__collectTargetHints --> src__pipeline__run__values - src__pipeline__run__persistFailedRun --> src__pipeline__run__skippedAudit - src__pipeline__run__persistFailedRun --> src__pipeline__run__failureCode - src__pipeline__run__persistFailedRun --> src__pipeline__run__failedAudit - src__pipeline__run__persistFailedRun --> src__pipeline__run__aborted - src__pipeline__run__persistFailedRun --> src__pipeline__run__stageValue - src__pipeline__run__persistFailedRun --> src__pipeline__run__manifestConfiguration - src__pipeline__run__aborted --> src__pipeline__run__skippedAudit - src__pipeline__run__message --> src__pipeline__run__failureCode - src__pipeline__run__knownAudit --> src__pipeline__run__failureCode - src__pipeline__run__failedAudit --> src__pipeline__run__failureCode - src__pipeline__run__stageValue --> src__pipeline__run__failedAudit - src__pipeline__run__stageValue --> src__pipeline__run__aborted - src__pipeline__run__reason --> src__pipeline__run__failureCode - src__operations__validation__dateString --> src__operations__validation__nonBlank - src__operations__validation__assertPrincipalList --> src__operations__validation__uniqueStrings - src__operations__validation__principals --> src__operations__validation__uniqueStrings - src__operations__validation__assertVariableContract --> src__operations__validation__objectValue - src__operations__validation__assertVariableContract --> src__operations__validation__exactKeys - src__operations__validation__assertVariableContract --> src__operations__validation__nonBlank + src__extractors__nl__extractNlIntent --> src__extractors__nl__assertNlExtractionOptions + src__extractors__nl__extractNlIntent --> src__extractors__nl__detectMissingFields + src__extractors__nl__absolute --> src__extractors__nl__detectMissingFields + src__extractors__nl__absolute --> src__extractors__nl__inferActor + src__extractors__nl__body --> src__extractors__nl__detectMissingFields + src__extractors__nl__body --> src__extractors__nl__inferActor + src__extractors__nl__sourcePath --> src__extractors__nl__detectMissingFields + src__extractors__nl__sourcePath --> src__extractors__nl__inferActor + src__extractors__nl__classified --> src__extractors__nl__inferActor + src__extractors__nl__action --> src__extractors__nl__inferActor + src__extractors__nl__object --> src__extractors__nl__inferActor + src__extractors__nl__missing --> src__extractors__nl__inferActor + src__extractors__nl__confidence --> src__extractors__nl__inferActor + src__extractors__ast__isExtractionResult --> src__extractors__ast__isIntentRecords + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__parseCycle + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__sourcePathFor + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__boundedArray + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__probeRecord + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__violationRecord + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__parseCycle + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__sourcePathFor + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__boundedArray + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__probeRecord + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__violationRecord + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__probeRecord + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__boundedArray + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__violationRecord + src__extractors__runtime_cycle__label --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__watched + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__tags + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__factsMetadata + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__watched + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__tags + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__jsonScalar + src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__tags + src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__jsonScalar + src__extractors__runtime_cycle__proposalRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__proposalRecord --> src__extractors__runtime_cycle__proposalAction + src__extractors__runtime_cycle__factsMetadata --> src__extractors__runtime_cycle__jsonScalar + src__extractors__configuration__MAX_ENTRIES_PER_FILE --> src__extractors__configuration__isConfigurationPath + src__extractors__configuration__MAX_ENTRIES_PER_FILE --> src__extractors__configuration__configurationRecords + src__extractors__configuration__extractConfigurationIntent --> src__extractors__configuration__isConfigurationPath + src__extractors__configuration__extractConfigurationIntent --> src__extractors__configuration__configurationRecords + src__extractors__configuration__files --> src__extractors__configuration__configurationRecords + src__extractors__configuration__relative --> src__extractors__configuration__configurationRecords + src__extractors__configuration__configurationRecords --> src__extractors__configuration__dockerEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__jsonEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__tomlEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__yamlOrAssignmentEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__fileAggregate + src__extractors__configuration__entries --> src__extractors__configuration__fileAggregate + src__extractors__configuration__bounded --> src__extractors__configuration__fileAggregate + src__extractors__configuration__fileAggregate --> src__extractors__configuration__configurationFormat + src__extractors__configuration__jsonEntries --> src__extractors__configuration__findKeyLine + src__extractors__configuration__parsed --> src__extractors__configuration__findKeyLine + src__extractors__configuration__lines --> src__extractors__configuration__findKeyLine + src__extractors__configuration__tomlEntries --> src__extractors__configuration__entries + src__extractors__configuration__tomlEntries --> src__extractors__configuration__match + src__extractors__configuration__tomlEntries --> src__extractors__configuration__entry + src__extractors__configuration__tomlEntries --> src__extractors__configuration__uniqueEntries + src__extractors__configuration__line --> src__extractors__configuration__entry + src__extractors__configuration__heading --> src__extractors__configuration__entry + src__extractors__configuration__pair --> src__extractors__configuration__entry + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__entries + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__match + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__entry + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__uniqueEntries + src__extractors__configuration__dockerEntries --> src__extractors__configuration__match + src__extractors__docs_schema__target --> src__extractors__docs_schema__strings + src__extractors__docs_schema__documentRecord --> src__extractors__docs_schema__strings + src__extractors__docs_schema__documentRecord --> src__extractors__docs_schema__target + src__extractors__docs_schema__documentResponseSchema --> src__extractors__docs_schema__documentResponseContract + src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited --> src__extractors__nl_llm__NlLlmRequiredError__assertNlExtractionOptions + src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited --> src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow + src__extractors__nl_llm__NlLlmRequiredError__client --> src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__requireConfiguredClient + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__selectWithinBudget + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__readPrompt + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk + src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage + src__extractors__docs_llm__DocumentationLlmRequiredError__files --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage + src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage + src__extractors__changelog__extractChangelog --> src__extractors__changelog__changelogAction + src__extractors__changelog__body --> src__extractors__changelog__changelogAction + src__extractors__changelog__relative --> src__extractors__changelog__changelogAction + src__extractors__changelog__lines --> src__extractors__changelog__changelogAction + src__extractors__docs_deterministic__extractDocumentationBaseline --> src__extractors__docs_deterministic__convertDocument + src__extractors__docs_deterministic__extractDocumentationBaseline --> src__extractors__docs_deterministic__primePathMapper + src__extractors__docs_deterministic__root --> src__extractors__docs_deterministic__convertDocument + src__extractors__docs_deterministic__root --> src__extractors__docs_deterministic__primePathMapper + src__extractors__docs_deterministic__resolver --> src__extractors__docs_deterministic__convertDocument + src__extractors__docs_deterministic__resolver --> src__extractors__docs_deterministic__primePathMapper + src__extractors__docs_deterministic__convertDocument --> src__extractors__docs_deterministic__handleDocumentationLine + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseFenceBlock + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseSectionHeading + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseBulletStatement + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseParagraphStatement + src__extractors__docs_deterministic__parseFenceBlock --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseFenceBlock --> src__extractors__docs_deterministic__codeBlockRecord + src__extractors__docs_deterministic__marker --> src__extractors__docs_deterministic__codeBlockRecord + src__extractors__docs_deterministic__parseSectionHeading --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseSectionHeading --> src__extractors__docs_deterministic__statementRecord + src__extractors__docs_deterministic__heading --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseBulletStatement --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseBulletStatement --> src__extractors__docs_deterministic__qualifyingStatement + src__extractors__docs_deterministic__parseParagraphStatement --> src__extractors__docs_deterministic__readParagraph + src__extractors__docs_deterministic__parseParagraphStatement --> src__extractors__docs_deterministic__qualifyingStatement + src__extractors__docs_deterministic__action --> src__extractors__docs_deterministic__targetsOf + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__buildBasenameIndex + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__headingScopes + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__basenames + src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__headingScopes + src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__basenames + src__extractors__markdown_paths__basenames --> src__extractors__markdown_paths__headingScopes + src__extractors__markdown_paths__basenames --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__headingDirectories --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__headingDirectories --> src__extractors__markdown_paths__basenames + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__createBasenameIndexState + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__readBasenameDirectoryEntries + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__isNestedCheckout + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__scanDirectoryForBasenames + src__extractors__markdown_paths__index --> src__extractors__markdown_paths__readBasenameDirectoryEntries + src__extractors__markdown_paths__index --> src__extractors__markdown_paths__isNestedCheckout + src__extractors__markdown_paths__index --> src__extractors__markdown_paths__scanDirectoryForBasenames + src__extractors__markdown_paths__state --> src__extractors__markdown_paths__readBasenameDirectoryEntries + src__extractors__markdown_paths__state --> src__extractors__markdown_paths__isNestedCheckout + src__extractors__markdown_paths__state --> src__extractors__markdown_paths__scanDirectoryForBasenames + src__extractors__markdown_paths__scanDirectoryForBasenames --> src__extractors__markdown_paths__addBasenameIndexMatch + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveObject + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__anchorToSource + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveTarget + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveAction + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveModality + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveObject + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__anchorToSource + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveTarget + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveAction + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveModality + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__statementText --> src__extractors__docs_record__resolveObject + src__extractors__docs_record__target --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__target --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__action --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__action --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__modality --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__modality --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__resolveObject --> src__extractors__docs_record__isPlaceholder + src__extractors__docs_record__fallback --> src__extractors__docs_record__isPlaceholder + src__extractors__docs_record__anchorToSource --> src__extractors__docs_record__clampLine + src__extractors__docs_record__anchorToSource --> src__extractors__docs_record__keywordOverlap + src__extractors__docs_record__resolveTarget --> src__extractors__docs_record__hasTarget + src__extractors__docs_record__resolveAction --> src__extractors__docs_record__allowedAction + src__extractors__docs_record__resolveModality --> src__extractors__docs_record__allowedModality + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownRecords --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering + src__extractors__markdown_llm_helpers__MarkdownAttemptError__outcomes --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichment --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownBatchWithCorrection + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__emptyCoverage + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering + src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings + src__extractors__communication_helpers__parseEnvelope --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__parseEnvelope --> src__extractors__communication_helpers__unquote + src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__basename + src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__inferGovernanceIdentityFromFilename + src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__inferIdentityFromPathAndFilename + src__extractors__communication_helpers__inferGovernanceIdentityFromFilename --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__inferIdentityFromPathAndFilename --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__fileParts --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__nestedRoleIndex --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__nestedRole --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__nestedParticipant --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__isTicketEvidenceFile --> src__extractors__communication_helpers__basename + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__isCommunicationNoise + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__flush + src__extractors__communication_helpers__flush --> src__extractors__communication_helpers__isCommunicationNoise + src__extractors__communication_helpers__item --> src__extractors__communication_helpers__isCommunicationNoise + src__extractors__communication_helpers__raw --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__heading --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__normalizeType --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__listValue --> src__extractors__communication_helpers__unquote + src__extractors__communication_helpers__sameStrings --> src__extractors__communication_helpers__normalize + src__extractors__todo__extractTodo --> src__extractors__todo__match + src__extractors__todo__body --> src__extractors__todo__match + src__extractors__todo__relative --> src__extractors__todo__match + src__extractors__todo__lines --> src__extractors__todo__match + src__extractors__todo__raw --> src__extractors__todo__match + src__extractors__todo__heading --> src__extractors__todo__match + src__extractors__todo__task --> src__extractors__todo__inferOwner + src__extractors__todo__checked --> src__extractors__todo__inferOwner + src__extractors__todo__block --> src__extractors__todo__inferOwner + src__extractors__todo__text --> src__extractors__todo__inferOwner + src__extractors__todo__classified --> src__extractors__todo__inferOwner + src__extractors__todo__action --> src__extractors__todo__inferOwner + src__extractors__todo__resolvedPaths --> src__extractors__todo__inferOwner + src__extractors__todo__inferOwner --> src__extractors__todo__match + src__extractors__todo__extractExplicitId --> src__extractors__todo__match + src__extractors__git__extractGitIntent --> src__extractors__git__isGitWorkTree + src__extractors__git__extractGitIntent --> src__extractors__git__extractRepositoryGitIntent + src__extractors__git__extractGitIntent --> src__extractors__git__discoverGitRepositories + src__extractors__git__extractGitIntent --> src__extractors__git__mapWithConcurrency + src__extractors__git__root --> src__extractors__git__isGitWorkTree + src__extractors__git__root --> src__extractors__git__extractRepositoryGitIntent + src__extractors__git__count --> src__extractors__git__isGitWorkTree + src__extractors__git__count --> src__extractors__git__extractRepositoryGitIntent + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readCommits + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readChangedFiles + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readStats + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__runGit + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__extractChangedSymbols + src__extractors__git__discoverGitRepositories --> src__extractors__git__createDiscoveryState + src__extractors__git__discoverGitRepositories --> src__extractors__git__hasMoreDiscoveryWork + src__extractors__git__discoverGitRepositories --> src__extractors__git__takeNextDiscoveryDirectory + src__extractors__git__discoverGitRepositories --> src__extractors__git__readDiscoveryEntries + src__extractors__git__discoverGitRepositories --> src__extractors__git__processDiscoveryDirectory + src__extractors__git__discoverGitRepositories --> src__extractors__git__filterDiscoveryChildren + src__extractors__git__discoverGitRepositories --> src__extractors__git__finishDiscovery + src__extractors__git__state --> src__extractors__git__hasMoreDiscoveryWork + src__extractors__git__state --> src__extractors__git__takeNextDiscoveryDirectory + src__extractors__git__state --> src__extractors__git__readDiscoveryEntries + src__extractors__git__state --> src__extractors__git__processDiscoveryDirectory + src__extractors__git__state --> src__extractors__git__filterDiscoveryChildren + src__extractors__git__processDiscoveryDirectory --> src__extractors__git__resolveDiscoveryPrefix + src__extractors__git__processDiscoveryDirectory --> src__extractors__git__gitMarkerState + src__extractors__git__processDiscoveryDirectory --> src__extractors__git__registerDiscoveredRepository + src__extractors__git__registerDiscoveredRepository --> src__extractors__git__isGitWorkTree + src__extractors__git__isGitWorkTree --> src__extractors__git__runGit + src__extractors__git__runGit --> src__extractors__git__execFileAsync + src__extractors__git__result --> src__extractors__git__execFileAsync + src__extractors__git__readCommits --> src__extractors__git__runGit + src__extractors__git__readChangedFiles --> src__extractors__git__runGit + src__extractors__git__readStats --> src__extractors__git__runGit + src__extractors__docs_chunks__prioritizeDocumentChunks --> src__extractors__docs_chunks__chunkPriority + src__extractors__docs_chunks__needles --> src__extractors__docs_chunks__chunkPriority + src__extractors__docs_chunks__mapConcurrent --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__index --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__item --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__workerCount --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__markdownSections + src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__flush + src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__splitLongSection + src__extractors__docs_chunks__sectionLines --> src__extractors__docs_chunks__flush + src__extractors__docs_chunks__sectionLines --> src__extractors__docs_chunks__splitLongSection + src__extractors__docs_chunks__sectionText --> src__extractors__docs_chunks__flush + src__extractors__docs_chunks__sectionText --> src__extractors__docs_chunks__splitLongSection + src__extractors__docs_chunks__splitLongSection --> src__extractors__docs_chunks__takeLineBatch + src__extractors__markdown_llm__MarkdownLlmRequiredError__extractMarkdownIntentAudited --> src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow + src__extractors__markdown_llm__MarkdownLlmRequiredError__client --> src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow + src__extractors__communication_file_helpers__envelope --> src__extractors__communication_file_helpers__shouldSkipCommunicationFile + src__extractors__communication_file_helpers__inferred --> src__extractors__communication_file_helpers__shouldSkipCommunicationFile + src__extractors__communication_file_helpers__shouldSkipCommunicationFile --> src__extractors__communication_file_helpers__hasExplicitEnvelopeMetadata + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendRoleAndParticipantWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendIdentityWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendRegistryAlignmentWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendA2aAgentWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendTimestampWarnings + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveAction + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveModality + src__extractors__nl_llm_helpers__NlAttemptError__lines --> src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt + src__extractors__nl_llm_helpers__NlAttemptError__action --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject + src__extractors__nl_llm_helpers__NlAttemptError__normalizedText --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject + src__extractors__nl_llm_helpers__NlAttemptError__statementText --> src__extractors__nl_llm_helpers__NlAttemptError__resolveModality + src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt --> src__extractors__nl_llm_helpers__NlAttemptError__clampLine + src__extractors__nl_llm_helpers__NlAttemptError__resolveAction --> src__extractors__nl_llm_helpers__NlAttemptError__allowedAction + src__extractors__nl_llm_helpers__NlAttemptError__resolveModality --> src__extractors__nl_llm_helpers__NlAttemptError__allowedModality + src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText + src__extractors__nl_llm_helpers__NlAttemptError__resolveObject --> src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder + src__extractors__nl_llm_helpers__NlAttemptError__resolveObject --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText + src__extractors__nl_llm_helpers__NlAttemptError__NL_ACTION_SET --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings + src__extractors__nl_llm_helpers__NlAttemptError__NL_MODALITY_SET --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings + src__extractors__nl_llm_helpers__NlAttemptError__NL_RECORD_CONTRACT --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings + src__extractors__ast__external__runExternalAstAdapter --> src__extractors__ast__external__execFileAsync + src__extractors__ast__external__result --> src__extractors__ast__external__execFileAsync + src__extractors__ast__records__adapterRecords --> src__extractors__ast__records__moduleRecords diff --git a/project/calls.png b/project/calls.png index da3dc02..0ea1cbb 100644 Binary files a/project/calls.png and b/project/calls.png differ diff --git a/project/calls.toon.yaml b/project/calls.toon.yaml index 94dcede..15f8dc3 100644 --- a/project/calls.toon.yaml +++ b/project/calls.toon.yaml @@ -1,272 +1,354 @@ -# code2llm call graph | -# generated in 0.21s -# nodes: 354 | edges: 500 | modules: 18 -# CCΜ„=4.0 +# code2llm call graph | /home/tom/github/semcod/todo2code +# generated in 0.23s +# nodes: 399 | edges: 500 | modules: 30 +# CCΜ„=3.1 HUBS[20]: - src.services.actions.executeAction - CC=83 in:0 out:65 total:65 - src.services.actions.root - CC=83 in:0 out:64 total:64 - src.pipeline.run.runPipeline - CC=53 in:0 out:54 total:54 - src.cli.main - CC=95 in:1 out:44 total:45 - src.web.diff-ui.diffUiHtml - CC=52 in:0 out:42 total:42 - src.synthesis.code-change-plan.applyCodeChangeSourcePatch - CC=41 in:0 out:35 total:35 - src.synthesis.code-change-plan.assertCodeChangeSourcePatch - CC=47 in:5 out:26 total:31 - src.synthesis.code-change-plan.uniqueSorted - CC=1 in:20 out:5 total:25 + src.cli.optionString + CC=2 in:33 out:1 total:34 src.cli.optionNumber - CC=5 in:18 out:5 total:23 - src.semantic.reranker.assertSemanticRerankResult - CC=21 in:2 out:21 total:23 - src.services.actions.numberValue - CC=6 in:18 out:4 total:22 - src.synthesis.code-change-plan.createCodeChangeSourcePatch - CC=13 in:2 out:20 total:22 - src.synthesis.code-change-plan.deterministicGeneration - CC=1 in:18 out:3 total:21 - src.synthesis.todo-patch.createTodoPatch - CC=8 in:1 out:20 total:21 - src.semantic.reranker.assertSemanticCandidateSet - CC=27 in:3 out:18 total:21 - src.watch.watcher.scanTree - CC=12 in:4 out:17 total:21 - src.synthesis.code-change-plan.evaluateCodeChangeAcceptance - CC=9 in:3 out:18 total:21 - src.synthesis.todo-patch.applyTodoPatch - CC=12 in:0 out:20 total:20 - src.cli.handleDiff - CC=24 in:1 out:19 total:20 - src.cli.handleExtract - CC=16 in:1 out:18 total:19 + CC=5 in:20 out:5 total:25 + src.extractors.git.extractRepositoryGitIntent + CC=11 in:3 out:21 total:24 + src.extractors.todo.extractTodo + CC=5 in:0 out:24 total:24 + src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited + CC=10 in:0 out:22 total:22 + rust-ast.src.main.main + CC=6 in:0 out:21 total:21 + rust-ast.src.main.collect_files + CC=9 in:1 out:20 total:21 + src.extractors.todo.body + CC=5 in:0 out:20 total:20 + src.extractors.nl.extractNlIntent + CC=5 in:0 out:20 total:20 + src.extractors.todo.lines + CC=5 in:0 out:20 total:20 + src.extractors.todo.relative + CC=5 in:0 out:20 total:20 + src.cli.optionBoolean + CC=3 in:17 out:3 total:20 + rust-ast.src.main.add + CC=1 in:9 out:10 total:19 + src.extractors.changelog.extractChangelog + CC=10 in:0 out:19 total:19 + src.cli.handleCommunication + CC=11 in:0 out:18 total:18 + src.extractors.configuration.configurationRecords + CC=4 in:4 out:12 total:16 + java.JavaAstExtract.JavaAstExtract.main + CC=10 in:0 out:16 total:16 + src.extractors.ast.records.moduleRecords + CC=6 in:1 out:14 total:15 + src.extractors.changelog.relative + CC=7 in:0 out:15 total:15 + src.extractors.changelog.lines + CC=7 in:0 out:15 total:15 MODULES: - src.cli [44 funcs] - command CC=4 out:1 - context CC=9 out:10 - controller CC=1 out:5 - diagnostics CC=2 out:5 - diagnosticsPath CC=2 out:5 - diff CC=2 out:4 - doctor CC=6 out:7 - emitExtraction CC=4 out:4 - execFileAsync CC=2 out:2 - extractor CC=6 out:6 - src.operations.validation [8 funcs] - assertPrincipalList CC=2 out:4 - assertVariableContract CC=20 out:14 - dateString CC=2 out:4 - exactKeys CC=2 out:5 - nonBlank CC=3 out:2 - objectValue CC=4 out:2 - principals CC=1 out:1 - uniqueStrings CC=8 out:5 - src.pipeline.run [19 funcs] - aborted CC=1 out:1 - collectTargetHints CC=1 out:4 - communicationAudit CC=10 out:5 - communicationInputPresent CC=10 out:5 - communicationStartedAt CC=10 out:5 - configurationExtraction CC=10 out:5 - docs CC=2 out:4 - failedAudit CC=9 out:2 - failureCode CC=1 out:2 - includeCommunication CC=10 out:5 - src.semantic.reranker [23 funcs] - acceptedDeclarations CC=16 out:15 - applyAcceptedSemanticRelations CC=2 out:13 - assertGroundedQuote CC=3 out:7 - assertSemanticCandidateSet CC=27 out:18 - assertSemanticRerankResult CC=21 out:21 - assertSemanticVerdictReason CC=7 out:2 - boundedScore CC=4 out:3 - byDeclaration CC=14 out:9 - createSemanticCandidateSet CC=8 out:17 - createSemanticRerankResult CC=4 out:11 - src.semantic.reranker-llm [8 funcs] - assertSemanticCandidateSet CC=2 out:1 - assertSemanticRerankResult CC=2 out:1 - assertTrackedSnapshot CC=1 out:0 - model CC=4 out:2 - modelRevision CC=4 out:2 - payload CC=1 out:3 - projectRecord CC=3 out:3 - rerankSemanticCandidates CC=25 out:19 - src.services.actions [41 funcs] - after CC=2 out:2 - afterDiagnostics CC=8 out:2 - afterGraph CC=8 out:2 - afterInput CC=2 out:2 - afterPath CC=1 out:4 - analysis CC=2 out:4 - before CC=2 out:2 - beforeDiagnostics CC=8 out:2 - beforeGraph CC=8 out:2 - beforeInput CC=2 out:2 - src.summary.render [6 funcs] - actions CC=2 out:2 - confidence CC=1 out:2 - recordCitations CC=1 out:1 - renderConclusion CC=1 out:3 - renderRecords CC=2 out:3 - renderSummaryMarkdown CC=10 out:9 - src.summary.summarizer [15 funcs] - assertConclusions CC=1 out:0 - conclusions CC=3 out:3 - deterministicConclusions CC=4 out:7 - generationMetadata CC=9 out:5 - materializeConclusions CC=1 out:7 - parsed CC=1 out:4 + examples.backend.src.request-handlers [12 funcs] + MAX_BODY_BYTES CC=9 out:5 + event CC=1 out:1 + handleEventList CC=1 out:5 + handleEventPublish CC=4 out:6 + handleHealth CC=1 out:2 + handleRequest CC=9 out:5 + parseLimit CC=2 out:2 + parseOffset CC=2 out:2 + readBody CC=3 out:5 + sendJson CC=1 out:4 + examples.backend.src.server [5 funcs] + createBackend CC=4 out:5 + sendJson CC=1 out:4 + server CC=3 out:4 + startBackend CC=3 out:3 + store CC=3 out:4 + examples.backend.src.validation [7 funcs] + ALLOWED_ACTIONS CC=10 out:5 + action CC=2 out:3 + agent CC=2 out:3 + invalid CC=1 out:0 + object CC=2 out:3 + record CC=2 out:3 + validateEventPayload CC=10 out:5 + examples.frontend.src.app [5 funcs] + createState CC=1 out:0 + mountPanel CC=1 out:4 + refresh CC=4 out:6 + reload CC=1 out:1 + state CC=1 out:1 + examples.frontend.src.render [4 funcs] + classifyEvent CC=4 out:0 + headerRow CC=2 out:2 + renderTable CC=3 out:4 + toRows CC=1 out:2 + examples.src.runtime [2 funcs] + executeContract CC=1 out:1 + validateContract CC=2 out:1 + java.JavaAstExtract [10 funcs] + add CC=1 out:0 + collect CC=1 out:11 + containsIgnored CC=3 out:2 + emit CC=1 out:3 + escape CC=9 out:6 + json CC=1 out:1 + main CC=10 out:16 + map CC=1 out:0 + slash CC=1 out:1 + try CC=3 out:13 + rust-ast.src.main [21 funcs] + add CC=1 out:10 + arguments CC=5 out:9 + collect_files CC=9 out:20 + excerpt CC=1 out:7 + main CC=6 out:21 + modifiers CC=3 out:4 + qualified CC=2 out:3 + slash CC=1 out:2 + type_item CC=1 out:8 + visit_expr_call CC=1 out:9 + src.cli [80 funcs] + absolute CC=3 out:1 + buildCommonPipelineOptions CC=3 out:8 + buildDiffPayload CC=2 out:2 + buildFileDiff CC=3 out:6 + buildGitDiff CC=5 out:6 + buildPipelineOptions CC=1 out:1 + buildWorkspaceComparisonOptions CC=3 out:6 + command CC=3 out:2 + commandHandlers CC=2 out:6 + context CC=2 out:4 + src.extractors.ast [2 funcs] + isExtractionResult CC=5 out:3 + isIntentRecords CC=2 out:1 + src.extractors.ast.external [3 funcs] + execFileAsync CC=3 out:0 + result CC=2 out:1 + runExternalAstAdapter CC=9 out:6 + src.extractors.ast.records [2 funcs] + adapterRecords CC=2 out:3 + moduleRecords CC=6 out:14 + src.extractors.changelog [5 funcs] + body CC=7 out:15 + changelogAction CC=11 out:3 + extractChangelog CC=10 out:19 + lines CC=7 out:15 + relative CC=7 out:15 + src.extractors.communication-file-helpers [10 funcs] + appendA2aAgentWarnings CC=5 out:4 + appendIdentityWarnings CC=4 out:2 + appendRegistryAlignmentWarnings CC=7 out:2 + appendRoleAndParticipantWarnings CC=3 out:2 + appendTimestampWarnings CC=3 out:2 + buildLocalWarnings CC=3 out:5 + envelope CC=2 out:1 + hasExplicitEnvelopeMetadata CC=1 out:2 + inferred CC=2 out:1 + shouldSkipCommunicationFile CC=8 out:3 + src.extractors.communication-helpers [23 funcs] + basename CC=1 out:0 + communicationSegments CC=14 out:12 + fileParts CC=5 out:2 + flush CC=5 out:5 + heading CC=2 out:1 + inferGovernanceIdentityFromFilename CC=7 out:3 + inferIdentity CC=2 out:5 + inferIdentityFromPathAndFilename CC=9 out:5 + isCommunicationNoise CC=3 out:2 + isCommunicationType CC=1 out:2 + src.extractors.configuration [23 funcs] + MAX_ENTRIES_PER_FILE CC=4 out:10 + bounded CC=1 out:3 + configurationFormat CC=6 out:4 + configurationRecords CC=4 out:12 + dockerEntries CC=6 out:6 + entries CC=1 out:3 + entry CC=1 out:1 + extractConfigurationIntent CC=4 out:10 + fileAggregate CC=3 out:10 + files CC=4 out:5 + src.extractors.docs-chunks [15 funcs] + chunkMarkdown CC=8 out:9 + chunkPriority CC=3 out:4 + flush CC=2 out:2 + index CC=1 out:3 + item CC=1 out:3 + mapConcurrent CC=3 out:7 + markdownSections CC=4 out:2 + needles CC=1 out:2 + prioritizeDocumentChunks CC=3 out:6 + sectionLines CC=2 out:3 + src.extractors.docs-deterministic [19 funcs] + action CC=3 out:6 + codeBlockRecord CC=2 out:2 + convertDocument CC=4 out:4 + extractDocumentationBaseline CC=4 out:8 + handleDocumentationLine CC=5 out:4 + heading CC=1 out:1 + marker CC=4 out:2 + match CC=2 out:0 + parseBulletStatement CC=6 out:3 + parseFenceBlock CC=7 out:5 + src.extractors.docs-llm [8 funcs] + errorMessage CC=2 out:1 + extractChunk CC=12 out:8 + extractDocumentationIntent CC=3 out:12 + files CC=3 out:7 + loadDocumentChunks CC=4 out:8 readPrompt CC=2 out:6 - sortedUnique CC=2 out:5 - summarizeWithCorrection CC=10 out:7 - summaryMode CC=7 out:1 - src.synthesis.code-change-path [2 funcs] - isPlannablePath CC=38 out:13 - isUsefulCodeChangePath CC=1 out:1 - src.synthesis.code-change-plan [63 funcs] - acceptanceCriteriaFor CC=4 out:3 - acceptances CC=1 out:2 - acceptedCount CC=2 out:1 - applyCodeChangeSourcePatch CC=41 out:35 - applyUnifiedDiffToText CC=47 out:13 - assertCodeChangeSourcePatch CC=47 out:26 - assertCodeChangeSourcePatchSet CC=18 out:14 - assertExistingSourceReceipt CC=8 out:10 - assertSourceApplyReceipt CC=11 out:13 - assertSourcePatchIds CC=6 out:5 - src.synthesis.task-synthesis-contract [5 funcs] - RAW_CONCLUSION_CONTRACT CC=1 out:5 - RAW_PROPOSAL_CONTRACT CC=1 out:6 - nonBlank CC=1 out:1 - taskIds CC=1 out:2 - taskStrings CC=1 out:2 - src.synthesis.task-synthesis-materialize [17 funcs] - conclusionByKey CC=2 out:10 - conclusionIdByKey CC=2 out:10 - conclusions CC=1 out:5 - diagnosticIds CC=1 out:2 - keys CC=2 out:4 - mapKeys CC=2 out:5 - materializeTaskSynthesisResponse CC=2 out:18 - normalizeAcceptanceCriteria CC=4 out:2 - normalizeLocalKeys CC=1 out:0 - normalizeRawTarget CC=3 out:2 - src.synthesis.tasks-llm [11 funcs] - assertConclusions CC=1 out:0 - client CC=2 out:2 - fallbackOrThrow CC=2 out:6 - generationMetadata CC=3 out:5 - payload CC=1 out:1 - prompt CC=1 out:1 - readPrompt CC=2 out:6 - startedAt CC=1 out:1 - synthesisAudit CC=1 out:1 - synthesizeTodoProposals CC=5 out:12 - src.synthesis.todo-patch [37 funcs] - appendPatch CC=2 out:1 - applied CC=5 out:4 - applyTodoPatch CC=12 out:20 - artifact CC=6 out:8 - assertApproval CC=3 out:2 - assertReceipt CC=7 out:4 - assertTodoPatchArtifact CC=11 out:16 - atomicWrite CC=5 out:13 - classified CC=6 out:8 - createTodoPatch CC=8 out:20 - src.synthesis.validation [12 funcs] - dependencyFirstPriorityOrder CC=11 out:10 - duplicateEvidence CC=11 out:9 - intersects CC=1 out:5 - jaccard CC=5 out:1 - proposalWords CC=1 out:1 - sharedPath CC=1 out:2 - sharedSymbol CC=1 out:2 - sharedTicket CC=1 out:2 - similarity CC=1 out:2 + requireConfiguredClient CC=3 out:4 + selectWithinBudget CC=2 out:3 + src.extractors.docs-record [20 funcs] + OBJECT_PLACEHOLDERS CC=14 out:13 + action CC=11 out:7 + allowedAction CC=1 out:1 + allowedLifecycle CC=1 out:1 + allowedModality CC=1 out:1 + anchorToSource CC=7 out:10 + clampLine CC=1 out:3 + fallback CC=2 out:1 + hasTarget CC=4 out:1 + isPlaceholder CC=3 out:3 + src.extractors.docs-schema [5 funcs] + documentRecord CC=1 out:8 + documentResponseContract CC=1 out:2 + documentResponseSchema CC=1 out:1 + strings CC=1 out:2 target CC=1 out:2 - src.tf.classifier [6 funcs] - classifyAction CC=17 out:12 - dynamicImport CC=1 out:3 - importer CC=1 out:0 - loadAssets CC=2 out:6 - loadClassifier CC=6 out:5 - vectorize CC=6 out:5 - src.watch.watcher [28 funcs] - DEFAULT_MIN_INTERVAL_MS CC=19 out:14 - DEFAULT_SCAN_INTERVAL_MS CC=19 out:14 - absolute CC=3 out:3 - absoluteRoot CC=11 out:14 - current CC=2 out:2 - defaultSleep CC=6 out:7 - delta CC=2 out:2 - describeDelta CC=2 out:4 - diffSnapshots CC=6 out:5 - emit CC=2 out:0 - src.web.diff-ui [9 funcs] - byId CC=1 out:0 - compareGraphs CC=15 out:13 - diffUiHtml CC=52 out:42 - fillSelect CC=6 out:9 - formatBytes CC=7 out:2 - loadRuns CC=12 out:14 - requestHeaders CC=3 out:2 - selectedRun CC=7 out:2 - updateMeta CC=7 out:3 + src.extractors.git [25 funcs] + count CC=2 out:2 + createDiscoveryState CC=1 out:0 + discoverGitRepositories CC=4 out:7 + execFileAsync CC=1 out:0 + extractChangedSymbols CC=9 out:3 + extractGitIntent CC=6 out:7 + extractRepositoryGitIntent CC=11 out:21 + filterDiscoveryChildren CC=5 out:6 + finishDiscovery CC=4 out:1 + gitMarkerState CC=5 out:5 + src.extractors.markdown-llm [3 funcs] + client CC=2 out:2 + extractMarkdownIntentAudited CC=9 out:14 + fallbackOrThrow CC=2 out:5 + src.extractors.markdown-llm-helpers [9 funcs] + emptyCoverage CC=2 out:1 + enrichBatchCovering CC=6 out:11 + enrichMarkdownBatchWithCorrection CC=1 out:0 + enrichMarkdownRecords CC=13 out:9 + enrichSplitBatch CC=2 out:7 + enrichment CC=1 out:6 + markdownResponseContract CC=1 out:7 + outcomes CC=4 out:2 + strings CC=1 out:5 + src.extractors.markdown-paths [14 funcs] + addBasenameIndexMatch CC=3 out:4 + basenames CC=11 out:10 + buildBasenameIndex CC=7 out:7 + createBasenameIndexState CC=1 out:1 + createMarkdownPathResolver CC=12 out:12 + headingDirectories CC=11 out:9 + headingScopes CC=4 out:6 + index CC=6 out:4 + isNestedCheckout CC=2 out:1 + isRepositoryPath CC=5 out:3 + src.extractors.nl [12 funcs] + absolute CC=2 out:14 + action CC=1 out:9 + assertNlExtractionOptions CC=9 out:2 + body CC=2 out:14 + classified CC=1 out:9 + confidence CC=1 out:9 + detectMissingFields CC=10 out:5 + extractNlIntent CC=5 out:20 + inferActor CC=5 out:2 + missing CC=1 out:9 + src.extractors.nl-llm [4 funcs] + assertNlExtractionOptions CC=2 out:4 + client CC=2 out:2 + extractNlIntentAudited CC=10 out:22 + fallbackOrThrow CC=1 out:0 + src.extractors.nl-llm-helpers [18 funcs] + NL_ACTION_SET CC=1 out:7 + NL_MODALITY_SET CC=1 out:7 + NL_RECORD_CONTRACT CC=1 out:7 + action CC=1 out:1 + allowedAction CC=1 out:1 + allowedModality CC=1 out:1 + clampLine CC=1 out:3 + isPlaceholder CC=2 out:3 + lines CC=1 out:1 + nlStrings CC=1 out:6 + src.extractors.runtime-cycle [17 funcs] + MAX_PER_SECTION CC=8 out:12 + boundedArray CC=8 out:4 + driftRecord CC=5 out:5 + extractRuntimeCycleIntent CC=8 out:12 + factsMetadata CC=5 out:3 + jsonScalar CC=6 out:1 + label CC=2 out:1 + parseCycle CC=7 out:5 + probeRecord CC=9 out:8 + proposalAction CC=5 out:0 + src.extractors.todo [16 funcs] + action CC=2 out:12 + block CC=2 out:12 + body CC=5 out:20 + checked CC=2 out:12 + classified CC=2 out:12 + extractExplicitId CC=5 out:3 + extractTodo CC=5 out:24 + heading CC=1 out:1 + inferOwner CC=4 out:1 + lines CC=5 out:20 EDGES: - src.cli.main β†’ src.cli.printHelp - src.cli.main β†’ src.cli.parseArgs - src.cli.main β†’ src.cli.initProject - src.cli.parsed β†’ src.cli.printHelp - src.cli.command β†’ src.cli.printHelp - src.cli.diagnosticsPath β†’ src.cli.optionNumber - src.cli.diagnosticsPath β†’ src.cli.optionBoolean - src.cli.diagnostics β†’ src.cli.optionNumber - src.cli.diagnostics β†’ src.cli.optionBoolean - src.cli.result β†’ src.cli.execFileAsync - src.cli.isPlanSet β†’ src.cli.optionString - src.cli.root β†’ src.cli.optionString - src.cli.root β†’ src.cli.optionNullableString - src.cli.root β†’ src.cli.optionLlmMode - src.cli.handleWatch β†’ src.cli.optionNullableString - src.cli.handleWatch β†’ src.cli.optionList - src.cli.handleWatch β†’ src.cli.optionBoolean - src.cli.handleWatch β†’ src.cli.optionString - src.cli.handleWatch β†’ src.cli.optionNumber - src.cli.handleWatch β†’ src.cli.optionNlMode - src.cli.taskFile β†’ src.cli.optionNullableString - src.cli.taskFile β†’ src.cli.optionList - src.cli.taskFile β†’ src.cli.optionBoolean - src.cli.taskFile β†’ src.cli.optionString - src.cli.taskFile β†’ src.cli.optionNumber - src.cli.taskFile β†’ src.cli.optionNlMode - src.cli.taskFile β†’ src.cli.optionLlmMode - src.cli.taskFile β†’ src.cli.optionPipelineTaskMode - src.cli.controller β†’ src.cli.optionNumber - src.cli.controller β†’ src.cli.optionBoolean - src.cli.controller β†’ src.cli.formatWatchEvent - src.cli.stop β†’ src.cli.optionNumber - src.cli.stop β†’ src.cli.optionBoolean - src.cli.stop β†’ src.cli.formatWatchEvent - src.cli.formatWatchEvent β†’ src.cli.file - src.cli.stamp β†’ src.cli.file - src.cli.handleDiff β†’ src.cli.optionString - src.cli.handleDiff β†’ src.cli.optionNumber - src.cli.mode β†’ src.cli.optionNumber - src.cli.svg β†’ src.cli.optionNumber - src.cli.svg β†’ src.cli.optionBoolean - src.cli.html β†’ src.cli.optionNumber - src.cli.diff β†’ src.cli.optionNumber - src.cli.context β†’ src.cli.optionString - src.cli.context β†’ src.cli.optionBoolean - src.cli.context β†’ src.cli.optionNumber - src.cli.maxRows β†’ src.cli.optionString - src.cli.maxRows β†’ src.cli.optionBoolean - src.cli.maxRows β†’ src.cli.optionNumber - src.cli.handleReality β†’ src.cli.optionString + rust-ast.src.main.main β†’ rust-ast.src.main.arguments + rust-ast.src.main.main β†’ rust-ast.src.main.collect_files + rust-ast.src.main.main β†’ rust-ast.src.main.slash + rust-ast.src.main.collect_files β†’ rust-ast.src.main.slash + rust-ast.src.main.add β†’ rust-ast.src.main.excerpt + rust-ast.src.main.visit_item_mod β†’ rust-ast.src.main.qualified + rust-ast.src.main.visit_item_mod β†’ rust-ast.src.main.add + rust-ast.src.main.visit_item_use β†’ rust-ast.src.main.add + rust-ast.src.main.visit_item_struct β†’ rust-ast.src.main.type_item + rust-ast.src.main.visit_item_enum β†’ rust-ast.src.main.type_item + rust-ast.src.main.visit_item_trait β†’ rust-ast.src.main.type_item + rust-ast.src.main.visit_item_type β†’ rust-ast.src.main.type_item + rust-ast.src.main.visit_item_const β†’ rust-ast.src.main.qualified + rust-ast.src.main.visit_item_const β†’ rust-ast.src.main.add + rust-ast.src.main.visit_item_const β†’ rust-ast.src.main.modifiers + rust-ast.src.main.visit_item_static β†’ rust-ast.src.main.qualified + rust-ast.src.main.visit_item_static β†’ rust-ast.src.main.add + rust-ast.src.main.visit_item_static β†’ rust-ast.src.main.modifiers + rust-ast.src.main.visit_item_fn β†’ rust-ast.src.main.qualified + rust-ast.src.main.visit_item_fn β†’ rust-ast.src.main.add + rust-ast.src.main.visit_impl_item_fn β†’ rust-ast.src.main.add + rust-ast.src.main.visit_expr_call β†’ rust-ast.src.main.add + rust-ast.src.main.visit_expr_method_call β†’ rust-ast.src.main.add + rust-ast.src.main.type_item β†’ rust-ast.src.main.qualified + rust-ast.src.main.type_item β†’ rust-ast.src.main.add + rust-ast.src.main.type_item β†’ rust-ast.src.main.modifiers + examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.handleHealth + examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.handleEventPublish + examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.handleEventList + examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.handleHealth + examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.handleEventPublish + examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.handleEventList + examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.request-handlers.handleHealth β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.request-handlers.handleHealth β†’ examples.backend.src.request-handlers.size + examples.backend.src.request-handlers.handleEventPublish β†’ examples.backend.src.request-handlers.readBody + examples.backend.src.request-handlers.handleEventPublish β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.request-handlers.validation β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.request-handlers.event β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.request-handlers.handleEventList β†’ examples.backend.src.request-handlers.parseOffset + examples.backend.src.request-handlers.handleEventList β†’ examples.backend.src.request-handlers.parseLimit + examples.backend.src.request-handlers.handleEventList β†’ examples.backend.src.request-handlers.sendJson + examples.backend.src.validation.ALLOWED_ACTIONS β†’ examples.backend.src.validation.invalid + examples.backend.src.validation.validateEventPayload β†’ examples.backend.src.validation.invalid + examples.backend.src.validation.record β†’ examples.backend.src.validation.invalid + examples.backend.src.validation.agent β†’ examples.backend.src.validation.invalid + examples.backend.src.validation.action β†’ examples.backend.src.validation.invalid + examples.backend.src.validation.object β†’ examples.backend.src.validation.invalid + examples.backend.src.server.createBackend β†’ examples.backend.src.server.sendJson diff --git a/project/calls.yaml b/project/calls.yaml index 35814d7..068d077 100644 --- a/project/calls.yaml +++ b/project/calls.yaml @@ -1,3992 +1,4389 @@ -project: +project: /home/tom/github/semcod/todo2code generated_from: code2llm call graph analysis stats: - total_nodes: 354 + total_nodes: 399 total_edges: 500 - modules_count: 18 + modules_count: 30 nodes: - src.synthesis.code-change-plan.buildChanges: - name: buildChanges - module: src.synthesis.code-change-plan - line: 380 - cyclomatic_complexity: 11 - calls_out: 7 - calls_in: 7 - src.cli.handleExtract: - name: handleExtract - module: src.cli - line: 518 - cyclomatic_complexity: 16 - calls_out: 18 - calls_in: 1 - src.synthesis.task-synthesis-contract.taskIds: - name: taskIds - module: src.synthesis.task-synthesis-contract - line: 35 + src.extractors.docs-llm.DocumentationLlmRequiredError.errorMessage: + name: errorMessage + module: src.extractors.docs-llm + line: 267 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 3 + examples.backend.src.request-handlers.handleHealth: + name: handleHealth + module: examples.backend.src.request-handlers + line: 25 cyclomatic_complexity: 1 calls_out: 2 calls_in: 2 - src.cli.optionLlmMode: - name: optionLlmMode - module: src.cli - line: 741 - cyclomatic_complexity: 6 - calls_out: 3 - calls_in: 8 - src.synthesis.task-synthesis-materialize.proposalKeys: - name: proposalKeys - module: src.synthesis.task-synthesis-materialize - line: 26 + src.extractors.nl.absolute: + name: absolute + module: src.extractors.nl + line: 40 + cyclomatic_complexity: 2 + calls_out: 14 + calls_in: 0 + rust-ast.src.main.visit_item_use: + name: visit_item_use + module: rust-ast.src.main + line: 216 cyclomatic_complexity: 1 - calls_out: 5 + calls_out: 8 calls_in: 0 - src.web.diff-ui.loadRuns: - name: loadRuns - module: src.web.diff-ui - line: 43 - cyclomatic_complexity: 12 - calls_out: 14 + src.extractors.markdown-paths.addBasenameIndexMatch: + name: addBasenameIndexMatch + module: src.extractors.markdown-paths + line: 148 + cyclomatic_complexity: 3 + calls_out: 4 calls_in: 1 - src.synthesis.code-change-plan.assertSourcePatchStrings: - name: assertSourcePatchStrings - module: src.synthesis.code-change-plan - line: 953 - cyclomatic_complexity: 8 - calls_out: 5 - calls_in: 2 - src.web.diff-ui.fillSelect: - name: fillSelect - module: src.web.diff-ui - line: 42 - cyclomatic_complexity: 6 - calls_out: 9 + java.JavaAstExtract.JavaAstExtract.slash: + name: slash + module: java.JavaAstExtract + line: 259 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 2 - src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse: - name: materializeTaskSynthesisResponse - module: src.synthesis.task-synthesis-materialize - line: 14 + src.cli.main: + name: main + module: src.cli + line: 61 + cyclomatic_complexity: 9 + calls_out: 12 + calls_in: 1 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.markdownResponseContract: + name: markdownResponseContract + module: src.extractors.markdown-llm-helpers + line: 369 + cyclomatic_complexity: 1 + calls_out: 7 + calls_in: 1 + examples.backend.src.validation.agent: + name: agent + module: examples.backend.src.validation + line: 22 cyclomatic_complexity: 2 - calls_out: 18 + calls_out: 3 calls_in: 0 - src.services.actions.value: - name: value - module: src.services.actions - line: 369 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment: + name: enrichment + module: src.extractors.markdown-llm-helpers + line: 371 + cyclomatic_complexity: 1 + calls_out: 6 + calls_in: 0 + src.extractors.git.extractChangedSymbols: + name: extractChangedSymbols + module: src.extractors.git + line: 376 + cyclomatic_complexity: 9 + calls_out: 3 + calls_in: 1 + src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent: + name: extractDocumentationIntent + module: src.extractors.docs-llm + line: 45 cyclomatic_complexity: 3 - calls_out: 1 + calls_out: 12 calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions: - name: assertConclusions - module: src.synthesis.tasks-llm - line: 71 - cyclomatic_complexity: 1 - calls_out: 0 - calls_in: 2 - src.synthesis.todo-patch.uniqueStrings: - name: uniqueStrings - module: src.synthesis.todo-patch - line: 366 - cyclomatic_complexity: 7 + src.cli.svg: + name: svg + module: src.cli + line: 564 + cyclomatic_complexity: 2 calls_out: 5 - calls_in: 6 - src.synthesis.code-change-plan.relatedRecords: - name: relatedRecords - module: src.synthesis.code-change-plan - line: 136 - cyclomatic_complexity: 1 - calls_out: 2 calls_in: 0 - src.pipeline.run.docs: - name: docs - module: src.pipeline.run - line: 146 + src.cli.handleExtractAst: + name: handleExtractAst + module: src.cli + line: 619 cyclomatic_complexity: 2 - calls_out: 4 + calls_out: 3 calls_in: 0 - src.cli.maxRows: - name: maxRows + src.cli.handleDiagnose: + name: handleDiagnose module: src.cli - line: 452 - cyclomatic_complexity: 9 - calls_out: 10 - calls_in: 0 - src.tf.classifier.classifyAction: - name: classifyAction - module: src.tf.classifier - line: 69 - cyclomatic_complexity: 17 - calls_out: 12 - calls_in: 0 - src.pipeline.run.configurationExtraction: - name: configurationExtraction - module: src.pipeline.run - line: 182 - cyclomatic_complexity: 10 + line: 139 + cyclomatic_complexity: 2 calls_out: 5 calls_in: 0 - src.summary.summarizer.client: - name: client - module: src.summary.summarizer - line: 85 + src.cli.handleExtract: + name: handleExtract + module: src.cli + line: 577 cyclomatic_complexity: 4 calls_out: 5 calls_in: 0 - src.semantic.reranker.validDate: - name: validDate - module: src.semantic.reranker - line: 499 - cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 2 - src.services.actions.patch: - name: patch - module: src.services.actions - line: 302 + src.cli.result: + name: result + module: src.cli + line: 770 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 1 calls_in: 0 - src.services.actions.afterPath: - name: afterPath - module: src.services.actions - line: 428 + src.extractors.nl.confidence: + name: confidence + module: src.extractors.nl + line: 53 cyclomatic_complexity: 1 - calls_out: 4 + calls_out: 9 calls_in: 0 - src.watch.watcher.waitMs: - name: waitMs - module: src.watch.watcher - line: 192 + src.extractors.runtime-cycle.sourcePathFor: + name: sourcePathFor + module: src.extractors.runtime-cycle + line: 89 cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 0 - src.cli.optionBoolean: - name: optionBoolean - module: src.cli - line: 717 - cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 15 - src.watch.watcher.diffSnapshots: - name: diffSnapshots - module: src.watch.watcher - line: 80 - cyclomatic_complexity: 6 - calls_out: 5 - calls_in: 3 - src.cli.optionPipelineTaskMode: - name: optionPipelineTaskMode - module: src.cli - line: 763 - cyclomatic_complexity: 6 calls_out: 3 + calls_in: 2 + src.extractors.docs-deterministic.primePathMapper: + name: primePathMapper + module: src.extractors.docs-deterministic + line: 87 + cyclomatic_complexity: 5 + calls_out: 6 calls_in: 3 - src.synthesis.task-synthesis-materialize.normalizeLocalKeys: - name: normalizeLocalKeys - module: src.synthesis.task-synthesis-materialize - line: 92 - cyclomatic_complexity: 1 - calls_out: 0 + src.extractors.markdown-paths.buildBasenameIndex: + name: buildBasenameIndex + module: src.extractors.markdown-paths + line: 90 + cyclomatic_complexity: 7 + calls_out: 7 calls_in: 1 - src.summary.summarizer.SummaryAttemptError.conclusions: - name: conclusions - module: src.summary.summarizer - line: 264 - cyclomatic_complexity: 3 + src.extractors.docs-chunks.sectionText: + name: sectionText + module: src.extractors.docs-chunks + line: 76 + cyclomatic_complexity: 2 calls_out: 3 calls_in: 0 - src.semantic.reranker.createSemanticCandidateSet: - name: createSemanticCandidateSet - module: src.semantic.reranker - line: 113 - cyclomatic_complexity: 8 - calls_out: 17 + src.cli.taskFile: + name: taskFile + module: src.cli + line: 348 + cyclomatic_complexity: 1 + calls_out: 5 calls_in: 0 - src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet: - name: assertSemanticCandidateSet - module: src.semantic.reranker-llm - line: 44 - cyclomatic_complexity: 2 + src.cli.handleCommunication: + name: handleCommunication + module: src.cli + line: 666 + cyclomatic_complexity: 11 + calls_out: 18 + calls_in: 0 + src.extractors.docs-deterministic.heading: + name: heading + module: src.extractors.docs-deterministic + line: 180 + cyclomatic_complexity: 1 calls_out: 1 - calls_in: 1 - src.synthesis.todo-patch.result: - name: result - module: src.synthesis.todo-patch - line: 188 - cyclomatic_complexity: 5 - calls_out: 4 calls_in: 0 - src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates: - name: rerankSemanticCandidates - module: src.semantic.reranker-llm - line: 38 - cyclomatic_complexity: 25 - calls_out: 19 + src.extractors.communication-helpers.nestedRoleIndex: + name: nestedRoleIndex + module: src.extractors.communication-helpers + line: 155 + cyclomatic_complexity: 5 + calls_out: 2 calls_in: 0 - src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria: - name: normalizeAcceptanceCriteria - module: src.synthesis.task-synthesis-materialize - line: 152 - cyclomatic_complexity: 4 + src.cli.isPlanSet: + name: isPlanSet + module: src.cli + line: 263 + cyclomatic_complexity: 3 calls_out: 2 - calls_in: 4 - src.synthesis.task-synthesis-materialize.proposalDrafts: - name: proposalDrafts - module: src.synthesis.task-synthesis-materialize - line: 49 - cyclomatic_complexity: 2 - calls_out: 10 calls_in: 0 - src.synthesis.task-synthesis-materialize.conclusionByKey: - name: conclusionByKey - module: src.synthesis.task-synthesis-materialize - line: 47 + src.extractors.ast.isIntentRecords: + name: isIntentRecords + module: src.extractors.ast + line: 153 cyclomatic_complexity: 2 - calls_out: 10 + calls_out: 1 + calls_in: 1 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords: + name: enrichMarkdownRecords + module: src.extractors.markdown-llm-helpers + line: 57 + cyclomatic_complexity: 13 + calls_out: 9 calls_in: 0 - src.cli.formatWatchEvent: - name: formatWatchEvent + src.extractors.todo.body: + name: body + module: src.extractors.todo + line: 28 + cyclomatic_complexity: 5 + calls_out: 20 + calls_in: 0 + src.extractors.communication-file-helpers.buildLocalWarnings: + name: buildLocalWarnings + module: src.extractors.communication-file-helpers + line: 254 + cyclomatic_complexity: 3 + calls_out: 5 + calls_in: 0 + src.cli.doctor: + name: doctor module: src.cli - line: 408 - cyclomatic_complexity: 10 + line: 757 + cyclomatic_complexity: 6 calls_out: 7 - calls_in: 3 - src.pipeline.run.reason: - name: reason - module: src.pipeline.run - line: 549 + calls_in: 1 + examples.backend.src.request-handlers.size: + name: size + module: examples.backend.src.request-handlers + line: 71 cyclomatic_complexity: 3 - calls_out: 1 - calls_in: 0 - src.semantic.reranker.assertSemanticVerdictReason: - name: assertSemanticVerdictReason - module: src.semantic.reranker - line: 443 - cyclomatic_complexity: 7 - calls_out: 2 + calls_out: 3 calls_in: 1 - src.cli.diff: - name: diff - module: src.cli - line: 444 - cyclomatic_complexity: 2 - calls_out: 4 - calls_in: 0 - src.semantic.reranker.roundedConfidence: - name: roundedConfidence - module: src.semantic.reranker - line: 487 + examples.backend.src.server.createBackend: + name: createBackend + module: examples.backend.src.server + line: 16 cyclomatic_complexity: 4 - calls_out: 3 - calls_in: 6 - src.summary.render.renderConclusion: - name: renderConclusion - module: src.summary.render - line: 54 + calls_out: 5 + calls_in: 1 + src.extractors.runtime-cycle.MAX_PER_SECTION: + name: MAX_PER_SECTION + module: src.extractors.runtime-cycle + line: 15 + cyclomatic_complexity: 8 + calls_out: 12 + calls_in: 0 + src.extractors.markdown-paths.createMarkdownPathResolver: + name: createMarkdownPathResolver + module: src.extractors.markdown-paths + line: 39 + cyclomatic_complexity: 12 + calls_out: 12 + calls_in: 0 + examples.frontend.src.app.state: + name: state + module: examples.frontend.src.app + line: 37 cyclomatic_complexity: 1 - calls_out: 3 + calls_out: 1 calls_in: 1 - src.cli.handleWatch: - name: handleWatch + src.cli.handleLink: + name: handleLink module: src.cli - line: 366 + line: 131 + cyclomatic_complexity: 2 + calls_out: 9 + calls_in: 0 + src.extractors.docs-deterministic.parseBulletStatement: + name: parseBulletStatement + module: src.extractors.docs-deterministic + line: 191 cyclomatic_complexity: 6 - calls_out: 18 + calls_out: 3 calls_in: 1 - src.pipeline.run.persistFailedRun: - name: persistFailedRun - module: src.pipeline.run - line: 497 - cyclomatic_complexity: 19 - calls_out: 12 + java.JavaAstExtract.JavaAstExtract.collect: + name: collect + module: java.JavaAstExtract + line: 58 + cyclomatic_complexity: 1 + calls_out: 11 calls_in: 1 - src.watch.watcher.emit: - name: emit - module: src.watch.watcher - line: 151 - cyclomatic_complexity: 2 - calls_out: 0 - calls_in: 10 - src.pipeline.run.manifestConfiguration: - name: manifestConfiguration - module: src.pipeline.run - line: 433 - cyclomatic_complexity: 8 - calls_out: 3 + src.extractors.docs-record.anchorToSource: + name: anchorToSource + module: src.extractors.docs-record + line: 93 + cyclomatic_complexity: 7 + calls_out: 10 calls_in: 2 - src.services.actions.beforeInput: - name: beforeInput - module: src.services.actions - line: 400 + src.extractors.docs-record.allowedAction: + name: allowedAction + module: src.extractors.docs-record + line: 183 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 1 + src.extractors.communication-helpers.listValue: + name: listValue + module: src.extractors.communication-helpers + line: 259 cyclomatic_complexity: 2 - calls_out: 2 + calls_out: 8 calls_in: 0 - src.synthesis.todo-patch.orderedSelected: - name: orderedSelected - module: src.synthesis.todo-patch - line: 91 + src.extractors.todo.resolvedPaths: + name: resolvedPaths + module: src.extractors.todo + line: 51 cyclomatic_complexity: 2 - calls_out: 2 + calls_out: 12 calls_in: 0 - src.cli.file: - name: file - module: src.cli - line: 523 - cyclomatic_complexity: 3 - calls_out: 0 - calls_in: 2 - src.synthesis.code-change-plan.fileHashesAfter: - name: fileHashesAfter - module: src.synthesis.code-change-plan - line: 1100 - cyclomatic_complexity: 1 - calls_out: 4 + rust-ast.src.main.visit_impl_item_fn: + name: visit_impl_item_fn + module: rust-ast.src.main + line: 275 + cyclomatic_complexity: 2 + calls_out: 10 calls_in: 0 - src.synthesis.todo-patch.diagnosticReportFingerprint: - name: diagnosticReportFingerprint - module: src.synthesis.todo-patch - line: 60 + examples.backend.src.request-handlers.handleEventList: + name: handleEventList + module: examples.backend.src.request-handlers + line: 50 cyclomatic_complexity: 1 - calls_out: 4 + calls_out: 5 calls_in: 2 - src.summary.render.actions: - name: actions - module: src.summary.render - line: 32 - cyclomatic_complexity: 2 - calls_out: 2 - calls_in: 0 - src.services.actions.graph: - name: graph - module: src.services.actions - line: 452 - cyclomatic_complexity: 2 + src.cli.emitExtraction: + name: emitExtraction + module: src.cli + line: 691 + cyclomatic_complexity: 4 calls_out: 4 - calls_in: 0 - src.synthesis.validation.dependencyFirstPriorityOrder: - name: dependencyFirstPriorityOrder - module: src.synthesis.validation - line: 64 - cyclomatic_complexity: 11 - calls_out: 10 - calls_in: 1 - src.semantic.reranker-llm.SemanticRerankerRequiredError.projectRecord: - name: projectRecord - module: src.semantic.reranker-llm - line: 195 - cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 2 - src.synthesis.code-change-plan.collectTarget: - name: collectTarget - module: src.synthesis.code-change-plan - line: 355 - cyclomatic_complexity: 11 - calls_out: 3 - calls_in: 7 - src.synthesis.validation.sharedTicket: - name: sharedTicket - module: src.synthesis.validation - line: 44 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 0 - src.summary.summarizer.SummaryAttemptError.readPrompt: - name: readPrompt - module: src.summary.summarizer - line: 329 - cyclomatic_complexity: 2 - calls_out: 6 - calls_in: 1 - src.pipeline.run.stageValue: - name: stageValue - module: src.pipeline.run - line: 535 - cyclomatic_complexity: 3 + calls_in: 8 + src.extractors.communication-file-helpers.appendRegistryAlignmentWarnings: + name: appendRegistryAlignmentWarnings + module: src.extractors.communication-file-helpers + line: 299 + cyclomatic_complexity: 7 calls_out: 2 calls_in: 1 - src.web.diff-ui.requestHeaders: - name: requestHeaders - module: src.web.diff-ui - line: 38 - cyclomatic_complexity: 3 + src.extractors.markdown-llm.MarkdownLlmRequiredError.client: + name: client + module: src.extractors.markdown-llm + line: 78 + cyclomatic_complexity: 2 calls_out: 2 - calls_in: 3 - src.synthesis.task-synthesis-materialize.diagnosticIds: - name: diagnosticIds - module: src.synthesis.task-synthesis-materialize - line: 32 + calls_in: 0 + rust-ast.src.main.visit_item_static: + name: visit_item_static + module: rust-ast.src.main + line: 250 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 9 calls_in: 0 - src.cli.initProject: - name: initProject - module: src.cli - line: 623 - cyclomatic_complexity: 6 + rust-ast.src.main.visit_item_const: + name: visit_item_const + module: rust-ast.src.main + line: 243 + cyclomatic_complexity: 1 calls_out: 9 + calls_in: 0 + java.JavaAstExtract.JavaAstExtract.json: + name: json + module: java.JavaAstExtract + line: 237 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 1 - src.semantic.reranker.values: - name: values - module: src.semantic.reranker - line: 226 - cyclomatic_complexity: 2 + src.extractors.runtime-cycle.proposalAction: + name: proposalAction + module: src.extractors.runtime-cycle + line: 285 + cyclomatic_complexity: 5 calls_out: 0 calls_in: 1 - src.synthesis.todo-patch.inline: - name: inline - module: src.synthesis.todo-patch - line: 321 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 3 - src.pipeline.run.runPipeline: - name: runPipeline - module: src.pipeline.run - line: 55 - cyclomatic_complexity: 53 - calls_out: 54 + src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited: + name: extractNlIntentAudited + module: src.extractors.nl-llm + line: 33 + cyclomatic_complexity: 10 + calls_out: 22 calls_in: 0 - src.cli.taskFile: - name: taskFile - module: src.cli - line: 368 + src.extractors.docs-deterministic.qualifyingStatement: + name: qualifyingStatement + module: src.extractors.docs-deterministic + line: 270 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 2 + src.extractors.runtime-cycle.results: + name: results + module: src.extractors.runtime-cycle + line: 46 cyclomatic_complexity: 3 - calls_out: 8 + calls_out: 5 calls_in: 0 - src.cli.optionNumber: - name: optionNumber + src.extractors.docs-deterministic.resolver: + name: resolver + module: src.extractors.docs-deterministic + line: 63 + cyclomatic_complexity: 4 + calls_out: 6 + calls_in: 0 + src.extractors.docs-llm.DocumentationLlmRequiredError.loadDocumentChunks: + name: loadDocumentChunks + module: src.extractors.docs-llm + line: 104 + cyclomatic_complexity: 4 + calls_out: 8 + calls_in: 1 + src.cli.parseArgs: + name: parseArgs module: src.cli - line: 724 - cyclomatic_complexity: 5 + line: 779 + cyclomatic_complexity: 13 calls_out: 5 - calls_in: 18 - src.cli.printHelp: - name: printHelp - module: src.cli - line: 777 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 3 - src.operations.validation.dateString: - name: dateString - module: src.operations.validation - line: 35 - cyclomatic_complexity: 2 - calls_out: 4 - calls_in: 2 - src.synthesis.code-change-plan.planHash: - name: planHash - module: src.synthesis.code-change-plan - line: 166 + calls_in: 1 + src.extractors.docs-schema.documentRecord: + name: documentRecord + module: src.extractors.docs-schema + line: 15 cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals: - name: synthesizeTodoProposals - module: src.synthesis.tasks-llm - line: 62 - cyclomatic_complexity: 5 - calls_out: 12 + calls_out: 8 calls_in: 0 - src.services.actions.numberValue: - name: numberValue - module: src.services.actions - line: 651 - cyclomatic_complexity: 6 + examples.frontend.src.render.renderTable: + name: renderTable + module: examples.frontend.src.render + line: 23 + cyclomatic_complexity: 3 calls_out: 4 - calls_in: 18 - src.semantic.reranker.requiredText: - name: requiredText - module: src.semantic.reranker - line: 494 + calls_in: 0 + src.extractors.configuration.uniqueEntries: + name: uniqueEntries + module: src.extractors.configuration + line: 195 cyclomatic_complexity: 3 - calls_out: 2 - calls_in: 11 - src.synthesis.code-change-plan.assertExistingSourceReceipt: - name: assertExistingSourceReceipt - module: src.synthesis.code-change-plan - line: 1152 - cyclomatic_complexity: 8 - calls_out: 10 - calls_in: 1 - src.web.diff-ui.compareGraphs: - name: compareGraphs - module: src.web.diff-ui - line: 45 - cyclomatic_complexity: 15 - calls_out: 13 + calls_out: 3 calls_in: 2 - src.synthesis.task-synthesis-contract.nonBlank: - name: nonBlank - module: src.synthesis.task-synthesis-contract - line: 36 + examples.src.runtime.executeContract: + name: executeContract + module: examples.src.runtime + line: 10 cyclomatic_complexity: 1 calls_out: 1 - calls_in: 2 - src.synthesis.todo-patch.selected: - name: selected - module: src.synthesis.todo-patch - line: 238 - cyclomatic_complexity: 6 - calls_out: 8 - calls_in: 0 - src.synthesis.code-change-plan.assertCodeChangeSourcePatch: - name: assertCodeChangeSourcePatch - module: src.synthesis.code-change-plan - line: 790 - cyclomatic_complexity: 47 - calls_out: 26 - calls_in: 5 - src.synthesis.code-change-plan.conclusionsByDiagnostic: - name: conclusionsByDiagnostic - module: src.synthesis.code-change-plan - line: 122 - cyclomatic_complexity: 7 - calls_out: 18 calls_in: 0 - src.synthesis.code-change-plan.descriptionFor: - name: descriptionFor - module: src.synthesis.code-change-plan - line: 444 - cyclomatic_complexity: 5 + src.extractors.runtime-cycle.tags: + name: tags + module: src.extractors.runtime-cycle + line: 119 + cyclomatic_complexity: 2 calls_out: 3 - calls_in: 7 - src.watch.watcher.snapshot: - name: snapshot - module: src.watch.watcher - line: 163 + calls_in: 3 + src.extractors.nl-llm-helpers.NlAttemptError.action: + name: action + module: src.extractors.nl-llm-helpers + line: 88 cyclomatic_complexity: 1 calls_out: 1 calls_in: 0 - src.synthesis.code-change-plan.applyUnifiedDiffToText: - name: applyUnifiedDiffToText - module: src.synthesis.code-change-plan - line: 1222 - cyclomatic_complexity: 47 - calls_out: 13 + src.extractors.git.resolveDiscoveryPrefix: + name: resolveDiscoveryPrefix + module: src.extractors.git + line: 264 + cyclomatic_complexity: 2 + calls_out: 1 calls_in: 1 - src.synthesis.code-change-plan.changes: - name: changes - module: src.synthesis.code-change-plan - line: 144 - cyclomatic_complexity: 1 - calls_out: 2 + src.extractors.docs-record.hasTarget: + name: hasTarget + module: src.extractors.docs-record + line: 152 + cyclomatic_complexity: 4 + calls_out: 1 + calls_in: 1 + src.extractors.configuration.yamlOrAssignmentEntries: + name: yamlOrAssignmentEntries + module: src.extractors.configuration + line: 162 + cyclomatic_complexity: 7 + calls_out: 6 + calls_in: 1 + src.cli.handleDiff: + name: handleDiff + module: src.cli + line: 468 + cyclomatic_complexity: 9 + calls_out: 12 calls_in: 0 - src.operations.validation.exactKeys: - name: exactKeys - module: src.operations.validation - line: 23 - cyclomatic_complexity: 2 + src.cli.optionTaskMode: + name: optionTaskMode + module: src.cli + line: 860 + cyclomatic_complexity: 5 + calls_out: 3 + calls_in: 1 + src.cli.handleCompareWorkspace: + name: handleCompareWorkspace + module: src.cli + line: 330 + cyclomatic_complexity: 1 calls_out: 5 - calls_in: 12 - src.synthesis.todo-patch.applyTodoPatch: - name: applyTodoPatch - module: src.synthesis.todo-patch - line: 160 - cyclomatic_complexity: 12 - calls_out: 20 calls_in: 0 - src.semantic.reranker.acceptedDeclarations: - name: acceptedDeclarations - module: src.semantic.reranker - line: 328 - cyclomatic_complexity: 16 - calls_out: 15 + src.extractors.docs-deterministic.extractDocumentationBaseline: + name: extractDocumentationBaseline + module: src.extractors.docs-deterministic + line: 56 + cyclomatic_complexity: 4 + calls_out: 8 calls_in: 0 - src.synthesis.task-synthesis-materialize.sortedUnique: - name: sortedUnique - module: src.synthesis.task-synthesis-materialize - line: 130 - cyclomatic_complexity: 1 - calls_out: 4 - calls_in: 10 - src.synthesis.code-change-plan.rollbackFor: - name: rollbackFor - module: src.synthesis.code-change-plan - line: 500 + rust-ast.src.main.add: + name: add + module: rust-ast.src.main + line: 158 cyclomatic_complexity: 1 - calls_out: 3 - calls_in: 7 - src.semantic.reranker.records: - name: records - module: src.semantic.reranker - line: 326 - cyclomatic_complexity: 16 - calls_out: 15 + calls_out: 10 + calls_in: 9 + src.cli.handleEvaluateCodeChange: + name: handleEvaluateCodeChange + module: src.cli + line: 290 + cyclomatic_complexity: 6 + calls_out: 5 calls_in: 0 - src.summary.render.renderRecords: - name: renderRecords - module: src.summary.render - line: 46 - cyclomatic_complexity: 2 - calls_out: 3 - calls_in: 1 - src.services.actions.llmModeValue: - name: llmModeValue - module: src.services.actions - line: 532 - cyclomatic_complexity: 5 + src.extractors.configuration.entry: + name: entry + module: src.extractors.configuration + line: 191 + cyclomatic_complexity: 1 calls_out: 1 - calls_in: 4 - src.operations.validation.principals: - name: principals - module: src.operations.validation + calls_in: 5 + src.extractors.todo.match: + name: match + module: src.extractors.todo + line: 87 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 8 + src.extractors.docs-chunks.workerCount: + name: workerCount + module: src.extractors.docs-chunks line: 50 cyclomatic_complexity: 1 - calls_out: 1 + calls_out: 3 calls_in: 0 - src.synthesis.todo-patch.markdown: - name: markdown - module: src.synthesis.todo-patch - line: 95 + examples.frontend.src.app.refresh: + name: refresh + module: examples.frontend.src.app + line: 18 + cyclomatic_complexity: 4 + calls_out: 6 + calls_in: 3 + src.extractors.git.registerDiscoveredRepository: + name: registerDiscoveredRepository + module: src.extractors.git + line: 252 cyclomatic_complexity: 2 - calls_out: 9 - calls_in: 0 - src.pipeline.run.failedAudit: - name: failedAudit - module: src.pipeline.run - line: 519 - cyclomatic_complexity: 9 calls_out: 2 - calls_in: 2 - src.synthesis.code-change-plan.instructionFor: - name: instructionFor - module: src.synthesis.code-change-plan - line: 969 - cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 3 - src.synthesis.code-change-path.isPlannablePath: - name: isPlannablePath - module: src.synthesis.code-change-path - line: 138 - cyclomatic_complexity: 38 - calls_out: 13 calls_in: 1 - src.services.actions.scopedPath: - name: scopedPath - module: src.services.actions - line: 603 + src.extractors.communication-helpers.match: + name: match + module: src.extractors.communication-helpers + line: 125 cyclomatic_complexity: 1 - calls_out: 3 - calls_in: 2 - src.synthesis.task-synthesis-materialize.normalizeRawTarget: - name: normalizeRawTarget - module: src.synthesis.task-synthesis-materialize - line: 142 - cyclomatic_complexity: 3 calls_out: 2 - calls_in: 4 - src.semantic.reranker-llm.SemanticRerankerRequiredError.model: - name: model - module: src.semantic.reranker-llm - line: 51 + calls_in: 5 + src.extractors.todo.checked: + name: checked + module: src.extractors.todo + line: 45 + cyclomatic_complexity: 2 + calls_out: 12 + calls_in: 0 + src.cli.handleWatch: + name: handleWatch + module: src.cli + line: 346 + cyclomatic_complexity: 1 + calls_out: 11 + calls_in: 0 + src.extractors.ast.records.moduleRecords: + name: moduleRecords + module: src.extractors.ast.records + line: 34 + cyclomatic_complexity: 6 + calls_out: 14 + calls_in: 1 + src.extractors.runtime-cycle.proposalRecord: + name: proposalRecord + module: src.extractors.runtime-cycle + line: 250 cyclomatic_complexity: 4 - calls_out: 2 + calls_out: 3 + calls_in: 2 + rust-ast.src.main.visit_item_mod: + name: visit_item_mod + module: rust-ast.src.main + line: 206 + cyclomatic_complexity: 1 + calls_out: 11 calls_in: 0 - src.watch.watcher.describeDelta: - name: describeDelta - module: src.watch.watcher - line: 100 + src.cli.handleExtractCommunication: + name: handleExtractCommunication + module: src.cli + line: 656 cyclomatic_complexity: 2 - calls_out: 4 - calls_in: 5 - src.synthesis.code-change-plan.renderCodeChangeReviewMarkdown: - name: renderCodeChangeReviewMarkdown - module: src.synthesis.code-change-plan - line: 572 - cyclomatic_complexity: 10 calls_out: 6 - calls_in: 1 - src.synthesis.code-change-plan.applyCodeChangeSourcePatch: - name: applyCodeChangeSourcePatch - module: src.synthesis.code-change-plan - line: 1031 - cyclomatic_complexity: 41 - calls_out: 35 - calls_in: 0 - src.synthesis.code-change-plan.createCodeChangeReviewPatch: - name: createCodeChangeReviewPatch - module: src.synthesis.code-change-plan - line: 547 - cyclomatic_complexity: 6 - calls_out: 15 calls_in: 0 - src.semantic.reranker.validateGeneration: - name: validateGeneration - module: src.semantic.reranker - line: 422 + src.extractors.runtime-cycle.factsMetadata: + name: factsMetadata + module: src.extractors.runtime-cycle + line: 293 cyclomatic_complexity: 5 calls_out: 3 calls_in: 1 - src.synthesis.code-change-plan.unifiedDiff: - name: unifiedDiff - module: src.synthesis.code-change-plan - line: 724 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 0 - src.synthesis.todo-patch.applied: - name: applied - module: src.synthesis.todo-patch - line: 189 - cyclomatic_complexity: 5 - calls_out: 4 - calls_in: 0 - src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection: - name: summarizeWithCorrection - module: src.summary.summarizer - line: 169 - cyclomatic_complexity: 10 + src.extractors.git.extractGitIntent: + name: extractGitIntent + module: src.extractors.git + line: 40 + cyclomatic_complexity: 6 calls_out: 7 - calls_in: 3 - src.synthesis.code-change-plan.index: - name: index - module: src.synthesis.code-change-plan - line: 344 - cyclomatic_complexity: 4 - calls_out: 3 calls_in: 0 - src.synthesis.code-change-plan.planIds: - name: planIds - module: src.synthesis.code-change-plan - line: 306 + src.extractors.docs-schema.target: + name: target + module: src.extractors.docs-schema + line: 13 cyclomatic_complexity: 1 calls_out: 2 + calls_in: 1 + src.extractors.nl.object: + name: object + module: src.extractors.nl + line: 51 + cyclomatic_complexity: 1 + calls_out: 9 calls_in: 0 - src.summary.render.confidence: - name: confidence - module: src.summary.render - line: 55 + rust-ast.src.main.visit_item_fn: + name: visit_item_fn + module: rust-ast.src.main + line: 257 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 13 calls_in: 0 - src.cli.invokedPath: - name: invokedPath - module: src.cli - line: 821 - cyclomatic_complexity: 4 - calls_out: 4 + src.extractors.communication-helpers.heading: + name: heading + module: src.extractors.communication-helpers + line: 207 + cyclomatic_complexity: 2 + calls_out: 1 calls_in: 0 - src.synthesis.code-change-plan.confidenceFor: - name: confidenceFor - module: src.synthesis.code-change-plan - line: 480 - cyclomatic_complexity: 4 + src.extractors.configuration.bounded: + name: bounded + module: src.extractors.configuration + line: 50 + cyclomatic_complexity: 1 + calls_out: 3 + calls_in: 0 + src.extractors.ast.external.execFileAsync: + name: execFileAsync + module: src.extractors.ast.external + line: 8 + cyclomatic_complexity: 3 + calls_out: 0 + calls_in: 2 + src.extractors.communication-file-helpers.hasExplicitEnvelopeMetadata: + name: hasExplicitEnvelopeMetadata + module: src.extractors.communication-file-helpers + line: 116 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 1 + rust-ast.src.main.qualified: + name: qualified + module: rust-ast.src.main + line: 154 + cyclomatic_complexity: 2 calls_out: 3 - calls_in: 8 - src.watch.watcher.visit: - name: visit - module: src.watch.watcher - line: 42 - cyclomatic_complexity: 11 - calls_out: 13 calls_in: 5 - src.cli.optionSummaryMode: - name: optionSummaryMode + java.JavaAstExtract.JavaAstExtract.map: + name: map + module: java.JavaAstExtract + line: 182 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 3 + src.cli.handleGraphDiff: + name: handleGraphDiff module: src.cli - line: 753 - cyclomatic_complexity: 4 - calls_out: 3 + line: 494 + cyclomatic_complexity: 7 + calls_out: 11 calls_in: 1 - src.summary.summarizer.systemPrompt: - name: systemPrompt - module: src.summary.summarizer - line: 103 - cyclomatic_complexity: 6 - calls_out: 6 - calls_in: 0 - src.cli.svg: - name: svg - module: src.cli - line: 505 + src.extractors.nl-llm.NlLlmRequiredError.client: + name: client + module: src.extractors.nl-llm + line: 61 cyclomatic_complexity: 2 - calls_out: 5 - calls_in: 0 - src.synthesis.code-change-plan.candidates: - name: candidates - module: src.synthesis.code-change-plan - line: 124 - cyclomatic_complexity: 7 - calls_out: 18 + calls_out: 2 calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.client: - name: client - module: src.synthesis.tasks-llm - line: 72 + src.extractors.git.root: + name: root + module: src.extractors.git + line: 41 cyclomatic_complexity: 2 calls_out: 2 calls_in: 0 - src.watch.watcher.relative: - name: relative - module: src.watch.watcher - line: 55 + examples.backend.src.request-handlers.handleRequest: + name: handleRequest + module: examples.backend.src.request-handlers + line: 7 + cyclomatic_complexity: 9 + calls_out: 5 + calls_in: 0 + rust-ast.src.main.modifiers: + name: modifiers + module: rust-ast.src.main + line: 193 cyclomatic_complexity: 3 - calls_out: 3 + calls_out: 4 calls_in: 4 - src.synthesis.todo-patch.renderTodoPatchMarkdown: - name: renderTodoPatchMarkdown - module: src.synthesis.todo-patch - line: 119 - cyclomatic_complexity: 6 - calls_out: 5 + src.extractors.runtime-cycle.violationRecord: + name: violationRecord + module: src.extractors.runtime-cycle + line: 173 + cyclomatic_complexity: 4 + calls_out: 7 + calls_in: 3 + java.JavaAstExtract.JavaAstExtract.try: + name: try + module: java.JavaAstExtract + line: 83 + cyclomatic_complexity: 3 + calls_out: 13 calls_in: 1 - src.synthesis.todo-patch.sourceTodo: - name: sourceTodo - module: src.synthesis.todo-patch - line: 232 - cyclomatic_complexity: 6 - calls_out: 8 + src.extractors.todo.text: + name: text + module: src.extractors.todo + line: 48 + cyclomatic_complexity: 2 + calls_out: 12 calls_in: 0 - src.synthesis.code-change-plan.priorityRank: - name: priorityRank - module: src.synthesis.code-change-plan - line: 672 + examples.backend.src.validation.invalid: + name: invalid + module: examples.backend.src.validation + line: 14 cyclomatic_complexity: 1 calls_out: 0 + calls_in: 6 + src.extractors.communication-helpers.inferGovernanceIdentityFromFilename: + name: inferGovernanceIdentityFromFilename + module: src.extractors.communication-helpers + line: 141 + cyclomatic_complexity: 7 + calls_out: 3 calls_in: 1 - src.watch.watcher.sleep: - name: sleep - module: src.watch.watcher + src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichSplitBatch: + name: enrichSplitBatch + module: src.extractors.markdown-llm-helpers line: 153 cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 3 - src.synthesis.todo-patch.current: - name: current - module: src.synthesis.todo-patch - line: 179 - cyclomatic_complexity: 2 - calls_out: 3 - calls_in: 0 - src.watch.watcher.lastReportStartedAt: - name: lastReportStartedAt - module: src.watch.watcher - line: 168 + calls_out: 7 + calls_in: 1 + java.JavaAstExtract.JavaAstExtract.containsIgnored: + name: containsIgnored + module: java.JavaAstExtract + line: 70 cyclomatic_complexity: 3 calls_out: 2 - calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow: - name: fallbackOrThrow - module: src.synthesis.tasks-llm - line: 177 - cyclomatic_complexity: 2 - calls_out: 6 - calls_in: 2 - src.semantic.reranker.validateRetrieval: - name: validateRetrieval - module: src.semantic.reranker - line: 414 - cyclomatic_complexity: 2 - calls_out: 3 calls_in: 1 - src.services.actions.root: - name: root - module: src.services.actions - line: 73 - cyclomatic_complexity: 83 - calls_out: 64 - calls_in: 0 - src.synthesis.todo-patch.renderTargets: - name: renderTargets - module: src.synthesis.todo-patch - line: 307 + src.cli.emitJson: + name: emitJson + module: src.cli + line: 701 cyclomatic_complexity: 2 calls_out: 4 - calls_in: 1 - src.synthesis.todo-patch.assertReceipt: - name: assertReceipt - module: src.synthesis.todo-patch - line: 262 - cyclomatic_complexity: 7 - calls_out: 4 calls_in: 2 - src.synthesis.validation.duplicateEvidence: - name: duplicateEvidence - module: src.synthesis.validation - line: 38 - cyclomatic_complexity: 11 - calls_out: 9 - calls_in: 1 - src.summary.summarizer.SummaryAttemptError.deterministicConclusions: - name: deterministicConclusions - module: src.summary.summarizer - line: 259 - cyclomatic_complexity: 4 + src.extractors.configuration.tomlEntries: + name: tomlEntries + module: src.extractors.configuration + line: 145 + cyclomatic_complexity: 3 calls_out: 7 - calls_in: 5 - src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT: - name: RAW_PROPOSAL_CONTRACT - module: src.synthesis.task-synthesis-contract - line: 49 - cyclomatic_complexity: 1 - calls_out: 6 + calls_in: 1 + src.extractors.ast.records.adapterRecords: + name: adapterRecords + module: src.extractors.ast.records + line: 5 + cyclomatic_complexity: 2 + calls_out: 3 calls_in: 0 - src.synthesis.todo-patch.uniqueIds: - name: uniqueIds - module: src.synthesis.todo-patch - line: 358 - cyclomatic_complexity: 7 - calls_out: 5 - calls_in: 6 - src.pipeline.run.communicationInputPresent: - name: communicationInputPresent - module: src.pipeline.run - line: 189 - cyclomatic_complexity: 10 + src.cli.view: + name: view + module: src.cli + line: 561 + cyclomatic_complexity: 2 calls_out: 5 calls_in: 0 - src.tf.classifier.dynamicImport: - name: dynamicImport - module: src.tf.classifier - line: 29 - cyclomatic_complexity: 1 - calls_out: 3 - calls_in: 1 - src.synthesis.code-change-plan.rawDiff: - name: rawDiff - module: src.synthesis.code-change-plan - line: 723 + src.cli.controller: + name: controller + module: src.cli + line: 351 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 5 calls_in: 0 - src.synthesis.code-change-plan.deterministicGeneration: - name: deterministicGeneration - module: src.synthesis.code-change-plan - line: 504 + src.extractors.communication-helpers.raw: + name: raw + module: src.extractors.communication-helpers + line: 206 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 0 + examples.frontend.src.render.headerRow: + name: headerRow + module: examples.frontend.src.render + line: 55 + cyclomatic_complexity: 2 + calls_out: 2 + calls_in: 1 + examples.backend.src.server.sendJson: + name: sendJson + module: examples.backend.src.server + line: 26 cyclomatic_complexity: 1 - calls_out: 3 - calls_in: 18 - src.synthesis.code-change-plan.patchHash: - name: patchHash - module: src.synthesis.code-change-plan - line: 745 + calls_out: 4 + calls_in: 3 + rust-ast.src.main.visit_item_type: + name: visit_item_type + module: rust-ast.src.main + line: 238 cyclomatic_complexity: 1 calls_out: 2 calls_in: 0 - src.synthesis.code-change-plan.proposalsByDiagnostic: - name: proposalsByDiagnostic - module: src.synthesis.code-change-plan - line: 121 + src.cli.handleApplySourcePatch: + name: handleApplySourcePatch + module: src.cli + line: 272 + cyclomatic_complexity: 6 + calls_out: 5 + calls_in: 0 + src.extractors.markdown-paths.basenames: + name: basenames + module: src.extractors.markdown-paths + line: 42 + cyclomatic_complexity: 11 + calls_out: 10 + calls_in: 3 + src.extractors.changelog.relative: + name: relative + module: src.extractors.changelog + line: 28 cyclomatic_complexity: 7 - calls_out: 18 + calls_out: 15 calls_in: 0 - src.cli.handleReality: - name: handleReality + src.extractors.git.readStats: + name: readStats + module: src.extractors.git + line: 364 + cyclomatic_complexity: 6 + calls_out: 4 + calls_in: 1 + src.extractors.runtime-cycle.jsonScalar: + name: jsonScalar + module: src.extractors.runtime-cycle + line: 302 + cyclomatic_complexity: 6 + calls_out: 1 + calls_in: 3 + src.extractors.docs-deterministic.match: + name: match + module: src.extractors.docs-deterministic + line: 160 + cyclomatic_complexity: 2 + calls_out: 0 + calls_in: 4 + src.extractors.docs-record.OBJECT_PLACEHOLDERS: + name: OBJECT_PLACEHOLDERS + module: src.extractors.docs-record + line: 21 + cyclomatic_complexity: 14 + calls_out: 13 + calls_in: 0 + src.cli.buildDiffPayload: + name: buildDiffPayload module: src.cli - line: 492 - cyclomatic_complexity: 9 - calls_out: 12 + line: 512 + cyclomatic_complexity: 2 + calls_out: 2 calls_in: 1 - src.synthesis.todo-patch.wasAlreadyAppended: - name: wasAlreadyAppended - module: src.synthesis.todo-patch - line: 299 + src.extractors.git.runGit: + name: runGit + module: src.extractors.git + line: 325 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 5 + src.extractors.git.readCommits: + name: readCommits + module: src.extractors.git + line: 334 + cyclomatic_complexity: 1 + calls_out: 7 + calls_in: 1 + src.cli.context: + name: context + module: src.cli + line: 535 + cyclomatic_complexity: 2 + calls_out: 4 + calls_in: 0 + src.extractors.markdown-paths.headingScopes: + name: headingScopes + module: src.extractors.markdown-paths + line: 83 cyclomatic_complexity: 4 + calls_out: 6 + calls_in: 3 + src.extractors.ast.isExtractionResult: + name: isExtractionResult + module: src.extractors.ast + line: 162 + cyclomatic_complexity: 5 calls_out: 3 - calls_in: 6 - src.services.actions.afterDiagnostics: - name: afterDiagnostics - module: src.services.actions - line: 361 + calls_in: 0 + src.cli.handleRenderTodo: + name: handleRenderTodo + module: src.cli + line: 180 cyclomatic_complexity: 8 - calls_out: 2 + calls_out: 5 calls_in: 0 - src.synthesis.task-synthesis-materialize.proposals: - name: proposals - module: src.synthesis.task-synthesis-materialize - line: 77 - cyclomatic_complexity: 1 - calls_out: 2 + src.extractors.markdown-paths.index: + name: index + module: src.extractors.markdown-paths + line: 91 + cyclomatic_complexity: 6 + calls_out: 4 calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt: - name: startedAt - module: src.synthesis.tasks-llm - line: 68 + examples.backend.src.request-handlers.handleEventPublish: + name: handleEventPublish + module: examples.backend.src.request-handlers + line: 29 + cyclomatic_complexity: 4 + calls_out: 6 + calls_in: 2 + src.cli.handleExtractDocs: + name: handleExtractDocs + module: src.cli + line: 646 cyclomatic_complexity: 1 - calls_out: 1 + calls_out: 4 calls_in: 0 - src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet: - name: assertCodeChangeSourcePatchSet - module: src.synthesis.code-change-plan - line: 896 - cyclomatic_complexity: 18 - calls_out: 14 - calls_in: 1 - src.synthesis.todo-patch.duplicates: - name: duplicates - module: src.synthesis.todo-patch - line: 239 - cyclomatic_complexity: 6 - calls_out: 8 + src.extractors.communication-file-helpers.envelope: + name: envelope + module: src.extractors.communication-file-helpers + line: 51 + cyclomatic_complexity: 2 + calls_out: 1 calls_in: 0 - src.synthesis.task-synthesis-materialize.proposalIdByKey: - name: proposalIdByKey - module: src.synthesis.task-synthesis-materialize - line: 76 + src.cli.printHelp: + name: printHelp + module: src.cli + line: 890 cyclomatic_complexity: 1 calls_out: 2 + calls_in: 3 + src.extractors.nl-llm-helpers.NlAttemptError.NL_RECORD_CONTRACT: + name: NL_RECORD_CONTRACT + module: src.extractors.nl-llm-helpers + line: 242 + cyclomatic_complexity: 1 + calls_out: 7 calls_in: 0 - src.synthesis.code-change-plan.acceptedCount: - name: acceptedCount - module: src.synthesis.code-change-plan - line: 316 + src.extractors.todo.block: + name: block + module: src.extractors.todo + line: 46 cyclomatic_complexity: 2 - calls_out: 1 + calls_out: 12 calls_in: 0 - src.services.actions.analysis: - name: analysis - module: src.services.actions - line: 130 + src.cli.optionNullableString: + name: optionNullableString + module: src.cli + line: 823 + cyclomatic_complexity: 6 + calls_out: 3 + calls_in: 8 + src.extractors.nl-llm-helpers.NlAttemptError.resolveAction: + name: resolveAction + module: src.extractors.nl-llm-helpers + line: 167 cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 1 + src.extractors.configuration.lines: + name: lines + module: src.extractors.configuration + line: 134 + cyclomatic_complexity: 3 calls_out: 4 calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload: - name: payload - module: src.synthesis.tasks-llm - line: 82 + src.extractors.docs-chunks.markdownSections: + name: markdownSections + module: src.extractors.docs-chunks + line: 94 + cyclomatic_complexity: 4 + calls_out: 2 + calls_in: 1 + src.extractors.markdown-paths.readBasenameDirectoryEntries: + name: readBasenameDirectoryEntries + module: src.extractors.markdown-paths + line: 113 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 3 + src.extractors.git.extractRepositoryGitIntent: + name: extractRepositoryGitIntent + module: src.extractors.git + line: 74 + cyclomatic_complexity: 11 + calls_out: 21 + calls_in: 3 + src.extractors.todo.raw: + name: raw + module: src.extractors.todo + line: 35 cyclomatic_complexity: 1 calls_out: 1 calls_in: 0 - src.semantic.reranker.validateVerdictReason: - name: validateVerdictReason - module: src.semantic.reranker - line: 435 - cyclomatic_complexity: 1 + src.extractors.runtime-cycle.text: + name: text + module: src.extractors.runtime-cycle + line: 115 + cyclomatic_complexity: 2 calls_out: 1 - calls_in: 4 - src.pipeline.run.communicationStartedAt: - name: communicationStartedAt - module: src.pipeline.run - line: 187 - cyclomatic_complexity: 10 - calls_out: 5 - calls_in: 0 - src.synthesis.code-change-plan.indexProposalsByDiagnostic: - name: indexProposalsByDiagnostic - module: src.synthesis.code-change-plan - line: 331 - cyclomatic_complexity: 4 - calls_out: 3 - calls_in: 1 - src.services.actions.conclusions: - name: conclusions - module: src.services.actions - line: 223 + calls_in: 5 + src.extractors.communication-helpers.basename: + name: basename + module: src.extractors.communication-helpers + line: 168 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 2 + src.extractors.git.filterDiscoveryChildren: + name: filterDiscoveryChildren + module: src.extractors.git + line: 221 + cyclomatic_complexity: 5 + calls_out: 6 + calls_in: 2 + src.extractors.configuration.parsed: + name: parsed + module: src.extractors.configuration + line: 132 cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 0 - src.services.actions.executeAction: - name: executeAction - module: src.services.actions - line: 72 - cyclomatic_complexity: 83 - calls_out: 65 + calls_out: 4 calls_in: 0 - src.watch.watcher.current: - name: current - module: src.watch.watcher - line: 181 - cyclomatic_complexity: 2 - calls_out: 2 + src.extractors.docs-schema.documentResponseSchema: + name: documentResponseSchema + module: src.extractors.docs-schema + line: 41 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 0 - src.services.actions.nullableString: - name: nullableString - module: src.services.actions - line: 640 + src.cli.optionPipelineTaskMode: + name: optionPipelineTaskMode + module: src.cli + line: 876 + cyclomatic_complexity: 6 + calls_out: 3 + calls_in: 1 + src.extractors.configuration.isConfigurationPath: + name: isConfigurationPath + module: src.extractors.configuration + line: 30 + cyclomatic_complexity: 10 + calls_out: 6 + calls_in: 2 + src.extractors.docs-record.resolveAction: + name: resolveAction + module: src.extractors.docs-record + line: 156 cyclomatic_complexity: 5 + calls_out: 4 + calls_in: 2 + src.extractors.nl-llm-helpers.NlAttemptError.resolveModality: + name: resolveModality + module: src.extractors.nl-llm-helpers + line: 171 + cyclomatic_complexity: 2 calls_out: 1 - calls_in: 3 - src.operations.validation.objectValue: - name: objectValue - module: src.operations.validation - line: 18 - cyclomatic_complexity: 4 + calls_in: 2 + src.cli.handleReality: + name: handleReality + module: src.cli + line: 551 + cyclomatic_complexity: 9 + calls_out: 12 + calls_in: 0 + examples.backend.src.request-handlers.parseOffset: + name: parseOffset + module: examples.backend.src.request-handlers + line: 59 + cyclomatic_complexity: 2 calls_out: 2 - calls_in: 16 - src.synthesis.todo-patch.classified: - name: classified - module: src.synthesis.todo-patch - line: 242 + calls_in: 1 + src.extractors.git.readChangedFiles: + name: readChangedFiles + module: src.extractors.git + line: 352 cyclomatic_complexity: 6 - calls_out: 8 - calls_in: 0 - src.cli.stamp: - name: stamp - module: src.cli - line: 409 - cyclomatic_complexity: 10 calls_out: 5 - calls_in: 0 - src.services.actions.title: - name: title - module: src.services.actions - line: 557 - cyclomatic_complexity: 3 + calls_in: 1 + src.cli.optionString: + name: optionString + module: src.cli + line: 818 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 33 + src.cli.handleProposeTodo: + name: handleProposeTodo + module: src.cli + line: 163 + cyclomatic_complexity: 5 calls_out: 6 calls_in: 0 - src.watch.watcher.defaultSleep: - name: defaultSleep - module: src.watch.watcher - line: 226 - cyclomatic_complexity: 6 + src.extractors.docs-record.modality: + name: modality + module: src.extractors.docs-record + line: 37 + cyclomatic_complexity: 11 calls_out: 7 calls_in: 0 - src.synthesis.code-change-plan.object: - name: object - module: src.synthesis.code-change-plan - line: 426 - cyclomatic_complexity: 5 + examples.backend.src.validation.record: + name: record + module: examples.backend.src.validation + line: 21 + cyclomatic_complexity: 2 calls_out: 3 calls_in: 0 - src.summary.render.recordCitations: - name: recordCitations - module: src.summary.render - line: 59 - cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 4 - src.synthesis.code-change-plan.patchIds: - name: patchIds - module: src.synthesis.code-change-plan - line: 918 + src.extractors.git.processDiscoveryDirectory: + name: processDiscoveryDirectory + module: src.extractors.git + line: 228 cyclomatic_complexity: 5 calls_out: 5 + calls_in: 2 + src.extractors.docs-deterministic.parseParagraphStatement: + name: parseParagraphStatement + module: src.extractors.docs-deterministic + line: 212 + cyclomatic_complexity: 4 + calls_out: 3 + calls_in: 1 + examples.backend.src.request-handlers.event: + name: event + module: examples.backend.src.request-handlers + line: 46 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 0 - src.services.actions.booleanValue: - name: booleanValue - module: src.services.actions - line: 675 - cyclomatic_complexity: 3 - calls_out: 2 - calls_in: 11 - src.watch.watcher.pending: - name: pending - module: src.watch.watcher - line: 169 + src.extractors.docs-llm.DocumentationLlmRequiredError.selectWithinBudget: + name: selectWithinBudget + module: src.extractors.docs-llm + line: 147 + cyclomatic_complexity: 2 + calls_out: 3 + calls_in: 1 + src.extractors.communication-helpers.item: + name: item + module: src.extractors.communication-helpers + line: 197 cyclomatic_complexity: 3 - calls_out: 2 + calls_out: 3 calls_in: 0 - src.synthesis.code-change-path.isUsefulCodeChangePath: - name: isUsefulCodeChangePath - module: src.synthesis.code-change-path - line: 202 + src.extractors.docs-deterministic.parseFenceBlock: + name: parseFenceBlock + module: src.extractors.docs-deterministic + line: 154 + cyclomatic_complexity: 7 + calls_out: 5 + calls_in: 1 + src.extractors.configuration.fileAggregate: + name: fileAggregate + module: src.extractors.configuration + line: 82 + cyclomatic_complexity: 3 + calls_out: 10 + calls_in: 3 + src.extractors.nl-llm-helpers.NlAttemptError.clampLine: + name: clampLine + module: src.extractors.nl-llm-helpers + line: 218 cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.services.actions.nlModeValue: - name: nlModeValue - module: src.services.actions - line: 528 + calls_out: 3 + calls_in: 1 + src.extractors.markdown-paths.createBasenameIndexState: + name: createBasenameIndexState + module: src.extractors.markdown-paths + line: 105 cyclomatic_complexity: 1 calls_out: 1 - calls_in: 2 - src.summary.summarizer.SummaryAttemptError.summaryMode: - name: summaryMode - module: src.summary.summarizer - line: 313 - cyclomatic_complexity: 7 - calls_out: 1 calls_in: 1 - src.services.actions.before: - name: before - module: src.services.actions - line: 402 + src.extractors.nl.sourcePath: + name: sourcePath + module: src.extractors.nl + line: 42 cyclomatic_complexity: 2 + calls_out: 14 + calls_in: 0 + src.cli.resolveMainCommand: + name: resolveMainCommand + module: src.cli + line: 125 + cyclomatic_complexity: 5 + calls_out: 0 + calls_in: 1 + src.extractors.git.readDiscoveryEntries: + name: readDiscoveryEntries + module: src.extractors.git + line: 209 + cyclomatic_complexity: 3 + calls_out: 3 + calls_in: 2 + rust-ast.src.main.visit_item_enum: + name: visit_item_enum + module: rust-ast.src.main + line: 228 + cyclomatic_complexity: 1 calls_out: 2 calls_in: 0 - src.semantic.reranker.assertGroundedQuote: - name: assertGroundedQuote - module: src.semantic.reranker - line: 460 + src.extractors.nl-llm-helpers.NlAttemptError.nonEmptyText: + name: nonEmptyText + module: src.extractors.nl-llm-helpers + line: 188 + cyclomatic_complexity: 3 + calls_out: 1 + calls_in: 3 + src.extractors.git.mapWithConcurrency: + name: mapWithConcurrency + module: src.extractors.git + line: 306 + cyclomatic_complexity: 3 + calls_out: 4 + calls_in: 1 + src.extractors.docs-chunks.prioritizeDocumentChunks: + name: prioritizeDocumentChunks + module: src.extractors.docs-chunks + line: 3 cyclomatic_complexity: 3 + calls_out: 6 + calls_in: 0 + src.extractors.nl.assertNlExtractionOptions: + name: assertNlExtractionOptions + module: src.extractors.nl + line: 25 + cyclomatic_complexity: 9 + calls_out: 2 + calls_in: 1 + src.extractors.nl-llm-helpers.NlAttemptError.NL_ACTION_SET: + name: NL_ACTION_SET + module: src.extractors.nl-llm-helpers + line: 234 + cyclomatic_complexity: 1 calls_out: 7 - calls_in: 4 - src.web.diff-ui.byId: - name: byId - module: src.web.diff-ui - line: 36 + calls_in: 0 + src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow: + name: fallbackOrThrow + module: src.extractors.nl-llm + line: 116 cyclomatic_complexity: 1 calls_out: 0 - calls_in: 8 - src.operations.validation.nonBlank: - name: nonBlank - module: src.operations.validation - line: 31 + calls_in: 2 + examples.backend.src.request-handlers.parseLimit: + name: parseLimit + module: examples.backend.src.request-handlers + line: 64 + cyclomatic_complexity: 2 + calls_out: 2 + calls_in: 1 + src.extractors.configuration.pair: + name: pair + module: src.extractors.configuration + line: 156 cyclomatic_complexity: 3 calls_out: 2 - calls_in: 12 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.generationMetadata: - name: generationMetadata - module: src.synthesis.tasks-llm - line: 213 + calls_in: 0 + src.extractors.nl.action: + name: action + module: src.extractors.nl + line: 50 + cyclomatic_complexity: 1 + calls_out: 9 + calls_in: 0 + src.extractors.docs-deterministic.action: + name: action + module: src.extractors.docs-deterministic + line: 296 cyclomatic_complexity: 3 - calls_out: 5 - calls_in: 1 - src.synthesis.task-synthesis-materialize.conclusions: - name: conclusions - module: src.synthesis.task-synthesis-materialize - line: 31 + calls_out: 6 + calls_in: 0 + rust-ast.src.main.slash: + name: slash + module: rust-ast.src.main + line: 320 cyclomatic_complexity: 1 - calls_out: 5 + calls_out: 2 + calls_in: 2 + src.extractors.runtime-cycle.extractRuntimeCycleIntent: + name: extractRuntimeCycleIntent + module: src.extractors.runtime-cycle + line: 29 + cyclomatic_complexity: 8 + calls_out: 12 calls_in: 0 - src.synthesis.code-change-plan.conclusions: - name: conclusions - module: src.synthesis.code-change-plan - line: 118 + src.extractors.configuration.jsonEntries: + name: jsonEntries + module: src.extractors.configuration + line: 131 cyclomatic_complexity: 7 - calls_out: 18 + calls_out: 7 + calls_in: 1 + src.extractors.nl-llm-helpers.NlAttemptError.statementText: + name: statementText + module: src.extractors.nl-llm-helpers + line: 91 + cyclomatic_complexity: 10 + calls_out: 6 calls_in: 0 - src.synthesis.code-change-plan.set: - name: set - module: src.synthesis.code-change-plan - line: 903 + src.extractors.runtime-cycle.watched: + name: watched + module: src.extractors.runtime-cycle + line: 129 + cyclomatic_complexity: 3 + calls_out: 3 + calls_in: 2 + src.extractors.docs-record.fallback: + name: fallback + module: src.extractors.docs-record + line: 81 cyclomatic_complexity: 2 calls_out: 1 - calls_in: 6 - src.semantic.reranker.seenIds: - name: seenIds - module: src.semantic.reranker - line: 203 - cyclomatic_complexity: 14 - calls_out: 9 calls_in: 0 - src.watch.watcher.onAbort: - name: onAbort - module: src.watch.watcher - line: 233 - cyclomatic_complexity: 1 + src.extractors.communication-helpers.fileParts: + name: fileParts + module: src.extractors.communication-helpers + line: 154 + cyclomatic_complexity: 5 calls_out: 2 calls_in: 0 - src.synthesis.validation.intersects: - name: intersects - module: src.synthesis.validation - line: 110 + src.extractors.changelog.extractChangelog: + name: extractChangelog + module: src.extractors.changelog + line: 18 + cyclomatic_complexity: 10 + calls_out: 19 + calls_in: 0 + src.extractors.nl-llm-helpers.NlAttemptError.allowedAction: + name: allowedAction + module: src.extractors.nl-llm-helpers + line: 222 cyclomatic_complexity: 1 - calls_out: 5 + calls_out: 1 calls_in: 1 - src.synthesis.validation.target: - name: target - module: src.synthesis.validation - line: 43 + src.extractors.docs-chunks.needles: + name: needles + module: src.extractors.docs-chunks + line: 7 cyclomatic_complexity: 1 calls_out: 2 calls_in: 0 - src.synthesis.code-change-plan.uniqueSorted: - name: uniqueSorted - module: src.synthesis.code-change-plan - line: 525 - cyclomatic_complexity: 1 - calls_out: 5 - calls_in: 20 - src.cli.handleCommunication: - name: handleCommunication + src.cli.handleExtractConfig: + name: handleExtractConfig module: src.cli - line: 583 - cyclomatic_complexity: 11 - calls_out: 18 - calls_in: 1 - src.synthesis.todo-patch.renderIds: - name: renderIds - module: src.synthesis.todo-patch - line: 317 + line: 624 + cyclomatic_complexity: 2 + calls_out: 3 + calls_in: 0 + src.extractors.docs-chunks.chunkPriority: + name: chunkPriority + module: src.extractors.docs-chunks + line: 23 + cyclomatic_complexity: 3 + calls_out: 4 + calls_in: 2 + src.extractors.configuration.heading: + name: heading + module: src.extractors.configuration + line: 150 + cyclomatic_complexity: 4 + calls_out: 3 + calls_in: 0 + src.extractors.git.count: + name: count + module: src.extractors.git + line: 42 cyclomatic_complexity: 2 calls_out: 2 - calls_in: 1 - src.synthesis.code-change-plan.startsWithImperative: - name: startsWithImperative - module: src.synthesis.code-change-plan - line: 439 + calls_in: 0 + src.extractors.nl.extractNlIntent: + name: extractNlIntent + module: src.extractors.nl + line: 38 + cyclomatic_complexity: 5 + calls_out: 20 + calls_in: 0 + src.extractors.communication-file-helpers.appendIdentityWarnings: + name: appendIdentityWarnings + module: src.extractors.communication-file-helpers + line: 282 cyclomatic_complexity: 4 - calls_out: 1 - calls_in: 3 - src.synthesis.code-change-plan.assertSourcePatchIds: - name: assertSourcePatchIds - module: src.synthesis.code-change-plan - line: 945 - cyclomatic_complexity: 6 - calls_out: 5 + calls_out: 2 calls_in: 1 - src.synthesis.validation.sharedPath: - name: sharedPath - module: src.synthesis.validation - line: 46 + examples.frontend.src.app.mountPanel: + name: mountPanel + module: examples.frontend.src.app + line: 36 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 4 calls_in: 0 - src.services.actions.beforeDiagnostics: - name: beforeDiagnostics - module: src.services.actions - line: 353 - cyclomatic_complexity: 8 + src.extractors.nl-llm-helpers.NlAttemptError.isPlaceholder: + name: isPlaceholder + module: src.extractors.nl-llm-helpers + line: 192 + cyclomatic_complexity: 2 + calls_out: 3 + calls_in: 1 + src.cli.buildCommonPipelineOptions: + name: buildCommonPipelineOptions + module: src.cli + line: 384 + cyclomatic_complexity: 3 + calls_out: 8 + calls_in: 1 + examples.backend.src.request-handlers.validation: + name: validation + module: examples.backend.src.request-handlers + line: 39 + cyclomatic_complexity: 2 calls_out: 2 calls_in: 0 - src.services.actions.todoPath: - name: todoPath - module: src.services.actions - line: 201 - cyclomatic_complexity: 1 - calls_out: 2 + src.cli.diff: + name: diff + module: src.cli + line: 504 + cyclomatic_complexity: 2 + calls_out: 4 calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesisAudit: - name: synthesisAudit - module: src.synthesis.tasks-llm - line: 235 + src.extractors.nl-llm-helpers.NlAttemptError.NL_MODALITY_SET: + name: NL_MODALITY_SET + module: src.extractors.nl-llm-helpers + line: 236 cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 2 - src.semantic.reranker.quote: - name: quote - module: src.semantic.reranker - line: 465 - cyclomatic_complexity: 1 - calls_out: 1 + calls_out: 7 calls_in: 0 - src.synthesis.code-change-plan.createCodeChangeSourcePatch: - name: createCodeChangeSourcePatch - module: src.synthesis.code-change-plan - line: 698 - cyclomatic_complexity: 13 - calls_out: 20 - calls_in: 2 - src.cli.result: - name: result + src.cli.optionNumber: + name: optionNumber module: src.cli - line: 657 - cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.pipeline.run.communicationAudit: - name: communicationAudit - module: src.pipeline.run - line: 188 - cyclomatic_complexity: 10 + line: 837 + cyclomatic_complexity: 5 calls_out: 5 - calls_in: 0 - src.summary.summarizer.SummaryAttemptError.materializeConclusions: - name: materializeConclusions - module: src.summary.summarizer - line: 233 - cyclomatic_complexity: 1 - calls_out: 7 - calls_in: 1 - src.services.actions.stringValue: - name: stringValue - module: src.services.actions - line: 636 - cyclomatic_complexity: 3 - calls_out: 1 - calls_in: 12 - src.semantic.reranker.applyAcceptedSemanticRelations: - name: applyAcceptedSemanticRelations - module: src.semantic.reranker - line: 372 - cyclomatic_complexity: 2 - calls_out: 13 - calls_in: 0 - src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult: - name: assertSemanticRerankResult - module: src.semantic.reranker-llm - line: 55 + calls_in: 20 + src.cli.handler: + name: handler + module: src.cli + line: 594 cyclomatic_complexity: 2 calls_out: 1 - calls_in: 3 - src.watch.watcher.generate: - name: generate - module: src.watch.watcher - line: 207 - cyclomatic_complexity: 3 - calls_out: 5 - calls_in: 5 - src.synthesis.code-change-plan.recordsById: - name: recordsById - module: src.synthesis.code-change-plan - line: 120 - cyclomatic_complexity: 7 - calls_out: 18 - calls_in: 0 - src.semantic.reranker.assertSemanticRerankResult: - name: assertSemanticRerankResult - module: src.semantic.reranker - line: 311 - cyclomatic_complexity: 21 - calls_out: 21 calls_in: 2 - src.synthesis.task-synthesis-contract.taskStrings: - name: taskStrings - module: src.synthesis.task-synthesis-contract - line: 34 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 1 - src.synthesis.code-change-plan.now: - name: now - module: src.synthesis.code-change-plan - line: 1099 - cyclomatic_complexity: 1 - calls_out: 4 - calls_in: 0 - src.pipeline.run.values: - name: values - module: src.pipeline.run - line: 486 - cyclomatic_complexity: 1 - calls_out: 0 - calls_in: 3 - src.cli.parsed: - name: parsed + src.cli.resolvePipelineRoot: + name: resolvePipelineRoot module: src.cli - line: 63 - cyclomatic_complexity: 4 + line: 367 + cyclomatic_complexity: 2 calls_out: 1 - calls_in: 0 - src.services.actions.resolveRoot: - name: resolveRoot - module: src.services.actions - line: 598 - cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 1 - src.pipeline.run.message: - name: message - module: src.pipeline.run - line: 511 - cyclomatic_complexity: 9 + calls_in: 3 + src.extractors.communication-helpers.nestedParticipant: + name: nestedParticipant + module: src.extractors.communication-helpers + line: 157 + cyclomatic_complexity: 5 calls_out: 2 calls_in: 0 - src.tf.classifier.vectorize: - name: vectorize - module: src.tf.classifier - line: 60 + src.extractors.docs-deterministic.codeBlockRecord: + name: codeBlockRecord + module: src.extractors.docs-deterministic + line: 325 + cyclomatic_complexity: 2 + calls_out: 2 + calls_in: 2 + src.extractors.nl-llm-helpers.NlAttemptError.resolveObject: + name: resolveObject + module: src.extractors.nl-llm-helpers + line: 197 cyclomatic_complexity: 6 - calls_out: 5 + calls_out: 3 + calls_in: 3 + src.extractors.docs-deterministic.handleDocumentationLine: + name: handleDocumentationLine + module: src.extractors.docs-deterministic + line: 132 + cyclomatic_complexity: 5 + calls_out: 4 calls_in: 1 - src.semantic.reranker.byDeclaration: - name: byDeclaration - module: src.semantic.reranker - line: 205 - cyclomatic_complexity: 14 - calls_out: 9 - calls_in: 0 - src.watch.watcher.watchRepository: - name: watchRepository - module: src.watch.watcher - line: 147 - cyclomatic_complexity: 19 - calls_out: 14 - calls_in: 0 - src.watch.watcher.absolute: - name: absolute - module: src.watch.watcher - line: 54 - cyclomatic_complexity: 3 + src.extractors.docs-chunks.sectionLines: + name: sectionLines + module: src.extractors.docs-chunks + line: 75 + cyclomatic_complexity: 2 calls_out: 3 calls_in: 0 - src.pipeline.run.knownAudit: - name: knownAudit - module: src.pipeline.run - line: 512 + java.JavaAstExtract.JavaAstExtract.escape: + name: escape + module: java.JavaAstExtract + line: 240 cyclomatic_complexity: 9 - calls_out: 2 - calls_in: 0 - src.synthesis.task-synthesis-materialize.keys: - name: keys - module: src.synthesis.task-synthesis-materialize - line: 122 - cyclomatic_complexity: 2 + calls_out: 6 + calls_in: 1 + src.extractors.configuration.relative: + name: relative + module: src.extractors.configuration + line: 19 + cyclomatic_complexity: 3 calls_out: 4 calls_in: 0 - src.synthesis.code-change-plan.target: - name: target - module: src.synthesis.code-change-plan - line: 143 - cyclomatic_complexity: 1 + src.extractors.communication-helpers.nestedRole: + name: nestedRole + module: src.extractors.communication-helpers + line: 156 + cyclomatic_complexity: 5 calls_out: 2 calls_in: 0 - src.watch.watcher.finish: - name: finish - module: src.watch.watcher - line: 238 - cyclomatic_complexity: 2 + src.extractors.docs-chunks.takeLineBatch: + name: takeLineBatch + module: src.extractors.docs-chunks + line: 128 + cyclomatic_complexity: 8 + calls_out: 2 + calls_in: 1 + src.extractors.configuration.match: + name: match + module: src.extractors.configuration + line: 175 + cyclomatic_complexity: 5 calls_out: 2 calls_in: 3 - src.summary.summarizer.payload: - name: payload - module: src.summary.summarizer - line: 104 + java.JavaAstExtract.JavaAstExtract.add: + name: add + module: java.JavaAstExtract + line: 181 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 1 + src.cli.root: + name: root + module: src.cli + line: 667 + cyclomatic_complexity: 2 + calls_out: 4 + calls_in: 0 + src.extractors.changelog.lines: + name: lines + module: src.extractors.changelog + line: 30 + cyclomatic_complexity: 7 + calls_out: 15 + calls_in: 0 + src.cli.handleIntake: + name: handleIntake + module: src.cli + line: 706 + cyclomatic_complexity: 13 + calls_out: 13 + calls_in: 0 + examples.backend.src.server.startBackend: + name: startBackend + module: examples.backend.src.server + line: 35 + cyclomatic_complexity: 3 + calls_out: 3 + calls_in: 0 + src.cli.handleProposeSourcePatch: + name: handleProposeSourcePatch + module: src.cli + line: 257 cyclomatic_complexity: 6 calls_out: 6 calls_in: 0 - src.synthesis.todo-patch.isoDate: - name: isoDate - module: src.synthesis.todo-patch - line: 354 + src.extractors.docs-record.isPlaceholder: + name: isPlaceholder + module: src.extractors.docs-record + line: 75 cyclomatic_complexity: 3 calls_out: 3 calls_in: 2 - src.synthesis.code-change-plan.acceptances: - name: acceptances - module: src.synthesis.code-change-plan - line: 309 + src.extractors.docs-record.allowedLifecycle: + name: allowedLifecycle + module: src.extractors.docs-record + line: 191 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 1 + calls_in: 5 + src.extractors.nl-llm-helpers.NlAttemptError.nlStrings: + name: nlStrings + module: src.extractors.nl-llm-helpers + line: 241 + cyclomatic_complexity: 1 + calls_out: 6 + calls_in: 3 + src.cli.handleProposeCodeChange: + name: handleProposeCodeChange + module: src.cli + line: 222 + cyclomatic_complexity: 5 + calls_out: 5 calls_in: 0 - src.summary.summarizer.SummaryAttemptError.parsed: - name: parsed - module: src.summary.summarizer - line: 239 + rust-ast.src.main.visit_expr_call: + name: visit_expr_call + module: rust-ast.src.main + line: 288 cyclomatic_complexity: 1 - calls_out: 4 + calls_out: 9 calls_in: 0 - src.semantic.reranker-llm.SemanticRerankerRequiredError.payload: - name: payload - module: src.semantic.reranker-llm - line: 73 + rust-ast.src.main.visit_item_trait: + name: visit_item_trait + module: rust-ast.src.main + line: 233 cyclomatic_complexity: 1 - calls_out: 3 + calls_out: 2 calls_in: 0 - src.semantic.reranker.seenDecisions: - name: seenDecisions - module: src.semantic.reranker - line: 327 - cyclomatic_complexity: 16 - calls_out: 15 + src.extractors.markdown-paths.isRepositoryPath: + name: isRepositoryPath + module: src.extractors.markdown-paths + line: 76 + cyclomatic_complexity: 5 + calls_out: 3 + calls_in: 4 + src.extractors.git.result: + name: result + module: src.extractors.git + line: 326 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 0 - src.synthesis.todo-patch.currentHash: - name: currentHash - module: src.synthesis.todo-patch - line: 187 + src.extractors.todo.lines: + name: lines + module: src.extractors.todo + line: 32 cyclomatic_complexity: 5 - calls_out: 4 + calls_out: 20 calls_in: 0 - src.synthesis.validation.validateAndClassifyTodoProposals: - name: validateAndClassifyTodoProposals - module: src.synthesis.validation - line: 17 + src.extractors.communication-helpers.normalize: + name: normalize + module: src.extractors.communication-helpers + line: 282 cyclomatic_complexity: 1 - calls_out: 10 + calls_out: 0 + calls_in: 1 + examples.backend.src.server.store: + name: store + module: examples.backend.src.server + line: 17 + cyclomatic_complexity: 3 + calls_out: 4 calls_in: 0 - src.tf.classifier.importer: - name: importer - module: src.tf.classifier - line: 30 + src.extractors.git.execFileAsync: + name: execFileAsync + module: src.extractors.git + line: 12 cyclomatic_complexity: 1 calls_out: 0 - calls_in: 1 - src.summary.summarizer.SummaryAttemptError.sortedUnique: - name: sortedUnique - module: src.summary.summarizer - line: 324 - cyclomatic_complexity: 2 - calls_out: 5 - calls_in: 4 - src.synthesis.todo-patch.createTodoPatch: - name: createTodoPatch - module: src.synthesis.todo-patch - line: 69 - cyclomatic_complexity: 8 - calls_out: 20 - calls_in: 1 - src.synthesis.code-change-plan.markdown: - name: markdown - module: src.synthesis.code-change-plan - line: 558 + calls_in: 2 + src.cli.optionNlMode: + name: optionNlMode + module: src.cli + line: 850 cyclomatic_complexity: 1 - calls_out: 3 + calls_out: 1 + calls_in: 2 + src.extractors.configuration.extractConfigurationIntent: + name: extractConfigurationIntent + module: src.extractors.configuration + line: 11 + cyclomatic_complexity: 4 + calls_out: 10 calls_in: 0 - src.services.actions.receiptPath: - name: receiptPath - module: src.services.actions - line: 303 + src.extractors.docs-deterministic.statementRecord: + name: statementRecord + module: src.extractors.docs-deterministic + line: 288 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 0 + calls_in: 1 + src.extractors.docs-deterministic.root: + name: root + module: src.extractors.docs-deterministic + line: 60 + cyclomatic_complexity: 4 + calls_out: 6 calls_in: 0 - src.web.diff-ui.selectedRun: - name: selectedRun - module: src.web.diff-ui + src.extractors.markdown-paths.repositoryRoot: + name: repositoryRoot + module: src.extractors.markdown-paths line: 40 - cyclomatic_complexity: 7 - calls_out: 2 - calls_in: 3 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.readPrompt: - name: readPrompt - module: src.synthesis.tasks-llm - line: 262 + cyclomatic_complexity: 11 + calls_out: 11 + calls_in: 0 + src.extractors.nl.detectMissingFields: + name: detectMissingFields + module: src.extractors.nl + line: 95 + cyclomatic_complexity: 10 + calls_out: 5 + calls_in: 4 + src.cli.commandHandlers: + name: commandHandlers + module: src.cli + line: 89 cyclomatic_complexity: 2 calls_out: 6 calls_in: 1 - src.services.actions.after: - name: after - module: src.services.actions - line: 403 - cyclomatic_complexity: 2 - calls_out: 2 - calls_in: 0 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt: - name: prompt - module: src.synthesis.tasks-llm - line: 81 + rust-ast.src.main.excerpt: + name: excerpt + module: rust-ast.src.main + line: 186 cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.cli.mode: - name: mode - module: src.cli - line: 429 - cyclomatic_complexity: 8 - calls_out: 10 - calls_in: 0 - src.web.diff-ui.diffUiHtml: - name: diffUiHtml - module: src.web.diff-ui - line: 1 - cyclomatic_complexity: 52 - calls_out: 42 - calls_in: 0 - src.cli.main: - name: main - module: src.cli - line: 53 - cyclomatic_complexity: 95 - calls_out: 44 + calls_out: 7 calls_in: 1 - src.cli.extractor: - name: extractor - module: src.cli - line: 519 - cyclomatic_complexity: 6 - calls_out: 6 + src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord: + name: toIntentRecord + module: src.extractors.nl-llm-helpers + line: 85 + cyclomatic_complexity: 11 + calls_out: 11 calls_in: 0 - src.synthesis.todo-patch.normalizePath: - name: normalizePath - module: src.synthesis.todo-patch - line: 325 - cyclomatic_complexity: 1 + src.extractors.ast.external.result: + name: result + module: src.extractors.ast.external + line: 32 + cyclomatic_complexity: 2 calls_out: 1 - calls_in: 2 - src.synthesis.code-change-plan.plansById: - name: plansById - module: src.synthesis.code-change-plan - line: 917 - cyclomatic_complexity: 5 - calls_out: 5 calls_in: 0 - src.services.actions.filterCommunicationGraph: - name: filterCommunicationGraph - module: src.services.actions - line: 511 - cyclomatic_complexity: 17 - calls_out: 7 - calls_in: 2 src.cli.execFileAsync: name: execFileAsync module: src.cli - line: 39 + line: 41 cyclomatic_complexity: 2 calls_out: 2 calls_in: 2 - src.pipeline.run.aborted: - name: aborted - module: src.pipeline.run - line: 507 - cyclomatic_complexity: 1 - calls_out: 1 + src.extractors.todo.extractTodo: + name: extractTodo + module: src.extractors.todo + line: 19 + cyclomatic_complexity: 5 + calls_out: 24 + calls_in: 0 + src.extractors.communication-helpers.parseEnvelope: + name: parseEnvelope + module: src.extractors.communication-helpers + line: 118 + cyclomatic_complexity: 5 + calls_out: 8 + calls_in: 0 + src.extractors.docs-record.resolveModality: + name: resolveModality + module: src.extractors.docs-record + line: 164 + cyclomatic_complexity: 5 + calls_out: 4 calls_in: 2 - src.cli.optionNullableString: - name: optionNullableString - module: src.cli - line: 710 - cyclomatic_complexity: 6 - calls_out: 3 - calls_in: 6 - src.cli.html: - name: html - module: src.cli - line: 432 - cyclomatic_complexity: 8 - calls_out: 10 + src.extractors.todo.task: + name: task + module: src.extractors.todo + line: 43 + cyclomatic_complexity: 2 + calls_out: 12 calls_in: 0 - src.synthesis.todo-patch.hash: - name: hash - module: src.synthesis.todo-patch - line: 350 + examples.backend.src.request-handlers.readBody: + name: readBody + module: examples.backend.src.request-handlers + line: 69 cyclomatic_complexity: 3 - calls_out: 2 + calls_out: 5 + calls_in: 1 + src.extractors.communication-helpers.inferIdentityFromPathAndFilename: + name: inferIdentityFromPathAndFilename + module: src.extractors.communication-helpers + line: 153 + cyclomatic_complexity: 9 + calls_out: 5 calls_in: 1 - src.synthesis.todo-patch.rendered: - name: rendered - module: src.synthesis.todo-patch - line: 312 + src.extractors.docs-deterministic.targetsOf: + name: targetsOf + module: src.extractors.docs-deterministic + line: 359 cyclomatic_complexity: 1 - calls_out: 3 + calls_out: 5 + calls_in: 1 + src.extractors.markdown-paths.isNestedCheckout: + name: isNestedCheckout + module: src.extractors.markdown-paths + line: 121 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 3 + rust-ast.src.main.main: + name: main + module: rust-ast.src.main + line: 36 + cyclomatic_complexity: 6 + calls_out: 21 calls_in: 0 - src.pipeline.run.failureCode: - name: failureCode - module: src.pipeline.run - line: 575 + src.extractors.communication-helpers.unquote: + name: unquote + module: src.extractors.communication-helpers + line: 318 cyclomatic_complexity: 1 calls_out: 2 - calls_in: 5 - src.synthesis.code-change-plan.record: - name: record - module: src.synthesis.code-change-plan - line: 425 - cyclomatic_complexity: 5 + calls_in: 2 + src.extractors.docs-chunks.item: + name: item + module: src.extractors.docs-chunks + line: 45 + cyclomatic_complexity: 1 calls_out: 3 calls_in: 0 - src.watch.watcher.result: - name: result - module: src.watch.watcher - line: 211 + examples.frontend.src.app.reload: + name: reload + module: examples.frontend.src.app + line: 38 cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 1 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes: + name: outcomes + module: src.extractors.markdown-llm-helpers + line: 71 + cyclomatic_complexity: 4 calls_out: 2 calls_in: 0 - src.synthesis.task-synthesis-materialize.conclusionIdByKey: - name: conclusionIdByKey - module: src.synthesis.task-synthesis-materialize - line: 46 - cyclomatic_complexity: 2 - calls_out: 10 - calls_in: 0 - src.synthesis.code-change-plan.normalizeUnifiedDiff: - name: normalizeUnifiedDiff - module: src.synthesis.code-change-plan - line: 983 - cyclomatic_complexity: 17 - calls_out: 9 - calls_in: 4 - src.synthesis.validation.proposalWords: - name: proposalWords - module: src.synthesis.validation - line: 40 + src.extractors.markdown-paths.scanDirectoryForBasenames: + name: scanDirectoryForBasenames + module: src.extractors.markdown-paths + line: 125 + cyclomatic_complexity: 8 + calls_out: 8 + calls_in: 3 + java.JavaAstExtract.JavaAstExtract.emit: + name: emit + module: java.JavaAstExtract + line: 219 cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.synthesis.code-change-plan.titleFor: - name: titleFor - module: src.synthesis.code-change-plan - line: 424 - cyclomatic_complexity: 9 - calls_out: 4 - calls_in: 7 - src.cli.doctor: - name: doctor - module: src.cli - line: 644 - cyclomatic_complexity: 6 - calls_out: 7 + calls_out: 3 calls_in: 1 - src.tf.classifier.loadClassifier: - name: loadClassifier - module: src.tf.classifier - line: 47 - cyclomatic_complexity: 6 - calls_out: 5 + src.extractors.docs-deterministic.convertDocument: + name: convertDocument + module: src.extractors.docs-deterministic + line: 100 + cyclomatic_complexity: 4 + calls_out: 4 + calls_in: 3 + src.extractors.ast.external.runExternalAstAdapter: + name: runExternalAstAdapter + module: src.extractors.ast.external + line: 23 + cyclomatic_complexity: 9 + calls_out: 6 + calls_in: 0 + src.extractors.docs-llm.DocumentationLlmRequiredError.extractChunk: + name: extractChunk + module: src.extractors.docs-llm + line: 161 + cyclomatic_complexity: 12 + calls_out: 8 calls_in: 1 - src.cli.optionNlMode: - name: optionNlMode - module: src.cli - line: 737 + src.extractors.docs-schema.strings: + name: strings + module: src.extractors.docs-schema + line: 12 cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 2 + src.extractors.runtime-cycle.label: + name: label + module: src.extractors.runtime-cycle + line: 111 + cyclomatic_complexity: 2 calls_out: 1 calls_in: 5 - src.pipeline.run.includeCommunication: - name: includeCommunication - module: src.pipeline.run - line: 186 - cyclomatic_complexity: 10 - calls_out: 5 - calls_in: 0 - src.cli.command: - name: command + examples.backend.src.request-handlers.sendJson: + name: sendJson + module: examples.backend.src.request-handlers + line: 81 + cyclomatic_complexity: 1 + calls_out: 4 + calls_in: 7 + src.cli.optionList: + name: optionList module: src.cli - line: 64 - cyclomatic_complexity: 4 - calls_out: 1 - calls_in: 0 - src.services.actions.afterInput: - name: afterInput - module: src.services.actions - line: 401 + line: 845 cyclomatic_complexity: 2 - calls_out: 2 - calls_in: 0 - src.synthesis.todo-patch.writeTodoPatchArtifacts: - name: writeTodoPatchArtifacts - module: src.synthesis.todo-patch - line: 152 - cyclomatic_complexity: 3 calls_out: 5 - calls_in: 0 - src.synthesis.code-change-plan.acceptanceCriteriaFor: - name: acceptanceCriteriaFor - module: src.synthesis.code-change-plan - line: 459 - cyclomatic_complexity: 4 - calls_out: 3 - calls_in: 7 - src.synthesis.code-change-plan.paths: - name: paths - module: src.synthesis.code-change-plan - line: 830 - cyclomatic_complexity: 16 - calls_out: 12 - calls_in: 0 - src.services.actions.svg: - name: svg - module: src.services.actions - line: 405 - cyclomatic_complexity: 2 - calls_out: 2 - calls_in: 0 - src.services.actions.result: - name: result - module: src.services.actions - line: 442 - cyclomatic_complexity: 1 - calls_out: 4 - calls_in: 0 - src.synthesis.validation.similarity: - name: similarity - module: src.synthesis.validation - line: 47 + calls_in: 3 + src.cli.handleExtractGit: + name: handleExtractGit + module: src.cli + line: 614 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 3 calls_in: 0 - src.cli.emitExtraction: - name: emitExtraction - module: src.cli - line: 608 - cyclomatic_complexity: 4 - calls_out: 4 - calls_in: 2 - src.synthesis.code-change-plan.assertSourceApplyReceipt: - name: assertSourceApplyReceipt - module: src.synthesis.code-change-plan - line: 1180 - cyclomatic_complexity: 11 - calls_out: 13 - calls_in: 2 - src.cli.parseArgs: - name: parseArgs + src.extractors.todo.extractExplicitId: + name: extractExplicitId + module: src.extractors.todo + line: 91 + cyclomatic_complexity: 5 + calls_out: 3 + calls_in: 11 + src.cli.handleExtractNl: + name: handleExtractNl module: src.cli - line: 666 - cyclomatic_complexity: 13 - calls_out: 5 - calls_in: 1 - src.synthesis.todo-patch.assertApproval: - name: assertApproval - module: src.synthesis.todo-patch - line: 256 - cyclomatic_complexity: 3 - calls_out: 2 - calls_in: 1 - src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision: - name: modelRevision - module: src.semantic.reranker-llm - line: 52 - cyclomatic_complexity: 4 - calls_out: 2 + line: 601 + cyclomatic_complexity: 5 + calls_out: 6 calls_in: 0 - src.cli.isPlanSet: - name: isPlanSet + src.cli.command: + name: command module: src.cli - line: 246 + line: 72 cyclomatic_complexity: 3 calls_out: 2 calls_in: 0 - src.services.actions.proposals: - name: proposals - module: src.services.actions - line: 226 - cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 0 - src.cli.stop: - name: stop + src.cli.formatWatchEvent: + name: formatWatchEvent module: src.cli - line: 393 + line: 448 + cyclomatic_complexity: 10 + calls_out: 7 + calls_in: 5 + src.extractors.nl-llm-helpers.NlAttemptError.normalizedText: + name: normalizedText + module: src.extractors.nl-llm-helpers + line: 89 cyclomatic_complexity: 1 - calls_out: 5 - calls_in: 0 - src.watch.watcher.now: - name: now - module: src.watch.watcher - line: 152 - cyclomatic_complexity: 2 calls_out: 1 - calls_in: 8 + calls_in: 0 src.cli.diagnosticsPath: name: diagnosticsPath module: src.cli - line: 498 + line: 557 cyclomatic_complexity: 2 calls_out: 5 calls_in: 0 - src.synthesis.todo-patch.artifact: - name: artifact - module: src.synthesis.todo-patch - line: 222 - cyclomatic_complexity: 6 - calls_out: 8 + src.extractors.communication-helpers.sameStrings: + name: sameStrings + module: src.extractors.communication-helpers + line: 281 + cyclomatic_complexity: 1 + calls_out: 6 calls_in: 0 - src.synthesis.todo-patch.appendPatch: - name: appendPatch - module: src.synthesis.todo-patch - line: 294 - cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 6 - src.cli.root: - name: root - module: src.cli - line: 584 - cyclomatic_complexity: 2 - calls_out: 4 + examples.backend.src.validation.ALLOWED_ACTIONS: + name: ALLOWED_ACTIONS + module: examples.backend.src.validation + line: 11 + cyclomatic_complexity: 10 + calls_out: 5 calls_in: 0 - src.services.actions.diff: - name: diff - module: src.services.actions - line: 433 + src.extractors.communication-file-helpers.appendTimestampWarnings: + name: appendTimestampWarnings + module: src.extractors.communication-file-helpers + line: 328 + cyclomatic_complexity: 3 + calls_out: 2 + calls_in: 1 + rust-ast.src.main.type_item: + name: type_item + module: rust-ast.src.main + line: 306 cyclomatic_complexity: 1 + calls_out: 8 + calls_in: 4 + src.extractors.docs-llm.DocumentationLlmRequiredError.requireConfiguredClient: + name: requireConfiguredClient + module: src.extractors.docs-llm + line: 85 + cyclomatic_complexity: 3 calls_out: 4 + calls_in: 1 + src.cli.handleRenderCodeChange: + name: handleRenderCodeChange + module: src.cli + line: 241 + cyclomatic_complexity: 5 + calls_out: 5 calls_in: 0 - src.synthesis.code-change-plan.indexConclusionsByDiagnostic: - name: indexConclusionsByDiagnostic - module: src.synthesis.code-change-plan - line: 343 - cyclomatic_complexity: 4 + src.extractors.nl-llm-helpers.NlAttemptError.sourceExcerpt: + name: sourceExcerpt + module: src.extractors.nl-llm-helpers + line: 157 + cyclomatic_complexity: 5 calls_out: 3 + calls_in: 2 + src.extractors.docs-deterministic.parseSectionHeading: + name: parseSectionHeading + module: src.extractors.docs-deterministic + line: 173 + cyclomatic_complexity: 9 + calls_out: 4 calls_in: 1 - src.summary.summarizer.mode: - name: mode - module: src.summary.summarizer - line: 66 + src.extractors.communication-helpers.inferIdentity: + name: inferIdentity + module: src.extractors.communication-helpers + line: 132 cyclomatic_complexity: 2 - calls_out: 3 - calls_in: 0 - src.operations.validation.uniqueStrings: - name: uniqueStrings - module: src.operations.validation - line: 40 - cyclomatic_complexity: 8 - calls_out: 5 - calls_in: 13 - src.synthesis.code-change-plan.exactSourcePatchKeys: - name: exactSourcePatchKeys - module: src.synthesis.code-change-plan - line: 937 - cyclomatic_complexity: 3 calls_out: 5 - calls_in: 4 - src.cli.handleDiff: - name: handleDiff + calls_in: 0 + src.extractors.git.takeNextDiscoveryDirectory: + name: takeNextDiscoveryDirectory + module: src.extractors.git + line: 201 + cyclomatic_complexity: 2 + calls_out: 0 + calls_in: 2 + src.cli.handleSummarize: + name: handleSummarize module: src.cli - line: 428 - cyclomatic_complexity: 24 - calls_out: 19 + line: 146 + cyclomatic_complexity: 5 + calls_out: 8 + calls_in: 0 + src.cli.reportPipelineDegradation: + name: reportPipelineDegradation + module: src.cli + line: 882 + cyclomatic_complexity: 6 + calls_out: 2 calls_in: 1 - src.services.actions.readRecords: - name: readRecords - module: src.services.actions - line: 624 - cyclomatic_complexity: 4 - calls_out: 7 - calls_in: 2 - src.synthesis.code-change-plan.exactSourcePatchSet: - name: exactSourcePatchSet - module: src.synthesis.code-change-plan - line: 961 + src.extractors.communication-helpers.isTicketEvidenceFile: + name: isTicketEvidenceFile + module: src.extractors.communication-helpers + line: 167 cyclomatic_complexity: 4 calls_out: 4 - calls_in: 3 - src.watch.watcher.maxFiles: - name: maxFiles - module: src.watch.watcher - line: 38 + calls_in: 0 + src.extractors.markdown-paths.headingDirectories: + name: headingDirectories + module: src.extractors.markdown-paths + line: 46 cyclomatic_complexity: 11 - calls_out: 14 + calls_out: 9 calls_in: 0 - src.synthesis.code-change-plan.splitKeep: - name: splitKeep - module: src.synthesis.code-change-plan - line: 1305 + src.cli.file: + name: file + module: src.cli + line: 602 cyclomatic_complexity: 3 - calls_out: 3 - calls_in: 1 - src.semantic.reranker.decisions: - name: decisions - module: src.semantic.reranker - line: 274 - cyclomatic_complexity: 2 - calls_out: 9 + calls_out: 0 + calls_in: 2 + examples.backend.src.validation.validateEventPayload: + name: validateEventPayload + module: examples.backend.src.validation + line: 13 + cyclomatic_complexity: 10 + calls_out: 5 calls_in: 0 - src.services.actions.diagnostics: - name: diagnostics - module: src.services.actions - line: 453 - cyclomatic_complexity: 2 + src.extractors.communication-file-helpers.appendA2aAgentWarnings: + name: appendA2aAgentWarnings + module: src.extractors.communication-file-helpers + line: 314 + cyclomatic_complexity: 5 calls_out: 4 + calls_in: 1 + src.extractors.todo.inferOwner: + name: inferOwner + module: src.extractors.todo + line: 86 + cyclomatic_complexity: 4 + calls_out: 1 + calls_in: 11 + src.extractors.runtime-cycle.probeRecord: + name: probeRecord + module: src.extractors.runtime-cycle + line: 134 + cyclomatic_complexity: 9 + calls_out: 8 + calls_in: 3 + src.extractors.docs-record.target: + name: target + module: src.extractors.docs-record + line: 35 + cyclomatic_complexity: 11 + calls_out: 7 calls_in: 0 - src.services.actions.afterGraph: - name: afterGraph - module: src.services.actions - line: 358 - cyclomatic_complexity: 8 - calls_out: 2 - calls_in: 0 - src.watch.watcher.DEFAULT_MIN_INTERVAL_MS: - name: DEFAULT_MIN_INTERVAL_MS - module: src.watch.watcher - line: 144 - cyclomatic_complexity: 19 - calls_out: 14 - calls_in: 0 - src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT: - name: RAW_CONCLUSION_CONTRACT - module: src.synthesis.task-synthesis-contract - line: 38 + src.extractors.git.createDiscoveryState: + name: createDiscoveryState + module: src.extractors.git + line: 184 cyclomatic_complexity: 1 - calls_out: 5 - calls_in: 0 - src.synthesis.task-synthesis-materialize.parsed: - name: parsed - module: src.synthesis.task-synthesis-materialize - line: 20 + calls_out: 0 + calls_in: 1 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering: + name: enrichBatchCovering + module: src.extractors.markdown-llm-helpers + line: 112 + cyclomatic_complexity: 6 + calls_out: 11 + calls_in: 3 + rust-ast.src.main.collect_files: + name: collect_files + module: rust-ast.src.main + line: 101 + cyclomatic_complexity: 9 + calls_out: 20 + calls_in: 1 + src.extractors.docs-chunks.worker: + name: worker + module: src.extractors.docs-chunks + line: 41 + cyclomatic_complexity: 3 + calls_out: 1 + calls_in: 4 + examples.frontend.src.render.classifyEvent: + name: classifyEvent + module: examples.frontend.src.render + line: 13 + cyclomatic_complexity: 4 + calls_out: 0 + calls_in: 1 + src.cli.handleExtractMarkdown: + name: handleExtractMarkdown + module: src.cli + line: 636 cyclomatic_complexity: 1 calls_out: 5 calls_in: 0 - src.cli.optionList: - name: optionList - module: src.cli - line: 732 + src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions: + name: assertNlExtractionOptions + module: src.extractors.nl-llm + line: 38 cyclomatic_complexity: 2 + calls_out: 4 + calls_in: 1 + src.extractors.docs-llm.DocumentationLlmRequiredError.files: + name: files + module: src.extractors.docs-llm + line: 110 + cyclomatic_complexity: 3 + calls_out: 7 + calls_in: 0 + src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited: + name: extractMarkdownIntentAudited + module: src.extractors.markdown-llm + line: 34 + cyclomatic_complexity: 9 + calls_out: 14 + calls_in: 0 + src.extractors.git.gitMarkerState: + name: gitMarkerState + module: src.extractors.git + line: 277 + cyclomatic_complexity: 5 calls_out: 5 - calls_in: 4 - src.web.diff-ui.updateMeta: - name: updateMeta - module: src.web.diff-ui - line: 41 + calls_in: 1 + src.extractors.runtime-cycle.parseCycle: + name: parseCycle + module: src.extractors.runtime-cycle + line: 68 cyclomatic_complexity: 7 + calls_out: 5 + calls_in: 2 + src.extractors.communication-file-helpers.shouldSkipCommunicationFile: + name: shouldSkipCommunicationFile + module: src.extractors.communication-file-helpers + line: 102 + cyclomatic_complexity: 8 calls_out: 3 calls_in: 2 - src.cli.optionString: - name: optionString + rust-ast.src.main.visit_expr_method_call: + name: visit_expr_method_call + module: rust-ast.src.main + line: 296 + cyclomatic_complexity: 1 + calls_out: 7 + calls_in: 0 + src.extractors.configuration.dockerEntries: + name: dockerEntries + module: src.extractors.configuration + line: 173 + cyclomatic_complexity: 6 + calls_out: 6 + calls_in: 1 + src.cli.pipeline: + name: pipeline module: src.cli - line: 705 + line: 349 + cyclomatic_complexity: 1 + calls_out: 5 + calls_in: 0 + src.extractors.git.isGitWorkTree: + name: isGitWorkTree + module: src.extractors.git + line: 287 cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 17 - src.pipeline.run.skippedAudit: - name: skippedAudit - module: src.pipeline.run - line: 579 + calls_out: 2 + calls_in: 4 + src.extractors.communication-helpers.communicationSegments: + name: communicationSegments + module: src.extractors.communication-helpers + line: 181 + cyclomatic_complexity: 14 + calls_out: 12 + calls_in: 0 + src.extractors.changelog.body: + name: body + module: src.extractors.changelog + line: 27 + cyclomatic_complexity: 7 + calls_out: 15 + calls_in: 0 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownBatchWithCorrection: + name: enrichMarkdownBatchWithCorrection + module: src.extractors.markdown-llm-helpers + line: 187 cyclomatic_complexity: 1 calls_out: 0 - calls_in: 8 - src.synthesis.code-change-plan.riskFor: - name: riskFor - module: src.synthesis.code-change-plan - line: 489 - cyclomatic_complexity: 4 - calls_out: 1 - calls_in: 7 - src.services.actions.summaryModeValue: - name: summaryModeValue - module: src.services.actions - line: 544 - cyclomatic_complexity: 4 - calls_out: 2 - calls_in: 2 - src.services.actions.nullableScopedPath: - name: nullableScopedPath - module: src.services.actions - line: 613 + calls_in: 1 + src.cli.buildWorkspaceComparisonOptions: + name: buildWorkspaceComparisonOptions + module: src.cli + line: 414 + cyclomatic_complexity: 3 + calls_out: 6 + calls_in: 1 + src.cli.handleExtractRuntime: + name: handleExtractRuntime + module: src.cli + line: 629 cyclomatic_complexity: 2 calls_out: 3 - calls_in: 2 - src.pipeline.run.collectTargetHints: - name: collectTargetHints - module: src.pipeline.run - line: 485 - cyclomatic_complexity: 1 + calls_in: 0 + src.extractors.configuration.configurationFormat: + name: configurationFormat + module: src.extractors.configuration + line: 113 + cyclomatic_complexity: 6 + calls_out: 4 + calls_in: 1 + rust-ast.src.main.arguments: + name: arguments + module: rust-ast.src.main + line: 82 + cyclomatic_complexity: 5 + calls_out: 9 + calls_in: 1 + src.extractors.docs-deterministic.marker: + name: marker + module: src.extractors.docs-deterministic + line: 162 + cyclomatic_complexity: 4 + calls_out: 2 + calls_in: 0 + src.cli.absolute: + name: absolute + module: src.cli + line: 712 + cyclomatic_complexity: 3 + calls_out: 1 + calls_in: 0 + src.extractors.configuration.findKeyLine: + name: findKeyLine + module: src.extractors.configuration + line: 204 + cyclomatic_complexity: 3 calls_out: 4 - calls_in: 2 - src.semantic.reranker.assertSemanticCandidateSet: - name: assertSemanticCandidateSet - module: src.semantic.reranker - line: 184 - cyclomatic_complexity: 27 - calls_out: 18 calls_in: 3 - src.cli.optionTaskMode: - name: optionTaskMode + src.cli.resolveWatchTaskFile: + name: resolveWatchTaskFile module: src.cli - line: 747 - cyclomatic_complexity: 5 - calls_out: 3 + line: 409 + cyclomatic_complexity: 3 + calls_out: 4 calls_in: 1 - src.summary.summarizer.summarizeGraph: - name: summarizeGraph - module: src.summary.summarizer - line: 57 - cyclomatic_complexity: 10 - calls_out: 13 + src.extractors.communication-file-helpers.inferred: + name: inferred + module: src.extractors.communication-file-helpers + line: 52 + cyclomatic_complexity: 2 + calls_out: 1 calls_in: 0 - src.watch.watcher.scanTree: - name: scanTree - module: src.watch.watcher - line: 37 - cyclomatic_complexity: 12 - calls_out: 17 - calls_in: 4 - src.watch.watcher.delta: - name: delta - module: src.watch.watcher - line: 182 + src.extractors.todo.heading: + name: heading + module: src.extractors.todo + line: 36 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 0 + src.extractors.docs-chunks.flush: + name: flush + module: src.extractors.docs-chunks + line: 63 cyclomatic_complexity: 2 calls_out: 2 - calls_in: 0 - src.semantic.reranker.createSemanticRerankResult: - name: createSemanticRerankResult - module: src.semantic.reranker + calls_in: 3 + src.extractors.communication-helpers.isCommunicationType: + name: isCommunicationType + module: src.extractors.communication-helpers line: 251 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 6 + examples.backend.src.validation.action: + name: action + module: examples.backend.src.validation + line: 23 + cyclomatic_complexity: 2 + calls_out: 3 + calls_in: 0 + src.extractors.communication-helpers.normalizeType: + name: normalizeType + module: src.extractors.communication-helpers + line: 246 cyclomatic_complexity: 4 - calls_out: 11 + calls_out: 2 calls_in: 0 - src.synthesis.todo-patch.now: - name: now - module: src.synthesis.todo-patch - line: 186 - cyclomatic_complexity: 5 - calls_out: 4 + src.cli.diagnostics: + name: diagnostics + module: src.cli + line: 558 + cyclomatic_complexity: 2 + calls_out: 5 calls_in: 0 - src.synthesis.task-synthesis-materialize.normalizeStringArray: - name: normalizeStringArray - module: src.synthesis.task-synthesis-materialize - line: 134 + examples.backend.src.request-handlers.MAX_BODY_BYTES: + name: MAX_BODY_BYTES + module: examples.backend.src.request-handlers + line: 5 + cyclomatic_complexity: 9 + calls_out: 5 + calls_in: 0 + examples.backend.src.server.server: + name: server + module: examples.backend.src.server + line: 18 cyclomatic_complexity: 3 calls_out: 4 - calls_in: 11 - src.synthesis.todo-patch.recovered: - name: recovered - module: src.synthesis.todo-patch - line: 190 - cyclomatic_complexity: 5 - calls_out: 4 calls_in: 0 - src.synthesis.validation.jaccard: - name: jaccard - module: src.synthesis.validation - line: 103 + src.extractors.configuration.files: + name: files + module: src.extractors.configuration + line: 15 + cyclomatic_complexity: 4 + calls_out: 5 + calls_in: 0 + src.extractors.docs-deterministic.readParagraph: + name: readParagraph + module: src.extractors.docs-deterministic + line: 235 + cyclomatic_complexity: 11 + calls_out: 5 + calls_in: 1 + src.extractors.docs-record.linesFromChunk: + name: linesFromChunk + module: src.extractors.docs-record + line: 172 + cyclomatic_complexity: 1 + calls_out: 5 + calls_in: 5 + src.extractors.nl.inferActor: + name: inferActor + module: src.extractors.nl + line: 87 cyclomatic_complexity: 5 - calls_out: 1 - calls_in: 6 - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection: - name: synthesizeWithCorrection - module: src.synthesis.tasks-llm - line: 117 + calls_out: 2 + calls_in: 9 + src.extractors.docs-record.action: + name: action + module: src.extractors.docs-record + line: 36 cyclomatic_complexity: 11 - calls_out: 8 + calls_out: 7 + calls_in: 0 + src.extractors.docs-record.clampLine: + name: clampLine + module: src.extractors.docs-record + line: 179 + cyclomatic_complexity: 1 + calls_out: 3 + calls_in: 1 + src.extractors.runtime-cycle.boundedArray: + name: boundedArray + module: src.extractors.runtime-cycle + line: 94 + cyclomatic_complexity: 8 + calls_out: 4 calls_in: 3 - src.operations.validation.assertVariableContract: - name: assertVariableContract - module: src.operations.validation - line: 62 - cyclomatic_complexity: 20 - calls_out: 14 + src.extractors.docs-chunks.splitLongSection: + name: splitLongSection + module: src.extractors.docs-chunks + line: 107 + cyclomatic_complexity: 2 + calls_out: 3 + calls_in: 3 + src.extractors.todo.classified: + name: classified + module: src.extractors.todo + line: 49 + cyclomatic_complexity: 2 + calls_out: 12 calls_in: 0 - src.synthesis.todo-patch.object: - name: object - module: src.synthesis.todo-patch - line: 333 + src.extractors.git.state: + name: state + module: src.extractors.git + line: 172 cyclomatic_complexity: 4 - calls_out: 2 - calls_in: 6 - src.summary.summarizer.SummaryAttemptError.generationMetadata: - name: generationMetadata - module: src.summary.summarizer - line: 285 - cyclomatic_complexity: 9 calls_out: 5 - calls_in: 6 - src.synthesis.todo-patch.exactKeys: - name: exactKeys - module: src.synthesis.todo-patch - line: 338 + calls_in: 0 + src.extractors.runtime-cycle.driftRecord: + name: driftRecord + module: src.extractors.runtime-cycle + line: 211 + cyclomatic_complexity: 5 + calls_out: 5 + calls_in: 2 + src.extractors.configuration.entries: + name: entries + module: src.extractors.configuration + line: 43 + cyclomatic_complexity: 1 + calls_out: 3 + calls_in: 2 + examples.src.runtime.validateContract: + name: validateContract + module: examples.src.runtime + line: 6 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 1 + src.cli.parsed: + name: parsed + module: src.cli + line: 71 cyclomatic_complexity: 3 - calls_out: 6 - calls_in: 6 - src.synthesis.code-change-plan.createCodeChangeSourcePatchSet: - name: createCodeChangeSourcePatchSet - module: src.synthesis.code-change-plan - line: 759 + calls_out: 2 + calls_in: 0 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.emptyCoverage: + name: emptyCoverage + module: src.extractors.markdown-llm-helpers + line: 179 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 1 + src.extractors.todo.relative: + name: relative + module: src.extractors.todo + line: 29 + cyclomatic_complexity: 5 + calls_out: 20 + calls_in: 0 + src.extractors.docs-chunks.chunkMarkdown: + name: chunkMarkdown + module: src.extractors.docs-chunks + line: 55 cyclomatic_complexity: 8 - calls_out: 11 + calls_out: 9 + calls_in: 0 + rust-ast.src.main.visit_item_struct: + name: visit_item_struct + module: rust-ast.src.main + line: 223 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 0 + src.extractors.communication-file-helpers.appendRoleAndParticipantWarnings: + name: appendRoleAndParticipantWarnings + module: src.extractors.communication-file-helpers + line: 273 + cyclomatic_complexity: 3 + calls_out: 2 + calls_in: 1 + examples.backend.src.validation.object: + name: object + module: examples.backend.src.validation + line: 24 + cyclomatic_complexity: 2 + calls_out: 3 + calls_in: 0 + src.extractors.nl.classified: + name: classified + module: src.extractors.nl + line: 49 + cyclomatic_complexity: 1 + calls_out: 9 + calls_in: 0 + src.extractors.docs-chunks.index: + name: index + module: src.extractors.docs-chunks + line: 43 + cyclomatic_complexity: 1 + calls_out: 3 + calls_in: 0 + src.extractors.todo.action: + name: action + module: src.extractors.todo + line: 50 + cyclomatic_complexity: 2 + calls_out: 12 + calls_in: 0 + src.extractors.markdown-llm.MarkdownLlmRequiredError.fallbackOrThrow: + name: fallbackOrThrow + module: src.extractors.markdown-llm + line: 135 + cyclomatic_complexity: 2 + calls_out: 5 + calls_in: 2 + src.extractors.communication-helpers.isCommunicationNoise: + name: isCommunicationNoise + module: src.extractors.communication-helpers + line: 286 + cyclomatic_complexity: 3 + calls_out: 2 + calls_in: 3 + src.cli.initProject: + name: initProject + module: src.cli + line: 736 + cyclomatic_complexity: 6 + calls_out: 9 + calls_in: 1 + src.extractors.nl-llm-helpers.NlAttemptError.lines: + name: lines + module: src.extractors.nl-llm-helpers + line: 86 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 0 - src.services.actions.stringList: - name: stringList - module: src.services.actions - line: 645 + src.cli.invokedPath: + name: invokedPath + module: src.cli + line: 936 cyclomatic_complexity: 4 + calls_out: 4 + calls_in: 0 + src.extractors.configuration.configurationRecords: + name: configurationRecords + module: src.extractors.configuration + line: 41 + cyclomatic_complexity: 4 + calls_out: 12 + calls_in: 4 + src.cli.handleCloseCodeChange: + name: handleCloseCodeChange + module: src.cli + line: 310 + cyclomatic_complexity: 6 + calls_out: 5 + calls_in: 0 + src.cli.buildGitDiff: + name: buildGitDiff + module: src.cli + line: 534 + cyclomatic_complexity: 5 calls_out: 6 - calls_in: 3 - src.watch.watcher.absoluteRoot: - name: absoluteRoot - module: src.watch.watcher - line: 40 - cyclomatic_complexity: 11 - calls_out: 14 + calls_in: 1 + src.cli.stop: + name: stop + module: src.cli + line: 352 + cyclomatic_complexity: 1 + calls_out: 5 + calls_in: 0 + src.extractors.docs-record.toDocumentIntentRecord: + name: toDocumentIntentRecord + module: src.extractors.docs-record + line: 25 + cyclomatic_complexity: 14 + calls_out: 13 calls_in: 0 - src.synthesis.code-change-plan.renderIds: - name: renderIds - module: src.synthesis.code-change-plan - line: 680 - cyclomatic_complexity: 2 - calls_out: 2 + src.extractors.docs-record.allowedModality: + name: allowedModality + module: src.extractors.docs-record + line: 187 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 1 - src.services.actions.view: - name: view - module: src.services.actions - line: 456 - cyclomatic_complexity: 2 - calls_out: 4 + src.cli.handleApplyTodo: + name: handleApplyTodo + module: src.cli + line: 201 + cyclomatic_complexity: 8 + calls_out: 5 calls_in: 0 - src.services.actions.withTextDiffViews: - name: withTextDiffViews - module: src.services.actions - line: 556 + src.cli.optionBoolean: + name: optionBoolean + module: src.cli + line: 830 cyclomatic_complexity: 3 - calls_out: 7 - calls_in: 2 - src.synthesis.validation.words: - name: words - module: src.synthesis.validation - line: 99 - cyclomatic_complexity: 2 calls_out: 3 - calls_in: 7 - src.semantic.reranker-llm.SemanticRerankerRequiredError.assertTrackedSnapshot: - name: assertTrackedSnapshot - module: src.semantic.reranker-llm - line: 140 - cyclomatic_complexity: 1 - calls_out: 0 + calls_in: 17 + src.cli.optionLlmMode: + name: optionLlmMode + module: src.cli + line: 854 + cyclomatic_complexity: 6 + calls_out: 3 + calls_in: 8 + src.cli.parseDiffMode: + name: parseDiffMode + module: src.cli + line: 488 + cyclomatic_complexity: 5 + calls_out: 3 calls_in: 1 - src.cli.diagnostics: - name: diagnostics + src.cli.stamp: + name: stamp module: src.cli - line: 499 - cyclomatic_complexity: 2 + line: 449 + cyclomatic_complexity: 10 calls_out: 5 calls_in: 0 - src.synthesis.todo-patch.nonBlank: - name: nonBlank - module: src.synthesis.todo-patch - line: 346 + src.cli.optionSummaryMode: + name: optionSummaryMode + module: src.cli + line: 866 + cyclomatic_complexity: 4 + calls_out: 3 + calls_in: 1 + src.cli.buildFileDiff: + name: buildFileDiff + module: src.cli + line: 517 cyclomatic_complexity: 3 - calls_out: 2 - calls_in: 3 - src.watch.watcher.runReport: - name: runReport - module: src.watch.watcher - line: 157 + calls_out: 6 + calls_in: 1 + src.extractors.docs-llm.DocumentationLlmRequiredError.readPrompt: + name: readPrompt + module: src.extractors.docs-llm + line: 261 cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 5 - src.semantic.reranker.seenPairs: - name: seenPairs - module: src.semantic.reranker - line: 204 - cyclomatic_complexity: 14 - calls_out: 9 - calls_in: 0 - src.cli.context: - name: context - module: src.cli - line: 451 - cyclomatic_complexity: 9 + calls_out: 6 + calls_in: 1 + src.extractors.communication-helpers.flush: + name: flush + module: src.extractors.communication-helpers + line: 195 + cyclomatic_complexity: 5 + calls_out: 5 + calls_in: 1 + src.extractors.docs-record.keywordOverlap: + name: keywordOverlap + module: src.extractors.docs-record + line: 119 + cyclomatic_complexity: 3 + calls_out: 3 + calls_in: 1 + src.extractors.changelog.changelogAction: + name: changelogAction + module: src.extractors.changelog + line: 87 + cyclomatic_complexity: 11 + calls_out: 3 + calls_in: 4 + src.extractors.configuration.MAX_ENTRIES_PER_FILE: + name: MAX_ENTRIES_PER_FILE + module: src.extractors.configuration + line: 8 + cyclomatic_complexity: 4 calls_out: 10 calls_in: 0 - src.services.actions.beforeGraph: - name: beforeGraph - module: src.services.actions - line: 350 - cyclomatic_complexity: 8 - calls_out: 2 - calls_in: 0 - src.synthesis.task-synthesis-materialize.mapKeys: - name: mapKeys - module: src.synthesis.task-synthesis-materialize - line: 121 - cyclomatic_complexity: 2 - calls_out: 5 - calls_in: 6 - src.synthesis.code-change-plan.evaluateCodeChangeAcceptance: - name: evaluateCodeChangeAcceptance - module: src.synthesis.code-change-plan - line: 224 - cyclomatic_complexity: 9 - calls_out: 18 - calls_in: 3 - src.synthesis.validation.sharedSymbol: - name: sharedSymbol - module: src.synthesis.validation - line: 45 + examples.frontend.src.render.toRows: + name: toRows + module: examples.frontend.src.render + line: 19 cyclomatic_complexity: 1 calls_out: 2 calls_in: 0 - src.web.diff-ui.formatBytes: - name: formatBytes - module: src.web.diff-ui - line: 39 - cyclomatic_complexity: 7 - calls_out: 2 - calls_in: 3 - src.synthesis.todo-patch.assertTodoPatchArtifact: - name: assertTodoPatchArtifact - module: src.synthesis.todo-patch - line: 221 - cyclomatic_complexity: 11 - calls_out: 16 - calls_in: 2 - src.services.actions.hasInputValue: - name: hasInputValue - module: src.services.actions - line: 657 + src.extractors.git.hasMoreDiscoveryWork: + name: hasMoreDiscoveryWork + module: src.extractors.git + line: 195 cyclomatic_complexity: 3 calls_out: 0 - calls_in: 7 - src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS: - name: DEFAULT_SCAN_INTERVAL_MS - module: src.watch.watcher - line: 145 - cyclomatic_complexity: 19 - calls_out: 14 - calls_in: 0 - src.synthesis.code-change-plan.proposals: - name: proposals - module: src.synthesis.code-change-plan - line: 119 - cyclomatic_complexity: 7 - calls_out: 18 + calls_in: 2 + src.cli.handlePipeline: + name: handlePipeline + module: src.cli + line: 338 + cyclomatic_complexity: 1 + calls_out: 7 calls_in: 0 - src.synthesis.code-change-plan.generatedAt: - name: generatedAt - module: src.synthesis.code-change-plan - line: 769 - cyclomatic_complexity: 3 - calls_out: 2 + examples.frontend.src.app.createState: + name: createState + module: examples.frontend.src.app + line: 14 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 1 + src.extractors.configuration.line: + name: line + module: src.extractors.configuration + line: 149 + cyclomatic_complexity: 4 + calls_out: 3 calls_in: 0 - src.summary.render.renderSummaryMarkdown: - name: renderSummaryMarkdown - module: src.summary.render - line: 3 - cyclomatic_complexity: 10 - calls_out: 9 + src.extractors.docs-record.statementText: + name: statementText + module: src.extractors.docs-record + line: 32 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 0 - src.operations.validation.assertPrincipalList: - name: assertPrincipalList - module: src.operations.validation - line: 49 + src.extractors.markdown-llm-helpers.MarkdownAttemptError.strings: + name: strings + module: src.extractors.markdown-llm-helpers + line: 370 + cyclomatic_complexity: 1 + calls_out: 5 + calls_in: 2 + src.extractors.nl.body: + name: body + module: src.extractors.nl + line: 41 cyclomatic_complexity: 2 - calls_out: 4 - calls_in: 3 - src.semantic.reranker.boundedScore: - name: boundedScore - module: src.semantic.reranker - line: 480 + calls_out: 14 + calls_in: 0 + src.extractors.docs-record.resolveTarget: + name: resolveTarget + module: src.extractors.docs-record + line: 128 + cyclomatic_complexity: 12 + calls_out: 7 + calls_in: 2 + src.extractors.git.discoverGitRepositories: + name: discoverGitRepositories + module: src.extractors.git + line: 171 cyclomatic_complexity: 4 - calls_out: 3 - calls_in: 5 - src.tf.classifier.loadAssets: - name: loadAssets - module: src.tf.classifier - line: 34 - cyclomatic_complexity: 2 - calls_out: 6 + calls_out: 7 calls_in: 1 - src.cli.controller: - name: controller + src.extractors.git.finishDiscovery: + name: finishDiscovery + module: src.extractors.git + line: 268 + cyclomatic_complexity: 4 + calls_out: 1 + calls_in: 1 + src.cli.buildPipelineOptions: + name: buildPipelineOptions module: src.cli - line: 392 + line: 371 cyclomatic_complexity: 1 - calls_out: 5 - calls_in: 0 - src.synthesis.todo-patch.sameArray: - name: sameArray - module: src.synthesis.todo-patch - line: 329 - cyclomatic_complexity: 2 calls_out: 1 - calls_in: 4 - src.services.actions.beforePath: - name: beforePath - module: src.services.actions - line: 427 - cyclomatic_complexity: 1 - calls_out: 4 - calls_in: 0 - src.synthesis.code-change-plan.matchingConclusions: - name: matchingConclusions - module: src.synthesis.code-change-plan - line: 142 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 0 - src.watch.watcher.timer: - name: timer - module: src.watch.watcher - line: 232 + calls_in: 2 + src.extractors.nl.missing: + name: missing + module: src.extractors.nl + line: 52 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 9 calls_in: 0 - src.watch.watcher.startedAt: - name: startedAt - module: src.watch.watcher - line: 209 + src.extractors.docs-chunks.mapConcurrent: + name: mapConcurrent + module: src.extractors.docs-chunks + line: 33 cyclomatic_complexity: 3 - calls_out: 4 + calls_out: 7 calls_in: 0 - src.synthesis.todo-patch.atomicWrite: - name: atomicWrite - module: src.synthesis.todo-patch - line: 274 - cyclomatic_complexity: 5 - calls_out: 13 - calls_in: 6 - src.summary.summarizer.SummaryAttemptError.assertConclusions: - name: assertConclusions - module: src.summary.summarizer - line: 281 - cyclomatic_complexity: 1 - calls_out: 0 - calls_in: 3 - src.synthesis.code-change-plan.inline: - name: inline - module: src.synthesis.code-change-plan - line: 676 + src.extractors.docs-schema.documentResponseContract: + name: documentResponseContract + module: src.extractors.docs-schema + line: 31 cyclomatic_complexity: 1 calls_out: 2 calls_in: 1 - src.synthesis.code-change-plan.matchingProposals: - name: matchingProposals - module: src.synthesis.code-change-plan - line: 141 + src.extractors.nl-llm-helpers.NlAttemptError.allowedModality: + name: allowedModality + module: src.extractors.nl-llm-helpers + line: 226 cyclomatic_complexity: 1 - calls_out: 2 + calls_out: 1 + calls_in: 1 + src.extractors.markdown-paths.state: + name: state + module: src.extractors.markdown-paths + line: 92 + cyclomatic_complexity: 6 + calls_out: 4 calls_in: 0 - src.cli.view: - name: view - module: src.cli - line: 502 - cyclomatic_complexity: 2 - calls_out: 5 + src.extractors.docs-record.resolveObject: + name: resolveObject + module: src.extractors.docs-record + line: 79 + cyclomatic_complexity: 4 + calls_out: 2 + calls_in: 3 + java.JavaAstExtract.JavaAstExtract.main: + name: main + module: java.JavaAstExtract + line: 21 + cyclomatic_complexity: 10 + calls_out: 16 calls_in: 0 edges: -- caller: src.cli.main - callee: src.cli.printHelp +- caller: rust-ast.src.main.main + callee: rust-ast.src.main.arguments call_type: resolved -- caller: src.cli.main - callee: src.cli.parseArgs +- caller: rust-ast.src.main.main + callee: rust-ast.src.main.collect_files call_type: resolved -- caller: src.cli.main - callee: src.cli.initProject +- caller: rust-ast.src.main.main + callee: rust-ast.src.main.slash call_type: resolved -- caller: src.cli.parsed - callee: src.cli.printHelp +- caller: rust-ast.src.main.collect_files + callee: rust-ast.src.main.slash call_type: resolved -- caller: src.cli.command - callee: src.cli.printHelp +- caller: rust-ast.src.main.add + callee: rust-ast.src.main.excerpt call_type: resolved -- caller: src.cli.diagnosticsPath - callee: src.cli.optionNumber +- caller: rust-ast.src.main.visit_item_mod + callee: rust-ast.src.main.qualified call_type: resolved -- caller: src.cli.diagnosticsPath - callee: src.cli.optionBoolean +- caller: rust-ast.src.main.visit_item_mod + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.diagnostics - callee: src.cli.optionNumber +- caller: rust-ast.src.main.visit_item_use + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.diagnostics - callee: src.cli.optionBoolean +- caller: rust-ast.src.main.visit_item_struct + callee: rust-ast.src.main.type_item call_type: resolved -- caller: src.cli.result - callee: src.cli.execFileAsync +- caller: rust-ast.src.main.visit_item_enum + callee: rust-ast.src.main.type_item call_type: resolved -- caller: src.cli.isPlanSet - callee: src.cli.optionString +- caller: rust-ast.src.main.visit_item_trait + callee: rust-ast.src.main.type_item call_type: resolved -- caller: src.cli.root - callee: src.cli.optionString +- caller: rust-ast.src.main.visit_item_type + callee: rust-ast.src.main.type_item call_type: resolved -- caller: src.cli.root - callee: src.cli.optionNullableString +- caller: rust-ast.src.main.visit_item_const + callee: rust-ast.src.main.qualified call_type: resolved -- caller: src.cli.root - callee: src.cli.optionLlmMode +- caller: rust-ast.src.main.visit_item_const + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.handleWatch - callee: src.cli.optionNullableString +- caller: rust-ast.src.main.visit_item_const + callee: rust-ast.src.main.modifiers call_type: resolved -- caller: src.cli.handleWatch - callee: src.cli.optionList +- caller: rust-ast.src.main.visit_item_static + callee: rust-ast.src.main.qualified call_type: resolved -- caller: src.cli.handleWatch - callee: src.cli.optionBoolean +- caller: rust-ast.src.main.visit_item_static + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.handleWatch - callee: src.cli.optionString +- caller: rust-ast.src.main.visit_item_static + callee: rust-ast.src.main.modifiers call_type: resolved -- caller: src.cli.handleWatch - callee: src.cli.optionNumber +- caller: rust-ast.src.main.visit_item_fn + callee: rust-ast.src.main.qualified call_type: resolved -- caller: src.cli.handleWatch - callee: src.cli.optionNlMode +- caller: rust-ast.src.main.visit_item_fn + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionNullableString +- caller: rust-ast.src.main.visit_impl_item_fn + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionList +- caller: rust-ast.src.main.visit_expr_call + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionBoolean +- caller: rust-ast.src.main.visit_expr_method_call + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionString +- caller: rust-ast.src.main.type_item + callee: rust-ast.src.main.qualified call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionNumber +- caller: rust-ast.src.main.type_item + callee: rust-ast.src.main.add call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionNlMode +- caller: rust-ast.src.main.type_item + callee: rust-ast.src.main.modifiers call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionLlmMode +- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES + callee: examples.backend.src.request-handlers.handleHealth call_type: resolved -- caller: src.cli.taskFile - callee: src.cli.optionPipelineTaskMode +- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES + callee: examples.backend.src.request-handlers.handleEventPublish call_type: resolved -- caller: src.cli.controller - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES + callee: examples.backend.src.request-handlers.handleEventList call_type: resolved -- caller: src.cli.controller - callee: src.cli.optionBoolean +- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.controller - callee: src.cli.formatWatchEvent +- caller: examples.backend.src.request-handlers.handleRequest + callee: examples.backend.src.request-handlers.handleHealth call_type: resolved -- caller: src.cli.stop - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.handleRequest + callee: examples.backend.src.request-handlers.handleEventPublish call_type: resolved -- caller: src.cli.stop - callee: src.cli.optionBoolean +- caller: examples.backend.src.request-handlers.handleRequest + callee: examples.backend.src.request-handlers.handleEventList call_type: resolved -- caller: src.cli.stop - callee: src.cli.formatWatchEvent +- caller: examples.backend.src.request-handlers.handleRequest + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.formatWatchEvent - callee: src.cli.file +- caller: examples.backend.src.request-handlers.handleHealth + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.stamp - callee: src.cli.file +- caller: examples.backend.src.request-handlers.handleHealth + callee: examples.backend.src.request-handlers.size call_type: resolved -- caller: src.cli.handleDiff - callee: src.cli.optionString +- caller: examples.backend.src.request-handlers.handleEventPublish + callee: examples.backend.src.request-handlers.readBody call_type: resolved -- caller: src.cli.handleDiff - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.handleEventPublish + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.mode - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.validation + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.svg - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.event + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.svg - callee: src.cli.optionBoolean +- caller: examples.backend.src.request-handlers.handleEventList + callee: examples.backend.src.request-handlers.parseOffset call_type: resolved -- caller: src.cli.html - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.handleEventList + callee: examples.backend.src.request-handlers.parseLimit call_type: resolved -- caller: src.cli.diff - callee: src.cli.optionNumber +- caller: examples.backend.src.request-handlers.handleEventList + callee: examples.backend.src.request-handlers.sendJson call_type: resolved -- caller: src.cli.context - callee: src.cli.optionString +- caller: examples.backend.src.validation.ALLOWED_ACTIONS + callee: examples.backend.src.validation.invalid call_type: resolved -- caller: src.cli.context - callee: src.cli.optionBoolean +- caller: examples.backend.src.validation.validateEventPayload + callee: examples.backend.src.validation.invalid call_type: resolved -- caller: src.cli.context - callee: src.cli.optionNumber +- caller: examples.backend.src.validation.record + callee: examples.backend.src.validation.invalid call_type: resolved -- caller: src.cli.maxRows - callee: src.cli.optionString +- caller: examples.backend.src.validation.agent + callee: examples.backend.src.validation.invalid call_type: resolved -- caller: src.cli.maxRows - callee: src.cli.optionBoolean +- caller: examples.backend.src.validation.action + callee: examples.backend.src.validation.invalid call_type: resolved -- caller: src.cli.maxRows - callee: src.cli.optionNumber +- caller: examples.backend.src.validation.object + callee: examples.backend.src.validation.invalid call_type: resolved -- caller: src.cli.handleReality - callee: src.cli.optionString +- caller: examples.backend.src.server.createBackend + callee: examples.backend.src.server.sendJson call_type: resolved -- caller: src.cli.handleReality - callee: src.cli.optionNumber +- caller: examples.backend.src.server.store + callee: examples.backend.src.server.sendJson call_type: resolved -- caller: src.cli.handleReality - callee: src.cli.optionBoolean +- caller: examples.backend.src.server.server + callee: examples.backend.src.server.sendJson call_type: resolved -- caller: src.cli.view - callee: src.cli.optionNumber +- caller: examples.backend.src.server.startBackend + callee: examples.backend.src.server.createBackend call_type: resolved -- caller: src.cli.view - callee: src.cli.optionBoolean +- caller: examples.frontend.src.render.toRows + callee: examples.frontend.src.render.classifyEvent call_type: resolved -- caller: src.cli.handleExtract - callee: src.cli.optionString +- caller: examples.frontend.src.render.renderTable + callee: examples.frontend.src.render.headerRow call_type: resolved -- caller: src.cli.handleExtract - callee: src.cli.optionNlMode +- caller: examples.frontend.src.app.mountPanel + callee: examples.frontend.src.app.createState call_type: resolved -- caller: src.cli.handleExtract - callee: src.cli.emitExtraction +- caller: examples.frontend.src.app.mountPanel + callee: examples.frontend.src.app.refresh call_type: resolved -- caller: src.cli.handleExtract - callee: src.cli.optionNumber +- caller: examples.frontend.src.app.mountPanel + callee: examples.frontend.src.app.reload call_type: resolved -- caller: src.cli.extractor - callee: src.cli.optionString +- caller: examples.frontend.src.app.mountPanel + callee: examples.frontend.src.app.state call_type: resolved -- caller: src.cli.extractor - callee: src.cli.optionNlMode +- caller: examples.frontend.src.app.state + callee: examples.frontend.src.app.refresh call_type: resolved -- caller: src.cli.extractor - callee: src.cli.emitExtraction +- caller: examples.frontend.src.app.reload + callee: examples.frontend.src.app.refresh call_type: resolved -- caller: src.cli.handleCommunication - callee: src.cli.optionString +- caller: examples.src.runtime.executeContract + callee: examples.src.runtime.validateContract call_type: resolved -- caller: src.cli.handleCommunication - callee: src.cli.optionNullableString +- caller: java.JavaAstExtract.JavaAstExtract.main + callee: java.JavaAstExtract.JavaAstExtract.add call_type: resolved -- caller: src.cli.handleCommunication - callee: src.cli.optionLlmMode +- caller: java.JavaAstExtract.JavaAstExtract.main + callee: java.JavaAstExtract.JavaAstExtract.emit call_type: resolved -- caller: src.cli.handleCommunication - callee: src.cli.optionNumber +- caller: java.JavaAstExtract.JavaAstExtract.main + callee: java.JavaAstExtract.JavaAstExtract.collect call_type: resolved -- caller: src.cli.handleCommunication - callee: src.cli.optionBoolean +- caller: java.JavaAstExtract.JavaAstExtract.emit + callee: java.JavaAstExtract.JavaAstExtract.json call_type: resolved -- caller: src.cli.doctor - callee: src.cli.execFileAsync +- caller: java.JavaAstExtract.JavaAstExtract.emit + callee: java.JavaAstExtract.JavaAstExtract.map call_type: resolved -- caller: src.cli.optionNumber - callee: src.cli.optionString +- caller: java.JavaAstExtract.JavaAstExtract.collect + callee: java.JavaAstExtract.JavaAstExtract.try call_type: resolved -- caller: src.cli.optionList - callee: src.cli.optionString +- caller: java.JavaAstExtract.JavaAstExtract.collect + callee: java.JavaAstExtract.JavaAstExtract.containsIgnored call_type: resolved -- caller: src.cli.optionNlMode - callee: src.cli.optionLlmMode +- caller: java.JavaAstExtract.JavaAstExtract.try + callee: java.JavaAstExtract.JavaAstExtract.slash call_type: resolved -- caller: src.cli.optionLlmMode - callee: src.cli.optionString +- caller: java.JavaAstExtract.JavaAstExtract.json + callee: java.JavaAstExtract.JavaAstExtract.escape call_type: resolved -- caller: src.cli.optionTaskMode - callee: src.cli.optionString +- caller: src.cli.main + callee: src.cli.printHelp call_type: resolved -- caller: src.cli.optionSummaryMode - callee: src.cli.optionLlmMode +- caller: src.cli.main + callee: src.cli.parseArgs call_type: resolved -- caller: src.cli.optionSummaryMode - callee: src.cli.optionBoolean +- caller: src.cli.main + callee: src.cli.resolveMainCommand call_type: resolved -- caller: src.cli.optionPipelineTaskMode - callee: src.cli.optionString +- caller: src.cli.main + callee: src.cli.commandHandlers call_type: resolved -- caller: src.cli.invokedPath - callee: src.cli.main +- caller: src.cli.parsed + callee: src.cli.printHelp call_type: resolved -- caller: src.web.diff-ui.diffUiHtml - callee: src.web.diff-ui.byId +- caller: src.cli.command + callee: src.cli.printHelp call_type: resolved -- caller: src.web.diff-ui.requestHeaders - callee: src.web.diff-ui.byId +- caller: src.cli.commandHandlers + callee: src.cli.initProject call_type: resolved -- caller: src.web.diff-ui.formatBytes - callee: src.web.diff-ui.selectedRun +- caller: src.cli.commandHandlers + callee: src.cli.doctor call_type: resolved -- caller: src.web.diff-ui.formatBytes - callee: src.web.diff-ui.byId +- caller: src.cli.handleLink + callee: src.cli.emitJson call_type: resolved -- caller: src.web.diff-ui.selectedRun - callee: src.web.diff-ui.byId +- caller: src.cli.handleLink + callee: src.cli.optionString call_type: resolved -- caller: src.web.diff-ui.selectedRun - callee: src.web.diff-ui.formatBytes +- caller: src.cli.handleDiagnose + callee: src.cli.emitJson call_type: resolved -- caller: src.web.diff-ui.updateMeta - callee: src.web.diff-ui.selectedRun +- caller: src.cli.handleDiagnose + callee: src.cli.optionString call_type: resolved -- caller: src.web.diff-ui.updateMeta - callee: src.web.diff-ui.byId +- caller: src.cli.handleSummarize + callee: src.cli.optionString call_type: resolved -- caller: src.web.diff-ui.updateMeta - callee: src.web.diff-ui.formatBytes +- caller: src.cli.handleSummarize + callee: src.cli.optionSummaryMode call_type: resolved -- caller: src.web.diff-ui.fillSelect - callee: src.web.diff-ui.byId +- caller: src.cli.diagnosticsPath + callee: src.cli.optionNumber call_type: resolved -- caller: src.web.diff-ui.fillSelect - callee: src.web.diff-ui.updateMeta +- caller: src.cli.diagnosticsPath + callee: src.cli.optionBoolean call_type: resolved -- caller: src.web.diff-ui.loadRuns - callee: src.web.diff-ui.byId +- caller: src.cli.diagnostics + callee: src.cli.optionNumber call_type: resolved -- caller: src.web.diff-ui.loadRuns - callee: src.web.diff-ui.requestHeaders +- caller: src.cli.diagnostics + callee: src.cli.optionBoolean call_type: resolved -- caller: src.web.diff-ui.compareGraphs - callee: src.web.diff-ui.byId +- caller: src.cli.result + callee: src.cli.execFileAsync call_type: resolved -- caller: src.web.diff-ui.compareGraphs - callee: src.web.diff-ui.requestHeaders +- caller: src.cli.handleProposeTodo + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.scanTree - callee: src.watch.watcher.relative +- caller: src.cli.handleProposeTodo + callee: src.cli.optionTaskMode call_type: resolved -- caller: src.watch.watcher.maxFiles - callee: src.watch.watcher.relative +- caller: src.cli.handleRenderTodo + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.maxFiles - callee: src.watch.watcher.visit +- caller: src.cli.handleApplyTodo + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.absoluteRoot - callee: src.watch.watcher.relative +- caller: src.cli.handleProposeCodeChange + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.absoluteRoot - callee: src.watch.watcher.visit +- caller: src.cli.handleRenderCodeChange + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.visit - callee: src.watch.watcher.relative +- caller: src.cli.handleProposeSourcePatch + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.absolute - callee: src.watch.watcher.visit +- caller: src.cli.isPlanSet + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.relative - callee: src.watch.watcher.visit +- caller: src.cli.handleApplySourcePatch + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - callee: src.watch.watcher.now +- caller: src.cli.handleEvaluateCodeChange + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - callee: src.watch.watcher.scanTree +- caller: src.cli.handleCloseCodeChange + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - callee: src.watch.watcher.emit +- caller: src.cli.handleCompareWorkspace + callee: src.cli.resolvePipelineRoot call_type: resolved -- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - callee: src.watch.watcher.generate +- caller: src.cli.handleCompareWorkspace + callee: src.cli.buildWorkspaceComparisonOptions call_type: resolved -- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - callee: src.watch.watcher.sleep +- caller: src.cli.root + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - callee: src.watch.watcher.diffSnapshots +- caller: src.cli.root + callee: src.cli.optionNullableString call_type: resolved -- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - callee: src.watch.watcher.now +- caller: src.cli.root + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - callee: src.watch.watcher.scanTree +- caller: src.cli.handlePipeline + callee: src.cli.resolvePipelineRoot call_type: resolved -- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - callee: src.watch.watcher.emit +- caller: src.cli.handlePipeline + callee: src.cli.buildPipelineOptions call_type: resolved -- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - callee: src.watch.watcher.generate +- caller: src.cli.handlePipeline + callee: src.cli.optionNullableString call_type: resolved -- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - callee: src.watch.watcher.sleep +- caller: src.cli.handlePipeline + callee: src.cli.reportPipelineDegradation call_type: resolved -- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - callee: src.watch.watcher.diffSnapshots +- caller: src.cli.handleWatch + callee: src.cli.resolvePipelineRoot call_type: resolved -- caller: src.watch.watcher.watchRepository - callee: src.watch.watcher.now +- caller: src.cli.handleWatch + callee: src.cli.resolveWatchTaskFile call_type: resolved -- caller: src.watch.watcher.watchRepository - callee: src.watch.watcher.scanTree +- caller: src.cli.handleWatch + callee: src.cli.buildPipelineOptions call_type: resolved -- caller: src.watch.watcher.watchRepository - callee: src.watch.watcher.emit +- caller: src.cli.handleWatch + callee: src.cli.optionNumber call_type: resolved -- caller: src.watch.watcher.watchRepository - callee: src.watch.watcher.generate +- caller: src.cli.handleWatch + callee: src.cli.optionBoolean call_type: resolved -- caller: src.watch.watcher.watchRepository - callee: src.watch.watcher.sleep +- caller: src.cli.taskFile + callee: src.cli.optionNumber call_type: resolved -- caller: src.watch.watcher.watchRepository - callee: src.watch.watcher.diffSnapshots +- caller: src.cli.taskFile + callee: src.cli.optionBoolean call_type: resolved -- caller: src.watch.watcher.result - callee: src.watch.watcher.emit +- caller: src.cli.taskFile + callee: src.cli.formatWatchEvent call_type: resolved -- caller: src.watch.watcher.result - callee: src.watch.watcher.now +- caller: src.cli.pipeline + callee: src.cli.optionNumber call_type: resolved -- caller: src.watch.watcher.snapshot - callee: src.watch.watcher.emit +- caller: src.cli.pipeline + callee: src.cli.optionBoolean call_type: resolved -- caller: src.watch.watcher.lastReportStartedAt - callee: src.watch.watcher.now +- caller: src.cli.pipeline + callee: src.cli.formatWatchEvent call_type: resolved -- caller: src.watch.watcher.lastReportStartedAt - callee: src.watch.watcher.generate +- caller: src.cli.controller + callee: src.cli.optionNumber call_type: resolved -- caller: src.watch.watcher.pending - callee: src.watch.watcher.now +- caller: src.cli.controller + callee: src.cli.optionBoolean call_type: resolved -- caller: src.watch.watcher.pending - callee: src.watch.watcher.generate +- caller: src.cli.controller + callee: src.cli.formatWatchEvent call_type: resolved -- caller: src.watch.watcher.current - callee: src.watch.watcher.describeDelta +- caller: src.cli.stop + callee: src.cli.optionNumber call_type: resolved -- caller: src.watch.watcher.current - callee: src.watch.watcher.emit +- caller: src.cli.stop + callee: src.cli.optionBoolean call_type: resolved -- caller: src.watch.watcher.delta - callee: src.watch.watcher.describeDelta +- caller: src.cli.stop + callee: src.cli.formatWatchEvent call_type: resolved -- caller: src.watch.watcher.delta - callee: src.watch.watcher.emit +- caller: src.cli.buildPipelineOptions + callee: src.cli.buildCommonPipelineOptions call_type: resolved -- caller: src.watch.watcher.waitMs - callee: src.watch.watcher.emit +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionNullableString call_type: resolved -- caller: src.watch.watcher.generate - callee: src.watch.watcher.emit +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionList call_type: resolved -- caller: src.watch.watcher.generate - callee: src.watch.watcher.now +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionBoolean call_type: resolved -- caller: src.watch.watcher.generate - callee: src.watch.watcher.runReport +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.generate - callee: src.watch.watcher.scanTree +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionNumber call_type: resolved -- caller: src.watch.watcher.startedAt - callee: src.watch.watcher.runReport +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionNlMode call_type: resolved -- caller: src.watch.watcher.startedAt - callee: src.watch.watcher.emit +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.watch.watcher.startedAt - callee: src.watch.watcher.now +- caller: src.cli.buildCommonPipelineOptions + callee: src.cli.optionPipelineTaskMode call_type: resolved -- caller: src.watch.watcher.defaultSleep - callee: src.watch.watcher.finish +- caller: src.cli.resolveWatchTaskFile + callee: src.cli.optionNullableString call_type: resolved -- caller: src.watch.watcher.timer - callee: src.watch.watcher.finish +- caller: src.cli.buildWorkspaceComparisonOptions + callee: src.cli.optionString call_type: resolved -- caller: src.watch.watcher.onAbort - callee: src.watch.watcher.finish +- caller: src.cli.buildWorkspaceComparisonOptions + callee: src.cli.optionNullableString call_type: resolved -- caller: src.tf.classifier.dynamicImport - callee: src.tf.classifier.importer +- caller: src.cli.buildWorkspaceComparisonOptions + callee: src.cli.optionList call_type: resolved -- caller: src.tf.classifier.loadClassifier - callee: src.tf.classifier.dynamicImport +- caller: src.cli.buildWorkspaceComparisonOptions + callee: src.cli.optionBoolean call_type: resolved -- caller: src.tf.classifier.loadClassifier - callee: src.tf.classifier.loadAssets +- caller: src.cli.buildWorkspaceComparisonOptions + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.tf.classifier.classifyAction - callee: src.tf.classifier.loadClassifier +- caller: src.cli.buildWorkspaceComparisonOptions + callee: src.cli.optionNumber call_type: resolved -- caller: src.tf.classifier.classifyAction - callee: src.tf.classifier.vectorize +- caller: src.cli.formatWatchEvent + callee: src.cli.file call_type: resolved -- caller: src.synthesis.validation.validateAndClassifyTodoProposals - callee: src.synthesis.validation.duplicateEvidence +- caller: src.cli.stamp + callee: src.cli.file call_type: resolved -- caller: src.synthesis.validation.validateAndClassifyTodoProposals - callee: src.synthesis.validation.dependencyFirstPriorityOrder +- caller: src.cli.handleDiff + callee: src.cli.parseDiffMode call_type: resolved -- caller: src.synthesis.validation.duplicateEvidence - callee: src.synthesis.validation.words +- caller: src.cli.handleDiff + callee: src.cli.handleGraphDiff call_type: resolved -- caller: src.synthesis.validation.duplicateEvidence - callee: src.synthesis.validation.intersects +- caller: src.cli.handleDiff + callee: src.cli.buildDiffPayload call_type: resolved -- caller: src.synthesis.validation.duplicateEvidence - callee: src.synthesis.validation.jaccard +- caller: src.cli.handleDiff + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.validation.proposalWords - callee: src.synthesis.validation.words +- caller: src.cli.handleDiff + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.validation.target - callee: src.synthesis.validation.jaccard +- caller: src.cli.svg + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.validation.target - callee: src.synthesis.validation.words +- caller: src.cli.svg + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.validation.sharedTicket - callee: src.synthesis.validation.jaccard +- caller: src.cli.parseDiffMode + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.validation.sharedTicket - callee: src.synthesis.validation.words +- caller: src.cli.handleGraphDiff + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.validation.sharedSymbol - callee: src.synthesis.validation.jaccard +- caller: src.cli.handleGraphDiff + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.validation.sharedSymbol - callee: src.synthesis.validation.words +- caller: src.cli.diff + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.validation.sharedPath - callee: src.synthesis.validation.jaccard +- caller: src.cli.buildDiffPayload + callee: src.cli.buildFileDiff call_type: resolved -- caller: src.synthesis.validation.sharedPath - callee: src.synthesis.validation.words +- caller: src.cli.buildDiffPayload + callee: src.cli.buildGitDiff call_type: resolved -- caller: src.synthesis.validation.similarity - callee: src.synthesis.validation.jaccard +- caller: src.cli.buildFileDiff + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.validation.similarity - callee: src.synthesis.validation.words +- caller: src.cli.context + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.createTodoPatch - callee: src.synthesis.todo-patch.sameArray +- caller: src.cli.context + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.selected - callee: src.synthesis.todo-patch.object +- caller: src.cli.context + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.todo-patch.selected - callee: src.synthesis.todo-patch.exactKeys +- caller: src.cli.buildGitDiff + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.todo-patch.selected - callee: src.synthesis.todo-patch.uniqueIds +- caller: src.cli.buildGitDiff + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.selected - callee: src.synthesis.todo-patch.uniqueStrings +- caller: src.cli.buildGitDiff + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.orderedSelected - callee: src.synthesis.todo-patch.sameArray +- caller: src.cli.handleReality + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.markdown - callee: src.synthesis.todo-patch.normalizePath +- caller: src.cli.handleReality + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.todo-patch.markdown - callee: src.synthesis.todo-patch.diagnosticReportFingerprint +- caller: src.cli.handleReality + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.renderTodoPatchMarkdown - callee: src.synthesis.todo-patch.inline +- caller: src.cli.view + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.todo-patch.renderTodoPatchMarkdown - callee: src.synthesis.todo-patch.renderTargets +- caller: src.cli.view + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.renderTodoPatchMarkdown - callee: src.synthesis.todo-patch.renderIds +- caller: src.cli.handleExtract + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.writeTodoPatchArtifacts - callee: src.synthesis.todo-patch.createTodoPatch +- caller: src.cli.handleExtract + callee: src.cli.handler call_type: resolved -- caller: src.synthesis.todo-patch.applyTodoPatch - callee: src.synthesis.todo-patch.assertTodoPatchArtifact +- caller: src.cli.handleExtractNl + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.applyTodoPatch - callee: src.synthesis.todo-patch.assertApproval +- caller: src.cli.handleExtractNl + callee: src.cli.optionNlMode call_type: resolved -- caller: src.synthesis.todo-patch.current - callee: src.synthesis.todo-patch.assertReceipt +- caller: src.cli.handleExtractNl + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.now - callee: src.synthesis.todo-patch.appendPatch +- caller: src.cli.handleExtractGit + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.todo-patch.now - callee: src.synthesis.todo-patch.atomicWrite +- caller: src.cli.handleExtractGit + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.now - callee: src.synthesis.todo-patch.wasAlreadyAppended +- caller: src.cli.handleExtractAst + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.currentHash - callee: src.synthesis.todo-patch.appendPatch +- caller: src.cli.handleExtractConfig + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.currentHash - callee: src.synthesis.todo-patch.atomicWrite +- caller: src.cli.handleExtractRuntime + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.currentHash - callee: src.synthesis.todo-patch.wasAlreadyAppended +- caller: src.cli.handleExtractMarkdown + callee: src.cli.optionNullableString call_type: resolved -- caller: src.synthesis.todo-patch.result - callee: src.synthesis.todo-patch.appendPatch +- caller: src.cli.handleExtractMarkdown + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.synthesis.todo-patch.result - callee: src.synthesis.todo-patch.atomicWrite +- caller: src.cli.handleExtractMarkdown + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.result - callee: src.synthesis.todo-patch.wasAlreadyAppended +- caller: src.cli.handleExtractDocs + callee: src.cli.optionList call_type: resolved -- caller: src.synthesis.todo-patch.applied - callee: src.synthesis.todo-patch.appendPatch +- caller: src.cli.handleExtractDocs + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.applied - callee: src.synthesis.todo-patch.atomicWrite +- caller: src.cli.handleExtractCommunication + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.applied - callee: src.synthesis.todo-patch.wasAlreadyAppended +- caller: src.cli.handleExtractCommunication + callee: src.cli.optionNullableString call_type: resolved -- caller: src.synthesis.todo-patch.recovered - callee: src.synthesis.todo-patch.appendPatch +- caller: src.cli.handleExtractCommunication + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.synthesis.todo-patch.recovered - callee: src.synthesis.todo-patch.atomicWrite +- caller: src.cli.handleExtractCommunication + callee: src.cli.emitExtraction call_type: resolved -- caller: src.synthesis.todo-patch.recovered - callee: src.synthesis.todo-patch.wasAlreadyAppended +- caller: src.cli.handleCommunication + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.assertTodoPatchArtifact - callee: src.synthesis.todo-patch.object +- caller: src.cli.handleCommunication + callee: src.cli.optionNullableString call_type: resolved -- caller: src.synthesis.todo-patch.assertTodoPatchArtifact - callee: src.synthesis.todo-patch.exactKeys +- caller: src.cli.handleCommunication + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.synthesis.todo-patch.assertTodoPatchArtifact - callee: src.synthesis.todo-patch.isoDate +- caller: src.cli.handleCommunication + callee: src.cli.optionNumber call_type: resolved -- caller: src.synthesis.todo-patch.assertTodoPatchArtifact - callee: src.synthesis.todo-patch.hash +- caller: src.cli.handleCommunication + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.assertTodoPatchArtifact - callee: src.synthesis.todo-patch.nonBlank +- caller: src.cli.handleIntake + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.assertTodoPatchArtifact - callee: src.synthesis.todo-patch.uniqueIds +- caller: src.cli.handleIntake + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.artifact - callee: src.synthesis.todo-patch.object +- caller: src.cli.absolute + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.artifact - callee: src.synthesis.todo-patch.exactKeys +- caller: src.cli.doctor + callee: src.cli.execFileAsync call_type: resolved -- caller: src.synthesis.todo-patch.artifact - callee: src.synthesis.todo-patch.uniqueIds +- caller: src.cli.optionNumber + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.artifact - callee: src.synthesis.todo-patch.uniqueStrings +- caller: src.cli.optionList + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.sourceTodo - callee: src.synthesis.todo-patch.object +- caller: src.cli.optionNlMode + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.synthesis.todo-patch.sourceTodo - callee: src.synthesis.todo-patch.exactKeys +- caller: src.cli.optionLlmMode + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.sourceTodo - callee: src.synthesis.todo-patch.uniqueIds +- caller: src.cli.optionTaskMode + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.sourceTodo - callee: src.synthesis.todo-patch.uniqueStrings +- caller: src.cli.optionSummaryMode + callee: src.cli.optionLlmMode call_type: resolved -- caller: src.synthesis.todo-patch.duplicates - callee: src.synthesis.todo-patch.object +- caller: src.cli.optionSummaryMode + callee: src.cli.optionBoolean call_type: resolved -- caller: src.synthesis.todo-patch.duplicates - callee: src.synthesis.todo-patch.exactKeys +- caller: src.cli.optionPipelineTaskMode + callee: src.cli.optionString call_type: resolved -- caller: src.synthesis.todo-patch.duplicates - callee: src.synthesis.todo-patch.uniqueIds +- caller: src.cli.invokedPath + callee: src.cli.main call_type: resolved -- caller: src.synthesis.todo-patch.duplicates - callee: src.synthesis.todo-patch.uniqueStrings +- caller: src.extractors.nl.extractNlIntent + callee: src.extractors.nl.assertNlExtractionOptions call_type: resolved -- caller: src.synthesis.todo-patch.classified - callee: src.synthesis.todo-patch.object +- caller: src.extractors.nl.extractNlIntent + callee: src.extractors.nl.detectMissingFields call_type: resolved -- caller: src.synthesis.todo-patch.classified - callee: src.synthesis.todo-patch.exactKeys +- caller: src.extractors.nl.absolute + callee: src.extractors.nl.detectMissingFields call_type: resolved -- caller: src.synthesis.todo-patch.classified - callee: src.synthesis.todo-patch.uniqueIds +- caller: src.extractors.nl.absolute + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.todo-patch.classified - callee: src.synthesis.todo-patch.uniqueStrings +- caller: src.extractors.nl.body + callee: src.extractors.nl.detectMissingFields call_type: resolved -- caller: src.synthesis.todo-patch.assertApproval - callee: src.synthesis.todo-patch.nonBlank +- caller: src.extractors.nl.body + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.todo-patch.assertReceipt - callee: src.synthesis.todo-patch.sameArray +- caller: src.extractors.nl.sourcePath + callee: src.extractors.nl.detectMissingFields call_type: resolved -- caller: src.synthesis.todo-patch.assertReceipt - callee: src.synthesis.todo-patch.nonBlank +- caller: src.extractors.nl.sourcePath + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.todo-patch.assertReceipt - callee: src.synthesis.todo-patch.isoDate +- caller: src.extractors.nl.classified + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.todo-patch.renderTargets - callee: src.synthesis.todo-patch.inline +- caller: src.extractors.nl.action + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.todo-patch.rendered - callee: src.synthesis.todo-patch.inline +- caller: src.extractors.nl.object + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions +- caller: src.extractors.nl.missing + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow +- caller: src.extractors.nl.confidence + callee: src.extractors.nl.inferActor call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.readPrompt +- caller: src.extractors.ast.isExtractionResult + callee: src.extractors.ast.isIntentRecords call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection +- caller: src.extractors.runtime-cycle.MAX_PER_SECTION + callee: src.extractors.runtime-cycle.parseCycle call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions +- caller: src.extractors.runtime-cycle.MAX_PER_SECTION + callee: src.extractors.runtime-cycle.sourcePathFor call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.client - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow +- caller: src.extractors.runtime-cycle.MAX_PER_SECTION + callee: src.extractors.runtime-cycle.boundedArray call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection +- caller: src.extractors.runtime-cycle.MAX_PER_SECTION + callee: src.extractors.runtime-cycle.probeRecord call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection +- caller: src.extractors.runtime-cycle.MAX_PER_SECTION + callee: src.extractors.runtime-cycle.label call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.generationMetadata +- caller: src.extractors.runtime-cycle.MAX_PER_SECTION + callee: src.extractors.runtime-cycle.violationRecord call_type: resolved -- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow - callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesisAudit +- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent + callee: src.extractors.runtime-cycle.parseCycle call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse - callee: src.synthesis.task-synthesis-materialize.normalizeLocalKeys +- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent + callee: src.extractors.runtime-cycle.sourcePathFor call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent + callee: src.extractors.runtime-cycle.boundedArray call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent + callee: src.extractors.runtime-cycle.probeRecord call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.parsed - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent + callee: src.extractors.runtime-cycle.label call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.parsed - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent + callee: src.extractors.runtime-cycle.violationRecord call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalKeys - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.results + callee: src.extractors.runtime-cycle.probeRecord call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalKeys - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.results + callee: src.extractors.runtime-cycle.boundedArray call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusions - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.results + callee: src.extractors.runtime-cycle.label call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusions - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.results + callee: src.extractors.runtime-cycle.violationRecord call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.diagnosticIds - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.label + callee: src.extractors.runtime-cycle.text call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.probeRecord + callee: src.extractors.runtime-cycle.label call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey - callee: src.synthesis.task-synthesis-materialize.normalizeRawTarget +- caller: src.extractors.runtime-cycle.probeRecord + callee: src.extractors.runtime-cycle.text call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey - callee: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria +- caller: src.extractors.runtime-cycle.probeRecord + callee: src.extractors.runtime-cycle.watched call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey - callee: src.synthesis.task-synthesis-materialize.mapKeys +- caller: src.extractors.runtime-cycle.probeRecord + callee: src.extractors.runtime-cycle.tags call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.probeRecord + callee: src.extractors.runtime-cycle.factsMetadata call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionByKey - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.violationRecord + callee: src.extractors.runtime-cycle.label call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionByKey - callee: src.synthesis.task-synthesis-materialize.normalizeRawTarget +- caller: src.extractors.runtime-cycle.violationRecord + callee: src.extractors.runtime-cycle.text call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionByKey - callee: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria +- caller: src.extractors.runtime-cycle.violationRecord + callee: src.extractors.runtime-cycle.watched call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionByKey - callee: src.synthesis.task-synthesis-materialize.mapKeys +- caller: src.extractors.runtime-cycle.violationRecord + callee: src.extractors.runtime-cycle.tags call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.conclusionByKey - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.violationRecord + callee: src.extractors.runtime-cycle.jsonScalar call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalDrafts - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.runtime-cycle.driftRecord + callee: src.extractors.runtime-cycle.text call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalDrafts - callee: src.synthesis.task-synthesis-materialize.normalizeRawTarget +- caller: src.extractors.runtime-cycle.driftRecord + callee: src.extractors.runtime-cycle.tags call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalDrafts - callee: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria +- caller: src.extractors.runtime-cycle.driftRecord + callee: src.extractors.runtime-cycle.jsonScalar call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalDrafts - callee: src.synthesis.task-synthesis-materialize.mapKeys +- caller: src.extractors.runtime-cycle.proposalRecord + callee: src.extractors.runtime-cycle.text call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalDrafts - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.runtime-cycle.proposalRecord + callee: src.extractors.runtime-cycle.proposalAction call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposalIdByKey - callee: src.synthesis.task-synthesis-materialize.mapKeys +- caller: src.extractors.runtime-cycle.factsMetadata + callee: src.extractors.runtime-cycle.jsonScalar call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.proposals - callee: src.synthesis.task-synthesis-materialize.mapKeys +- caller: src.extractors.configuration.MAX_ENTRIES_PER_FILE + callee: src.extractors.configuration.isConfigurationPath call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.keys - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.configuration.MAX_ENTRIES_PER_FILE + callee: src.extractors.configuration.configurationRecords call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.mapKeys - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.configuration.extractConfigurationIntent + callee: src.extractors.configuration.isConfigurationPath call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.mapKeys - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.configuration.extractConfigurationIntent + callee: src.extractors.configuration.configurationRecords call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.sortedUnique - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.configuration.files + callee: src.extractors.configuration.configurationRecords call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.normalizeRawTarget - callee: src.synthesis.task-synthesis-materialize.normalizeStringArray +- caller: src.extractors.configuration.relative + callee: src.extractors.configuration.configurationRecords call_type: resolved -- caller: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria - callee: src.synthesis.task-synthesis-materialize.sortedUnique +- caller: src.extractors.configuration.configurationRecords + callee: src.extractors.configuration.dockerEntries call_type: resolved -- caller: src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT - callee: src.synthesis.task-synthesis-contract.nonBlank +- caller: src.extractors.configuration.configurationRecords + callee: src.extractors.configuration.jsonEntries call_type: resolved -- caller: src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT - callee: src.synthesis.task-synthesis-contract.taskIds +- caller: src.extractors.configuration.configurationRecords + callee: src.extractors.configuration.tomlEntries call_type: resolved -- caller: src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT - callee: src.synthesis.task-synthesis-contract.nonBlank +- caller: src.extractors.configuration.configurationRecords + callee: src.extractors.configuration.yamlOrAssignmentEntries call_type: resolved -- caller: src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT - callee: src.synthesis.task-synthesis-contract.taskStrings +- caller: src.extractors.configuration.configurationRecords + callee: src.extractors.configuration.fileAggregate call_type: resolved -- caller: src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT - callee: src.synthesis.task-synthesis-contract.taskIds +- caller: src.extractors.configuration.entries + callee: src.extractors.configuration.fileAggregate call_type: resolved -- caller: src.synthesis.code-change-plan.generatedAt - callee: src.synthesis.code-change-plan.createCodeChangeSourcePatch +- caller: src.extractors.configuration.bounded + callee: src.extractors.configuration.fileAggregate call_type: resolved -- caller: src.synthesis.code-change-plan.conclusions - callee: src.synthesis.code-change-plan.collectTarget +- caller: src.extractors.configuration.fileAggregate + callee: src.extractors.configuration.configurationFormat call_type: resolved -- caller: src.synthesis.code-change-plan.conclusions - callee: src.synthesis.code-change-plan.buildChanges +- caller: src.extractors.configuration.jsonEntries + callee: src.extractors.configuration.findKeyLine call_type: resolved -- caller: src.synthesis.code-change-plan.conclusions - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.configuration.parsed + callee: src.extractors.configuration.findKeyLine call_type: resolved -- caller: src.synthesis.code-change-plan.conclusions - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.configuration.lines + callee: src.extractors.configuration.findKeyLine call_type: resolved -- caller: src.synthesis.code-change-plan.conclusions - callee: src.synthesis.code-change-plan.titleFor +- caller: src.extractors.configuration.tomlEntries + callee: src.extractors.configuration.entries call_type: resolved -- caller: src.synthesis.code-change-plan.conclusions - callee: src.synthesis.code-change-plan.descriptionFor +- caller: src.extractors.configuration.tomlEntries + callee: src.extractors.configuration.match call_type: resolved -- caller: src.synthesis.code-change-plan.proposals - callee: src.synthesis.code-change-plan.collectTarget +- caller: src.extractors.configuration.tomlEntries + callee: src.extractors.configuration.entry call_type: resolved -- caller: src.synthesis.code-change-plan.proposals - callee: src.synthesis.code-change-plan.buildChanges +- caller: src.extractors.configuration.tomlEntries + callee: src.extractors.configuration.uniqueEntries call_type: resolved -- caller: src.synthesis.code-change-plan.proposals - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.configuration.line + callee: src.extractors.configuration.entry call_type: resolved -- caller: src.synthesis.code-change-plan.proposals - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.configuration.heading + callee: src.extractors.configuration.entry call_type: resolved -- caller: src.synthesis.code-change-plan.proposals - callee: src.synthesis.code-change-plan.titleFor +- caller: src.extractors.configuration.pair + callee: src.extractors.configuration.entry call_type: resolved -- caller: src.synthesis.code-change-plan.proposals - callee: src.synthesis.code-change-plan.descriptionFor +- caller: src.extractors.configuration.yamlOrAssignmentEntries + callee: src.extractors.configuration.entries call_type: resolved -- caller: src.synthesis.code-change-plan.recordsById - callee: src.synthesis.code-change-plan.collectTarget +- caller: src.extractors.configuration.yamlOrAssignmentEntries + callee: src.extractors.configuration.match call_type: resolved -- caller: src.synthesis.code-change-plan.recordsById - callee: src.synthesis.code-change-plan.buildChanges +- caller: src.extractors.configuration.yamlOrAssignmentEntries + callee: src.extractors.configuration.entry call_type: resolved -- caller: src.synthesis.code-change-plan.recordsById - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.configuration.yamlOrAssignmentEntries + callee: src.extractors.configuration.uniqueEntries call_type: resolved -- caller: src.synthesis.code-change-plan.recordsById - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.configuration.dockerEntries + callee: src.extractors.configuration.match call_type: resolved -- caller: src.synthesis.code-change-plan.recordsById - callee: src.synthesis.code-change-plan.titleFor +- caller: src.extractors.docs-schema.target + callee: src.extractors.docs-schema.strings call_type: resolved -- caller: src.synthesis.code-change-plan.recordsById - callee: src.synthesis.code-change-plan.descriptionFor +- caller: src.extractors.docs-schema.documentRecord + callee: src.extractors.docs-schema.strings call_type: resolved -- caller: src.synthesis.code-change-plan.proposalsByDiagnostic - callee: src.synthesis.code-change-plan.collectTarget +- caller: src.extractors.docs-schema.documentRecord + callee: src.extractors.docs-schema.target call_type: resolved -- caller: src.synthesis.code-change-plan.proposalsByDiagnostic - callee: src.synthesis.code-change-plan.buildChanges +- caller: src.extractors.docs-schema.documentResponseSchema + callee: src.extractors.docs-schema.documentResponseContract call_type: resolved -- caller: src.synthesis.code-change-plan.proposalsByDiagnostic - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited + callee: src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions call_type: resolved -- caller: src.synthesis.code-change-plan.proposalsByDiagnostic - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited + callee: src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow call_type: resolved -- caller: src.synthesis.code-change-plan.proposalsByDiagnostic - callee: src.synthesis.code-change-plan.titleFor +- caller: src.extractors.nl-llm.NlLlmRequiredError.client + callee: src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow call_type: resolved -- caller: src.synthesis.code-change-plan.proposalsByDiagnostic - callee: src.synthesis.code-change-plan.descriptionFor +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.requireConfiguredClient call_type: resolved -- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic - callee: src.synthesis.code-change-plan.collectTarget +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.loadDocumentChunks call_type: resolved -- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic - callee: src.synthesis.code-change-plan.buildChanges +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.selectWithinBudget call_type: resolved -- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.readPrompt call_type: resolved -- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.extractChunk call_type: resolved -- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic - callee: src.synthesis.code-change-plan.titleFor +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.loadDocumentChunks + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.errorMessage call_type: resolved -- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic - callee: src.synthesis.code-change-plan.descriptionFor +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.files + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.errorMessage call_type: resolved -- caller: src.synthesis.code-change-plan.candidates - callee: src.synthesis.code-change-plan.collectTarget +- caller: src.extractors.docs-llm.DocumentationLlmRequiredError.extractChunk + callee: src.extractors.docs-llm.DocumentationLlmRequiredError.errorMessage call_type: resolved -- caller: src.synthesis.code-change-plan.candidates - callee: src.synthesis.code-change-plan.buildChanges +- caller: src.extractors.changelog.extractChangelog + callee: src.extractors.changelog.changelogAction call_type: resolved -- caller: src.synthesis.code-change-plan.candidates - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.changelog.body + callee: src.extractors.changelog.changelogAction call_type: resolved -- caller: src.synthesis.code-change-plan.candidates - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.changelog.relative + callee: src.extractors.changelog.changelogAction call_type: resolved -- caller: src.synthesis.code-change-plan.candidates - callee: src.synthesis.code-change-plan.titleFor +- caller: src.extractors.changelog.lines + callee: src.extractors.changelog.changelogAction call_type: resolved -- caller: src.synthesis.code-change-plan.candidates - callee: src.synthesis.code-change-plan.descriptionFor +- caller: src.extractors.docs-deterministic.extractDocumentationBaseline + callee: src.extractors.docs-deterministic.convertDocument call_type: resolved -- caller: src.synthesis.code-change-plan.relatedRecords - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.extractDocumentationBaseline + callee: src.extractors.docs-deterministic.primePathMapper call_type: resolved -- caller: src.synthesis.code-change-plan.matchingProposals - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.root + callee: src.extractors.docs-deterministic.convertDocument call_type: resolved -- caller: src.synthesis.code-change-plan.matchingConclusions - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.root + callee: src.extractors.docs-deterministic.primePathMapper call_type: resolved -- caller: src.synthesis.code-change-plan.target - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.resolver + callee: src.extractors.docs-deterministic.convertDocument call_type: resolved -- caller: src.synthesis.code-change-plan.changes - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.resolver + callee: src.extractors.docs-deterministic.primePathMapper call_type: resolved -- caller: src.synthesis.code-change-plan.planHash - callee: src.synthesis.code-change-plan.confidenceFor +- caller: src.extractors.docs-deterministic.convertDocument + callee: src.extractors.docs-deterministic.handleDocumentationLine call_type: resolved -- caller: src.synthesis.code-change-plan.planIds - callee: src.synthesis.code-change-plan.evaluateCodeChangeAcceptance +- caller: src.extractors.docs-deterministic.handleDocumentationLine + callee: src.extractors.docs-deterministic.parseFenceBlock call_type: resolved -- caller: src.synthesis.code-change-plan.acceptances - callee: src.synthesis.code-change-plan.evaluateCodeChangeAcceptance +- caller: src.extractors.docs-deterministic.handleDocumentationLine + callee: src.extractors.docs-deterministic.parseSectionHeading call_type: resolved -- caller: src.synthesis.code-change-plan.acceptedCount - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.docs-deterministic.handleDocumentationLine + callee: src.extractors.docs-deterministic.parseBulletStatement call_type: resolved -- caller: src.synthesis.code-change-plan.indexProposalsByDiagnostic - callee: src.synthesis.code-change-plan.set +- caller: src.extractors.docs-deterministic.handleDocumentationLine + callee: src.extractors.docs-deterministic.parseParagraphStatement call_type: resolved -- caller: src.synthesis.code-change-plan.index - callee: src.synthesis.code-change-plan.set +- caller: src.extractors.docs-deterministic.parseFenceBlock + callee: src.extractors.docs-deterministic.match call_type: resolved -- caller: src.synthesis.code-change-plan.indexConclusionsByDiagnostic - callee: src.synthesis.code-change-plan.set +- caller: src.extractors.docs-deterministic.parseFenceBlock + callee: src.extractors.docs-deterministic.codeBlockRecord call_type: resolved -- caller: src.synthesis.code-change-plan.paths - callee: src.synthesis.code-change-plan.exactSourcePatchKeys +- caller: src.extractors.docs-deterministic.marker + callee: src.extractors.docs-deterministic.codeBlockRecord call_type: resolved -- caller: src.synthesis.code-change-plan.paths - callee: src.synthesis.code-change-plan.assertSourcePatchStrings +- caller: src.extractors.docs-deterministic.parseSectionHeading + callee: src.extractors.docs-deterministic.match call_type: resolved -- caller: src.synthesis.code-change-plan.paths - callee: src.synthesis.code-change-plan.normalizeUnifiedDiff +- caller: src.extractors.docs-deterministic.parseSectionHeading + callee: src.extractors.docs-deterministic.statementRecord call_type: resolved -- caller: src.synthesis.code-change-plan.buildChanges - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.heading + callee: src.extractors.docs-deterministic.match call_type: resolved -- caller: src.synthesis.code-change-plan.titleFor - callee: src.synthesis.code-change-plan.startsWithImperative +- caller: src.extractors.docs-deterministic.parseBulletStatement + callee: src.extractors.docs-deterministic.match call_type: resolved -- caller: src.synthesis.code-change-plan.record - callee: src.synthesis.code-change-plan.startsWithImperative +- caller: src.extractors.docs-deterministic.parseBulletStatement + callee: src.extractors.docs-deterministic.qualifyingStatement call_type: resolved -- caller: src.synthesis.code-change-plan.object - callee: src.synthesis.code-change-plan.startsWithImperative +- caller: src.extractors.docs-deterministic.parseParagraphStatement + callee: src.extractors.docs-deterministic.readParagraph call_type: resolved -- caller: src.synthesis.code-change-plan.acceptanceCriteriaFor - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.parseParagraphStatement + callee: src.extractors.docs-deterministic.qualifyingStatement call_type: resolved -- caller: src.synthesis.code-change-plan.riskFor - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.docs-deterministic.action + callee: src.extractors.docs-deterministic.targetsOf call_type: resolved -- caller: src.synthesis.code-change-plan.rollbackFor - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.markdown-paths.createMarkdownPathResolver + callee: src.extractors.markdown-paths.buildBasenameIndex call_type: resolved -- caller: src.synthesis.code-change-plan.createCodeChangeReviewPatch - callee: src.synthesis.code-change-plan.priorityRank +- caller: src.extractors.markdown-paths.createMarkdownPathResolver + callee: src.extractors.markdown-paths.headingScopes call_type: resolved -- caller: src.synthesis.code-change-plan.markdown - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.markdown-paths.createMarkdownPathResolver + callee: src.extractors.markdown-paths.isRepositoryPath call_type: resolved -- caller: src.synthesis.code-change-plan.renderCodeChangeReviewMarkdown - callee: src.synthesis.code-change-plan.inline +- caller: src.extractors.markdown-paths.createMarkdownPathResolver + callee: src.extractors.markdown-paths.basenames call_type: resolved -- caller: src.synthesis.code-change-plan.renderCodeChangeReviewMarkdown - callee: src.synthesis.code-change-plan.renderIds +- caller: src.extractors.markdown-paths.repositoryRoot + callee: src.extractors.markdown-paths.headingScopes call_type: resolved -- caller: src.synthesis.code-change-plan.rawDiff - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.markdown-paths.repositoryRoot + callee: src.extractors.markdown-paths.isRepositoryPath call_type: resolved -- caller: src.synthesis.code-change-plan.rawDiff - callee: src.synthesis.code-change-plan.instructionFor +- caller: src.extractors.markdown-paths.repositoryRoot + callee: src.extractors.markdown-paths.basenames call_type: resolved -- caller: src.synthesis.code-change-plan.unifiedDiff - callee: src.synthesis.code-change-plan.uniqueSorted +- caller: src.extractors.markdown-paths.basenames + callee: src.extractors.markdown-paths.headingScopes call_type: resolved -- caller: src.synthesis.code-change-plan.unifiedDiff - callee: src.synthesis.code-change-plan.instructionFor +- caller: src.extractors.markdown-paths.basenames + callee: src.extractors.markdown-paths.isRepositoryPath call_type: resolved -- caller: src.synthesis.code-change-plan.patchHash - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.markdown-paths.headingDirectories + callee: src.extractors.markdown-paths.isRepositoryPath call_type: resolved -- caller: src.synthesis.code-change-plan.createCodeChangeSourcePatchSet - callee: src.synthesis.code-change-plan.createCodeChangeSourcePatch +- caller: src.extractors.markdown-paths.headingDirectories + callee: src.extractors.markdown-paths.basenames call_type: resolved -- caller: src.synthesis.code-change-plan.createCodeChangeSourcePatchSet - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.markdown-paths.buildBasenameIndex + callee: src.extractors.markdown-paths.createBasenameIndexState call_type: resolved -- caller: src.synthesis.code-change-plan.assertCodeChangeSourcePatch - callee: src.synthesis.code-change-plan.exactSourcePatchKeys +- caller: src.extractors.markdown-paths.buildBasenameIndex + callee: src.extractors.markdown-paths.readBasenameDirectoryEntries call_type: resolved -- caller: src.synthesis.code-change-plan.assertCodeChangeSourcePatch - callee: src.synthesis.code-change-plan.assertSourcePatchIds +- caller: src.extractors.markdown-paths.buildBasenameIndex + callee: src.extractors.markdown-paths.isNestedCheckout call_type: resolved -- caller: src.synthesis.code-change-plan.assertCodeChangeSourcePatch - callee: src.synthesis.code-change-plan.assertSourcePatchStrings +- caller: src.extractors.markdown-paths.buildBasenameIndex + callee: src.extractors.markdown-paths.scanDirectoryForBasenames call_type: resolved -- caller: src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet - callee: src.synthesis.code-change-plan.exactSourcePatchKeys +- caller: src.extractors.markdown-paths.index + callee: src.extractors.markdown-paths.readBasenameDirectoryEntries call_type: resolved -- caller: src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet - callee: src.synthesis.code-change-plan.assertCodeChangeSourcePatch +- caller: src.extractors.markdown-paths.index + callee: src.extractors.markdown-paths.isNestedCheckout call_type: resolved -- caller: src.synthesis.code-change-plan.plansById - callee: src.synthesis.code-change-plan.assertCodeChangeSourcePatch +- caller: src.extractors.markdown-paths.index + callee: src.extractors.markdown-paths.scanDirectoryForBasenames call_type: resolved -- caller: src.synthesis.code-change-plan.patchIds - callee: src.synthesis.code-change-plan.assertCodeChangeSourcePatch +- caller: src.extractors.markdown-paths.state + callee: src.extractors.markdown-paths.readBasenameDirectoryEntries call_type: resolved -- caller: src.synthesis.code-change-plan.applyCodeChangeSourcePatch - callee: src.synthesis.code-change-plan.assertCodeChangeSourcePatch +- caller: src.extractors.markdown-paths.state + callee: src.extractors.markdown-paths.isNestedCheckout call_type: resolved -- caller: src.synthesis.code-change-plan.applyCodeChangeSourcePatch - callee: src.synthesis.code-change-plan.assertExistingSourceReceipt +- caller: src.extractors.markdown-paths.state + callee: src.extractors.markdown-paths.scanDirectoryForBasenames call_type: resolved -- caller: src.synthesis.code-change-plan.now - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.markdown-paths.scanDirectoryForBasenames + callee: src.extractors.markdown-paths.addBasenameIndexMatch call_type: resolved -- caller: src.synthesis.code-change-plan.fileHashesAfter - callee: src.synthesis.code-change-plan.deterministicGeneration +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.resolveObject call_type: resolved -- caller: src.synthesis.code-change-plan.assertExistingSourceReceipt - callee: src.synthesis.code-change-plan.assertSourceApplyReceipt +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.anchorToSource call_type: resolved -- caller: src.synthesis.code-change-plan.assertSourceApplyReceipt - callee: src.synthesis.code-change-plan.exactSourcePatchKeys +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.resolveTarget call_type: resolved -- caller: src.synthesis.code-change-plan.assertSourceApplyReceipt - callee: src.synthesis.code-change-plan.exactSourcePatchSet +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.resolveAction call_type: resolved -- caller: src.synthesis.code-change-plan.applyUnifiedDiffToText - callee: src.synthesis.code-change-plan.normalizeUnifiedDiff +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.resolveModality call_type: resolved -- caller: src.synthesis.code-change-plan.applyUnifiedDiffToText - callee: src.synthesis.code-change-plan.splitKeep +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.allowedLifecycle call_type: resolved -- caller: src.synthesis.code-change-path.isUsefulCodeChangePath - callee: src.synthesis.code-change-path.isPlannablePath +- caller: src.extractors.docs-record.OBJECT_PLACEHOLDERS + callee: src.extractors.docs-record.linesFromChunk call_type: resolved -- caller: src.summary.summarizer.summarizeGraph - callee: src.summary.summarizer.SummaryAttemptError.assertConclusions +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.resolveObject call_type: resolved -- caller: src.summary.summarizer.summarizeGraph - callee: src.summary.summarizer.SummaryAttemptError.summaryMode +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.anchorToSource call_type: resolved -- caller: src.summary.summarizer.summarizeGraph - callee: src.summary.summarizer.SummaryAttemptError.deterministicConclusions +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.resolveTarget call_type: resolved -- caller: src.summary.summarizer.summarizeGraph - callee: src.summary.summarizer.SummaryAttemptError.generationMetadata +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.resolveAction call_type: resolved -- caller: src.summary.summarizer.summarizeGraph - callee: src.summary.summarizer.SummaryAttemptError.readPrompt +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.resolveModality call_type: resolved -- caller: src.summary.summarizer.mode - callee: src.summary.summarizer.SummaryAttemptError.deterministicConclusions +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.allowedLifecycle call_type: resolved -- caller: src.summary.summarizer.mode - callee: src.summary.summarizer.SummaryAttemptError.generationMetadata +- caller: src.extractors.docs-record.toDocumentIntentRecord + callee: src.extractors.docs-record.linesFromChunk call_type: resolved -- caller: src.summary.summarizer.client - callee: src.summary.summarizer.SummaryAttemptError.deterministicConclusions +- caller: src.extractors.docs-record.statementText + callee: src.extractors.docs-record.resolveObject call_type: resolved -- caller: src.summary.summarizer.client - callee: src.summary.summarizer.SummaryAttemptError.generationMetadata +- caller: src.extractors.docs-record.target + callee: src.extractors.docs-record.allowedLifecycle call_type: resolved -- caller: src.summary.summarizer.systemPrompt - callee: src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection +- caller: src.extractors.docs-record.target + callee: src.extractors.docs-record.linesFromChunk call_type: resolved -- caller: src.summary.summarizer.systemPrompt - callee: src.summary.summarizer.SummaryAttemptError.deterministicConclusions +- caller: src.extractors.docs-record.action + callee: src.extractors.docs-record.allowedLifecycle call_type: resolved -- caller: src.summary.summarizer.systemPrompt - callee: src.summary.summarizer.SummaryAttemptError.generationMetadata +- caller: src.extractors.docs-record.action + callee: src.extractors.docs-record.linesFromChunk call_type: resolved -- caller: src.summary.summarizer.payload - callee: src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection +- caller: src.extractors.docs-record.modality + callee: src.extractors.docs-record.allowedLifecycle call_type: resolved -- caller: src.summary.summarizer.payload - callee: src.summary.summarizer.SummaryAttemptError.deterministicConclusions +- caller: src.extractors.docs-record.modality + callee: src.extractors.docs-record.linesFromChunk call_type: resolved -- caller: src.summary.summarizer.payload - callee: src.summary.summarizer.SummaryAttemptError.generationMetadata +- caller: src.extractors.docs-record.resolveObject + callee: src.extractors.docs-record.isPlaceholder call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection - callee: src.summary.summarizer.SummaryAttemptError.materializeConclusions +- caller: src.extractors.docs-record.fallback + callee: src.extractors.docs-record.isPlaceholder call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection - callee: src.summary.summarizer.SummaryAttemptError.generationMetadata +- caller: src.extractors.docs-record.anchorToSource + callee: src.extractors.docs-record.clampLine call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.conclusions - callee: src.summary.summarizer.SummaryAttemptError.sortedUnique +- caller: src.extractors.docs-record.anchorToSource + callee: src.extractors.docs-record.keywordOverlap call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.materializeConclusions - callee: src.summary.summarizer.SummaryAttemptError.sortedUnique +- caller: src.extractors.docs-record.resolveTarget + callee: src.extractors.docs-record.hasTarget call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.materializeConclusions - callee: src.summary.summarizer.SummaryAttemptError.assertConclusions +- caller: src.extractors.docs-record.resolveAction + callee: src.extractors.docs-record.allowedAction call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.parsed - callee: src.summary.summarizer.SummaryAttemptError.sortedUnique +- caller: src.extractors.docs-record.resolveModality + callee: src.extractors.docs-record.allowedModality call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.deterministicConclusions - callee: src.summary.summarizer.SummaryAttemptError.sortedUnique +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering call_type: resolved -- caller: src.summary.summarizer.SummaryAttemptError.deterministicConclusions - callee: src.summary.summarizer.SummaryAttemptError.assertConclusions +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering call_type: resolved -- caller: src.summary.render.renderSummaryMarkdown - callee: src.summary.render.renderRecords +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.strings call_type: resolved -- caller: src.summary.render.renderSummaryMarkdown - callee: src.summary.render.renderConclusion +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownBatchWithCorrection call_type: resolved -- caller: src.summary.render.renderSummaryMarkdown - callee: src.summary.render.recordCitations +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.markdownResponseContract call_type: resolved -- caller: src.summary.render.actions - callee: src.summary.render.recordCitations +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichSplitBatch call_type: resolved -- caller: src.summary.render.confidence - callee: src.summary.render.recordCitations +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.emptyCoverage call_type: resolved -- caller: src.summary.render.renderConclusion - callee: src.summary.render.recordCitations +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichSplitBatch + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering call_type: resolved -- caller: src.services.actions.executeAction - callee: src.services.actions.resolveRoot +- caller: src.extractors.markdown-llm-helpers.MarkdownAttemptError.markdownResponseContract + callee: src.extractors.markdown-llm-helpers.MarkdownAttemptError.strings call_type: resolved -- caller: src.services.actions.executeAction - callee: src.services.actions.scopedPath +- caller: src.extractors.communication-helpers.parseEnvelope + callee: src.extractors.communication-helpers.match call_type: resolved -- caller: src.services.actions.executeAction - callee: src.services.actions.nlModeValue +- caller: src.extractors.communication-helpers.parseEnvelope + callee: src.extractors.communication-helpers.unquote call_type: resolved -- caller: src.services.actions.executeAction - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.inferIdentity + callee: src.extractors.communication-helpers.basename call_type: resolved -- caller: src.services.actions.executeAction - callee: src.services.actions.nullableScopedPath +- caller: src.extractors.communication-helpers.inferIdentity + callee: src.extractors.communication-helpers.inferGovernanceIdentityFromFilename call_type: resolved -- caller: src.services.actions.root - callee: src.services.actions.scopedPath +- caller: src.extractors.communication-helpers.inferIdentity + callee: src.extractors.communication-helpers.inferIdentityFromPathAndFilename call_type: resolved -- caller: src.services.actions.root - callee: src.services.actions.nlModeValue +- caller: src.extractors.communication-helpers.inferGovernanceIdentityFromFilename + callee: src.extractors.communication-helpers.match call_type: resolved -- caller: src.services.actions.root - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.inferIdentityFromPathAndFilename + callee: src.extractors.communication-helpers.isCommunicationType call_type: resolved -- caller: src.services.actions.root - callee: src.services.actions.nullableScopedPath +- caller: src.extractors.communication-helpers.fileParts + callee: src.extractors.communication-helpers.isCommunicationType call_type: resolved -- caller: src.services.actions.root - callee: src.services.actions.llmModeValue +- caller: src.extractors.communication-helpers.nestedRoleIndex + callee: src.extractors.communication-helpers.isCommunicationType call_type: resolved -- caller: src.services.actions.analysis - callee: src.services.actions.booleanValue +- caller: src.extractors.communication-helpers.nestedRole + callee: src.extractors.communication-helpers.isCommunicationType call_type: resolved -- caller: src.services.actions.graph - callee: src.services.actions.booleanValue +- caller: src.extractors.communication-helpers.nestedParticipant + callee: src.extractors.communication-helpers.isCommunicationType call_type: resolved -- caller: src.services.actions.graph - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.isTicketEvidenceFile + callee: src.extractors.communication-helpers.basename call_type: resolved -- caller: src.services.actions.diagnostics - callee: src.services.actions.booleanValue +- caller: src.extractors.communication-helpers.communicationSegments + callee: src.extractors.communication-helpers.isCommunicationNoise call_type: resolved -- caller: src.services.actions.diagnostics - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.communicationSegments + callee: src.extractors.communication-helpers.match call_type: resolved -- caller: src.services.actions.result - callee: src.services.actions.stringValue +- caller: src.extractors.communication-helpers.communicationSegments + callee: src.extractors.communication-helpers.flush call_type: resolved -- caller: src.services.actions.result - callee: src.services.actions.booleanValue +- caller: src.extractors.communication-helpers.flush + callee: src.extractors.communication-helpers.isCommunicationNoise call_type: resolved -- caller: src.services.actions.result - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.item + callee: src.extractors.communication-helpers.isCommunicationNoise call_type: resolved -- caller: src.services.actions.todoPath - callee: src.services.actions.stringValue +- caller: src.extractors.communication-helpers.raw + callee: src.extractors.communication-helpers.match call_type: resolved -- caller: src.services.actions.receiptPath - callee: src.services.actions.stringValue +- caller: src.extractors.communication-helpers.heading + callee: src.extractors.communication-helpers.match call_type: resolved -- caller: src.services.actions.conclusions - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.normalizeType + callee: src.extractors.communication-helpers.isCommunicationType call_type: resolved -- caller: src.services.actions.proposals - callee: src.services.actions.numberValue +- caller: src.extractors.communication-helpers.listValue + callee: src.extractors.communication-helpers.unquote call_type: resolved -- caller: src.services.actions.patch - callee: src.services.actions.stringValue +- caller: src.extractors.communication-helpers.sameStrings + callee: src.extractors.communication-helpers.normalize call_type: resolved -- caller: src.services.actions.beforeGraph - callee: src.services.actions.hasInputValue +- caller: src.extractors.todo.extractTodo + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.beforeDiagnostics - callee: src.services.actions.hasInputValue +- caller: src.extractors.todo.body + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.afterGraph - callee: src.services.actions.hasInputValue +- caller: src.extractors.todo.relative + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.afterDiagnostics - callee: src.services.actions.hasInputValue +- caller: src.extractors.todo.lines + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.value - callee: src.services.actions.hasInputValue +- caller: src.extractors.todo.raw + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.beforeInput - callee: src.services.actions.numberValue +- caller: src.extractors.todo.heading + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.afterInput - callee: src.services.actions.numberValue +- caller: src.extractors.todo.task + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.before - callee: src.services.actions.numberValue +- caller: src.extractors.todo.checked + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.after - callee: src.services.actions.numberValue +- caller: src.extractors.todo.block + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.diff - callee: src.services.actions.stringValue +- caller: src.extractors.todo.text + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.diff - callee: src.services.actions.numberValue +- caller: src.extractors.todo.classified + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.svg - callee: src.services.actions.numberValue +- caller: src.extractors.todo.action + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.beforePath - callee: src.services.actions.stringValue +- caller: src.extractors.todo.resolvedPaths + callee: src.extractors.todo.inferOwner call_type: resolved -- caller: src.services.actions.beforePath - callee: src.services.actions.numberValue +- caller: src.extractors.todo.inferOwner + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.afterPath - callee: src.services.actions.stringValue +- caller: src.extractors.todo.extractExplicitId + callee: src.extractors.todo.match call_type: resolved -- caller: src.services.actions.afterPath - callee: src.services.actions.numberValue +- caller: src.extractors.git.extractGitIntent + callee: src.extractors.git.isGitWorkTree call_type: resolved -- caller: src.services.actions.view - callee: src.services.actions.booleanValue +- caller: src.extractors.git.extractGitIntent + callee: src.extractors.git.extractRepositoryGitIntent call_type: resolved -- caller: src.services.actions.view - callee: src.services.actions.numberValue +- caller: src.extractors.git.extractGitIntent + callee: src.extractors.git.discoverGitRepositories call_type: resolved -- caller: src.services.actions.filterCommunicationGraph - callee: src.services.actions.stringValue +- caller: src.extractors.git.extractGitIntent + callee: src.extractors.git.mapWithConcurrency call_type: resolved -- caller: src.services.actions.filterCommunicationGraph - callee: src.services.actions.booleanValue +- caller: src.extractors.git.root + callee: src.extractors.git.isGitWorkTree call_type: resolved -- caller: src.services.actions.nlModeValue - callee: src.services.actions.llmModeValue +- caller: src.extractors.git.root + callee: src.extractors.git.extractRepositoryGitIntent call_type: resolved -- caller: src.services.actions.summaryModeValue - callee: src.services.actions.llmModeValue +- caller: src.extractors.git.count + callee: src.extractors.git.isGitWorkTree call_type: resolved -- caller: src.services.actions.summaryModeValue - callee: src.services.actions.booleanValue +- caller: src.extractors.git.count + callee: src.extractors.git.extractRepositoryGitIntent call_type: resolved -- caller: src.services.actions.withTextDiffViews - callee: src.services.actions.stringValue +- caller: src.extractors.git.extractRepositoryGitIntent + callee: src.extractors.git.readCommits call_type: resolved -- caller: src.services.actions.withTextDiffViews - callee: src.services.actions.booleanValue +- caller: src.extractors.git.extractRepositoryGitIntent + callee: src.extractors.git.readChangedFiles call_type: resolved -- caller: src.services.actions.withTextDiffViews - callee: src.services.actions.numberValue +- caller: src.extractors.git.extractRepositoryGitIntent + callee: src.extractors.git.readStats call_type: resolved -- caller: src.services.actions.title - callee: src.services.actions.booleanValue +- caller: src.extractors.git.extractRepositoryGitIntent + callee: src.extractors.git.runGit call_type: resolved -- caller: src.services.actions.title - callee: src.services.actions.numberValue +- caller: src.extractors.git.extractRepositoryGitIntent + callee: src.extractors.git.extractChangedSymbols call_type: resolved -- caller: src.services.actions.scopedPath - callee: src.services.actions.stringValue +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.createDiscoveryState call_type: resolved -- caller: src.services.actions.nullableScopedPath - callee: src.services.actions.nullableString +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.hasMoreDiscoveryWork call_type: resolved -- caller: src.services.actions.readRecords - callee: src.services.actions.stringList +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.takeNextDiscoveryDirectory call_type: resolved -- caller: src.semantic.reranker.createSemanticCandidateSet - callee: src.semantic.reranker.requiredText +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.readDiscoveryEntries call_type: resolved -- caller: src.semantic.reranker.assertSemanticCandidateSet - callee: src.semantic.reranker.validDate +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.processDiscoveryDirectory call_type: resolved -- caller: src.semantic.reranker.assertSemanticCandidateSet - callee: src.semantic.reranker.validateRetrieval +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.filterDiscoveryChildren call_type: resolved -- caller: src.semantic.reranker.records - callee: src.semantic.reranker.roundedConfidence +- caller: src.extractors.git.discoverGitRepositories + callee: src.extractors.git.finishDiscovery call_type: resolved -- caller: src.semantic.reranker.records - callee: src.semantic.reranker.validateVerdictReason +- caller: src.extractors.git.state + callee: src.extractors.git.hasMoreDiscoveryWork call_type: resolved -- caller: src.semantic.reranker.records - callee: src.semantic.reranker.requiredText +- caller: src.extractors.git.state + callee: src.extractors.git.takeNextDiscoveryDirectory call_type: resolved -- caller: src.semantic.reranker.seenIds - callee: src.semantic.reranker.boundedScore +- caller: src.extractors.git.state + callee: src.extractors.git.readDiscoveryEntries call_type: resolved -- caller: src.semantic.reranker.seenPairs - callee: src.semantic.reranker.boundedScore +- caller: src.extractors.git.state + callee: src.extractors.git.processDiscoveryDirectory call_type: resolved -- caller: src.semantic.reranker.byDeclaration - callee: src.semantic.reranker.boundedScore +- caller: src.extractors.git.state + callee: src.extractors.git.filterDiscoveryChildren call_type: resolved -- caller: src.semantic.reranker.createSemanticRerankResult - callee: src.semantic.reranker.assertSemanticCandidateSet +- caller: src.extractors.git.processDiscoveryDirectory + callee: src.extractors.git.resolveDiscoveryPrefix call_type: resolved -- caller: src.semantic.reranker.createSemanticRerankResult - callee: src.semantic.reranker.requiredText +- caller: src.extractors.git.processDiscoveryDirectory + callee: src.extractors.git.gitMarkerState call_type: resolved -- caller: src.semantic.reranker.createSemanticRerankResult - callee: src.semantic.reranker.roundedConfidence +- caller: src.extractors.git.processDiscoveryDirectory + callee: src.extractors.git.registerDiscoveredRepository call_type: resolved -- caller: src.semantic.reranker.decisions - callee: src.semantic.reranker.roundedConfidence +- caller: src.extractors.git.registerDiscoveredRepository + callee: src.extractors.git.isGitWorkTree call_type: resolved -- caller: src.semantic.reranker.decisions - callee: src.semantic.reranker.requiredText +- caller: src.extractors.git.isGitWorkTree + callee: src.extractors.git.runGit call_type: resolved -- caller: src.semantic.reranker.assertSemanticRerankResult - callee: src.semantic.reranker.assertSemanticCandidateSet +- caller: src.extractors.git.runGit + callee: src.extractors.git.execFileAsync call_type: resolved -- caller: src.semantic.reranker.assertSemanticRerankResult - callee: src.semantic.reranker.validDate +- caller: src.extractors.git.result + callee: src.extractors.git.execFileAsync call_type: resolved -- caller: src.semantic.reranker.assertSemanticRerankResult - callee: src.semantic.reranker.validateGeneration +- caller: src.extractors.git.readCommits + callee: src.extractors.git.runGit call_type: resolved -- caller: src.semantic.reranker.seenDecisions - callee: src.semantic.reranker.roundedConfidence +- caller: src.extractors.git.readChangedFiles + callee: src.extractors.git.runGit call_type: resolved -- caller: src.semantic.reranker.seenDecisions - callee: src.semantic.reranker.validateVerdictReason +- caller: src.extractors.git.readStats + callee: src.extractors.git.runGit call_type: resolved -- caller: src.semantic.reranker.seenDecisions - callee: src.semantic.reranker.requiredText +- caller: src.extractors.docs-chunks.prioritizeDocumentChunks + callee: src.extractors.docs-chunks.chunkPriority call_type: resolved -- caller: src.semantic.reranker.acceptedDeclarations - callee: src.semantic.reranker.roundedConfidence +- caller: src.extractors.docs-chunks.needles + callee: src.extractors.docs-chunks.chunkPriority call_type: resolved -- caller: src.semantic.reranker.acceptedDeclarations - callee: src.semantic.reranker.validateVerdictReason +- caller: src.extractors.docs-chunks.mapConcurrent + callee: src.extractors.docs-chunks.worker call_type: resolved -- caller: src.semantic.reranker.acceptedDeclarations - callee: src.semantic.reranker.requiredText +- caller: src.extractors.docs-chunks.index + callee: src.extractors.docs-chunks.worker call_type: resolved -- caller: src.semantic.reranker.applyAcceptedSemanticRelations - callee: src.semantic.reranker.assertSemanticRerankResult +- caller: src.extractors.docs-chunks.item + callee: src.extractors.docs-chunks.worker call_type: resolved -- caller: src.semantic.reranker.applyAcceptedSemanticRelations - callee: src.semantic.reranker.values +- caller: src.extractors.docs-chunks.workerCount + callee: src.extractors.docs-chunks.worker call_type: resolved -- caller: src.semantic.reranker.validateRetrieval - callee: src.semantic.reranker.requiredText +- caller: src.extractors.docs-chunks.chunkMarkdown + callee: src.extractors.docs-chunks.markdownSections call_type: resolved -- caller: src.semantic.reranker.validateGeneration - callee: src.semantic.reranker.requiredText +- caller: src.extractors.docs-chunks.chunkMarkdown + callee: src.extractors.docs-chunks.flush call_type: resolved -- caller: src.semantic.reranker.validateVerdictReason - callee: src.semantic.reranker.assertSemanticVerdictReason +- caller: src.extractors.docs-chunks.chunkMarkdown + callee: src.extractors.docs-chunks.splitLongSection call_type: resolved -- caller: src.semantic.reranker.assertGroundedQuote - callee: src.semantic.reranker.requiredText +- caller: src.extractors.docs-chunks.sectionLines + callee: src.extractors.docs-chunks.flush call_type: resolved -- caller: src.semantic.reranker.quote - callee: src.semantic.reranker.requiredText +- caller: src.extractors.docs-chunks.sectionLines + callee: src.extractors.docs-chunks.splitLongSection call_type: resolved -- caller: src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates - callee: src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet +- caller: src.extractors.docs-chunks.sectionText + callee: src.extractors.docs-chunks.flush call_type: resolved -- caller: src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates - callee: src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult +- caller: src.extractors.docs-chunks.sectionText + callee: src.extractors.docs-chunks.splitLongSection call_type: resolved -- caller: src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates - callee: src.semantic.reranker-llm.SemanticRerankerRequiredError.assertTrackedSnapshot +- caller: src.extractors.docs-chunks.splitLongSection + callee: src.extractors.docs-chunks.takeLineBatch call_type: resolved -- caller: src.semantic.reranker-llm.SemanticRerankerRequiredError.model - callee: src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult +- caller: src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited + callee: src.extractors.markdown-llm.MarkdownLlmRequiredError.fallbackOrThrow call_type: resolved -- caller: src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision - callee: src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult +- caller: src.extractors.markdown-llm.MarkdownLlmRequiredError.client + callee: src.extractors.markdown-llm.MarkdownLlmRequiredError.fallbackOrThrow call_type: resolved -- caller: src.semantic.reranker-llm.SemanticRerankerRequiredError.payload - callee: src.semantic.reranker-llm.SemanticRerankerRequiredError.projectRecord +- caller: src.extractors.communication-file-helpers.envelope + callee: src.extractors.communication-file-helpers.shouldSkipCommunicationFile call_type: resolved -- caller: src.pipeline.run.runPipeline - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.communication-file-helpers.inferred + callee: src.extractors.communication-file-helpers.shouldSkipCommunicationFile call_type: resolved -- caller: src.pipeline.run.docs - callee: src.pipeline.run.collectTargetHints +- caller: src.extractors.communication-file-helpers.shouldSkipCommunicationFile + callee: src.extractors.communication-file-helpers.hasExplicitEnvelopeMetadata call_type: resolved -- caller: src.pipeline.run.docs - callee: src.pipeline.run.values +- caller: src.extractors.communication-file-helpers.buildLocalWarnings + callee: src.extractors.communication-file-helpers.appendRoleAndParticipantWarnings call_type: resolved -- caller: src.pipeline.run.configurationExtraction - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.communication-file-helpers.buildLocalWarnings + callee: src.extractors.communication-file-helpers.appendIdentityWarnings call_type: resolved -- caller: src.pipeline.run.includeCommunication - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.communication-file-helpers.buildLocalWarnings + callee: src.extractors.communication-file-helpers.appendRegistryAlignmentWarnings call_type: resolved -- caller: src.pipeline.run.communicationStartedAt - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.communication-file-helpers.buildLocalWarnings + callee: src.extractors.communication-file-helpers.appendA2aAgentWarnings call_type: resolved -- caller: src.pipeline.run.communicationAudit - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.communication-file-helpers.buildLocalWarnings + callee: src.extractors.communication-file-helpers.appendTimestampWarnings call_type: resolved -- caller: src.pipeline.run.communicationInputPresent - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord + callee: src.extractors.nl-llm-helpers.NlAttemptError.sourceExcerpt call_type: resolved -- caller: src.pipeline.run.collectTargetHints - callee: src.pipeline.run.values +- caller: src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord + callee: src.extractors.nl-llm-helpers.NlAttemptError.resolveAction call_type: resolved -- caller: src.pipeline.run.persistFailedRun - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord + callee: src.extractors.nl-llm-helpers.NlAttemptError.nonEmptyText call_type: resolved -- caller: src.pipeline.run.persistFailedRun - callee: src.pipeline.run.failureCode +- caller: src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord + callee: src.extractors.nl-llm-helpers.NlAttemptError.resolveObject call_type: resolved -- caller: src.pipeline.run.persistFailedRun - callee: src.pipeline.run.failedAudit +- caller: src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord + callee: src.extractors.nl-llm-helpers.NlAttemptError.resolveModality call_type: resolved -- caller: src.pipeline.run.persistFailedRun - callee: src.pipeline.run.aborted +- caller: src.extractors.nl-llm-helpers.NlAttemptError.lines + callee: src.extractors.nl-llm-helpers.NlAttemptError.sourceExcerpt call_type: resolved -- caller: src.pipeline.run.persistFailedRun - callee: src.pipeline.run.stageValue +- caller: src.extractors.nl-llm-helpers.NlAttemptError.action + callee: src.extractors.nl-llm-helpers.NlAttemptError.resolveObject call_type: resolved -- caller: src.pipeline.run.persistFailedRun - callee: src.pipeline.run.manifestConfiguration +- caller: src.extractors.nl-llm-helpers.NlAttemptError.normalizedText + callee: src.extractors.nl-llm-helpers.NlAttemptError.resolveObject call_type: resolved -- caller: src.pipeline.run.aborted - callee: src.pipeline.run.skippedAudit +- caller: src.extractors.nl-llm-helpers.NlAttemptError.statementText + callee: src.extractors.nl-llm-helpers.NlAttemptError.resolveModality call_type: resolved -- caller: src.pipeline.run.message - callee: src.pipeline.run.failureCode +- caller: src.extractors.nl-llm-helpers.NlAttemptError.sourceExcerpt + callee: src.extractors.nl-llm-helpers.NlAttemptError.clampLine call_type: resolved -- caller: src.pipeline.run.knownAudit - callee: src.pipeline.run.failureCode +- caller: src.extractors.nl-llm-helpers.NlAttemptError.resolveAction + callee: src.extractors.nl-llm-helpers.NlAttemptError.allowedAction call_type: resolved -- caller: src.pipeline.run.failedAudit - callee: src.pipeline.run.failureCode +- caller: src.extractors.nl-llm-helpers.NlAttemptError.resolveModality + callee: src.extractors.nl-llm-helpers.NlAttemptError.allowedModality call_type: resolved -- caller: src.pipeline.run.stageValue - callee: src.pipeline.run.failedAudit +- caller: src.extractors.nl-llm-helpers.NlAttemptError.isPlaceholder + callee: src.extractors.nl-llm-helpers.NlAttemptError.nonEmptyText call_type: resolved -- caller: src.pipeline.run.stageValue - callee: src.pipeline.run.aborted +- caller: src.extractors.nl-llm-helpers.NlAttemptError.resolveObject + callee: src.extractors.nl-llm-helpers.NlAttemptError.isPlaceholder call_type: resolved -- caller: src.pipeline.run.reason - callee: src.pipeline.run.failureCode +- caller: src.extractors.nl-llm-helpers.NlAttemptError.resolveObject + callee: src.extractors.nl-llm-helpers.NlAttemptError.nonEmptyText call_type: resolved -- caller: src.operations.validation.dateString - callee: src.operations.validation.nonBlank +- caller: src.extractors.nl-llm-helpers.NlAttemptError.NL_ACTION_SET + callee: src.extractors.nl-llm-helpers.NlAttemptError.nlStrings call_type: resolved -- caller: src.operations.validation.assertPrincipalList - callee: src.operations.validation.uniqueStrings +- caller: src.extractors.nl-llm-helpers.NlAttemptError.NL_MODALITY_SET + callee: src.extractors.nl-llm-helpers.NlAttemptError.nlStrings call_type: resolved -- caller: src.operations.validation.principals - callee: src.operations.validation.uniqueStrings +- caller: src.extractors.nl-llm-helpers.NlAttemptError.NL_RECORD_CONTRACT + callee: src.extractors.nl-llm-helpers.NlAttemptError.nlStrings call_type: resolved -- caller: src.operations.validation.assertVariableContract - callee: src.operations.validation.objectValue +- caller: src.extractors.ast.external.runExternalAstAdapter + callee: src.extractors.ast.external.execFileAsync call_type: resolved -- caller: src.operations.validation.assertVariableContract - callee: src.operations.validation.exactKeys +- caller: src.extractors.ast.external.result + callee: src.extractors.ast.external.execFileAsync call_type: resolved -- caller: src.operations.validation.assertVariableContract - callee: src.operations.validation.nonBlank +- caller: src.extractors.ast.records.adapterRecords + callee: src.extractors.ast.records.moduleRecords call_type: resolved modules: + examples.backend.src.request-handlers: + - examples.backend.src.request-handlers.MAX_BODY_BYTES + - examples.backend.src.request-handlers.event + - examples.backend.src.request-handlers.handleEventList + - examples.backend.src.request-handlers.handleEventPublish + - examples.backend.src.request-handlers.handleHealth + - examples.backend.src.request-handlers.handleRequest + - examples.backend.src.request-handlers.parseLimit + - examples.backend.src.request-handlers.parseOffset + - examples.backend.src.request-handlers.readBody + - examples.backend.src.request-handlers.sendJson + - examples.backend.src.request-handlers.size + - examples.backend.src.request-handlers.validation + examples.backend.src.server: + - examples.backend.src.server.createBackend + - examples.backend.src.server.sendJson + - examples.backend.src.server.server + - examples.backend.src.server.startBackend + - examples.backend.src.server.store + examples.backend.src.validation: + - examples.backend.src.validation.ALLOWED_ACTIONS + - examples.backend.src.validation.action + - examples.backend.src.validation.agent + - examples.backend.src.validation.invalid + - examples.backend.src.validation.object + - examples.backend.src.validation.record + - examples.backend.src.validation.validateEventPayload + examples.frontend.src.app: + - examples.frontend.src.app.createState + - examples.frontend.src.app.mountPanel + - examples.frontend.src.app.refresh + - examples.frontend.src.app.reload + - examples.frontend.src.app.state + examples.frontend.src.render: + - examples.frontend.src.render.classifyEvent + - examples.frontend.src.render.headerRow + - examples.frontend.src.render.renderTable + - examples.frontend.src.render.toRows + examples.src.runtime: + - examples.src.runtime.executeContract + - examples.src.runtime.validateContract + java.JavaAstExtract: + - java.JavaAstExtract.JavaAstExtract.add + - java.JavaAstExtract.JavaAstExtract.collect + - java.JavaAstExtract.JavaAstExtract.containsIgnored + - java.JavaAstExtract.JavaAstExtract.emit + - java.JavaAstExtract.JavaAstExtract.escape + - java.JavaAstExtract.JavaAstExtract.json + - java.JavaAstExtract.JavaAstExtract.main + - java.JavaAstExtract.JavaAstExtract.map + - java.JavaAstExtract.JavaAstExtract.slash + - java.JavaAstExtract.JavaAstExtract.try + rust-ast.src.main: + - rust-ast.src.main.add + - rust-ast.src.main.arguments + - rust-ast.src.main.collect_files + - rust-ast.src.main.excerpt + - rust-ast.src.main.main + - rust-ast.src.main.modifiers + - rust-ast.src.main.qualified + - rust-ast.src.main.slash + - rust-ast.src.main.type_item + - rust-ast.src.main.visit_expr_call + - rust-ast.src.main.visit_expr_method_call + - rust-ast.src.main.visit_impl_item_fn + - rust-ast.src.main.visit_item_const + - rust-ast.src.main.visit_item_enum + - rust-ast.src.main.visit_item_fn + - rust-ast.src.main.visit_item_mod + - rust-ast.src.main.visit_item_static + - rust-ast.src.main.visit_item_struct + - rust-ast.src.main.visit_item_trait + - rust-ast.src.main.visit_item_type + - rust-ast.src.main.visit_item_use src.cli: + - src.cli.absolute + - src.cli.buildCommonPipelineOptions + - src.cli.buildDiffPayload + - src.cli.buildFileDiff + - src.cli.buildGitDiff + - src.cli.buildPipelineOptions + - src.cli.buildWorkspaceComparisonOptions - src.cli.command + - src.cli.commandHandlers - src.cli.context - src.cli.controller - src.cli.diagnostics @@ -3994,22 +4391,44 @@ modules: - src.cli.diff - src.cli.doctor - src.cli.emitExtraction + - src.cli.emitJson - src.cli.execFileAsync - - src.cli.extractor - src.cli.file - src.cli.formatWatchEvent + - src.cli.handleApplySourcePatch + - src.cli.handleApplyTodo + - src.cli.handleCloseCodeChange - src.cli.handleCommunication + - src.cli.handleCompareWorkspace + - src.cli.handleDiagnose - src.cli.handleDiff + - src.cli.handleEvaluateCodeChange - src.cli.handleExtract + - src.cli.handleExtractAst + - src.cli.handleExtractCommunication + - src.cli.handleExtractConfig + - src.cli.handleExtractDocs + - src.cli.handleExtractGit + - src.cli.handleExtractMarkdown + - src.cli.handleExtractNl + - src.cli.handleExtractRuntime + - src.cli.handleGraphDiff + - src.cli.handleIntake + - src.cli.handleLink + - src.cli.handlePipeline + - src.cli.handleProposeCodeChange + - src.cli.handleProposeSourcePatch + - src.cli.handleProposeTodo - src.cli.handleReality + - src.cli.handleRenderCodeChange + - src.cli.handleRenderTodo + - src.cli.handleSummarize - src.cli.handleWatch - - src.cli.html + - src.cli.handler - src.cli.initProject - src.cli.invokedPath - src.cli.isPlanSet - src.cli.main - - src.cli.maxRows - - src.cli.mode - src.cli.optionBoolean - src.cli.optionList - src.cli.optionLlmMode @@ -4021,8 +4440,14 @@ modules: - src.cli.optionSummaryMode - src.cli.optionTaskMode - src.cli.parseArgs + - src.cli.parseDiffMode - src.cli.parsed + - src.cli.pipeline - src.cli.printHelp + - src.cli.reportPipelineDegradation + - src.cli.resolveMainCommand + - src.cli.resolvePipelineRoot + - src.cli.resolveWatchTaskFile - src.cli.result - src.cli.root - src.cli.stamp @@ -4030,347 +4455,297 @@ modules: - src.cli.svg - src.cli.taskFile - src.cli.view - src.operations.validation: - - src.operations.validation.assertPrincipalList - - src.operations.validation.assertVariableContract - - src.operations.validation.dateString - - src.operations.validation.exactKeys - - src.operations.validation.nonBlank - - src.operations.validation.objectValue - - src.operations.validation.principals - - src.operations.validation.uniqueStrings - src.pipeline.run: - - src.pipeline.run.aborted - - src.pipeline.run.collectTargetHints - - src.pipeline.run.communicationAudit - - src.pipeline.run.communicationInputPresent - - src.pipeline.run.communicationStartedAt - - src.pipeline.run.configurationExtraction - - src.pipeline.run.docs - - src.pipeline.run.failedAudit - - src.pipeline.run.failureCode - - src.pipeline.run.includeCommunication - - src.pipeline.run.knownAudit - - src.pipeline.run.manifestConfiguration - - src.pipeline.run.message - - src.pipeline.run.persistFailedRun - - src.pipeline.run.reason - - src.pipeline.run.runPipeline - - src.pipeline.run.skippedAudit - - src.pipeline.run.stageValue - - src.pipeline.run.values - src.semantic.reranker: - - src.semantic.reranker.acceptedDeclarations - - src.semantic.reranker.applyAcceptedSemanticRelations - - src.semantic.reranker.assertGroundedQuote - - src.semantic.reranker.assertSemanticCandidateSet - - src.semantic.reranker.assertSemanticRerankResult - - src.semantic.reranker.assertSemanticVerdictReason - - src.semantic.reranker.boundedScore - - src.semantic.reranker.byDeclaration - - src.semantic.reranker.createSemanticCandidateSet - - src.semantic.reranker.createSemanticRerankResult - - src.semantic.reranker.decisions - - src.semantic.reranker.quote - - src.semantic.reranker.records - - src.semantic.reranker.requiredText - - src.semantic.reranker.roundedConfidence - - src.semantic.reranker.seenDecisions - - src.semantic.reranker.seenIds - - src.semantic.reranker.seenPairs - - src.semantic.reranker.validDate - - src.semantic.reranker.validateGeneration - - src.semantic.reranker.validateRetrieval - - src.semantic.reranker.validateVerdictReason - - src.semantic.reranker.values - src.semantic.reranker-llm: - - src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet - - src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult - - src.semantic.reranker-llm.SemanticRerankerRequiredError.assertTrackedSnapshot - - src.semantic.reranker-llm.SemanticRerankerRequiredError.model - - src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision - - src.semantic.reranker-llm.SemanticRerankerRequiredError.payload - - src.semantic.reranker-llm.SemanticRerankerRequiredError.projectRecord - - src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates - src.services.actions: - - src.services.actions.after - - src.services.actions.afterDiagnostics - - src.services.actions.afterGraph - - src.services.actions.afterInput - - src.services.actions.afterPath - - src.services.actions.analysis - - src.services.actions.before - - src.services.actions.beforeDiagnostics - - src.services.actions.beforeGraph - - src.services.actions.beforeInput - - src.services.actions.beforePath - - src.services.actions.booleanValue - - src.services.actions.conclusions - - src.services.actions.diagnostics - - src.services.actions.diff - - src.services.actions.executeAction - - src.services.actions.filterCommunicationGraph - - src.services.actions.graph - - src.services.actions.hasInputValue - - src.services.actions.llmModeValue - - src.services.actions.nlModeValue - - src.services.actions.nullableScopedPath - - src.services.actions.nullableString - - src.services.actions.numberValue - - src.services.actions.patch - - src.services.actions.proposals - - src.services.actions.readRecords - - src.services.actions.receiptPath - - src.services.actions.resolveRoot - - src.services.actions.result - - src.services.actions.root - - src.services.actions.scopedPath - - src.services.actions.stringList - - src.services.actions.stringValue - - src.services.actions.summaryModeValue - - src.services.actions.svg - - src.services.actions.title - - src.services.actions.todoPath - - src.services.actions.value - - src.services.actions.view - - src.services.actions.withTextDiffViews - src.summary.render: - - src.summary.render.actions - - src.summary.render.confidence - - src.summary.render.recordCitations - - src.summary.render.renderConclusion - - src.summary.render.renderRecords - - src.summary.render.renderSummaryMarkdown - src.summary.summarizer: - - src.summary.summarizer.SummaryAttemptError.assertConclusions - - src.summary.summarizer.SummaryAttemptError.conclusions - - src.summary.summarizer.SummaryAttemptError.deterministicConclusions - - src.summary.summarizer.SummaryAttemptError.generationMetadata - - src.summary.summarizer.SummaryAttemptError.materializeConclusions - - src.summary.summarizer.SummaryAttemptError.parsed - - src.summary.summarizer.SummaryAttemptError.readPrompt - - src.summary.summarizer.SummaryAttemptError.sortedUnique - - src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection - - src.summary.summarizer.SummaryAttemptError.summaryMode - - src.summary.summarizer.client - - src.summary.summarizer.mode - - src.summary.summarizer.payload - - src.summary.summarizer.summarizeGraph - - src.summary.summarizer.systemPrompt - src.synthesis.code-change-path: - - src.synthesis.code-change-path.isPlannablePath - - src.synthesis.code-change-path.isUsefulCodeChangePath - src.synthesis.code-change-plan: - - src.synthesis.code-change-plan.acceptanceCriteriaFor - - src.synthesis.code-change-plan.acceptances - - src.synthesis.code-change-plan.acceptedCount - - src.synthesis.code-change-plan.applyCodeChangeSourcePatch - - src.synthesis.code-change-plan.applyUnifiedDiffToText - - src.synthesis.code-change-plan.assertCodeChangeSourcePatch - - src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet - - src.synthesis.code-change-plan.assertExistingSourceReceipt - - src.synthesis.code-change-plan.assertSourceApplyReceipt - - src.synthesis.code-change-plan.assertSourcePatchIds - - src.synthesis.code-change-plan.assertSourcePatchStrings - - src.synthesis.code-change-plan.buildChanges - - src.synthesis.code-change-plan.candidates - - src.synthesis.code-change-plan.changes - - src.synthesis.code-change-plan.collectTarget - - src.synthesis.code-change-plan.conclusions - - src.synthesis.code-change-plan.conclusionsByDiagnostic - - src.synthesis.code-change-plan.confidenceFor - - src.synthesis.code-change-plan.createCodeChangeReviewPatch - - src.synthesis.code-change-plan.createCodeChangeSourcePatch - - src.synthesis.code-change-plan.createCodeChangeSourcePatchSet - - src.synthesis.code-change-plan.descriptionFor - - src.synthesis.code-change-plan.deterministicGeneration - - src.synthesis.code-change-plan.evaluateCodeChangeAcceptance - - src.synthesis.code-change-plan.exactSourcePatchKeys - - src.synthesis.code-change-plan.exactSourcePatchSet - - src.synthesis.code-change-plan.fileHashesAfter - - src.synthesis.code-change-plan.generatedAt - - src.synthesis.code-change-plan.index - - src.synthesis.code-change-plan.indexConclusionsByDiagnostic - - src.synthesis.code-change-plan.indexProposalsByDiagnostic - - src.synthesis.code-change-plan.inline - - src.synthesis.code-change-plan.instructionFor - - src.synthesis.code-change-plan.markdown - - src.synthesis.code-change-plan.matchingConclusions - - src.synthesis.code-change-plan.matchingProposals - - src.synthesis.code-change-plan.normalizeUnifiedDiff - - src.synthesis.code-change-plan.now - - src.synthesis.code-change-plan.object - - src.synthesis.code-change-plan.patchHash - - src.synthesis.code-change-plan.patchIds - - src.synthesis.code-change-plan.paths - - src.synthesis.code-change-plan.planHash - - src.synthesis.code-change-plan.planIds - - src.synthesis.code-change-plan.plansById - - src.synthesis.code-change-plan.priorityRank - - src.synthesis.code-change-plan.proposals - - src.synthesis.code-change-plan.proposalsByDiagnostic - - src.synthesis.code-change-plan.rawDiff - - src.synthesis.code-change-plan.record - - src.synthesis.code-change-plan.recordsById - - src.synthesis.code-change-plan.relatedRecords - - src.synthesis.code-change-plan.renderCodeChangeReviewMarkdown - - src.synthesis.code-change-plan.renderIds - - src.synthesis.code-change-plan.riskFor - - src.synthesis.code-change-plan.rollbackFor - - src.synthesis.code-change-plan.set - - src.synthesis.code-change-plan.splitKeep - - src.synthesis.code-change-plan.startsWithImperative - - src.synthesis.code-change-plan.target - - src.synthesis.code-change-plan.titleFor - - src.synthesis.code-change-plan.unifiedDiff - - src.synthesis.code-change-plan.uniqueSorted - src.synthesis.task-synthesis-contract: - - src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT - - src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT - - src.synthesis.task-synthesis-contract.nonBlank - - src.synthesis.task-synthesis-contract.taskIds - - src.synthesis.task-synthesis-contract.taskStrings - src.synthesis.task-synthesis-materialize: - - src.synthesis.task-synthesis-materialize.conclusionByKey - - src.synthesis.task-synthesis-materialize.conclusionIdByKey - - src.synthesis.task-synthesis-materialize.conclusions - - src.synthesis.task-synthesis-materialize.diagnosticIds - - src.synthesis.task-synthesis-materialize.keys - - src.synthesis.task-synthesis-materialize.mapKeys - - src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse - - src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria - - src.synthesis.task-synthesis-materialize.normalizeLocalKeys - - src.synthesis.task-synthesis-materialize.normalizeRawTarget - - src.synthesis.task-synthesis-materialize.normalizeStringArray - - src.synthesis.task-synthesis-materialize.parsed - - src.synthesis.task-synthesis-materialize.proposalDrafts - - src.synthesis.task-synthesis-materialize.proposalIdByKey - - src.synthesis.task-synthesis-materialize.proposalKeys - - src.synthesis.task-synthesis-materialize.proposals - - src.synthesis.task-synthesis-materialize.sortedUnique - src.synthesis.tasks-llm: - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.client - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.generationMetadata - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.readPrompt - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesisAudit - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals - - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection - src.synthesis.todo-patch: - - src.synthesis.todo-patch.appendPatch - - src.synthesis.todo-patch.applied - - src.synthesis.todo-patch.applyTodoPatch - - src.synthesis.todo-patch.artifact - - src.synthesis.todo-patch.assertApproval - - src.synthesis.todo-patch.assertReceipt - - src.synthesis.todo-patch.assertTodoPatchArtifact - - src.synthesis.todo-patch.atomicWrite - - src.synthesis.todo-patch.classified - - src.synthesis.todo-patch.createTodoPatch - - src.synthesis.todo-patch.current - - src.synthesis.todo-patch.currentHash - - src.synthesis.todo-patch.diagnosticReportFingerprint - - src.synthesis.todo-patch.duplicates - - src.synthesis.todo-patch.exactKeys - - src.synthesis.todo-patch.hash - - src.synthesis.todo-patch.inline - - src.synthesis.todo-patch.isoDate - - src.synthesis.todo-patch.markdown - - src.synthesis.todo-patch.nonBlank - - src.synthesis.todo-patch.normalizePath - - src.synthesis.todo-patch.now - - src.synthesis.todo-patch.object - - src.synthesis.todo-patch.orderedSelected - - src.synthesis.todo-patch.recovered - - src.synthesis.todo-patch.renderIds - - src.synthesis.todo-patch.renderTargets - - src.synthesis.todo-patch.renderTodoPatchMarkdown - - src.synthesis.todo-patch.rendered - - src.synthesis.todo-patch.result - - src.synthesis.todo-patch.sameArray - - src.synthesis.todo-patch.selected - - src.synthesis.todo-patch.sourceTodo - - src.synthesis.todo-patch.uniqueIds - - src.synthesis.todo-patch.uniqueStrings - - src.synthesis.todo-patch.wasAlreadyAppended - - src.synthesis.todo-patch.writeTodoPatchArtifacts - src.synthesis.validation: - - src.synthesis.validation.dependencyFirstPriorityOrder - - src.synthesis.validation.duplicateEvidence - - src.synthesis.validation.intersects - - src.synthesis.validation.jaccard - - src.synthesis.validation.proposalWords - - src.synthesis.validation.sharedPath - - src.synthesis.validation.sharedSymbol - - src.synthesis.validation.sharedTicket - - src.synthesis.validation.similarity - - src.synthesis.validation.target - - src.synthesis.validation.validateAndClassifyTodoProposals - - src.synthesis.validation.words - src.tf.classifier: - - src.tf.classifier.classifyAction - - src.tf.classifier.dynamicImport - - src.tf.classifier.importer - - src.tf.classifier.loadAssets - - src.tf.classifier.loadClassifier - - src.tf.classifier.vectorize - src.watch.watcher: - - src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - - src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - - src.watch.watcher.absolute - - src.watch.watcher.absoluteRoot - - src.watch.watcher.current - - src.watch.watcher.defaultSleep - - src.watch.watcher.delta - - src.watch.watcher.describeDelta - - src.watch.watcher.diffSnapshots - - src.watch.watcher.emit - - src.watch.watcher.finish - - src.watch.watcher.generate - - src.watch.watcher.lastReportStartedAt - - src.watch.watcher.maxFiles - - src.watch.watcher.now - - src.watch.watcher.onAbort - - src.watch.watcher.pending - - src.watch.watcher.relative - - src.watch.watcher.result - - src.watch.watcher.runReport - - src.watch.watcher.scanTree - - src.watch.watcher.sleep - - src.watch.watcher.snapshot - - src.watch.watcher.startedAt - - src.watch.watcher.timer - - src.watch.watcher.visit - - src.watch.watcher.waitMs - - src.watch.watcher.watchRepository - src.web.diff-ui: - - src.web.diff-ui.byId - - src.web.diff-ui.compareGraphs - - src.web.diff-ui.diffUiHtml - - src.web.diff-ui.fillSelect - - src.web.diff-ui.formatBytes - - src.web.diff-ui.loadRuns - - src.web.diff-ui.requestHeaders - - src.web.diff-ui.selectedRun - - src.web.diff-ui.updateMeta + src.extractors.ast: + - src.extractors.ast.isExtractionResult + - src.extractors.ast.isIntentRecords + src.extractors.ast.external: + - src.extractors.ast.external.execFileAsync + - src.extractors.ast.external.result + - src.extractors.ast.external.runExternalAstAdapter + src.extractors.ast.records: + - src.extractors.ast.records.adapterRecords + - src.extractors.ast.records.moduleRecords + src.extractors.changelog: + - src.extractors.changelog.body + - src.extractors.changelog.changelogAction + - src.extractors.changelog.extractChangelog + - src.extractors.changelog.lines + - src.extractors.changelog.relative + src.extractors.communication-file-helpers: + - src.extractors.communication-file-helpers.appendA2aAgentWarnings + - src.extractors.communication-file-helpers.appendIdentityWarnings + - src.extractors.communication-file-helpers.appendRegistryAlignmentWarnings + - src.extractors.communication-file-helpers.appendRoleAndParticipantWarnings + - src.extractors.communication-file-helpers.appendTimestampWarnings + - src.extractors.communication-file-helpers.buildLocalWarnings + - src.extractors.communication-file-helpers.envelope + - src.extractors.communication-file-helpers.hasExplicitEnvelopeMetadata + - src.extractors.communication-file-helpers.inferred + - src.extractors.communication-file-helpers.shouldSkipCommunicationFile + src.extractors.communication-helpers: + - src.extractors.communication-helpers.basename + - src.extractors.communication-helpers.communicationSegments + - src.extractors.communication-helpers.fileParts + - src.extractors.communication-helpers.flush + - src.extractors.communication-helpers.heading + - src.extractors.communication-helpers.inferGovernanceIdentityFromFilename + - src.extractors.communication-helpers.inferIdentity + - src.extractors.communication-helpers.inferIdentityFromPathAndFilename + - src.extractors.communication-helpers.isCommunicationNoise + - src.extractors.communication-helpers.isCommunicationType + - src.extractors.communication-helpers.isTicketEvidenceFile + - src.extractors.communication-helpers.item + - src.extractors.communication-helpers.listValue + - src.extractors.communication-helpers.match + - src.extractors.communication-helpers.nestedParticipant + - src.extractors.communication-helpers.nestedRole + - src.extractors.communication-helpers.nestedRoleIndex + - src.extractors.communication-helpers.normalize + - src.extractors.communication-helpers.normalizeType + - src.extractors.communication-helpers.parseEnvelope + - src.extractors.communication-helpers.raw + - src.extractors.communication-helpers.sameStrings + - src.extractors.communication-helpers.unquote + src.extractors.configuration: + - src.extractors.configuration.MAX_ENTRIES_PER_FILE + - src.extractors.configuration.bounded + - src.extractors.configuration.configurationFormat + - src.extractors.configuration.configurationRecords + - src.extractors.configuration.dockerEntries + - src.extractors.configuration.entries + - src.extractors.configuration.entry + - src.extractors.configuration.extractConfigurationIntent + - src.extractors.configuration.fileAggregate + - src.extractors.configuration.files + - src.extractors.configuration.findKeyLine + - src.extractors.configuration.heading + - src.extractors.configuration.isConfigurationPath + - src.extractors.configuration.jsonEntries + - src.extractors.configuration.line + - src.extractors.configuration.lines + - src.extractors.configuration.match + - src.extractors.configuration.pair + - src.extractors.configuration.parsed + - src.extractors.configuration.relative + - src.extractors.configuration.tomlEntries + - src.extractors.configuration.uniqueEntries + - src.extractors.configuration.yamlOrAssignmentEntries + src.extractors.docs-chunks: + - src.extractors.docs-chunks.chunkMarkdown + - src.extractors.docs-chunks.chunkPriority + - src.extractors.docs-chunks.flush + - src.extractors.docs-chunks.index + - src.extractors.docs-chunks.item + - src.extractors.docs-chunks.mapConcurrent + - src.extractors.docs-chunks.markdownSections + - src.extractors.docs-chunks.needles + - src.extractors.docs-chunks.prioritizeDocumentChunks + - src.extractors.docs-chunks.sectionLines + - src.extractors.docs-chunks.sectionText + - src.extractors.docs-chunks.splitLongSection + - src.extractors.docs-chunks.takeLineBatch + - src.extractors.docs-chunks.worker + - src.extractors.docs-chunks.workerCount + src.extractors.docs-deterministic: + - src.extractors.docs-deterministic.action + - src.extractors.docs-deterministic.codeBlockRecord + - src.extractors.docs-deterministic.convertDocument + - src.extractors.docs-deterministic.extractDocumentationBaseline + - src.extractors.docs-deterministic.handleDocumentationLine + - src.extractors.docs-deterministic.heading + - src.extractors.docs-deterministic.marker + - src.extractors.docs-deterministic.match + - src.extractors.docs-deterministic.parseBulletStatement + - src.extractors.docs-deterministic.parseFenceBlock + - src.extractors.docs-deterministic.parseParagraphStatement + - src.extractors.docs-deterministic.parseSectionHeading + - src.extractors.docs-deterministic.primePathMapper + - src.extractors.docs-deterministic.qualifyingStatement + - src.extractors.docs-deterministic.readParagraph + - src.extractors.docs-deterministic.resolver + - src.extractors.docs-deterministic.root + - src.extractors.docs-deterministic.statementRecord + - src.extractors.docs-deterministic.targetsOf + src.extractors.docs-llm: + - src.extractors.docs-llm.DocumentationLlmRequiredError.errorMessage + - src.extractors.docs-llm.DocumentationLlmRequiredError.extractChunk + - src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent + - src.extractors.docs-llm.DocumentationLlmRequiredError.files + - src.extractors.docs-llm.DocumentationLlmRequiredError.loadDocumentChunks + - src.extractors.docs-llm.DocumentationLlmRequiredError.readPrompt + - src.extractors.docs-llm.DocumentationLlmRequiredError.requireConfiguredClient + - src.extractors.docs-llm.DocumentationLlmRequiredError.selectWithinBudget + src.extractors.docs-record: + - src.extractors.docs-record.OBJECT_PLACEHOLDERS + - src.extractors.docs-record.action + - src.extractors.docs-record.allowedAction + - src.extractors.docs-record.allowedLifecycle + - src.extractors.docs-record.allowedModality + - src.extractors.docs-record.anchorToSource + - src.extractors.docs-record.clampLine + - src.extractors.docs-record.fallback + - src.extractors.docs-record.hasTarget + - src.extractors.docs-record.isPlaceholder + - src.extractors.docs-record.keywordOverlap + - src.extractors.docs-record.linesFromChunk + - src.extractors.docs-record.modality + - src.extractors.docs-record.resolveAction + - src.extractors.docs-record.resolveModality + - src.extractors.docs-record.resolveObject + - src.extractors.docs-record.resolveTarget + - src.extractors.docs-record.statementText + - src.extractors.docs-record.target + - src.extractors.docs-record.toDocumentIntentRecord + src.extractors.docs-schema: + - src.extractors.docs-schema.documentRecord + - src.extractors.docs-schema.documentResponseContract + - src.extractors.docs-schema.documentResponseSchema + - src.extractors.docs-schema.strings + - src.extractors.docs-schema.target + src.extractors.git: + - src.extractors.git.count + - src.extractors.git.createDiscoveryState + - src.extractors.git.discoverGitRepositories + - src.extractors.git.execFileAsync + - src.extractors.git.extractChangedSymbols + - src.extractors.git.extractGitIntent + - src.extractors.git.extractRepositoryGitIntent + - src.extractors.git.filterDiscoveryChildren + - src.extractors.git.finishDiscovery + - src.extractors.git.gitMarkerState + - src.extractors.git.hasMoreDiscoveryWork + - src.extractors.git.isGitWorkTree + - src.extractors.git.mapWithConcurrency + - src.extractors.git.processDiscoveryDirectory + - src.extractors.git.readChangedFiles + - src.extractors.git.readCommits + - src.extractors.git.readDiscoveryEntries + - src.extractors.git.readStats + - src.extractors.git.registerDiscoveredRepository + - src.extractors.git.resolveDiscoveryPrefix + - src.extractors.git.result + - src.extractors.git.root + - src.extractors.git.runGit + - src.extractors.git.state + - src.extractors.git.takeNextDiscoveryDirectory + src.extractors.markdown-llm: + - src.extractors.markdown-llm.MarkdownLlmRequiredError.client + - src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited + - src.extractors.markdown-llm.MarkdownLlmRequiredError.fallbackOrThrow + src.extractors.markdown-llm-helpers: + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.emptyCoverage + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownBatchWithCorrection + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichSplitBatch + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.markdownResponseContract + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes + - src.extractors.markdown-llm-helpers.MarkdownAttemptError.strings + src.extractors.markdown-paths: + - src.extractors.markdown-paths.addBasenameIndexMatch + - src.extractors.markdown-paths.basenames + - src.extractors.markdown-paths.buildBasenameIndex + - src.extractors.markdown-paths.createBasenameIndexState + - src.extractors.markdown-paths.createMarkdownPathResolver + - src.extractors.markdown-paths.headingDirectories + - src.extractors.markdown-paths.headingScopes + - src.extractors.markdown-paths.index + - src.extractors.markdown-paths.isNestedCheckout + - src.extractors.markdown-paths.isRepositoryPath + - src.extractors.markdown-paths.readBasenameDirectoryEntries + - src.extractors.markdown-paths.repositoryRoot + - src.extractors.markdown-paths.scanDirectoryForBasenames + - src.extractors.markdown-paths.state + src.extractors.nl: + - src.extractors.nl.absolute + - src.extractors.nl.action + - src.extractors.nl.assertNlExtractionOptions + - src.extractors.nl.body + - src.extractors.nl.classified + - src.extractors.nl.confidence + - src.extractors.nl.detectMissingFields + - src.extractors.nl.extractNlIntent + - src.extractors.nl.inferActor + - src.extractors.nl.missing + - src.extractors.nl.object + - src.extractors.nl.sourcePath + src.extractors.nl-llm: + - src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions + - src.extractors.nl-llm.NlLlmRequiredError.client + - src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited + - src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow + src.extractors.nl-llm-helpers: + - src.extractors.nl-llm-helpers.NlAttemptError.NL_ACTION_SET + - src.extractors.nl-llm-helpers.NlAttemptError.NL_MODALITY_SET + - src.extractors.nl-llm-helpers.NlAttemptError.NL_RECORD_CONTRACT + - src.extractors.nl-llm-helpers.NlAttemptError.action + - src.extractors.nl-llm-helpers.NlAttemptError.allowedAction + - src.extractors.nl-llm-helpers.NlAttemptError.allowedModality + - src.extractors.nl-llm-helpers.NlAttemptError.clampLine + - src.extractors.nl-llm-helpers.NlAttemptError.isPlaceholder + - src.extractors.nl-llm-helpers.NlAttemptError.lines + - src.extractors.nl-llm-helpers.NlAttemptError.nlStrings + - src.extractors.nl-llm-helpers.NlAttemptError.nonEmptyText + - src.extractors.nl-llm-helpers.NlAttemptError.normalizedText + - src.extractors.nl-llm-helpers.NlAttemptError.resolveAction + - src.extractors.nl-llm-helpers.NlAttemptError.resolveModality + - src.extractors.nl-llm-helpers.NlAttemptError.resolveObject + - src.extractors.nl-llm-helpers.NlAttemptError.sourceExcerpt + - src.extractors.nl-llm-helpers.NlAttemptError.statementText + - src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord + src.extractors.runtime-cycle: + - src.extractors.runtime-cycle.MAX_PER_SECTION + - src.extractors.runtime-cycle.boundedArray + - src.extractors.runtime-cycle.driftRecord + - src.extractors.runtime-cycle.extractRuntimeCycleIntent + - src.extractors.runtime-cycle.factsMetadata + - src.extractors.runtime-cycle.jsonScalar + - src.extractors.runtime-cycle.label + - src.extractors.runtime-cycle.parseCycle + - src.extractors.runtime-cycle.probeRecord + - src.extractors.runtime-cycle.proposalAction + - src.extractors.runtime-cycle.proposalRecord + - src.extractors.runtime-cycle.results + - src.extractors.runtime-cycle.sourcePathFor + - src.extractors.runtime-cycle.tags + - src.extractors.runtime-cycle.text + - src.extractors.runtime-cycle.violationRecord + - src.extractors.runtime-cycle.watched + src.extractors.todo: + - src.extractors.todo.action + - src.extractors.todo.block + - src.extractors.todo.body + - src.extractors.todo.checked + - src.extractors.todo.classified + - src.extractors.todo.extractExplicitId + - src.extractors.todo.extractTodo + - src.extractors.todo.heading + - src.extractors.todo.inferOwner + - src.extractors.todo.lines + - src.extractors.todo.match + - src.extractors.todo.raw + - src.extractors.todo.relative + - src.extractors.todo.resolvedPaths + - src.extractors.todo.task + - src.extractors.todo.text entry_points: -- examples.backend.src.server.MAX_BODY_BYTES +- examples.backend.src.request-handlers.MAX_BODY_BYTES +- examples.backend.src.request-handlers.body +- examples.backend.src.request-handlers.buffer +- examples.backend.src.request-handlers.event +- examples.backend.src.request-handlers.handleRequest +- examples.backend.src.request-handlers.limit +- examples.backend.src.request-handlers.offset +- examples.backend.src.request-handlers.parsed +- examples.backend.src.request-handlers.url +- examples.backend.src.request-handlers.validation - examples.backend.src.server.body -- examples.backend.src.server.buffer -- examples.backend.src.server.event - examples.backend.src.server.host -- examples.backend.src.server.limit -- examples.backend.src.server.offset - examples.backend.src.server.port - examples.backend.src.server.server - examples.backend.src.server.startBackend - examples.backend.src.server.store -- examples.backend.src.server.url -- examples.backend.src.server.validation - examples.backend.src.store.EventStore.enqueueEvent - examples.backend.src.store.EventStore.listEvents - examples.backend.src.store.EventStore.size @@ -4385,7 +4760,6 @@ entry_points: - examples.frontend.src.api.ApiError.payload - examples.frontend.src.api.ApiError.publishEvent - examples.frontend.src.api.ApiError.response -- examples.frontend.src.api.ApiError.super - examples.frontend.src.api.ApiError.url - examples.frontend.src.app.message - examples.frontend.src.app.mountPanel @@ -4408,6 +4782,9 @@ entry_points: - java.JavaAstExtract.JavaAstExtract.main - php.ast_extract.argumentValue - php.ast_extract.parseFile +- project.cleanup_analysis_snapshot +- project.install_project_package +- project.run_analysis_tool - python.ast_extract.FactVisitor.__init__ - python.ast_extract.FactVisitor.add - python.ast_extract.FactVisitor.add_named_constant @@ -4805,6 +5182,7 @@ entry_points: - sdk.typescript.src.T2CClient.task - sdk.typescript.src.T2CClient.timer - sdk.typescript.src.T2CError.super +- src.cli.absolute - src.cli.actor - src.cli.afterFile - src.cli.afterGraphPath @@ -4817,6 +5195,7 @@ entry_points: - src.cli.config - src.cli.context - src.cli.controller +- src.cli.cycle - src.cli.diagnostics - src.cli.diagnosticsPath - src.cli.diff @@ -4826,6 +5205,34 @@ entry_points: - src.cli.graphFile - src.cli.graphOut - src.cli.graphPath +- src.cli.handleApplySourcePatch +- src.cli.handleApplyTodo +- src.cli.handleCloseCodeChange +- src.cli.handleCommunication +- src.cli.handleCompareWorkspace +- src.cli.handleDiagnose +- src.cli.handleDiff +- src.cli.handleEvaluateCodeChange +- src.cli.handleExtract +- src.cli.handleExtractAst +- src.cli.handleExtractCommunication +- src.cli.handleExtractConfig +- src.cli.handleExtractDocs +- src.cli.handleExtractGit +- src.cli.handleExtractMarkdown +- src.cli.handleExtractNl +- src.cli.handleExtractRuntime +- src.cli.handleIntake +- src.cli.handleLink +- src.cli.handlePipeline +- src.cli.handleProposeCodeChange +- src.cli.handleProposeSourcePatch +- src.cli.handleProposeTodo +- src.cli.handleReality +- src.cli.handleRenderCodeChange +- src.cli.handleRenderTodo +- src.cli.handleSummarize +- src.cli.handleWatch - src.cli.html - src.cli.inline - src.cli.inputPath @@ -4838,12 +5245,14 @@ entry_points: - src.cli.name - src.cli.next - src.cli.number +- src.cli.operation - src.cli.options - src.cli.out - src.cli.output - src.cli.parsed - src.cli.patch - src.cli.patchPath +- src.cli.pipeline - src.cli.planPath - src.cli.plansPath - src.cli.receipt @@ -4885,6 +5294,7 @@ entry_points: - src.communication.analyzer.output - src.communication.analyzer.participant - src.communication.analyzer.participantGit +- src.communication.analyzer.participantRows - src.communication.analyzer.participants - src.communication.analyzer.plans - src.communication.analyzer.record @@ -4901,52 +5311,156 @@ entry_points: - src.communication.analyzer.sortedRespondents - src.communication.analyzer.sourceRecords - src.communication.analyzer.type +- src.communication.analyzer.uniqueIssues - src.communication.analyzer.value - src.communication.identity.allowed - src.communication.identity.entry - src.communication.identity.external - src.communication.identity.extra - src.communication.identity.ids +- src.communication.identity.key +- src.communication.identity.kind - src.communication.identity.loadParticipantIdentityRegistry - src.communication.identity.missing - src.communication.identity.normalized - src.communication.identity.owner +- src.communication.identity.participantId +- src.communication.identity.participants +- src.communication.identity.principals - src.communication.identity.registry - src.communication.identity.registryPath +- src.communication.identity.role +- src.communication.identity.v1Path +- src.communication.identity.v2Path - src.communication.identity.values -- src.communication.llm.CommunicationAttemptError.COMMUNICATION_ENRICHMENT_CONTRACT -- src.communication.llm.CommunicationAttemptError.COMMUNICATION_RESPONSE_CONTRACT -- src.communication.llm.CommunicationAttemptError.PARTICIPANT_SYNTHESIS_CONTRACT -- src.communication.llm.CommunicationAttemptError.byKey -- src.communication.llm.CommunicationAttemptError.completion -- src.communication.llm.CommunicationAttemptError.expected -- src.communication.llm.CommunicationAttemptError.failed -- src.communication.llm.CommunicationAttemptError.group -- src.communication.llm.CommunicationAttemptError.grouped -- src.communication.llm.CommunicationAttemptError.key -- src.communication.llm.CommunicationAttemptError.marked -- src.communication.llm.CommunicationAttemptError.output -- src.communication.llm.CommunicationAttemptError.participant -- src.communication.llm.CommunicationAttemptError.permitted -- src.communication.llm.CommunicationAttemptError.promptPath -- src.communication.llm.CommunicationAttemptError.recordIds -- src.communication.llm.CommunicationAttemptError.role -- src.communication.llm.CommunicationAttemptError.seen -- src.communication.llm.CommunicationAttemptError.super -- src.communication.llm.CommunicationLlmRequiredError.client -- src.communication.llm.CommunicationLlmRequiredError.deterministic -- src.communication.llm.CommunicationLlmRequiredError.enrichedByOriginal -- src.communication.llm.CommunicationLlmRequiredError.enrichments -- src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited -- src.communication.llm.CommunicationLlmRequiredError.failure -- src.communication.llm.CommunicationLlmRequiredError.generation -- src.communication.llm.CommunicationLlmRequiredError.groups -- src.communication.llm.CommunicationLlmRequiredError.participants -- src.communication.llm.CommunicationLlmRequiredError.records -- src.communication.llm.CommunicationLlmRequiredError.response -- src.communication.llm.CommunicationLlmRequiredError.responses -- src.communication.llm.CommunicationLlmRequiredError.startedAt -- src.communication.llm.CommunicationLlmRequiredError.super +- src.communication.intake-contract.IntakeError.allowed +- src.communication.intake-contract.IntakeError.assertIntakeEnvelope +- src.communication.intake-contract.IntakeError.assertParticipant +- src.communication.intake-contract.IntakeError.assertPrincipal +- src.communication.intake-contract.IntakeError.base +- src.communication.intake-contract.IntakeError.diagnostic +- src.communication.intake-contract.IntakeError.entry +- src.communication.intake-contract.IntakeError.envelope +- src.communication.intake-contract.IntakeError.extra +- src.communication.intake-contract.IntakeError.known +- src.communication.intake-contract.IntakeError.missing +- src.communication.intake-contract.IntakeError.principal +- src.communication.intake-contract.IntakeError.principalKey +- src.communication.intake-contract.IntakeError.record +- src.communication.intake-contract.IntakeError.super +- src.communication.intake-contract.IntakeError.ticketId +- src.communication.intake-contract.IntakeError.type +- src.communication.intake-protobuf.byte +- src.communication.intake-protobuf.data +- src.communication.intake-protobuf.decodeIntakeEnvelope +- src.communication.intake-protobuf.decodeIntakeResult +- src.communication.intake-protobuf.encodeIntakeEnvelope +- src.communication.intake-protobuf.encodeIntakeResult +- src.communication.intake-protobuf.envelope +- src.communication.intake-protobuf.field +- src.communication.intake-protobuf.fieldStart +- src.communication.intake-protobuf.numbers +- src.communication.intake-protobuf.offset +- src.communication.intake-protobuf.operation +- src.communication.intake-protobuf.parsed +- src.communication.intake-protobuf.payload +- src.communication.intake-protobuf.raw +- src.communication.intake-protobuf.remaining +- src.communication.intake-protobuf.strings +- src.communication.intake-protobuf.unknownFields +- src.communication.intake-protobuf.value +- src.communication.intake-protobuf.values +- src.communication.intake-protobuf.wire +- src.communication.intake-service.GovernedIntakeService.actor +- src.communication.intake-service.GovernedIntakeService.actual +- src.communication.intake-service.GovernedIntakeService.appended +- src.communication.intake-service.GovernedIntakeService.assertProjectionWritable +- src.communication.intake-service.GovernedIntakeService.body +- src.communication.intake-service.GovernedIntakeService.candidates +- src.communication.intake-service.GovernedIntakeService.command +- src.communication.intake-service.GovernedIntakeService.commandEnvelope +- src.communication.intake-service.GovernedIntakeService.conflictingFiles +- src.communication.intake-service.GovernedIntakeService.directory +- src.communication.intake-service.GovernedIntakeService.envelope +- src.communication.intake-service.GovernedIntakeService.event +- src.communication.intake-service.GovernedIntakeService.existing +- src.communication.intake-service.GovernedIntakeService.hash +- src.communication.intake-service.GovernedIntakeService.key +- src.communication.intake-service.GovernedIntakeService.messages +- src.communication.intake-service.GovernedIntakeService.participant +- src.communication.intake-service.GovernedIntakeService.participantId +- src.communication.intake-service.GovernedIntakeService.participants +- src.communication.intake-service.GovernedIntakeService.payload +- src.communication.intake-service.GovernedIntakeService.projectionHash +- src.communication.intake-service.GovernedIntakeService.rejectSecrets +- src.communication.intake-service.GovernedIntakeService.roleFiles +- src.communication.intake-service.GovernedIntakeService.slug +- src.communication.intake-service.GovernedIntakeService.stat +- src.communication.intake-service.GovernedIntakeService.state +- src.communication.intake-service.GovernedIntakeService.stream +- src.communication.intake-service.GovernedIntakeService.target +- src.communication.intake-service.GovernedIntakeService.ticketId +- src.communication.intake-service.GovernedIntakeService.updated +- src.communication.intake-service.GovernedIntakeService.writeProjection +- src.communication.intake-store.IntakeEventStore.event +- src.communication.intake-store.IntakeEventStore.eventPath +- src.communication.intake-store.IntakeEventStore.existing +- src.communication.intake-store.IntakeEventStore.lockPath +- src.communication.intake-store.IntakeEventStore.name +- src.communication.intake-store.IntakeEventStore.names +- src.communication.intake-store.IntakeEventStore.projectionPath +- src.communication.intake-store.IntakeEventStore.read +- src.communication.intake-store.IntakeEventStore.safe +- src.communication.intake-store.IntakeEventStore.slug +- src.communication.intake-store.IntakeEventStore.stat +- src.communication.intake-store.IntakeEventStore.stream +- src.communication.intake-store.IntakeEventStore.temp +- src.communication.intake-store.IntakeEventStore.writeRegistry +- src.communication.llm.implementation-helpers.COMMUNICATION_ENRICHMENT_CONTRACT +- src.communication.llm.implementation-helpers.COMMUNICATION_RESPONSE_CONTRACT +- src.communication.llm.implementation-helpers.PARTICIPANT_SYNTHESIS_CONTRACT +- src.communication.llm.implementation-helpers.audit +- src.communication.llm.implementation-helpers.byKey +- src.communication.llm.implementation-helpers.deterministicGeneration +- src.communication.llm.implementation-helpers.deterministicSyntheses +- src.communication.llm.implementation-helpers.enrichRecord +- src.communication.llm.implementation-helpers.expected +- src.communication.llm.implementation-helpers.fallbackGeneration +- src.communication.llm.implementation-helpers.group +- src.communication.llm.implementation-helpers.grouped +- src.communication.llm.implementation-helpers.key +- src.communication.llm.implementation-helpers.llmGeneration +- src.communication.llm.implementation-helpers.markDeterministic +- src.communication.llm.implementation-helpers.marked +- src.communication.llm.implementation-helpers.materializeSyntheses +- src.communication.llm.implementation-helpers.output +- src.communication.llm.implementation-helpers.participant +- src.communication.llm.implementation-helpers.permitted +- src.communication.llm.implementation-helpers.promptPath +- src.communication.llm.implementation-helpers.promptPayload +- src.communication.llm.implementation-helpers.readPrompt +- src.communication.llm.implementation-helpers.recordIds +- src.communication.llm.implementation-helpers.role +- src.communication.llm.implementation-helpers.seen +- src.communication.llm.implementation-helpers.validateEnrichments +- src.communication.llm.implementation.CommunicationAttemptError.completion +- src.communication.llm.implementation.CommunicationAttemptError.failed +- src.communication.llm.implementation.CommunicationAttemptError.marked +- src.communication.llm.implementation.CommunicationAttemptError.super +- src.communication.llm.implementation.CommunicationLlmRequiredError.client +- src.communication.llm.implementation.CommunicationLlmRequiredError.deterministic +- src.communication.llm.implementation.CommunicationLlmRequiredError.enrichedByOriginal +- src.communication.llm.implementation.CommunicationLlmRequiredError.enrichments +- src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited +- src.communication.llm.implementation.CommunicationLlmRequiredError.failure +- src.communication.llm.implementation.CommunicationLlmRequiredError.generation +- src.communication.llm.implementation.CommunicationLlmRequiredError.groups +- src.communication.llm.implementation.CommunicationLlmRequiredError.participants +- src.communication.llm.implementation.CommunicationLlmRequiredError.records +- src.communication.llm.implementation.CommunicationLlmRequiredError.response +- src.communication.llm.implementation.CommunicationLlmRequiredError.responses +- src.communication.llm.implementation.CommunicationLlmRequiredError.startedAt +- src.communication.llm.implementation.CommunicationLlmRequiredError.super - src.comparison.workspace.absolute - src.comparison.workspace.alignmentRateDelta - src.comparison.workspace.artifacts @@ -5041,111 +5555,138 @@ entry_points: - src.core.io.DEFAULT_IGNORED_DIRS - src.core.io.absolute - src.core.io.after -- src.core.io.base - src.core.io.body - src.core.io.char - src.core.io.entries -- src.core.io.extension -- src.core.io.extensions - src.core.io.files -- src.core.io.ignored -- src.core.io.matcher -- src.core.io.maxFiles +- src.core.io.isTargetFile - src.core.io.next - src.core.io.normalized - src.core.io.readJson - src.core.io.readJsonl +- src.core.io.relativePosix - src.core.io.resolveGlobs +- src.core.io.state - src.core.io.writeJson - src.core.io.writeJsonl - src.core.io.writeText +- src.core.record-metadata.generationMetadata +- src.core.record-metadata.separator - src.core.record.buildRecord - src.core.record.rawExcerpt -- src.core.record.separator -- src.core.record.used +- src.core.record.seed - src.core.record.withRecordGeneration -- src.core.schema.ACTIONS -- src.core.schema.CODE_CHANGE_ACTIONS -- src.core.schema.CODE_CHANGE_RISK_LEVELS -- src.core.schema.CONCLUSION_KINDS -- src.core.schema.DIAGNOSTIC_SEVERITIES -- src.core.schema.EPISTEMIC_CLASSES -- src.core.schema.GENERATION_EFFECTIVE_MODES -- src.core.schema.GENERATION_REQUESTED_MODES -- src.core.schema.LIFECYCLES -- src.core.schema.MODALITIES -- src.core.schema.POLARITIES -- src.core.schema.RELATION_TYPES -- src.core.schema.SOURCE_KINDS -- src.core.schema.TODO_PRIORITIES -- src.core.schema.acceptance -- src.core.schema.actual -- src.core.schema.afterKnown -- src.core.schema.assertCodeChangeAcceptance -- src.core.schema.assertCodeChangePlan -- src.core.schema.assertCodeChangePlans -- src.core.schema.assertCodeChangePlansForReview -- src.core.schema.assertConclusion -- src.core.schema.assertIntentGraphDiff -- src.core.schema.assertTodoProposal -- src.core.schema.beforeKnown -- src.core.schema.byId -- src.core.schema.change -- src.core.schema.changePaths -- src.core.schema.conclusion -- src.core.schema.conclusions -- src.core.schema.diagnostic -- src.core.schema.diagnosticIds -- src.core.schema.diff -- src.core.schema.epistemic -- src.core.schema.evidence -- src.core.schema.expectedAccepted -- src.core.schema.expectedBlocking -- src.core.schema.expectedCleared -- src.core.schema.expectedFingerprint -- src.core.schema.expectedGenerator -- src.core.schema.expectedHash -- src.core.schema.expectedId -- src.core.schema.expectedRemaining -- src.core.schema.expectedSet -- src.core.schema.extra -- src.core.schema.generation -- src.core.schema.graph -- src.core.schema.id -- src.core.schema.ids -- src.core.schema.key -- src.core.schema.known -- src.core.schema.lifecycle -- src.core.schema.lines -- src.core.schema.metadata -- src.core.schema.missing -- src.core.schema.normalized -- src.core.schema.normalizedPath -- src.core.schema.plan -- src.core.schema.proposal -- src.core.schema.proposalIds -- src.core.schema.proposals -- src.core.schema.record -- src.core.schema.recordIds -- src.core.schema.records -- src.core.schema.referencedConclusionIds -- src.core.schema.relation -- src.core.schema.relationIds -- src.core.schema.relations -- src.core.schema.report -- src.core.schema.risk -- src.core.schema.semantic -- src.core.schema.separator -- src.core.schema.source -- src.core.schema.start -- src.core.schema.statement -- src.core.schema.stats -- src.core.schema.summary -- src.core.schema.target -- src.core.schema.targetPaths -- src.core.schema.unknown -- src.core.schema.visited -- src.core.schema.visiting +- src.core.schema.code-change.acceptance +- src.core.schema.code-change.afterKnown +- src.core.schema.code-change.assertCodeChangeAcceptance +- src.core.schema.code-change.assertCodeChangePlan +- src.core.schema.code-change.assertCodeChangePlans +- src.core.schema.code-change.assertCodeChangePlansForReview +- src.core.schema.code-change.beforeKnown +- src.core.schema.code-change.change +- src.core.schema.code-change.changePaths +- src.core.schema.code-change.conclusions +- src.core.schema.code-change.evidence +- src.core.schema.code-change.expectedAccepted +- src.core.schema.code-change.expectedBlocking +- src.core.schema.code-change.expectedCleared +- src.core.schema.code-change.expectedHash +- src.core.schema.code-change.expectedId +- src.core.schema.code-change.expectedRemaining +- src.core.schema.code-change.id +- src.core.schema.code-change.ids +- src.core.schema.code-change.known +- src.core.schema.code-change.normalizedPath +- src.core.schema.code-change.plan +- src.core.schema.code-change.proposal +- src.core.schema.code-change.proposalIds +- src.core.schema.code-change.proposals +- src.core.schema.code-change.referencedConclusionIds +- src.core.schema.code-change.risk +- src.core.schema.code-change.semantic +- src.core.schema.code-change.target +- src.core.schema.code-change.targetPaths +- src.core.schema.conclusions.assertConclusion +- src.core.schema.conclusions.assertTodoProposal +- src.core.schema.conclusions.assertTodoProposalReferenceValue +- src.core.schema.conclusions.assertTodoProposals +- src.core.schema.conclusions.conclusion +- src.core.schema.conclusions.diagnostic +- src.core.schema.conclusions.diagnosticIds +- src.core.schema.conclusions.expectedId +- src.core.schema.conclusions.id +- src.core.schema.conclusions.ids +- src.core.schema.conclusions.known +- src.core.schema.conclusions.proposal +- src.core.schema.conclusions.proposalIds +- src.core.schema.conclusions.report +- src.core.schema.conclusions.target +- src.core.schema.constants.ACTIONS +- src.core.schema.constants.CODE_CHANGE_ACTIONS +- src.core.schema.constants.CODE_CHANGE_RISK_LEVELS +- src.core.schema.constants.CONCLUSION_KINDS +- src.core.schema.constants.DIAGNOSTIC_SEVERITIES +- src.core.schema.constants.EPISTEMIC_CLASSES +- src.core.schema.constants.GENERATION_EFFECTIVE_MODES +- src.core.schema.constants.GENERATION_REQUESTED_MODES +- src.core.schema.constants.LIFECYCLES +- src.core.schema.constants.MODALITIES +- src.core.schema.constants.POLARITIES +- src.core.schema.constants.RELATION_TYPES +- src.core.schema.constants.SOURCE_KINDS +- src.core.schema.constants.TODO_PRIORITIES +- src.core.schema.intent.assertIntentGraph +- src.core.schema.intent.assertIntentGraphDiff +- src.core.schema.intent.change +- src.core.schema.intent.diff +- src.core.schema.intent.epistemic +- src.core.schema.intent.expectedFingerprint +- src.core.schema.intent.expectedGenerator +- src.core.schema.intent.generation +- src.core.schema.intent.graph +- src.core.schema.intent.lifecycle +- src.core.schema.intent.lines +- src.core.schema.intent.metadata +- src.core.schema.intent.record +- src.core.schema.intent.recordId +- src.core.schema.intent.recordIds +- src.core.schema.intent.records +- src.core.schema.intent.relation +- src.core.schema.intent.relationIds +- src.core.schema.intent.relations +- src.core.schema.intent.separator +- src.core.schema.intent.source +- src.core.schema.intent.statement +- src.core.schema.intent.stats +- src.core.schema.intent.summary +- src.core.schema.intent.target +- src.core.schema.intent.typedMetadata +- src.core.schema.utils.actual +- src.core.schema.utils.assertAcyclicProposalDependencies +- src.core.schema.utils.assertGroundedGenerationMetadata +- src.core.schema.utils.byId +- src.core.schema.utils.confidence +- src.core.schema.utils.countMap +- src.core.schema.utils.countRecords +- src.core.schema.utils.exactCounts +- src.core.schema.utils.exactStringSet +- src.core.schema.utils.expectedSet +- src.core.schema.utils.extra +- src.core.schema.utils.generation +- src.core.schema.utils.isJsonValue +- src.core.schema.utils.key +- src.core.schema.utils.knownReferences +- src.core.schema.utils.missing +- src.core.schema.utils.nonEmptyString +- src.core.schema.utils.nonEmptyUniqueIdArray +- src.core.schema.utils.nonEmptyUniqueStringArray +- src.core.schema.utils.normalized +- src.core.schema.utils.nullableDate +- src.core.schema.utils.repositoryPath +- src.core.schema.utils.start +- src.core.schema.utils.unknown +- src.core.schema.utils.visited +- src.core.schema.utils.visiting - src.core.security.ancestorReal - src.core.security.assertPathWithinRoot - src.core.security.candidateAbsolute @@ -5170,10 +5711,12 @@ entry_points: - src.core.text.STOP_WORDS - src.core.text.aliased - src.core.text.backticks +- src.core.text.buildStopWords - src.core.text.camel - src.core.text.classifyActionHeuristically - src.core.text.cleaned - src.core.text.conventional +- src.core.text.conventionalAction - src.core.text.detectModality - src.core.text.detectPolarity - src.core.text.dot @@ -5186,6 +5729,7 @@ entry_points: - src.core.text.last - src.core.text.left - src.core.text.lines +- src.core.text.matchedByPattern - src.core.text.normalized - src.core.text.parts - src.core.text.pieces @@ -5206,27 +5750,31 @@ entry_points: - src.core.text.topicKeywords - src.core.text.value - src.core.text.values -- src.diff.git.BINARY_EXTENSIONS +- src.core.text.withoutAction +- src.diff.git-binary.BINARY_EXTENSIONS +- src.diff.git-binary.isProbablyBinary - src.diff.git.after +- src.diff.git.args - src.diff.git.before - src.diff.git.beforePath - src.diff.git.collectGitDiff - src.diff.git.diff -- src.diff.git.inside -- src.diff.git.maxFiles +- src.diff.git.diffs +- src.diff.git.normalized - src.diff.git.parts - src.diff.git.result -- src.diff.git.revision -- src.diff.git.root -- src.diff.git.staged +- src.diff.git.selected - src.diff.git.status +- src.diff.git.worktree - src.diff.reality.BADGE_CHAR - src.diff.reality.LABEL_CHAR - src.diff.reality.aligned - src.diff.reality.alignment - src.diff.reality.anchor - src.diff.reality.anchors +- src.diff.reality.body - src.diff.reality.bucket +- src.diff.reality.buildRealityRow - src.diff.reality.buildRealityView - src.diff.reality.bySeverity - src.diff.reality.bySize @@ -5234,6 +5782,7 @@ entry_points: - src.diff.reality.changelog - src.diff.reality.codes - src.diff.reality.color +- src.diff.reality.compareRealityRows - src.diff.reality.components - src.diff.reality.count - src.diff.reality.cx @@ -5243,8 +5792,10 @@ entry_points: - src.diff.reality.diagnosticsByRecord - src.diff.reality.documentedObservedTopics - src.diff.reality.fill +- src.diff.reality.footer - src.diff.reality.groups -- src.diff.reality.headerY +- src.diff.reality.header +- src.diff.reality.height - src.diff.reality.implementationAlignedTopics - src.diff.reality.index - src.diff.reality.isDeclared @@ -5253,19 +5804,21 @@ entry_points: - src.diff.reality.laneStep - src.diff.reality.laneX - src.diff.reality.lanes +- src.diff.reality.layout - src.diff.reality.maxRows - src.diff.reality.modulePaths - src.diff.reality.object - src.diff.reality.observed - src.diff.reality.observedRecords - src.diff.reality.observedTopics +- src.diff.reality.overflow - src.diff.reality.path - src.diff.reality.paths - src.diff.reality.pillWidth +- src.diff.reality.raw - src.diff.reality.renderRealityMarkdown - src.diff.reality.renderRealitySvg - src.diff.reality.resolved -- src.diff.reality.rowHeight - src.diff.reality.rows - src.diff.reality.separator - src.diff.reality.status @@ -5277,13 +5830,31 @@ entry_points: - src.diff.reality.title - src.diff.reality.value - src.diff.reality.visible -- src.diff.reality.width - src.diff.reality.y - src.diff.svg.metricCard - src.diff.svg.sanitizeSourceLine - src.diff.svg.svgDocument - src.diff.svg.theme - src.diff.svg.truncate +- src.diff.text-myers.afterEqualX +- src.diff.text-myers.afterEqualY +- src.diff.text-myers.diag +- src.diff.text-myers.k +- src.diff.text-myers.m +- src.diff.text-myers.myers +- src.diff.text-myers.n +- src.diff.text-myers.nextX +- src.diff.text-myers.nextY +- src.diff.text-myers.point +- src.diff.text-myers.previous +- src.diff.text-myers.previousK +- src.diff.text-myers.previousX +- src.diff.text-myers.previousY +- src.diff.text-myers.startX +- src.diff.text-myers.state +- src.diff.text-myers.v +- src.diff.text-myers.x +- src.diff.text-myers.y - src.diff.text-render.changed - src.diff.text-render.charWidth - src.diff.text-render.columnWidth @@ -5324,28 +5895,18 @@ entry_points: - src.diff.text.context - src.diff.text.diffText - src.diff.text.end -- src.diff.text.k - src.diff.text.last - src.diff.text.lines -- src.diff.text.m - src.diff.text.maxCompareLines - src.diff.text.middleAfter - src.diff.text.middleBefore - src.diff.text.middleOps -- src.diff.text.n - src.diff.text.normalized -- src.diff.text.offset - src.diff.text.prefix -- src.diff.text.previousK -- src.diff.text.previousX -- src.diff.text.previousY - src.diff.text.start - src.diff.text.suffix - src.diff.text.summarizeLines - src.diff.text.truncated -- src.diff.text.v -- src.diff.text.x -- src.diff.text.y - src.evaluation.gold-cases.actual - src.evaluation.gold-cases.augmented - src.evaluation.gold-cases.byClass @@ -5377,10 +5938,14 @@ entry_points: - src.evaluation.gold-cases.observed - src.evaluation.gold-cases.proposals - src.evaluation.gold-cases.record +- src.evaluation.gold-cases.recordId - src.evaluation.gold-cases.recordIds - src.evaluation.gold-cases.records - src.evaluation.gold-cases.report +- src.evaluation.gold-cases.requestedCandidates - src.evaluation.gold-cases.rerank +- src.evaluation.gold-cases.reranker +- src.evaluation.gold-cases.restricted - src.evaluation.gold-cases.validation - src.evaluation.gold-cli.arg - src.evaluation.gold-cli.args @@ -5410,8 +5975,9 @@ entry_points: - src.evaluation.gold-types.assertGoldDataset - src.evaluation.gold-types.channels - src.evaluation.gold-types.dataset -- src.evaluation.gold-types.labels -- src.evaluation.gold-types.modules +- src.evaluation.gold-types.decisions +- src.evaluation.gold-types.recordLabels +- src.evaluation.gold-types.seenModules - src.evaluation.gold.actual - src.evaluation.gold.byChannel - src.evaluation.gold.byClass @@ -5479,12 +6045,13 @@ entry_points: - src.extractors.ast.rust.helperPath - src.extractors.ast.typescript.callee - src.extractors.ast.typescript.capabilities +- src.extractors.ast.typescript.context - src.extractors.ast.typescript.declarationIsCallable - src.extractors.ast.typescript.extension - src.extractors.ast.typescript.extractTypeScriptFile -- src.extractors.ast.typescript.moduleCapabilities -- src.extractors.ast.typescript.relative -- src.extractors.ast.typescript.sourceFile +- src.extractors.ast.typescript.languageName +- src.extractors.ast.typescript.nodeExcerpt +- src.extractors.ast.typescript.sourceLineRange - src.extractors.ast.typescript.symbol - src.extractors.ast.typescript.symbolModifiers - src.extractors.ast.unsupported @@ -5507,55 +6074,86 @@ entry_points: - src.extractors.changelog.resolvedPaths - src.extractors.changelog.text - src.extractors.changelog.versionHeading -- src.extractors.communication.action -- src.extractors.communication.classified -- src.extractors.communication.cleaned +- src.extractors.communication-file-helpers.buildCommunicationSegments +- src.extractors.communication-file-helpers.buildLocalWarnings +- src.extractors.communication-file-helpers.collectCommunicationMetadata +- src.extractors.communication-file-helpers.declaredA2aAgentId +- src.extractors.communication-file-helpers.declaredGitAuthors +- src.extractors.communication-file-helpers.declaredParticipant +- src.extractors.communication-file-helpers.declaredParticipantId +- src.extractors.communication-file-helpers.declaredRole +- src.extractors.communication-file-helpers.displayName +- src.extractors.communication-file-helpers.envelope +- src.extractors.communication-file-helpers.explicitEnvelope +- src.extractors.communication-file-helpers.explicitMessageType +- src.extractors.communication-file-helpers.explicitPaths +- src.extractors.communication-file-helpers.explicitSymbols +- src.extractors.communication-file-helpers.extractCommunicationFile +- src.extractors.communication-file-helpers.extracted +- src.extractors.communication-file-helpers.gitAuthors +- src.extractors.communication-file-helpers.hasRegistryEntry +- src.extractors.communication-file-helpers.identity +- src.extractors.communication-file-helpers.inferred +- src.extractors.communication-file-helpers.inferredRole +- src.extractors.communication-file-helpers.localWarnings +- src.extractors.communication-file-helpers.messageType +- src.extractors.communication-file-helpers.participant +- src.extractors.communication-file-helpers.pathTicket +- src.extractors.communication-file-helpers.rawTimestamp +- src.extractors.communication-file-helpers.readCommunicationBody +- src.extractors.communication-file-helpers.readResult +- src.extractors.communication-file-helpers.recipient +- src.extractors.communication-file-helpers.records +- src.extractors.communication-file-helpers.relativeToProject +- src.extractors.communication-file-helpers.resolveFileScope +- src.extractors.communication-file-helpers.role +- src.extractors.communication-file-helpers.scope +- src.extractors.communication-file-helpers.segmentResult +- src.extractors.communication-file-helpers.segments +- src.extractors.communication-file-helpers.ticket +- src.extractors.communication-file-helpers.timestamp +- src.extractors.communication-helpers.action +- src.extractors.communication-helpers.buildCommunicationRecords +- src.extractors.communication-helpers.classified +- src.extractors.communication-helpers.cleaned +- src.extractors.communication-helpers.communicationSegments +- src.extractors.communication-helpers.end +- src.extractors.communication-helpers.fileParts +- src.extractors.communication-helpers.first +- src.extractors.communication-helpers.governance +- src.extractors.communication-helpers.governanceIdentity +- src.extractors.communication-helpers.heading +- src.extractors.communication-helpers.inferIdentity +- src.extractors.communication-helpers.isTicketEvidenceFile +- src.extractors.communication-helpers.item +- src.extractors.communication-helpers.line +- src.extractors.communication-helpers.lines +- src.extractors.communication-helpers.listValue +- src.extractors.communication-helpers.looksLikeTicket +- src.extractors.communication-helpers.nestedParticipant +- src.extractors.communication-helpers.nestedRole +- src.extractors.communication-helpers.nestedRoleIndex +- src.extractors.communication-helpers.normalizeRole +- src.extractors.communication-helpers.normalizeType +- src.extractors.communication-helpers.normalized +- src.extractors.communication-helpers.parseEnvelope +- src.extractors.communication-helpers.parsed +- src.extractors.communication-helpers.parts +- src.extractors.communication-helpers.raw +- src.extractors.communication-helpers.resolveIdentity +- src.extractors.communication-helpers.sameStrings +- src.extractors.communication-helpers.segmentType +- src.extractors.communication-helpers.semantics +- src.extractors.communication-helpers.semanticsFor +- src.extractors.communication-helpers.stripped +- src.extractors.communication-helpers.validTimestamp - src.extractors.communication.communicationFiles -- src.extractors.communication.declaredA2aAgentId -- src.extractors.communication.declaredGitAuthors -- src.extractors.communication.declaredParticipant -- src.extractors.communication.declaredParticipantId -- src.extractors.communication.declaredRole -- src.extractors.communication.displayName -- src.extractors.communication.end -- src.extractors.communication.envelope -- src.extractors.communication.explicitEnvelope -- src.extractors.communication.explicitMessageType -- src.extractors.communication.explicitPaths -- src.extractors.communication.explicitSymbols - src.extractors.communication.extractCommunicationIntent -- src.extractors.communication.fileParts +- src.extractors.communication.fileResult - src.extractors.communication.files -- src.extractors.communication.gitAuthors -- src.extractors.communication.governance -- src.extractors.communication.heading -- src.extractors.communication.identity - src.extractors.communication.identityRegistry -- src.extractors.communication.inferred -- src.extractors.communication.item -- src.extractors.communication.line -- src.extractors.communication.lines -- src.extractors.communication.messageType -- src.extractors.communication.nestedParticipant -- src.extractors.communication.nestedRole -- src.extractors.communication.nestedRoleIndex -- src.extractors.communication.normalized -- src.extractors.communication.parsed -- src.extractors.communication.participant -- src.extractors.communication.parts -- src.extractors.communication.pathTicket - src.extractors.communication.projectRoot -- src.extractors.communication.raw -- src.extractors.communication.recipient -- src.extractors.communication.relativeToProject -- src.extractors.communication.role - src.extractors.communication.root -- src.extractors.communication.segmentType -- src.extractors.communication.segments -- src.extractors.communication.semantics -- src.extractors.communication.stripped -- src.extractors.communication.ticket -- src.extractors.communication.timestamp - src.extractors.configuration.MAX_ENTRIES_PER_FILE - src.extractors.configuration.assignment - src.extractors.configuration.base @@ -5610,24 +6208,28 @@ entry_points: - src.extractors.docs-deterministic.block - src.extractors.docs-deterministic.body - src.extractors.docs-deterministic.bullet +- src.extractors.docs-deterministic.bulletRecord - src.extractors.docs-deterministic.cursor - src.extractors.docs-deterministic.extractDocumentationBaseline -- src.extractors.docs-deterministic.fenceMatch - src.extractors.docs-deterministic.hasCodeSpanIdentifier - src.extractors.docs-deterministic.heading +- src.extractors.docs-deterministic.headingRecord - src.extractors.docs-deterministic.language - src.extractors.docs-deterministic.level - src.extractors.docs-deterministic.line +- src.extractors.docs-deterministic.lineResult - src.extractors.docs-deterministic.lines - src.extractors.docs-deterministic.mapped - src.extractors.docs-deterministic.marker - src.extractors.docs-deterministic.paragraph +- src.extractors.docs-deterministic.paragraphResult - src.extractors.docs-deterministic.raw - src.extractors.docs-deterministic.record - src.extractors.docs-deterministic.relative - src.extractors.docs-deterministic.resolved - src.extractors.docs-deterministic.resolver - src.extractors.docs-deterministic.root +- src.extractors.docs-deterministic.sectionHeading - src.extractors.docs-deterministic.target - src.extractors.docs-deterministic.title - src.extractors.docs-llm.DocumentationLlmRequiredError.body @@ -5674,93 +6276,122 @@ entry_points: - src.extractors.docs-record.wanted - src.extractors.docs-schema.documentRecord - src.extractors.docs-schema.documentResponseSchema +- src.extractors.git.DISCOVERY_EXCLUDED_DIRECTORIES +- src.extractors.git.MAX_DISCOVERED_REPOSITORIES +- src.extractors.git.MAX_DISCOVERY_DIRECTORIES +- src.extractors.git.REPOSITORY_READ_CONCURRENCY - src.extractors.git.additions - src.extractors.git.changedFiles +- src.extractors.git.child - src.extractors.git.classified - src.extractors.git.commit - src.extractors.git.count +- src.extractors.git.current +- src.extractors.git.cursor - src.extractors.git.deletions - src.extractors.git.diff +- src.extractors.git.discovery - src.extractors.git.docOnly +- src.extractors.git.entries - src.extractors.git.extractGitIntent +- src.extractors.git.index - src.extractors.git.inferredSymbols -- src.extractors.git.inside - src.extractors.git.isDocumentationPath +- src.extractors.git.marker - src.extractors.git.message - src.extractors.git.output - src.extractors.git.parts +- src.extractors.git.prefix - src.extractors.git.result +- src.extractors.git.results - src.extractors.git.root +- src.extractors.git.scopedFiles +- src.extractors.git.state - src.extractors.git.stats - src.extractors.git.status - src.extractors.git.symbol +- src.extractors.git.value +- src.extractors.git.workers - src.extractors.markdown-block.cursor - src.extractors.markdown-block.line - src.extractors.markdown-block.readListBlock -- src.extractors.markdown-llm.MARKDOWN_LLM_BATCH_RECORDS -- src.extractors.markdown-llm.MarkdownAttemptError.completion -- src.extractors.markdown-llm.MarkdownAttemptError.enrichment -- src.extractors.markdown-llm.MarkdownAttemptError.expected -- src.extractors.markdown-llm.MarkdownAttemptError.failed -- src.extractors.markdown-llm.MarkdownAttemptError.half -- src.extractors.markdown-llm.MarkdownAttemptError.marked -- src.extractors.markdown-llm.MarkdownAttemptError.metadataByRecord -- src.extractors.markdown-llm.MarkdownAttemptError.output -- src.extractors.markdown-llm.MarkdownAttemptError.promptPath -- src.extractors.markdown-llm.MarkdownAttemptError.promptRecord -- src.extractors.markdown-llm.MarkdownAttemptError.super -- src.extractors.markdown-llm.MarkdownAttemptError.uncovered -- src.extractors.markdown-llm.MarkdownAttemptError.validateEnrichments +- src.extractors.markdown-llm-helpers.MARKDOWN_LLM_BATCH_RECORDS +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.completion +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.corrected +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichRecord +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichments +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.expected +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.failed +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.half +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.markDeterministic +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.marked +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.metadata +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.metadataByRecord +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.output +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.promptPath +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.promptRecord +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.readPrompt +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.responseByRecord +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.stageAudit +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.super +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.uncovered +- src.extractors.markdown-llm-helpers.MarkdownAttemptError.validateEnrichments - src.extractors.markdown-llm.MarkdownLlmRequiredError.client -- src.extractors.markdown-llm.MarkdownLlmRequiredError.corrected - src.extractors.markdown-llm.MarkdownLlmRequiredError.deterministic -- src.extractors.markdown-llm.MarkdownLlmRequiredError.enrichments - src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited - src.extractors.markdown-llm.MarkdownLlmRequiredError.failed - src.extractors.markdown-llm.MarkdownLlmRequiredError.failedResponses - src.extractors.markdown-llm.MarkdownLlmRequiredError.failure -- src.extractors.markdown-llm.MarkdownLlmRequiredError.outcomes - src.extractors.markdown-llm.MarkdownLlmRequiredError.prompt -- src.extractors.markdown-llm.MarkdownLlmRequiredError.responseByRecord - src.extractors.markdown-llm.MarkdownLlmRequiredError.startedAt - src.extractors.markdown-llm.MarkdownLlmRequiredError.super - src.extractors.markdown-paths.MAX_INDEXED_FILES - src.extractors.markdown-paths.PATH_SEARCH_EXCLUDES - src.extractors.markdown-paths.absolute -- src.extractors.markdown-paths.base - src.extractors.markdown-paths.candidate - src.extractors.markdown-paths.createMarkdownPathResolver - src.extractors.markdown-paths.directory +- src.extractors.markdown-paths.entries - src.extractors.markdown-paths.headingDirectories - src.extractors.markdown-paths.index - src.extractors.markdown-paths.matches - src.extractors.markdown-paths.normalized - src.extractors.markdown-paths.repositoryRoot -- src.extractors.markdown-paths.seen +- src.extractors.markdown-paths.state - src.extractors.markdown.changelog - src.extractors.markdown.extractMarkdownIntent - src.extractors.markdown.pathResolver - src.extractors.markdown.todo -- src.extractors.nl-llm.NlAttemptError.NL_RECORD_CONTRACT -- src.extractors.nl-llm.NlAttemptError.NL_RESPONSE_CONTRACT -- src.extractors.nl-llm.NlAttemptError.OBJECT_PLACEHOLDERS -- src.extractors.nl-llm.NlAttemptError.action -- src.extractors.nl-llm.NlAttemptError.completion -- src.extractors.nl-llm.NlAttemptError.deterministic -- src.extractors.nl-llm.NlAttemptError.end -- src.extractors.nl-llm.NlAttemptError.excerpt -- src.extractors.nl-llm.NlAttemptError.failedAudit -- src.extractors.nl-llm.NlAttemptError.lines -- src.extractors.nl-llm.NlAttemptError.normalizedText -- src.extractors.nl-llm.NlAttemptError.promptPath -- src.extractors.nl-llm.NlAttemptError.start -- src.extractors.nl-llm.NlAttemptError.statementText -- src.extractors.nl-llm.NlAttemptError.super -- src.extractors.nl-llm.NlAttemptError.text +- src.extractors.nl-llm-helpers.NlAttemptError.NL_ACTION_SET +- src.extractors.nl-llm-helpers.NlAttemptError.NL_MODALITY_SET +- src.extractors.nl-llm-helpers.NlAttemptError.NL_RECORD_CONTRACT +- src.extractors.nl-llm-helpers.NlAttemptError.NL_RESPONSE_CONTRACT +- src.extractors.nl-llm-helpers.NlAttemptError.OBJECT_PLACEHOLDERS +- src.extractors.nl-llm-helpers.NlAttemptError.action +- src.extractors.nl-llm-helpers.NlAttemptError.completion +- src.extractors.nl-llm-helpers.NlAttemptError.end +- src.extractors.nl-llm-helpers.NlAttemptError.extractNlWithCorrection +- src.extractors.nl-llm-helpers.NlAttemptError.fallback +- src.extractors.nl-llm-helpers.NlAttemptError.lines +- src.extractors.nl-llm-helpers.NlAttemptError.markDeterministicNlRecords +- src.extractors.nl-llm-helpers.NlAttemptError.nlStageAudit +- src.extractors.nl-llm-helpers.NlAttemptError.normalizedText +- src.extractors.nl-llm-helpers.NlAttemptError.promptPath +- src.extractors.nl-llm-helpers.NlAttemptError.readPrompt +- src.extractors.nl-llm-helpers.NlAttemptError.start +- src.extractors.nl-llm-helpers.NlAttemptError.statementText +- src.extractors.nl-llm-helpers.NlAttemptError.super +- src.extractors.nl-llm-helpers.NlAttemptError.text +- src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord - src.extractors.nl-llm.NlLlmRequiredError.absolute - src.extractors.nl-llm.NlLlmRequiredError.body - src.extractors.nl-llm.NlLlmRequiredError.client +- src.extractors.nl-llm.NlLlmRequiredError.deterministic - src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited +- src.extractors.nl-llm.NlLlmRequiredError.failedAudit - src.extractors.nl-llm.NlLlmRequiredError.failure - src.extractors.nl-llm.NlLlmRequiredError.maxLine - src.extractors.nl-llm.NlLlmRequiredError.prompt @@ -5780,6 +6411,27 @@ entry_points: - src.extractors.nl.missing - src.extractors.nl.object - src.extractors.nl.sourcePath +- src.extractors.runtime-cycle.MAX_PER_SECTION +- src.extractors.runtime-cycle.body +- src.extractors.runtime-cycle.cycle +- src.extractors.runtime-cycle.cyclePath +- src.extractors.runtime-cycle.declared +- src.extractors.runtime-cycle.detail +- src.extractors.runtime-cycle.error +- src.extractors.runtime-cycle.extractRuntimeCycleIntent +- src.extractors.runtime-cycle.fact +- src.extractors.runtime-cycle.failed +- src.extractors.runtime-cycle.host +- src.extractors.runtime-cycle.id +- src.extractors.runtime-cycle.kind +- src.extractors.runtime-cycle.objects +- src.extractors.runtime-cycle.observedAt +- src.extractors.runtime-cycle.outcome +- src.extractors.runtime-cycle.probe +- src.extractors.runtime-cycle.relative +- src.extractors.runtime-cycle.results +- src.extractors.runtime-cycle.root +- src.extractors.runtime-cycle.sourcePath - src.extractors.todo.absolute - src.extractors.todo.action - src.extractors.todo.block @@ -5815,26 +6467,31 @@ entry_points: - src.graph.changelog-signal.segments - src.graph.changelog-signal.text - src.graph.diagnostics.actions +- src.graph.diagnostics.ambiguous - src.graph.diagnostics.basis +- src.graph.diagnostics.changelog +- src.graph.diagnostics.context - src.graph.diagnostics.detail - src.graph.diagnostics.diagnoseGraph -- src.graph.diagnostics.documentedPaths -- src.graph.diagnostics.evidenced - src.graph.diagnostics.grounded -- src.graph.diagnostics.groundedImplementation +- src.graph.diagnostics.hasDocumentedTargetEvidence - src.graph.diagnostics.hasLocationOnlyEvidence -- src.graph.diagnostics.implementedPaths +- src.graph.diagnostics.isEvidence - src.graph.diagnostics.left +- src.graph.diagnostics.lowConfidence - src.graph.diagnostics.missingFields - src.graph.diagnostics.neighbors +- src.graph.diagnostics.notDocumented +- src.graph.diagnostics.notPlanned - src.graph.diagnostics.paths +- src.graph.diagnostics.planned - src.graph.diagnostics.recordsById - src.graph.diagnostics.related - src.graph.diagnostics.right - src.graph.diagnostics.score - src.graph.diagnostics.symbol - src.graph.diagnostics.symbolIssues -- src.graph.diagnostics.symbolResolutionIndex +- src.graph.diagnostics.unlinked - src.graph.diff.afterById - src.graph.diff.afterGroups - src.graph.diff.afterRecord @@ -5862,52 +6519,60 @@ entry_points: - src.graph.diff.visibleRows - src.graph.diff.width - src.graph.diff.y -- src.graph.linker.astId -- src.graph.linker.astIds +- src.graph.linker-candidates.astId +- src.graph.linker-candidates.astIds +- src.graph.linker-candidates.buckets +- src.graph.linker-candidates.collectCandidatePairs +- src.graph.linker-candidates.configurationIds +- src.graph.linker-candidates.declarationAstIds +- src.graph.linker-candidates.indexKeywords +- src.graph.linker-candidates.leftAst +- src.graph.linker-candidates.leftId +- src.graph.linker-candidates.moduleAstIds +- src.graph.linker-candidates.output +- src.graph.linker-candidates.rightAst +- src.graph.linker-candidates.rightId +- src.graph.linker-candidates.values +- src.graph.linker-relations.determineRelation +- src.graph.linker-relations.relation +- src.graph.linker-relations.sourceRelation +- src.graph.linker-relations.textScore - src.graph.linker.basename -- src.graph.linker.buckets - src.graph.linker.byId - src.graph.linker.candidatePairs - src.graph.linker.capabilityOverlap -- src.graph.linker.configurationIds -- src.graph.linker.declarationAstIds - src.graph.linker.directed - src.graph.linker.evidence - src.graph.linker.existing - src.graph.linker.full +- src.graph.linker.hasResolvedSymbol +- src.graph.linker.hasSharedAlias - src.graph.linker.intersection - src.graph.linker.key - src.graph.linker.keywordIndex - src.graph.linker.left -- src.graph.linker.leftAst -- src.graph.linker.leftId - src.graph.linker.leftKeywords - src.graph.linker.leftSet - src.graph.linker.linkIntentRecords -- src.graph.linker.moduleAstIds - src.graph.linker.normalized - src.graph.linker.objectSimilarity - src.graph.linker.output - src.graph.linker.owners - src.graph.linker.paths +- src.graph.linker.points - src.graph.linker.records -- src.graph.linker.relation - src.graph.linker.resolvableBasenames -- src.graph.linker.resolvedNlAstSymbol - src.graph.linker.right -- src.graph.linker.rightAst -- src.graph.linker.rightId - src.graph.linker.rightKeywords - src.graph.linker.score - src.graph.linker.sharedTopics - src.graph.linker.size -- src.graph.linker.sourceRelation - src.graph.linker.symbolResolutionIndex -- src.graph.linker.textScore - src.graph.symbol-resolution.ast - src.graph.symbol-resolution.buildSymbolResolutionIndex - src.graph.symbol-resolution.byAlias - src.graph.symbol-resolution.byNlRecord +- src.graph.symbol-resolution.candidate - src.graph.symbol-resolution.candidatePath - src.graph.symbol-resolution.hasResolvedNlAstSymbolPair - src.graph.symbol-resolution.matched @@ -5919,52 +6584,58 @@ entry_points: - src.interfaces.a2a-card.payload - src.interfaces.a2a-card.sendAgentCard - src.interfaces.a2a-card.serialized -- src.interfaces.a2a-history.absolute -- src.interfaces.a2a-history.filePath -- src.interfaces.a2a-history.files +- src.interfaces.a2a-history.entries - src.interfaces.a2a-history.graphPath -- src.interfaces.a2a-history.issues - src.interfaces.a2a-history.items - src.interfaces.a2a-history.listIntentRuns -- src.interfaces.a2a-history.llm - src.interfaces.a2a-history.manifest - src.interfaces.a2a-history.manifestPath - src.interfaces.a2a-history.participant -- src.interfaces.a2a-history.participantSummary -- src.interfaces.a2a-history.participants - src.interfaces.a2a-history.role - src.interfaces.a2a-history.runDirectory - src.interfaces.a2a-history.runsDirectory -- src.interfaces.a2a-history.runtime - src.interfaces.a2a-history.severity - src.interfaces.a2a-history.ticket -- src.interfaces.a2a-history.value -- src.interfaces.a2a-history.warnings -- src.interfaces.a2a-message.action +- src.interfaces.a2a-message-command.action +- src.interfaces.a2a-message-command.first +- src.interfaces.a2a-message-command.key +- src.interfaces.a2a-message-command.nested +- src.interfaces.a2a-message-command.normalized +- src.interfaces.a2a-message-command.objectCommand +- src.interfaces.a2a-message-command.objectData +- src.interfaces.a2a-message-command.parseCommand +- src.interfaces.a2a-message-command.protobuf +- src.interfaces.a2a-message-command.protobufCommand +- src.interfaces.a2a-message-command.raw +- src.interfaces.a2a-message-command.stringValue +- src.interfaces.a2a-message-command.text - src.interfaces.a2a-message.clonePart - src.interfaces.a2a-message.content - src.interfaces.a2a-message.contextId - src.interfaces.a2a-message.ensureSupportedMessageContent - src.interfaces.a2a-message.extensions -- src.interfaces.a2a-message.first -- src.interfaces.a2a-message.key - src.interfaces.a2a-message.messageId - src.interfaces.a2a-message.metadata -- src.interfaces.a2a-message.nested - src.interfaces.a2a-message.normalizeUserMessage -- src.interfaces.a2a-message.normalized -- src.interfaces.a2a-message.objectData - src.interfaces.a2a-message.output -- src.interfaces.a2a-message.parseCommand - src.interfaces.a2a-message.parseMessage - src.interfaces.a2a-message.parseSendConfiguration - src.interfaces.a2a-message.qualifier -- src.interfaces.a2a-message.raw - src.interfaces.a2a-message.referenceTaskIds -- src.interfaces.a2a-message.stringValue - src.interfaces.a2a-message.supported - src.interfaces.a2a-message.taskId -- src.interfaces.a2a-message.text +- src.interfaces.a2a-run-list-item.absolute +- src.interfaces.a2a-run-list-item.filePath +- src.interfaces.a2a-run-list-item.files +- src.interfaces.a2a-run-list-item.issues +- src.interfaces.a2a-run-list-item.llm +- src.interfaces.a2a-run-list-item.participantSummary +- src.interfaces.a2a-run-list-item.participants +- src.interfaces.a2a-run-list-item.runListItem +- src.interfaces.a2a-run-list-item.runtime +- src.interfaces.a2a-run-list-item.safePath +- src.interfaces.a2a-run-list-item.value +- src.interfaces.a2a-run-list-item.warnings - src.interfaces.a2a-task-store.cloneArtifact - src.interfaces.a2a-task-store.command - src.interfaces.a2a-task-store.compareTasksByUpdate @@ -5973,6 +6644,8 @@ entry_points: - src.interfaces.a2a-task-store.cursorTime - src.interfaces.a2a-task-store.deadline - src.interfaces.a2a-task-store.decoded +- src.interfaces.a2a-task-store.diagnostic +- src.interfaces.a2a-task-store.domainResult - src.interfaces.a2a-task-store.effectiveHistoryLength - src.interfaces.a2a-task-store.exact - src.interfaces.a2a-task-store.existing @@ -5989,10 +6662,12 @@ entry_points: - src.interfaces.a2a-task-store.messageTaskIndex - src.interfaces.a2a-task-store.next - src.interfaces.a2a-task-store.page +- src.interfaces.a2a-task-store.pageCursor - src.interfaces.a2a-task-store.pageSize -- src.interfaces.a2a-task-store.pageToken - src.interfaces.a2a-task-store.params - src.interfaces.a2a-task-store.prepared +- src.interfaces.a2a-task-store.protobuf +- src.interfaces.a2a-task-store.record - src.interfaces.a2a-task-store.restored - src.interfaces.a2a-task-store.result - src.interfaces.a2a-task-store.sendConfiguration @@ -6040,6 +6715,18 @@ entry_points: - src.interfaces.a2a.status - src.interfaces.a2a.stringMetadata - src.interfaces.a2a.url +- src.interfaces.a2a.value +- src.interfaces.intake-actions.envelope +- src.interfaces.intake-actions.envelopeInput +- src.interfaces.intake-actions.executeIntakeAction +- src.interfaces.intake-actions.operation +- src.interfaces.intake-actions.projectDir +- src.interfaces.intake-actions.requestedRoot +- src.interfaces.intake-actions.result +- src.interfaces.intake-actions.root +- src.interfaces.intake-actions.service +- src.interfaces.intake-actions.supplied +- src.interfaces.intake_cli.main - src.interfaces.mcp-errors.McpRequestError.normalizeMcpError - src.interfaces.mcp-errors.McpRequestError.super - src.interfaces.mcp-resources.filePath @@ -6126,17 +6813,24 @@ entry_points: - src.llm.failure.classifyLlmFailure - src.llm.failure.message - src.llm.failure.rejectedLlmResponseMetadata -- src.llm.openrouter.OpenRouterClient.abortFromExternal -- src.llm.openrouter.OpenRouterClient.apiKey -- src.llm.openrouter.OpenRouterClient.availableModels +- src.llm.openrouter-request.abortFromExternal +- src.llm.openrouter-request.availableModels +- src.llm.openrouter-request.controller +- src.llm.openrouter-request.error +- src.llm.openrouter-request.listErrorMessage +- src.llm.openrouter-request.message +- src.llm.openrouter-request.parsed +- src.llm.openrouter-request.requestOpenRouter +- src.llm.openrouter-request.resolution +- src.llm.openrouter-request.response +- src.llm.openrouter-request.shouldRetryRequestWithoutSchema +- src.llm.openrouter-request.timeout - src.llm.openrouter.OpenRouterClient.chatJson - src.llm.openrouter.OpenRouterClient.chatJsonWithMetadata -- src.llm.openrouter.OpenRouterClient.chatText - src.llm.openrouter.OpenRouterClient.content - src.llm.openrouter.OpenRouterClient.controller +- src.llm.openrouter.OpenRouterClient.createModelError - src.llm.openrouter.OpenRouterClient.end -- src.llm.openrouter.OpenRouterClient.error -- src.llm.openrouter.OpenRouterClient.externalSignal - src.llm.openrouter.OpenRouterClient.fallback - src.llm.openrouter.OpenRouterClient.isConfigured - src.llm.openrouter.OpenRouterClient.message @@ -6199,6 +6893,7 @@ entry_points: - src.operations.validation.assertOperationPlan - src.operations.validation.assertVariableContract - src.operations.validation.byId +- src.operations.validation.castPlan - src.operations.validation.contract - src.operations.validation.coveredSteps - src.operations.validation.decision @@ -6206,8 +6901,10 @@ entry_points: - src.operations.validation.expectation - src.operations.validation.expectationIds - src.operations.validation.expectedHash +- src.operations.validation.expectedId - src.operations.validation.founderDecisionRequired - src.operations.validation.generation +- src.operations.validation.hasCommandStep - src.operations.validation.ids - src.operations.validation.parameters - src.operations.validation.plan @@ -6227,60 +6924,78 @@ entry_points: - src.operations.validation.visited - src.operations.validation.visiting - src.operations.validation.writers +- src.pipeline.run-helpers.appendLlmNotConfigured +- src.pipeline.run-helpers.codeChangePlans +- src.pipeline.run-helpers.codeChangeReview +- src.pipeline.run-helpers.codeChangeSourcePatches +- src.pipeline.run-helpers.collectCommunicationAnalysis +- src.pipeline.run-helpers.collectTargetHints +- src.pipeline.run-helpers.collectTaskSynthesis +- src.pipeline.run-helpers.communication +- src.pipeline.run-helpers.communicationStartedAt +- src.pipeline.run-helpers.createCodeChangeArtifacts +- src.pipeline.run-helpers.foundMissingDirectory +- src.pipeline.run-helpers.includeCommunication +- src.pipeline.run-helpers.missingDirectory +- src.pipeline.run-helpers.taskSynthesisAudit +- src.pipeline.run-helpers.taskSynthesisMode +- src.pipeline.run-helpers.todoContent +- src.pipeline.run-persistence.codeChangePlansPath +- src.pipeline.run-persistence.codeChangeReviewAuditPath +- src.pipeline.run-persistence.codeChangeReviewPath +- src.pipeline.run-persistence.codeChangeSourcePatchesPath +- src.pipeline.run-persistence.communicationAnalysisPath +- src.pipeline.run-persistence.communicationMarkdownPath +- src.pipeline.run-persistence.diagnosticsPath +- src.pipeline.run-persistence.filePath +- src.pipeline.run-persistence.graphPath +- src.pipeline.run-persistence.knownAudit +- src.pipeline.run-persistence.makePipelineManifest +- src.pipeline.run-persistence.message +- src.pipeline.run-persistence.persistFailedRun +- src.pipeline.run-persistence.persistPipelineArtifacts +- src.pipeline.run-persistence.reason +- src.pipeline.run-persistence.summaryConclusionsPath +- src.pipeline.run-persistence.summaryPath +- src.pipeline.run-persistence.taskSynthesisPath +- src.pipeline.run-persistence.todoPatchAuditPath +- src.pipeline.run-persistence.todoPatchPath +- src.pipeline.run-persistence.todoValidationPath +- src.pipeline.run-summary.collectSummary +- src.pipeline.run-summary.includeSummaryLlm +- src.pipeline.run-summary.summary +- src.pipeline.run-summary.summaryStartedAt - src.pipeline.run.allRecords - src.pipeline.run.ast - src.pipeline.run.baseOutput -- src.pipeline.run.codeChangePlans -- src.pipeline.run.codeChangePlansPath -- src.pipeline.run.codeChangeReview -- src.pipeline.run.codeChangeReviewAuditPath -- src.pipeline.run.codeChangeReviewPath -- src.pipeline.run.codeChangeSourcePatches -- src.pipeline.run.codeChangeSourcePatchesPath -- src.pipeline.run.communication - src.pipeline.run.communicationAnalysis -- src.pipeline.run.communicationAnalysisPath - src.pipeline.run.communicationAudit -- src.pipeline.run.communicationInputPresent -- src.pipeline.run.communicationMarkdownPath -- src.pipeline.run.communicationStartedAt -- src.pipeline.run.configuration +- src.pipeline.run.communicationInput +- src.pipeline.run.communicationSyntheses - src.pipeline.run.configurationExtraction +- src.pipeline.run.context - src.pipeline.run.deterministicDocs - src.pipeline.run.deterministicDocumentFiles - src.pipeline.run.diagnostics -- src.pipeline.run.diagnosticsPath - src.pipeline.run.docs - src.pipeline.run.documentationStartedAt -- src.pipeline.run.filePath +- src.pipeline.run.execution - src.pipeline.run.generatedAt - src.pipeline.run.git - src.pipeline.run.graph -- src.pipeline.run.graphPath -- src.pipeline.run.includeCommunication -- src.pipeline.run.includeSummaryLlm -- src.pipeline.run.knownAudit +- src.pipeline.run.manifest +- src.pipeline.run.manifestPath - src.pipeline.run.markdown -- src.pipeline.run.message -- src.pipeline.run.missingDirectory +- src.pipeline.run.markdownAudit - src.pipeline.run.naturalLanguageAudit -- src.pipeline.run.reason +- src.pipeline.run.persisted - src.pipeline.run.result - src.pipeline.run.root - src.pipeline.run.runDirectory - src.pipeline.run.runId - src.pipeline.run.runPipeline -- src.pipeline.run.summary -- src.pipeline.run.summaryConclusionsPath -- src.pipeline.run.summaryPath -- src.pipeline.run.summaryStartedAt -- src.pipeline.run.taskSynthesisAudit -- src.pipeline.run.taskSynthesisMode -- src.pipeline.run.taskSynthesisPath -- src.pipeline.run.todoContent -- src.pipeline.run.todoPatchAuditPath -- src.pipeline.run.todoPatchPath -- src.pipeline.run.todoValidationPath +- src.pipeline.run.runtime +- src.pipeline.run.taskSynthesis - src.sdk.typescript.Todo2CodeClient.a2a - src.sdk.typescript.Todo2CodeClient.applySourcePatch - src.sdk.typescript.Todo2CodeClient.applyTodo @@ -6297,6 +7012,9 @@ entry_points: - src.sdk.typescript.Todo2CodeClient.renderCodeChange - src.sdk.typescript.Todo2CodeClient.renderTodo - src.sdk.typescript.Todo2CodeClient.run +- src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankerResponse +- src.semantic.reranker-llm.SemanticRerankerRequiredError.assertTrackedSnapshot +- src.semantic.reranker-llm.SemanticRerankerRequiredError.cached - src.semantic.reranker-llm.SemanticRerankerRequiredError.client - src.semantic.reranker-llm.SemanticRerankerRequiredError.execFileAsync - src.semantic.reranker-llm.SemanticRerankerRequiredError.head @@ -6321,29 +7039,39 @@ entry_points: - src.semantic.reranker-response.SEMANTIC_RERANK_RESPONSE_SCHEMA - src.semantic.reranker-response.assertSemanticRerankerResponse - src.semantic.reranker-response.response -- src.semantic.reranker.acceptedDeclarations -- src.semantic.reranker.added -- src.semantic.reranker.allowed -- src.semantic.reranker.applyAcceptedSemanticRelations -- src.semantic.reranker.byDeclaration -- src.semantic.reranker.candidate -- src.semantic.reranker.candidates -- src.semantic.reranker.citations -- src.semantic.reranker.comparePair -- src.semantic.reranker.createSemanticCandidateSet -- src.semantic.reranker.createSemanticRerankResult -- src.semantic.reranker.decisions -- src.semantic.reranker.declaration -- src.semantic.reranker.expectedHash -- src.semantic.reranker.grouped -- src.semantic.reranker.module -- src.semantic.reranker.quote -- src.semantic.reranker.reasons -- src.semantic.reranker.record -- src.semantic.reranker.records -- src.semantic.reranker.seenDecisions -- src.semantic.reranker.seenIds -- src.semantic.reranker.seenPairs +- src.semantic.reranker.candidate.comparePair +- src.semantic.reranker.candidate.createSemanticCandidateSet +- src.semantic.reranker.candidate.declaration +- src.semantic.reranker.candidate.existing +- src.semantic.reranker.candidate.expectedHash +- src.semantic.reranker.candidate.grouped +- src.semantic.reranker.candidate.module +- src.semantic.reranker.candidate.state +- src.semantic.reranker.candidate.values +- src.semantic.reranker.result.acceptedDeclarations +- src.semantic.reranker.result.added +- src.semantic.reranker.result.allowedReasons +- src.semantic.reranker.result.allowedVerdicts +- src.semantic.reranker.result.applyAcceptedSemanticRelations +- src.semantic.reranker.result.assertSemanticVerdictReason +- src.semantic.reranker.result.candidate +- src.semantic.reranker.result.candidates +- src.semantic.reranker.result.citations +- src.semantic.reranker.result.createSemanticRerankResult +- src.semantic.reranker.result.decisions +- src.semantic.reranker.result.expectedHash +- src.semantic.reranker.result.record +- src.semantic.reranker.result.seenDecisions +- src.semantic.reranker.validation.allowedReasons +- src.semantic.reranker.validation.allowedVerdicts +- src.semantic.reranker.validation.assertGroundedQuote +- src.semantic.reranker.validation.boundedScore +- src.semantic.reranker.validation.quote +- src.semantic.reranker.validation.roundedConfidence +- src.semantic.reranker.validation.validDate +- src.semantic.reranker.validation.validateGeneration +- src.semantic.reranker.validation.validateRetrieval +- src.semantic.reranker.validation.validateVerdictReason - src.services.actions.after - src.services.actions.afterDiagnostics - src.services.actions.afterGraph @@ -6361,10 +7089,35 @@ entry_points: - src.services.actions.diagnostics - src.services.actions.diff - src.services.actions.executeAction +- src.services.actions.executeAnalyzeCommunicationAction +- src.services.actions.executeApplySourcePatchAction +- src.services.actions.executeApplyTodoAction +- src.services.actions.executeCloseCodeChangeAction +- src.services.actions.executeCompareWorkspaceAction +- src.services.actions.executeDiagnoseAction +- src.services.actions.executeDiffAction +- src.services.actions.executeDiffFilesAction +- src.services.actions.executeDiffGitAction +- src.services.actions.executeEvaluateCodeChangeAction +- src.services.actions.executeExtractAstAction +- src.services.actions.executeExtractCommunicationAction +- src.services.actions.executeExtractConfigAction +- src.services.actions.executeExtractDocsAction +- src.services.actions.executeExtractGitAction +- src.services.actions.executeExtractMarkdownAction +- src.services.actions.executeExtractNlAction +- src.services.actions.executeLinkAction +- src.services.actions.executePipelineAction +- src.services.actions.executeProposeCodeChangeAction +- src.services.actions.executeProposeSourcePatchAction +- src.services.actions.executeProposeTodoAction +- src.services.actions.executeRealityAction +- src.services.actions.executeRenderCodeChangeAction +- src.services.actions.executeRenderTodoAction +- src.services.actions.executeSummarizeAction - src.services.actions.file - src.services.actions.files - src.services.actions.graph -- src.services.actions.isCommunication - src.services.actions.manifest - src.services.actions.manifestPath - src.services.actions.number @@ -6448,96 +7201,154 @@ entry_points: - src.synthesis.code-change-path.lowerSegments - src.synthesis.code-change-path.normalized - src.synthesis.code-change-path.segments -- src.synthesis.code-change-plan.IMPLEMENTATION_DIAGNOSTIC_CODES -- src.synthesis.code-change-plan.absolute -- src.synthesis.code-change-plan.acceptances -- src.synthesis.code-change-plan.accepted -- src.synthesis.code-change-plan.acceptedCount -- src.synthesis.code-change-plan.actual -- src.synthesis.code-change-plan.after -- src.synthesis.code-change-plan.afterById -- src.synthesis.code-change-plan.afterDiagnostics -- src.synthesis.code-change-plan.allowed -- src.synthesis.code-change-plan.applyCodeChangeSourcePatch -- src.synthesis.code-change-plan.artifact -- src.synthesis.code-change-plan.bare -- src.synthesis.code-change-plan.base -- src.synthesis.code-change-plan.baseLines -- src.synthesis.code-change-plan.before -- src.synthesis.code-change-plan.beforeIds -- src.synthesis.code-change-plan.body -- src.synthesis.code-change-plan.candidates -- src.synthesis.code-change-plan.changes -- src.synthesis.code-change-plan.clearedDiagnosticIds -- src.synthesis.code-change-plan.closeCodeChanges -- src.synthesis.code-change-plan.conclusions -- src.synthesis.code-change-plan.conclusionsByDiagnostic -- src.synthesis.code-change-plan.createCodeChangeReviewPatch -- src.synthesis.code-change-plan.createCodeChangeSourcePatchSet -- src.synthesis.code-change-plan.createRepositoryPathProbe -- src.synthesis.code-change-plan.createdAt -- src.synthesis.code-change-plan.criteria -- src.synthesis.code-change-plan.current -- src.synthesis.code-change-plan.cursor -- src.synthesis.code-change-plan.diffLines -- src.synthesis.code-change-plan.diffs -- src.synthesis.code-change-plan.editPath -- src.synthesis.code-change-plan.evaluatedAt -- src.synthesis.code-change-plan.existing -- src.synthesis.code-change-plan.exists -- src.synthesis.code-change-plan.expectedChanges -- src.synthesis.code-change-plan.expectedHash -- src.synthesis.code-change-plan.expectedPaths -- src.synthesis.code-change-plan.fileHashesAfter -- src.synthesis.code-change-plan.generatedAt -- src.synthesis.code-change-plan.generation -- src.synthesis.code-change-plan.graphFingerprint -- src.synthesis.code-change-plan.hashPaths -- src.synthesis.code-change-plan.index -- src.synthesis.code-change-plan.level -- src.synthesis.code-change-plan.lines -- src.synthesis.code-change-plan.mark -- src.synthesis.code-change-plan.markdown -- src.synthesis.code-change-plan.matchingConclusions -- src.synthesis.code-change-plan.matchingProposals -- src.synthesis.code-change-plan.maxPlans -- src.synthesis.code-change-plan.newBlockingDiagnosticIds -- src.synthesis.code-change-plan.newCount -- src.synthesis.code-change-plan.normalized -- src.synthesis.code-change-plan.normalizedDiff -- src.synthesis.code-change-plan.now -- src.synthesis.code-change-plan.object -- src.synthesis.code-change-plan.oldCount -- src.synthesis.code-change-plan.oldIndex -- src.synthesis.code-change-plan.patch -- src.synthesis.code-change-plan.patchHash -- src.synthesis.code-change-plan.patchIds -- src.synthesis.code-change-plan.path -- src.synthesis.code-change-plan.paths -- src.synthesis.code-change-plan.plan -- src.synthesis.code-change-plan.planHash -- src.synthesis.code-change-plan.planIds -- src.synthesis.code-change-plan.plansById -- src.synthesis.code-change-plan.proposals -- src.synthesis.code-change-plan.proposalsByDiagnostic -- src.synthesis.code-change-plan.proposeCodeChangePlans -- src.synthesis.code-change-plan.rationale -- src.synthesis.code-change-plan.rawDiff -- src.synthesis.code-change-plan.receiptPath -- src.synthesis.code-change-plan.record -- src.synthesis.code-change-plan.recordsById -- src.synthesis.code-change-plan.relatedRecords -- src.synthesis.code-change-plan.relative -- src.synthesis.code-change-plan.remainingDiagnosticIds -- src.synthesis.code-change-plan.root -- src.synthesis.code-change-plan.sourceIntents -- src.synthesis.code-change-plan.stripped -- src.synthesis.code-change-plan.symbols -- src.synthesis.code-change-plan.target -- src.synthesis.code-change-plan.targeted -- src.synthesis.code-change-plan.tickets -- src.synthesis.code-change-plan.unifiedDiff -- src.synthesis.code-change-plan.versions +- src.synthesis.code-change-plan.implementation-diagnostics.collectImplementationDiagnostics +- src.synthesis.code-change-plan.implementation-helpers-acceptance.acceptance +- src.synthesis.code-change-plan.implementation-helpers-acceptance.accepted +- src.synthesis.code-change-plan.implementation-helpers-acceptance.afterById +- src.synthesis.code-change-plan.implementation-helpers-acceptance.afterDiagnostics +- src.synthesis.code-change-plan.implementation-helpers-acceptance.beforeDiagnosticIds +- src.synthesis.code-change-plan.implementation-helpers-acceptance.context +- src.synthesis.code-change-plan.implementation-helpers-acceptance.evaluateCodeChangeAcceptance +- src.synthesis.code-change-plan.implementation-helpers-acceptance.evaluatedAt +- src.synthesis.code-change-plan.implementation-helpers-acceptance.reasons +- src.synthesis.code-change-plan.implementation-helpers-acceptance.targetedDiagnosticIds +- src.synthesis.code-change-plan.implementation-helpers-close.acceptances +- src.synthesis.code-change-plan.implementation-helpers-close.acceptedCount +- src.synthesis.code-change-plan.implementation-helpers-close.afterDiagnostics +- src.synthesis.code-change-plan.implementation-helpers-close.closeCodeChanges +- src.synthesis.code-change-plan.implementation-helpers-close.context +- src.synthesis.code-change-plan.implementation-helpers-close.evaluatedAt +- src.synthesis.code-change-plan.implementation-helpers-close.planIds +- src.synthesis.code-change-plan.implementation-helpers-plans.absolute +- src.synthesis.code-change-plan.implementation-helpers-plans.base +- src.synthesis.code-change-plan.implementation-helpers-plans.candidates +- src.synthesis.code-change-plan.implementation-helpers-plans.changes +- src.synthesis.code-change-plan.implementation-helpers-plans.conclusions +- src.synthesis.code-change-plan.implementation-helpers-plans.confidence +- src.synthesis.code-change-plan.implementation-helpers-plans.context +- src.synthesis.code-change-plan.implementation-helpers-plans.createRepositoryPathProbe +- src.synthesis.code-change-plan.implementation-helpers-plans.evidence +- src.synthesis.code-change-plan.implementation-helpers-plans.exists +- src.synthesis.code-change-plan.implementation-helpers-plans.generatedAt +- src.synthesis.code-change-plan.implementation-helpers-plans.matchingConclusions +- src.synthesis.code-change-plan.implementation-helpers-plans.matchingProposals +- src.synthesis.code-change-plan.implementation-helpers-plans.maxPlans +- src.synthesis.code-change-plan.implementation-helpers-plans.normalized +- src.synthesis.code-change-plan.implementation-helpers-plans.plan +- src.synthesis.code-change-plan.implementation-helpers-plans.plans +- src.synthesis.code-change-plan.implementation-helpers-plans.proposals +- src.synthesis.code-change-plan.implementation-helpers-plans.proposeCodeChangePlans +- src.synthesis.code-change-plan.implementation-helpers-plans.rationale +- src.synthesis.code-change-plan.implementation-helpers-plans.relatedRecords +- src.synthesis.code-change-plan.implementation-helpers-plans.semantic +- src.synthesis.code-change-plan.implementation-helpers-plans.sourceIntents +- src.synthesis.code-change-plan.implementation-helpers-plans.symbols +- src.synthesis.code-change-plan.implementation-helpers-plans.target +- src.synthesis.code-change-plan.implementation-helpers-shared.deterministicGeneration +- src.synthesis.code-change-plan.implementation-helpers-shared.uniqueSorted +- src.synthesis.code-change-plan.implementation-indexing.index +- src.synthesis.code-change-plan.implementation-indexing.indexConclusionsByDiagnostic +- src.synthesis.code-change-plan.implementation-indexing.indexProposalsByDiagnostic +- src.synthesis.code-change-plan.implementation-review.artifact +- src.synthesis.code-change-plan.implementation-review.context +- src.synthesis.code-change-plan.implementation-review.createCodeChangeReviewPatch +- src.synthesis.code-change-plan.implementation-review.createdAt +- src.synthesis.code-change-plan.implementation-review.generation +- src.synthesis.code-change-plan.implementation-review.lines +- src.synthesis.code-change-plan.implementation-review.markdown +- src.synthesis.code-change-plan.implementation-review.planHashes +- src.synthesis.code-change-plan.implementation-review.planIds +- src.synthesis.code-change-plan.implementation-review.symbols +- src.synthesis.code-change-plan.implementation-semantic.buildPlanEvidence +- src.synthesis.code-change-plan.implementation-semantic.buildPlanSemantic +- src.synthesis.code-change-plan.implementation-semantic.level +- src.synthesis.code-change-plan.implementation-semantic.object +- src.synthesis.code-change-plan.implementation-semantic.record +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.absolute +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.actual +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.after +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.applyCodeChangeSourcePatch +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.before +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.current +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.existed +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.existing +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.exists +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.expectedPaths +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.fileHashesAfter +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.hashPaths +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.idempotentResult +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.lock +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.now +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.patch +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.prepared +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.receipt +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.receiptPath +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.relative +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.request +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.rollbackErrors +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.root +- src.synthesis.code-change-plan.implementation-source-patch-apply-core.target +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.applyUnifiedDiffToText +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.baseLines +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.body +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.context +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.header +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.hunks +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.lines +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.mark +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.newCount +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.normalizedDiff +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.oldCount +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.oldIndex +- src.synthesis.code-change-plan.implementation-source-patch-apply-diff.output +- src.synthesis.code-change-plan.implementation-source-patch-assert.actual +- src.synthesis.code-change-plan.implementation-source-patch-assert.allowed +- src.synthesis.code-change-plan.implementation-source-patch-assert.assertCodeChangeSourcePatchSet +- src.synthesis.code-change-plan.implementation-source-patch-assert.context +- src.synthesis.code-change-plan.implementation-source-patch-assert.editContext +- src.synthesis.code-change-plan.implementation-source-patch-assert.editPath +- src.synthesis.code-change-plan.implementation-source-patch-assert.editPaths +- src.synthesis.code-change-plan.implementation-source-patch-assert.ensureSourcePatchEditAction +- src.synthesis.code-change-plan.implementation-source-patch-assert.ensureSourcePatchEditInstruction +- src.synthesis.code-change-plan.implementation-source-patch-assert.expectedChanges +- src.synthesis.code-change-plan.implementation-source-patch-assert.expectedHash +- src.synthesis.code-change-plan.implementation-source-patch-assert.expectedPlan +- src.synthesis.code-change-plan.implementation-source-patch-assert.expectedPlanIds +- src.synthesis.code-change-plan.implementation-source-patch-assert.marker +- src.synthesis.code-change-plan.implementation-source-patch-assert.normalizedEdit +- src.synthesis.code-change-plan.implementation-source-patch-assert.normalizedPath +- src.synthesis.code-change-plan.implementation-source-patch-assert.patch +- src.synthesis.code-change-plan.implementation-source-patch-assert.patchIds +- src.synthesis.code-change-plan.implementation-source-patch-assert.paths +- src.synthesis.code-change-plan.implementation-source-patch-assert.set +- src.synthesis.code-change-plan.implementation-source-patch-create.allowedPaths +- src.synthesis.code-change-plan.implementation-source-patch-create.context +- src.synthesis.code-change-plan.implementation-source-patch-create.createCodeChangeSourcePatchSet +- src.synthesis.code-change-plan.implementation-source-patch-create.createdAt +- src.synthesis.code-change-plan.implementation-source-patch-create.criteria +- src.synthesis.code-change-plan.implementation-source-patch-create.edits +- src.synthesis.code-change-plan.implementation-source-patch-create.generatedAt +- src.synthesis.code-change-plan.implementation-source-patch-create.graphFingerprint +- src.synthesis.code-change-plan.implementation-source-patch-create.normalizedPath +- src.synthesis.code-change-plan.implementation-source-patch-create.patchHash +- src.synthesis.code-change-plan.implementation-source-patch-create.patches +- src.synthesis.code-change-plan.implementation-source-patch-create.path +- src.synthesis.code-change-plan.implementation-source-patch-create.rawDiff +- src.synthesis.code-change-plan.implementation-source-patch-create.result +- src.synthesis.code-change-plan.implementation-source-patch-create.semantic +- src.synthesis.code-change-plan.implementation-source-patch-create.symbols +- src.synthesis.code-change-plan.implementation-source-patch-create.unifiedDiff +- src.synthesis.code-change-plan.implementation-source-patch-diff.bare +- src.synthesis.code-change-plan.implementation-source-patch-diff.normalizeUnifiedDiff +- src.synthesis.code-change-plan.implementation-source-patch-diff.normalized +- src.synthesis.code-change-plan.implementation-source-patch-diff.normalizedPath +- src.synthesis.code-change-plan.implementation-source-patch-diff.stripped +- src.synthesis.code-change-plan.implementation-targets.collectTarget +- src.synthesis.code-change-plan.implementation-targets.paths +- src.synthesis.code-change-plan.implementation-targets.symbols +- src.synthesis.code-change-plan.implementation-targets.target +- src.synthesis.code-change-plan.implementation-targets.tickets +- src.synthesis.code-change-plan.implementation-targets.versions - src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT - src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT - src.synthesis.task-synthesis-contract.TASK_SYNTHESIS_RESPONSE_CONTRACT @@ -6592,6 +7403,7 @@ entry_points: - src.synthesis.tasks-llm.TaskSynthesisAttemptError.super - src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals - src.synthesis.tasks-llm.TaskSynthesisAttemptError.wrapped +- src.synthesis.tasks-llm.TaskSynthesisRequiredError.super - src.synthesis.todo-patch.applied - src.synthesis.todo-patch.applyTodoPatch - src.synthesis.todo-patch.artifact @@ -6672,25 +7484,25 @@ entry_points: - src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - src.watch.watcher.absolute - src.watch.watcher.absoluteRoot +- src.watch.watcher.configuration - src.watch.watcher.current - src.watch.watcher.defaultSleep - src.watch.watcher.delta -- src.watch.watcher.lastReportStartedAt +- src.watch.watcher.initialSnapshot - src.watch.watcher.matcher - src.watch.watcher.maxFiles - src.watch.watcher.minIntervalMs - src.watch.watcher.onAbort -- src.watch.watcher.pending - src.watch.watcher.previous - src.watch.watcher.rest - src.watch.watcher.result - src.watch.watcher.root +- src.watch.watcher.runtime - src.watch.watcher.scanIntervalMs - src.watch.watcher.shown -- src.watch.watcher.signal -- src.watch.watcher.snapshot - src.watch.watcher.startedAt - src.watch.watcher.timer - src.watch.watcher.waitMs - src.watch.watcher.watchRepository +- src.web.diff-ui-script.loadRuns - src.web.diff-ui.diffUiHtml diff --git a/project/compact_flow.mmd b/project/compact_flow.mmd index 808d246..173ecdf 100644 --- a/project/compact_flow.mmd +++ b/project/compact_flow.mmd @@ -1,16 +1,18 @@ flowchart TD %% generated in 0.04s + examples__frontend["examples.frontend
25 funcs"] + java__JavaAstExtract["java.JavaAstExtract
12 funcs"] python__ast_extract["python.ast_extract
18 funcs"] scripts__research["scripts.research
71 funcs"] sdk__python["sdk.python
68 funcs"] - src__diff["src.diff
182 funcs"] - src__graph["src.graph
192 funcs"] + src__graph["src.graph
227 funcs"] src__live["src.live
60 funcs"] - src__synthesis["src.synthesis
292 funcs"] + src__synthesis["src.synthesis
477 funcs"] scripts__research ==>|7| src__live - sdk__python ==>|6| src__synthesis - python__ast_extract ==>|4| src__diff - sdk__python -->|2| src__graph - scripts__research -->|2| src__synthesis - scripts__research -->|2| src__diff - python__ast_extract -->|1| src__synthesis + sdk__python ==>|4| src__synthesis + sdk__python -->|2| java__JavaAstExtract + scripts__research -->|1| src__synthesis + scripts__research -->|1| src__graph + python__ast_extract -->|1| src__graph + sdk__python -->|1| src__graph + sdk__python -->|1| examples__frontend diff --git a/project/compact_flow.png b/project/compact_flow.png index 6e6aed7..ba63111 100644 Binary files a/project/compact_flow.png and b/project/compact_flow.png differ diff --git a/project/context.md b/project/context.md index 8849663..c2c4270 100644 --- a/project/context.md +++ b/project/context.md @@ -3,176 +3,132 @@ ## Overview -- **Project**: +- **Project**: /home/tom/github/semcod/todo2code - **Primary Language**: typescript -- **Languages**: typescript: 117, md: 52, json: 32, python: 15, javascript: 15 +- **Languages**: typescript: 173, json: 40, python: 16, javascript: 15, shell: 8 - **Analysis Mode**: static -- **Total Functions**: 3285 -- **Total Classes**: 348 -- **Modules**: 262 -- **Entry Points**: 2336 +- **Total Functions**: 4129 +- **Total Classes**: 404 +- **Modules**: 281 +- **Entry Points**: 2776 ## Architecture by Module ### src.cli -- **Functions**: 152 +- **Functions**: 202 - **Classes**: 1 - **File**: `cli.ts` -### src.core.schema -- **Functions**: 151 -- **Classes**: 4 -- **File**: `schema.ts` - -### src.synthesis.code-change-plan -- **Functions**: 148 -- **Classes**: 10 -- **File**: `code-change-plan.ts` - ### src.services.actions -- **Functions**: 113 +- **Functions**: 145 +- **Classes**: 1 - **File**: `actions.ts` ### src.interfaces.a2a-task-store -- **Functions**: 92 +- **Functions**: 101 - **Classes**: 3 - **File**: `a2a-task-store.ts` +### src.diff.reality +- **Functions**: 97 +- **Classes**: 4 +- **File**: `reality.ts` + ### src.communication.analyzer -- **Functions**: 79 +- **Functions**: 88 - **Classes**: 3 - **File**: `analyzer.ts` -### src.diff.reality -- **Functions**: 77 -- **Classes**: 3 -- **File**: `reality.ts` - -### src.graph.linker -- **Functions**: 75 -- **Classes**: 4 -- **File**: `linker.ts` +### src.communication.intake-service +- **Functions**: 82 +- **Classes**: 2 +- **File**: `intake-service.ts` -### src.extractors.communication -- **Functions**: 75 -- **Classes**: 4 -- **File**: `communication.ts` - -### src.pipeline.run -- **Functions**: 64 -- **Classes**: 1 -- **File**: `run.ts` +### src.communication.intake-contract +- **Functions**: 76 +- **Classes**: 7 +- **File**: `intake-contract.ts` ### src.evaluation.gold-cases -- **Functions**: 57 +- **Functions**: 75 - **Classes**: 4 - **File**: `gold-cases.ts` +### src.operations.validation +- **Functions**: 75 +- **File**: `validation.ts` + ### src.core.text -- **Functions**: 56 +- **Functions**: 66 - **File**: `text.ts` +### src.extractors.git +- **Functions**: 64 +- **Classes**: 6 +- **File**: `git.ts` + +### src.graph.diagnostics +- **Functions**: 61 +- **Classes**: 1 +- **File**: `diagnostics.ts` + ### src.comparison.workspace -- **Functions**: 55 +- **Functions**: 56 - **Classes**: 3 - **File**: `workspace.ts` -### src.communication.llm +### src.graph.linker - **Functions**: 55 -- **Classes**: 8 -- **File**: `llm.ts` +- **Classes**: 1 +- **File**: `linker.ts` + +### src.synthesis.code-change-plan.implementation-source-patch-assert +- **Functions**: 55 +- **Classes**: 2 +- **File**: `implementation-source-patch-assert.ts` + +### src.synthesis.code-change-plan.implementation-source-patch-apply-core +- **Functions**: 54 +- **Classes**: 6 +- **File**: `implementation-source-patch-apply-core.ts` ### src.synthesis.todo-patch - **Functions**: 53 - **Classes**: 5 - **File**: `todo-patch.ts` -### src.diff.text -- **Functions**: 53 -- **Classes**: 1 -- **File**: `text.ts` - -### src.llm.openrouter +### src.extractors.communication-helpers - **Functions**: 49 -- **Classes**: 7 -- **File**: `openrouter.ts` +- **Classes**: 3 +- **File**: `communication-helpers.ts` + +### src.interfaces.a2a +- **Functions**: 48 +- **File**: `a2a.ts` ### sdk.typescript.src - **Functions**: 48 - **Classes**: 14 - **File**: `index.ts` -### src.operations.validation -- **Functions**: 47 -- **File**: `validation.ts` - -### src.interfaces.a2a -- **Functions**: 46 -- **File**: `a2a.ts` - ## Key Entry Points Main execution flows into the system: -### src.services.actions.executeAction -- **Calls**: src.services.actions.resolveRoot, src.services.actions.scopedPath, src.services.actions.extractNlIntentAudited, src.services.actions.nlModeValue, src.services.actions.extractGitIntent, src.services.actions.numberValue, src.services.actions.extractAstIntent, src.services.actions.extractConfigurationIntent - -### src.services.actions.root -- **Calls**: src.services.actions.scopedPath, src.services.actions.extractNlIntentAudited, src.services.actions.nlModeValue, src.services.actions.extractGitIntent, src.services.actions.numberValue, src.services.actions.extractAstIntent, src.services.actions.extractConfigurationIntent, src.services.actions.extractMarkdownIntentAudited - ### sdk.python.examples.basic.main - **Calls**: os.environ.get, os.environ.get, os.environ.get, T2CClient, print, client.agent_card, print, client.extract_nl_result -### src.pipeline.run.runPipeline -- **Calls**: src.pipeline.run.resolve, src.pipeline.run.pathExists, src.pipeline.run.Error, src.pipeline.run.newRunId, src.pipeline.run.join, src.pipeline.run.ensureDir, src.pipeline.run.skippedAudit, src.pipeline.run.extractNlIntentAudited - -### src.extractors.ast.typescript.extractTypeScriptFile -- **Calls**: src.extractors.ast.typescript.relativePosix, src.extractors.ast.typescript.createSourceFile, src.extractors.ast.typescript.scriptKind, src.extractors.ast.typescript.getLineAndCharacterOfPosition, src.extractors.ast.typescript.getStart, src.extractors.ast.typescript.getEnd, src.extractors.ast.typescript.getText, src.extractors.ast.typescript.slice - -### src.extractors.communication.extractCommunicationIntent -- **Calls**: src.extractors.communication.resolve, src.extractors.communication.assertPathWithinRoot, src.extractors.communication.pathExists, src.extractors.communication.relativePosix, src.extractors.communication.walkFiles, src.extractors.communication.loadParticipantIdentityRegistry, src.extractors.communication.split, src.extractors.communication.toLowerCase - ### scripts.research.rank-intent-graph-embeddings.main - **Calls**: scripts.research.rank-intent-graph-embeddings.parse_args, args.graph.read_bytes, json.loads, sorted, sorted, time.monotonic, SentenceTransformer, model.encode -### src.web.diff-ui.diffUiHtml -- **Calls**: src.web.diff-ui.gradient, src.web.diff-ui.min, src.web.diff-ui.clamp, src.web.diff-ui.not, src.web.diff-ui.media, src.web.diff-ui.token, src.web.diff-ui.getElementById, src.web.diff-ui.byId - ### src.comparison.workspace.compareWorkspaceIntent - **Calls**: src.comparison.workspace.resolve, src.comparison.workspace.git, src.comparison.workspace.trim, src.comparison.workspace.relative, src.comparison.workspace.startsWith, src.comparison.workspace.isAbsolute, src.comparison.workspace.Error, src.comparison.workspace.scopedOutputDirectory -### src.extractors.communication.identityRegistry -- **Calls**: src.extractors.communication.relativePosix, src.extractors.communication.split, src.extractors.communication.toLowerCase, src.extractors.communication.readText, src.extractors.communication.push, src.extractors.communication.String, src.extractors.communication.parseEnvelope, src.extractors.communication.inferIdentity - -### src.extractors.communication.communicationFiles -- **Calls**: src.extractors.communication.relativePosix, src.extractors.communication.split, src.extractors.communication.toLowerCase, src.extractors.communication.readText, src.extractors.communication.push, src.extractors.communication.String, src.extractors.communication.parseEnvelope, src.extractors.communication.inferIdentity - -### src.synthesis.code-change-plan.applyCodeChangeSourcePatch -- **Calls**: src.synthesis.code-change-plan.assertCodeChangeSourcePatch, src.synthesis.code-change-plan.trim, src.synthesis.code-change-plan.Error, src.synthesis.code-change-plan.resolve, src.synthesis.code-change-plan.assertPathWithinRoot, src.synthesis.code-change-plan.ensureDir, src.synthesis.code-change-plan.dirname, src.synthesis.code-change-plan.open - -### src.communication.analyzer.analyzeCommunication -- **Calls**: src.communication.analyzer.assertIntentGraph, src.communication.analyzer.filter, src.communication.analyzer.validateSyntheses, src.communication.analyzer.evidenceNeighbors, src.communication.analyzer.participantOf, src.communication.analyzer.get, src.communication.analyzer.push, src.communication.analyzer.set - -### src.synthesis.code-change-plan.proposeCodeChangePlans -- **Calls**: src.synthesis.code-change-plan.assertIntentGraph, src.synthesis.code-change-plan.assertConclusions, src.synthesis.code-change-plan.Date, src.synthesis.code-change-plan.toISOString, src.synthesis.code-change-plan.isNaN, src.synthesis.code-change-plan.parse, src.synthesis.code-change-plan.Error, src.synthesis.code-change-plan.isInteger - -### src.graph.diagnostics.diagnoseGraph -- **Calls**: src.graph.diagnostics.Date, src.graph.diagnostics.toISOString, src.graph.diagnostics.assertIntentGraph, src.graph.diagnostics.buildNeighbors, src.graph.diagnostics.Map, src.graph.diagnostics.map, src.graph.diagnostics.indexGroundedImplementationEvidence, src.graph.diagnostics.indexImplementedPaths - -### src.interfaces.a2a-message.parseCommand -- **Calls**: src.interfaces.a2a-message.find, src.interfaces.a2a-message.isRecord, src.interfaces.a2a-message.commandFromData, src.interfaces.a2a-message.map, src.interfaces.a2a-message.join, src.interfaces.a2a-message.trim, src.interfaces.a2a-message.startsWith, src.interfaces.a2a-message.parse - -### src.core.text.inferObject -- **Calls**: src.core.text.replace, src.core.text.trim, src.core.text.b, src.core.text.utworzy, src.core.text.doda, src.core.text.zaimplementowa, src.core.text.stworzy, src.core.text.zbudowa - ### scripts.research.evaluate-embedding-pairs.main -- **Calls**: scripts.research.evaluate-embedding-pairs.parse_args, json.loads, src.synthesis.code-change-plan.list, time.monotonic, SentenceTransformer, model.encode, dict, args.output.write_text - -### src.core.text.normalized -- **Calls**: src.core.text.b, src.core.text.utworzy, src.core.text.doda, src.core.text.zaimplementowa, src.core.text.stworzy, src.core.text.zbudowa, src.core.text.napraw, src.core.text.popraw +- **Calls**: scripts.research.evaluate-embedding-pairs.parse_args, json.loads, src.synthesis.code-change-plan.implementation-indexing.list, time.monotonic, SentenceTransformer, model.encode, dict, args.output.write_text -### src.operations.validation.assertOperationPlan -- **Calls**: src.operations.validation.objectValue, src.operations.validation.exactKeys, src.operations.validation.Error, src.operations.validation.test, src.operations.validation.dateString, src.operations.validation.nonBlank, src.operations.validation.uniqueStrings, src.operations.validation.assertGeneration +### src.interfaces.intake_cli.main +- **Calls**: argparse.ArgumentParser, parser.add_subparsers, sub.add_parser, encode.add_argument, encode.add_argument, sub.add_parser, decode.add_argument, decode.add_argument ### src.comparison.workspace.temporaryParent - **Calls**: src.comparison.workspace.git, src.comparison.workspace.join, src.comparison.workspace.commonPipelineOptions, src.comparison.workspace.optionsForRoot, src.comparison.workspace.runPipeline, src.comparison.workspace.all, src.comparison.workspace.buildRealityView, src.comparison.workspace.diffIntentGraphs @@ -189,95 +145,145 @@ Main execution flows into the system: ### python.ast_extract.main - **Calls**: argparse.ArgumentParser, parser.add_argument, parser.add_argument, parser.add_argument, parser.parse_args, None.resolve, python.ast_extract.iter_python_files, print -### src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited -- **Calls**: src.communication.llm.now, src.communication.llm.extractCommunicationIntent, src.communication.llm.CommunicationAttemptError.audit, src.communication.llm.CommunicationAttemptError.markDeterministic, src.communication.llm.CommunicationAttemptError.deterministicSyntheses, src.communication.llm.CommunicationAttemptError.deterministicGeneration, src.communication.llm.OpenRouterClient, src.communication.llm.isConfigured +### src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited +- **Calls**: src.communication.llm.implementation.now, src.communication.llm.implementation.extractCommunicationIntent, src.communication.llm.implementation.audit, src.communication.llm.implementation.markDeterministic, src.communication.llm.implementation.deterministicSyntheses, src.communication.llm.implementation.deterministicGeneration, src.communication.llm.implementation.OpenRouterClient, src.communication.llm.implementation.isConfigured + +### src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited +- **Calls**: src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.now, src.extractors.nl-llm.extractNlIntent, src.extractors.nl-llm.markDeterministicNlRecords, src.extractors.nl-llm.nlStageAudit, src.extractors.nl-llm.OpenRouterClient, src.extractors.nl-llm.isConfigured, src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow ### src.graph.linker.linkIntentRecords - **Calls**: src.graph.linker.Date, src.graph.linker.toISOString, src.graph.linker.assertIntentRecords, src.graph.linker.deduplicateRecords, src.graph.linker.sort, src.graph.linker.localeCompare, src.graph.linker.Map, src.graph.linker.map -### src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited -- **Calls**: src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.now, src.extractors.nl-llm.extractNlIntent, src.extractors.nl-llm.NlAttemptError.markDeterministic, src.extractors.nl-llm.NlAttemptError.audit, src.extractors.nl-llm.OpenRouterClient, src.extractors.nl-llm.isConfigured, src.extractors.nl-llm.NlAttemptError.fallbackOrThrow - ### scripts.live-model-comparison.main - **Calls**: scripts.live-model-comparison.loadEnvFile, scripts.live-model-comparison.getConfig, scripts.live-model-comparison.Error, scripts.live-model-comparison.write, scripts.live-model-comparison.SKIPPED, scripts.live-model-comparison.Number, scripts.live-model-comparison.split, scripts.live-model-comparison.map -### src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited -- **Calls**: src.extractors.markdown-llm.now, src.extractors.markdown-llm.extractMarkdownIntent, src.extractors.markdown-llm.MarkdownAttemptError.stageAudit, src.extractors.markdown-llm.MarkdownAttemptError.markDeterministic, src.extractors.markdown-llm.OpenRouterClient, src.extractors.markdown-llm.isConfigured, src.extractors.markdown-llm.MarkdownAttemptError.fallbackOrThrow, src.extractors.markdown-llm.MarkdownAttemptError.readPrompt +### rust-ast.src.main.main +- **Calls**: rust-ast.src.main.let, rust-ast.src.main.arguments, rust-ast.src.main.collect_files, rust-ast.src.main.sort, rust-ast.src.main.slash, rust-ast.src.main.strip_prefix, rust-ast.src.main.unwrap_or, rust-ast.src.main.metadata + +### sdk.typescript.examples.basic.baseUrl +- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error + +### sdk.typescript.examples.basic.token +- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error + +### sdk.typescript.examples.basic.root +- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error + +### sdk.typescript.examples.basic.main +- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error + +### sdk.python.todo2code.runtime.TypeScriptRuntime.reality +- **Calls**: tempfile.TemporaryDirectory, self.invoke, Path, Path, Path, str, str, str + +### src.extractors.nl.extractNlIntent +- **Calls**: src.extractors.nl.assertNlExtractionOptions, src.extractors.nl.resolve, src.extractors.nl.readText, src.extractors.nl.isAbsolute, src.extractors.nl.relativePosix, src.extractors.nl.replace, src.extractors.nl.splitIntentLines, src.extractors.nl.classifyAction + +### src.extractors.ast.extractAstIntent +- **Calls**: src.extractors.ast.resolve, src.extractors.ast.ContentCache, src.extractors.ast.loadIgnoreMatcher, src.extractors.ast.walkFiles, src.extractors.ast.readText, src.extractors.ast.relativePosix, src.extractors.ast.getOrCompute, src.extractors.ast.sha256 + +### src.extractors.todo.body +- **Calls**: src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim, src.extractors.todo.toLowerCase, src.extractors.todo.readListBlock, src.extractors.todo.classifyAction, src.extractors.todo.resolve, src.extractors.todo.extractPaths + +### src.extractors.todo.relative +- **Calls**: src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim, src.extractors.todo.toLowerCase, src.extractors.todo.readListBlock, src.extractors.todo.classifyAction, src.extractors.todo.resolve, src.extractors.todo.extractPaths + +### src.extractors.todo.lines +- **Calls**: src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim, src.extractors.todo.toLowerCase, src.extractors.todo.readListBlock, src.extractors.todo.classifyAction, src.extractors.todo.resolve, src.extractors.todo.extractPaths + +### src.synthesis.todo-patch.applyTodoPatch +- **Calls**: src.synthesis.todo-patch.all, src.synthesis.todo-patch.readText, src.synthesis.todo-patch.assertTodoPatchArtifact, src.synthesis.todo-patch.sha256, src.synthesis.todo-patch.Error, src.synthesis.todo-patch.assertApproval, src.synthesis.todo-patch.ensureDir, src.synthesis.todo-patch.dirname + +### src.extractors.changelog.extractChangelog +- **Calls**: src.extractors.changelog.resolve, src.extractors.changelog.pathExists, src.extractors.changelog.readText, src.extractors.changelog.relativePosix, src.extractors.changelog.split, src.extractors.changelog.match, src.extractors.changelog.trim, src.extractors.changelog.readListBlock + +### src.graph.diff.diffIntentGraphs +- **Calls**: src.graph.diff.assertGraph, src.graph.diff.Map, src.graph.diff.map, src.graph.diff.has, src.graph.diff.push, src.graph.diff.groupRecords, src.graph.diff.Set, src.graph.diff.keys + +### php.ast_extract.parseFile +- **Calls**: php.ast_extract.file_get_contents, php.ast_extract.RuntimeException, php.ast_extract.preg_split, php.ast_extract.token_get_all, php.ast_extract.foreach, php.ast_extract.normalizedToken, php.ast_extract.substr_count, php.ast_extract.defined + +### src.cli.handleCommunication +- **Calls**: src.cli.resolve, src.cli.all, src.cli.extractCommunicationIntentAudited, src.cli.optionString, src.cli.optionNullableString, src.cli.optionLlmMode, src.cli.extractGitIntent, src.cli.optionNumber ## Process Flows Key execution flows identified: -### Flow 1: executeAction +### Flow 1: main ``` -executeAction [src.services.actions] - └─> resolveRoot - └─> scopedPath - └─> stringValue +main [sdk.python.examples.basic] ``` -### Flow 2: root +### Flow 2: compareWorkspaceIntent ``` -root [src.services.actions] - └─> scopedPath - └─> stringValue +compareWorkspaceIntent [src.comparison.workspace] + └─> git + └─> execFileAsync ``` -### Flow 3: main +### Flow 3: temporaryParent ``` -main [sdk.python.examples.basic] +temporaryParent [src.comparison.workspace] + └─> git + └─> execFileAsync ``` -### Flow 4: runPipeline +### Flow 4: baseWorktree ``` -runPipeline [src.pipeline.run] +baseWorktree [src.comparison.workspace] + └─> git + └─> execFileAsync ``` -### Flow 5: extractTypeScriptFile +### Flow 5: extractTodo ``` -extractTypeScriptFile [src.extractors.ast.typescript] +extractTodo [src.extractors.todo] ``` -### Flow 6: extractCommunicationIntent +### Flow 6: makefile ``` -extractCommunicationIntent [src.extractors.communication] +makefile [scripts.verify-env-contract] ``` -### Flow 7: diffUiHtml +### Flow 7: extractCommunicationIntentAudited ``` -diffUiHtml [src.web.diff-ui] +extractCommunicationIntentAudited [src.communication.llm.implementation.CommunicationLlmRequiredError] ``` -### Flow 8: compareWorkspaceIntent +### Flow 8: extractNlIntentAudited ``` -compareWorkspaceIntent [src.comparison.workspace] - └─> git - └─> execFileAsync +extractNlIntentAudited [src.extractors.nl-llm.NlLlmRequiredError] + └─> assertNlExtractionOptions ``` -### Flow 9: identityRegistry +### Flow 9: linkIntentRecords ``` -identityRegistry [src.extractors.communication] +linkIntentRecords [src.graph.linker] ``` -### Flow 10: communicationFiles +### Flow 10: baseUrl ``` -communicationFiles [src.extractors.communication] +baseUrl [sdk.typescript.examples.basic] + └─> health ``` ## Key Classes -### src.llm.openrouter.OpenRouterClient -- **Methods**: 48 -- **Key Methods**: src.llm.openrouter.OpenRouterClient.isConfigured, src.llm.openrouter.OpenRouterClient.listAvailableModels, src.llm.openrouter.OpenRouterClient.controller, src.llm.openrouter.OpenRouterClient.timeout, src.llm.openrouter.OpenRouterClient.response, src.llm.openrouter.OpenRouterClient.text, src.llm.openrouter.OpenRouterClient.clearTimeout, src.llm.openrouter.OpenRouterClient.chatText, src.llm.openrouter.OpenRouterClient.chatTextWithMetadata, src.llm.openrouter.OpenRouterClient.response +### src.communication.intake-service.GovernedIntakeService +- **Methods**: 82 +- **Key Methods**: src.communication.intake-service.GovernedIntakeService.command, src.communication.intake-service.GovernedIntakeService.duplicate, src.communication.intake-service.GovernedIntakeService.state, src.communication.intake-service.GovernedIntakeService.actor, src.communication.intake-service.GovernedIntakeService.event, src.communication.intake-service.GovernedIntakeService.appended, src.communication.intake-service.GovernedIntakeService.actual, src.communication.intake-service.GovernedIntakeService.updated, src.communication.intake-service.GovernedIntakeService.participantId, src.communication.intake-service.GovernedIntakeService.ticketId + +### src.communication.intake-contract.IntakeError +- **Methods**: 76 +- **Key Methods**: src.communication.intake-contract.IntakeError.super, src.communication.intake-contract.IntakeError.payloadHash, src.communication.intake-contract.IntakeError.canonicalJson, src.communication.intake-contract.IntakeError.record, src.communication.intake-contract.IntakeError.assertIntakeEnvelope, src.communication.intake-contract.IntakeError.envelope, src.communication.intake-contract.IntakeError.validateIntakeEnvelopeHeader, src.communication.intake-contract.IntakeError.validateIntakeEnvelopeTimestamp, src.communication.intake-contract.IntakeError.assertCommand, src.communication.intake-contract.IntakeError.assertQuery ### sdk.typescript.src.T2CClient - **Methods**: 46 - **Key Methods**: sdk.typescript.src.T2CClient.health, sdk.typescript.src.T2CClient.agentCard, sdk.typescript.src.T2CClient.send, sdk.typescript.src.T2CClient.result, sdk.typescript.src.T2CClient.call, sdk.typescript.src.T2CClient.task, sdk.typescript.src.T2CClient.detail, sdk.typescript.src.T2CClient.part, sdk.typescript.src.T2CClient.getTask, sdk.typescript.src.T2CClient.cancelTask -### src.communication.llm.CommunicationAttemptError -- **Methods**: 40 -- **Key Methods**: src.communication.llm.CommunicationAttemptError.super, src.communication.llm.CommunicationAttemptError.enrichWithCorrection, src.communication.llm.CommunicationAttemptError.completion, src.communication.llm.CommunicationAttemptError.fallbackOrThrow, src.communication.llm.CommunicationAttemptError.failed, src.communication.llm.CommunicationAttemptError.marked, src.communication.llm.CommunicationAttemptError.participantGroups, src.communication.llm.CommunicationAttemptError.grouped, src.communication.llm.CommunicationAttemptError.participant, src.communication.llm.CommunicationAttemptError.role +### src.semantic.reranker-llm.SemanticRerankerRequiredError +- **Methods**: 43 +- **Key Methods**: src.semantic.reranker-llm.SemanticRerankerRequiredError.super, src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates, src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet, src.semantic.reranker-llm.SemanticRerankerRequiredError.validateCandidateSetSize, src.semantic.reranker-llm.SemanticRerankerRequiredError.model, src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision, src.semantic.reranker-llm.SemanticRerankerRequiredError.cached, src.semantic.reranker-llm.SemanticRerankerRequiredError.client, src.semantic.reranker-llm.SemanticRerankerRequiredError.payload, src.semantic.reranker-llm.SemanticRerankerRequiredError.response ### src.llm.structured-schema.StructuredResponseError - **Methods**: 37 @@ -291,13 +297,17 @@ Example: - **Methods**: 34 - **Key Methods**: sdk.python.todo2code.client.T2CClient.__init__, sdk.python.todo2code.client.T2CClient._headers, sdk.python.todo2code.client.T2CClient._open, sdk.python.todo2code.client.T2CClient._rpc, sdk.python.todo2code.client.T2CClient._get, sdk.python.todo2code.client.T2CClient.health, sdk.python.todo2code.client.T2CClient.agent_card, sdk.python.todo2code.client.T2CClient.send, sdk.python.todo2code.client.T2CClient.call, sdk.python.todo2code.client.T2CClient.compare_workspace -### src.extractors.nl-llm.NlAttemptError -- **Methods**: 30 -- **Key Methods**: src.extractors.nl-llm.NlAttemptError.super, src.extractors.nl-llm.NlAttemptError.extractNlWithCorrection, src.extractors.nl-llm.NlAttemptError.completion, src.extractors.nl-llm.NlAttemptError.fallbackOrThrow, src.extractors.nl-llm.NlAttemptError.failedAudit, src.extractors.nl-llm.NlAttemptError.deterministic, src.extractors.nl-llm.NlAttemptError.markDeterministic, src.extractors.nl-llm.NlAttemptError.toIntentRecord, src.extractors.nl-llm.NlAttemptError.start, src.extractors.nl-llm.NlAttemptError.end +### src.llm.openrouter.OpenRouterClient +- **Methods**: 33 +- **Key Methods**: src.llm.openrouter.OpenRouterClient.isConfigured, src.llm.openrouter.OpenRouterClient.listAvailableModels, src.llm.openrouter.OpenRouterClient.controller, src.llm.openrouter.OpenRouterClient.timeout, src.llm.openrouter.OpenRouterClient.response, src.llm.openrouter.OpenRouterClient.text, src.llm.openrouter.OpenRouterClient.clearTimeout, src.llm.openrouter.OpenRouterClient.chatText, src.llm.openrouter.OpenRouterClient.chatTextWithMetadata, src.llm.openrouter.OpenRouterClient.response -### src.semantic.reranker-llm.SemanticRerankerRequiredError -- **Methods**: 29 -- **Key Methods**: src.semantic.reranker-llm.SemanticRerankerRequiredError.super, src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates, src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet, src.semantic.reranker-llm.SemanticRerankerRequiredError.model, src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision, src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult, src.semantic.reranker-llm.SemanticRerankerRequiredError.client, src.semantic.reranker-llm.SemanticRerankerRequiredError.records, src.semantic.reranker-llm.SemanticRerankerRequiredError.payload, src.semantic.reranker-llm.SemanticRerankerRequiredError.response +### src.extractors.nl-llm-helpers.NlAttemptError +- **Methods**: 31 +- **Key Methods**: src.extractors.nl-llm-helpers.NlAttemptError.super, src.extractors.nl-llm-helpers.NlAttemptError.extractNlWithCorrection, src.extractors.nl-llm-helpers.NlAttemptError.completion, src.extractors.nl-llm-helpers.NlAttemptError.markDeterministicNlRecords, src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord, src.extractors.nl-llm-helpers.NlAttemptError.lines, src.extractors.nl-llm-helpers.NlAttemptError.action, src.extractors.nl-llm-helpers.NlAttemptError.normalizedText, src.extractors.nl-llm-helpers.NlAttemptError.statementText, src.extractors.nl-llm-helpers.NlAttemptError.nlStageAudit + +### src.extractors.markdown-llm-helpers.MarkdownAttemptError +- **Methods**: 30 +- **Key Methods**: src.extractors.markdown-llm-helpers.MarkdownAttemptError.super, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichments, src.extractors.markdown-llm-helpers.MarkdownAttemptError.responseByRecord, src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes, src.extractors.markdown-llm-helpers.MarkdownAttemptError.corrected, src.extractors.markdown-llm-helpers.MarkdownAttemptError.failed, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment, src.extractors.markdown-llm-helpers.MarkdownAttemptError.metadata, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering ### src.extractors.docs-llm.DocumentationLlmRequiredError - **Methods**: 29 @@ -311,10 +321,6 @@ Example: - **Methods**: 25 - **Key Methods**: java.JavaAstExtract.JavaAstExtract.main, java.JavaAstExtract.JavaAstExtract.emit, java.JavaAstExtract.JavaAstExtract.parseFile, java.JavaAstExtract.JavaAstExtract.emit, java.JavaAstExtract.JavaAstExtract.collect, java.JavaAstExtract.JavaAstExtract.try, java.JavaAstExtract.JavaAstExtract.containsIgnored, java.JavaAstExtract.JavaAstExtract.try, java.JavaAstExtract.JavaAstExtract.Collector, java.JavaAstExtract.JavaAstExtract.add -### src.extractors.markdown-llm.MarkdownAttemptError -- **Methods**: 24 -- **Key Methods**: src.extractors.markdown-llm.MarkdownAttemptError.super, src.extractors.markdown-llm.MarkdownAttemptError.enrichBatchCovering, src.extractors.markdown-llm.MarkdownAttemptError.metadataByRecord, src.extractors.markdown-llm.MarkdownAttemptError.uncovered, src.extractors.markdown-llm.MarkdownAttemptError.enrichSplitBatch, src.extractors.markdown-llm.MarkdownAttemptError.half, src.extractors.markdown-llm.MarkdownAttemptError.emptyCoverage, src.extractors.markdown-llm.MarkdownAttemptError.enrichMarkdownBatchWithCorrection, src.extractors.markdown-llm.MarkdownAttemptError.completion, src.extractors.markdown-llm.MarkdownAttemptError.fallbackOrThrow - ### src.synthesis.tasks-llm.TaskSynthesisAttemptError - **Methods**: 21 - **Key Methods**: src.synthesis.tasks-llm.TaskSynthesisAttemptError.super, src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals, src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt, src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions, src.synthesis.tasks-llm.TaskSynthesisAttemptError.client, src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt, src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload, src.synthesis.tasks-llm.TaskSynthesisAttemptError.failure, src.synthesis.tasks-llm.TaskSynthesisAttemptError.responses, src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection @@ -323,21 +329,21 @@ Example: - **Methods**: 21 - **Key Methods**: src.summary.summarizer.SummaryAttemptError.super, src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection, src.summary.summarizer.SummaryAttemptError.conclusions, src.summary.summarizer.SummaryAttemptError.generationMetadata, src.summary.summarizer.SummaryAttemptError.message, src.summary.summarizer.SummaryAttemptError.materializeConclusions, src.summary.summarizer.SummaryAttemptError.parsed, src.summary.summarizer.SummaryAttemptError.conclusions, src.summary.summarizer.SummaryAttemptError.diagnosticIds, src.summary.summarizer.SummaryAttemptError.assertConclusions +### src.extractors.nl-llm.NlLlmRequiredError +- **Methods**: 19 +- **Key Methods**: src.extractors.nl-llm.NlLlmRequiredError.super, src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited, src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.NlLlmRequiredError.startedAt, src.extractors.nl-llm.NlLlmRequiredError.result, src.extractors.nl-llm.NlLlmRequiredError.client, src.extractors.nl-llm.NlLlmRequiredError.absolute, src.extractors.nl-llm.NlLlmRequiredError.body, src.extractors.nl-llm.NlLlmRequiredError.sourcePath, src.extractors.nl-llm.NlLlmRequiredError.maxLine + +### src.communication.intake-store.IntakeEventStore +- **Methods**: 19 +- **Key Methods**: src.communication.intake-store.IntakeEventStore.read, src.communication.intake-store.IntakeEventStore.names, src.communication.intake-store.IntakeEventStore.name, src.communication.intake-store.IntakeEventStore.eventPath, src.communication.intake-store.IntakeEventStore.stat, src.communication.intake-store.IntakeEventStore.event, src.communication.intake-store.IntakeEventStore.lockPath, src.communication.intake-store.IntakeEventStore.stream, src.communication.intake-store.IntakeEventStore.existing, src.communication.intake-store.IntakeEventStore.writeRegistry + ### src.sdk.typescript.Todo2CodeClient - **Methods**: 16 - **Key Methods**: src.sdk.typescript.Todo2CodeClient.a2a, src.sdk.typescript.Todo2CodeClient.health, src.sdk.typescript.Todo2CodeClient.diffGraphs, src.sdk.typescript.Todo2CodeClient.diffGraphFiles, src.sdk.typescript.Todo2CodeClient.compareWorkspace, src.sdk.typescript.Todo2CodeClient.proposeTodo, src.sdk.typescript.Todo2CodeClient.renderTodo, src.sdk.typescript.Todo2CodeClient.applyTodo, src.sdk.typescript.Todo2CodeClient.proposeCodeChange, src.sdk.typescript.Todo2CodeClient.renderCodeChange -### src.extractors.nl-llm.NlLlmRequiredError -- **Methods**: 15 -- **Key Methods**: src.extractors.nl-llm.NlLlmRequiredError.super, src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited, src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.NlLlmRequiredError.startedAt, src.extractors.nl-llm.NlLlmRequiredError.result, src.extractors.nl-llm.NlLlmRequiredError.client, src.extractors.nl-llm.NlLlmRequiredError.absolute, src.extractors.nl-llm.NlLlmRequiredError.body, src.extractors.nl-llm.NlLlmRequiredError.sourcePath, src.extractors.nl-llm.NlLlmRequiredError.maxLine - -### src.communication.llm.CommunicationLlmRequiredError +### src.communication.llm.implementation.CommunicationLlmRequiredError - **Methods**: 15 -- **Key Methods**: src.communication.llm.CommunicationLlmRequiredError.super, src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited, src.communication.llm.CommunicationLlmRequiredError.startedAt, src.communication.llm.CommunicationLlmRequiredError.deterministic, src.communication.llm.CommunicationLlmRequiredError.records, src.communication.llm.CommunicationLlmRequiredError.client, src.communication.llm.CommunicationLlmRequiredError.groups, src.communication.llm.CommunicationLlmRequiredError.response, src.communication.llm.CommunicationLlmRequiredError.enrichments, src.communication.llm.CommunicationLlmRequiredError.enrichedByOriginal - -### src.extractors.markdown-llm.MarkdownLlmRequiredError -- **Methods**: 13 -- **Key Methods**: src.extractors.markdown-llm.MarkdownLlmRequiredError.super, src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited, src.extractors.markdown-llm.MarkdownLlmRequiredError.startedAt, src.extractors.markdown-llm.MarkdownLlmRequiredError.deterministic, src.extractors.markdown-llm.MarkdownLlmRequiredError.client, src.extractors.markdown-llm.MarkdownLlmRequiredError.prompt, src.extractors.markdown-llm.MarkdownLlmRequiredError.enrichments, src.extractors.markdown-llm.MarkdownLlmRequiredError.responseByRecord, src.extractors.markdown-llm.MarkdownLlmRequiredError.outcomes, src.extractors.markdown-llm.MarkdownLlmRequiredError.corrected +- **Key Methods**: src.communication.llm.implementation.CommunicationLlmRequiredError.super, src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited, src.communication.llm.implementation.CommunicationLlmRequiredError.startedAt, src.communication.llm.implementation.CommunicationLlmRequiredError.deterministic, src.communication.llm.implementation.CommunicationLlmRequiredError.records, src.communication.llm.implementation.CommunicationLlmRequiredError.client, src.communication.llm.implementation.CommunicationLlmRequiredError.groups, src.communication.llm.implementation.CommunicationLlmRequiredError.response, src.communication.llm.implementation.CommunicationLlmRequiredError.enrichments, src.communication.llm.implementation.CommunicationLlmRequiredError.enrichedByOriginal ### src.core.content-cache.ContentCache - **Methods**: 13 @@ -348,87 +354,81 @@ Example: - **Key Methods**: python.ast_extract.FactVisitor.__init__, python.ast_extract.FactVisitor.excerpt, python.ast_extract.FactVisitor.add, python.ast_extract.FactVisitor.visit_Import, python.ast_extract.FactVisitor.visit_ImportFrom, python.ast_extract.FactVisitor.visit_FunctionDef, python.ast_extract.FactVisitor.visit_AsyncFunctionDef, python.ast_extract.FactVisitor.visit_ClassDef, python.ast_extract.FactVisitor.add_named_constant, python.ast_extract.FactVisitor.visit_Assign - **Inherits**: ast.NodeVisitor -### src.interfaces.a2a-types.BodyTooLargeError -- **Methods**: 11 -- **Key Methods**: src.interfaces.a2a-types.BodyTooLargeError.stringParam, src.interfaces.a2a-types.BodyTooLargeError.optionalString, src.interfaces.a2a-types.BodyTooLargeError.optionalStringArray, src.interfaces.a2a-types.BodyTooLargeError.optionalInteger, src.interfaces.a2a-types.BodyTooLargeError.parsed, src.interfaces.a2a-types.BodyTooLargeError.optionalBoolean, src.interfaces.a2a-types.BodyTooLargeError.optionalTimestamp, src.interfaces.a2a-types.BodyTooLargeError.timestamp, src.interfaces.a2a-types.BodyTooLargeError.optionalTaskState, src.interfaces.a2a-types.BodyTooLargeError.recordParam - ## Data Transformation Functions Key functions that process and transform data: -### src.cli.parsed -- **Output to**: src.cli.printHelp +### examples.backend.src.request-handlers.parseOffset +- **Output to**: examples.backend.src.request-handlers.Number, examples.backend.src.request-handlers.isFinite -### src.cli.formatWatchEvent -- **Output to**: src.cli.Date, src.cli.toISOString, src.cli.file, src.cli.join, src.cli.change +### examples.backend.src.request-handlers.parsed -### src.cli.parseArgs -- **Output to**: src.cli.push, src.cli.slice, src.cli.startsWith, src.cli.split, src.cli.set +### examples.backend.src.request-handlers.parseLimit +- **Output to**: examples.backend.src.request-handlers.Number, examples.backend.src.request-handlers.isFinite -### src.web.diff-ui.formatBytes -- **Output to**: src.web.diff-ui.selectedRun, src.web.diff-ui.byId +### examples.backend.src.validation.validateEventPayload +- **Output to**: examples.backend.src.validation.isArray, examples.backend.src.validation.invalid, examples.backend.src.validation.trim, examples.backend.src.validation.has, examples.backend.src.validation.join -### src.synthesis.validation.validateAndClassifyTodoProposals -- **Output to**: src.synthesis.validation.assertTodoProposals, src.synthesis.validation.filter, src.synthesis.validation.map, src.synthesis.validation.duplicateEvidence, src.synthesis.validation.Boolean +### examples.src.runtime.validateContract +- **Output to**: examples.src.runtime.Error -### src.synthesis.task-synthesis-materialize.parsed -- **Output to**: src.synthesis.task-synthesis-materialize.map, src.synthesis.task-synthesis-materialize.sortedUnique, src.synthesis.task-synthesis-materialize.groundRecordIdsByDiagnostics, src.synthesis.task-synthesis-materialize.normalizeStringArray, src.synthesis.task-synthesis-materialize.createConclusionId +### java.JavaAstExtract.JavaAstExtract.parseFile -### src.summary.summarizer.SummaryAttemptError.parsed -- **Output to**: src.summary.summarizer.map, src.summary.summarizer.SummaryAttemptError.sortedUnique, src.summary.summarizer.groundRecordIdsByDiagnostics, src.summary.summarizer.createConclusionId +### src.cli.parsed +- **Output to**: src.cli.has, src.cli.printHelp -### src.semantic.reranker.validateRetrieval -- **Output to**: src.semantic.reranker.requiredText, src.semantic.reranker.test, src.semantic.reranker.Error +### src.cli.formatWatchEvent +- **Output to**: src.cli.Date, src.cli.toISOString, src.cli.file, src.cli.join, src.cli.change -### src.semantic.reranker.validateGeneration -- **Output to**: src.semantic.reranker.Error, src.semantic.reranker.requiredText, src.semantic.reranker.test +### src.cli.parseDiffMode +- **Output to**: src.cli.optionString, src.cli.toLowerCase, src.cli.Error -### src.semantic.reranker.validateVerdictReason -- **Output to**: src.semantic.reranker.assertSemanticVerdictReason +### src.cli.parseArgs +- **Output to**: src.cli.push, src.cli.slice, src.cli.startsWith, src.cli.split, src.cli.set -### src.operations.subactor.compileSubactorProcessEnvelope -- **Output to**: src.operations.subactor.assertOperationPlan, src.operations.subactor.trim, src.operations.subactor.Error, src.operations.subactor.Map, src.operations.subactor.map +### src.extractors.runtime-cycle.parseCycle +- **Output to**: src.extractors.runtime-cycle.parse, src.extractors.runtime-cycle.Error, src.extractors.runtime-cycle.JSON, src.extractors.runtime-cycle.String, src.extractors.runtime-cycle.isArray -### src.llm.structured-schema.StructuredResponseError.parse -- **Output to**: src.llm.structured-schema.validate +### src.extractors.configuration.format +- **Output to**: src.extractors.configuration.buildRecord, src.extractors.configuration.join, src.extractors.configuration.trim -### src.llm.structured-schema.StructuredResponseError.parsed -- **Output to**: src.llm.structured-schema.map, src.llm.structured-schema.StructuredResponseError.parse +### src.extractors.configuration.configurationFormat +- **Output to**: src.extractors.configuration.basename, src.extractors.configuration.toLowerCase, src.extractors.configuration.startsWith, src.extractors.configuration.endsWith -### src.llm.openrouter.OpenRouterClient.formatInvalidModelError -- **Output to**: src.llm.openrouter.models, src.llm.openrouter.n, src.llm.openrouter.map, src.llm.openrouter.join +### src.extractors.configuration.parsed +- **Output to**: src.extractors.configuration.keys, src.extractors.configuration.sort, src.extractors.configuration.map, src.extractors.configuration.findKeyLine -### src.llm.openrouter.OpenRouterClient.parseJsonContent -- **Output to**: src.llm.openrouter.trim, src.llm.openrouter.replace, src.llm.openrouter.parse, src.llm.openrouter.indexOf, src.llm.openrouter.lastIndexOf +### src.extractors.docs-deterministic.convertDocument +- **Output to**: src.extractors.docs-deterministic.relativePosix, src.extractors.docs-deterministic.split, src.extractors.docs-deterministic.handleDocumentationLine, src.extractors.docs-deterministic.push -### src.llm.openrouter.OpenRouterClient.parseJsonResponse -- **Output to**: src.llm.openrouter.OpenRouterClient.responseMetadata, src.llm.openrouter.OpenRouterClient.extractContent, src.llm.openrouter.String, src.llm.openrouter.StructuredResponseError +### src.extractors.docs-deterministic.parseFenceBlock +- **Output to**: src.extractors.docs-deterministic.match, src.extractors.docs-deterministic.trim, src.extractors.docs-deterministic.codeBlockRecord, src.extractors.docs-deterministic.startsWith, src.extractors.docs-deterministic.slice -### src.interfaces.mcp.parsed -- **Output to**: src.interfaces.mcp.send +### src.extractors.docs-deterministic.parseSectionHeading +- **Output to**: src.extractors.docs-deterministic.match, src.extractors.docs-deterministic.trim, src.extractors.docs-deterministic.splice, src.extractors.docs-deterministic.statementRecord -### src.interfaces.mcp.validateModernRequest -- **Output to**: src.interfaces.mcp.McpRequestError, src.interfaces.mcp.isArray, src.interfaces.mcp.validateModernMetadata +### src.extractors.docs-deterministic.parseBulletStatement +- **Output to**: src.extractors.docs-deterministic.match, src.extractors.docs-deterministic.readListBlock, src.extractors.docs-deterministic.qualifyingStatement -### src.interfaces.mcp.validateModernMetadata -- **Output to**: src.interfaces.mcp.McpRequestError, src.interfaces.mcp.isArray +### src.extractors.docs-deterministic.parseParagraphStatement +- **Output to**: src.extractors.docs-deterministic.trim, src.extractors.docs-deterministic.readParagraph, src.extractors.docs-deterministic.qualifyingStatement -### src.interfaces.mcp.parseRequestLine +### src.extractors.markdown-llm-helpers.MarkdownAttemptError.validateEnrichments +- **Output to**: src.extractors.markdown-llm-helpers.isArray, src.extractors.markdown-llm-helpers.Error, src.extractors.markdown-llm-helpers.Set, src.extractors.markdown-llm-helpers.map, src.extractors.markdown-llm-helpers.has -### src.interfaces.a2a.parseRpcRequest -- **Output to**: src.interfaces.a2a.parse, src.interfaces.a2a.readBody, src.interfaces.a2a.sendJson, src.interfaces.a2a.rpcError, src.interfaces.a2a.errorMessage +### src.extractors.communication-helpers.parseEnvelope +- **Output to**: src.extractors.communication-helpers.split, src.extractors.communication-helpers.trim, src.extractors.communication-helpers.slice, src.extractors.communication-helpers.findIndex, src.extractors.communication-helpers.match -### src.interfaces.a2a-types.BodyTooLargeError.parsed -- **Output to**: src.interfaces.a2a-types.isInteger, src.interfaces.a2a-types.A2ARequestError +### src.extractors.communication-helpers.parsed -### src.interfaces.a2a-task-store.encodeCursor -- **Output to**: src.interfaces.a2a-task-store.from, src.interfaces.a2a-task-store.stringify, src.interfaces.a2a-task-store.toString +### src.extractors.git.processDiscoveryDirectory +- **Output to**: src.extractors.git.join, src.extractors.git.resolveDiscoveryPrefix, src.extractors.git.gitMarkerState, src.extractors.git.push, src.extractors.git.registerDiscoveredRepository -### src.interfaces.a2a-task-store.decodeCursor -- **Output to**: src.interfaces.a2a-task-store.parse, src.interfaces.a2a-task-store.from, src.interfaces.a2a-task-store.toString, src.interfaces.a2a-task-store.isFinite, src.interfaces.a2a-task-store.Error +### src.extractors.ast.external.parsed +- **Output to**: src.extractors.ast.external.adapterRecords -### src.interfaces.a2a-task-store.decoded -- **Output to**: src.interfaces.a2a-task-store.isFinite, src.interfaces.a2a-task-store.parse, src.interfaces.a2a-task-store.Error +### src.services.actions.parseCommunicationGraphFilter +- **Output to**: src.services.actions.stringValue, src.services.actions.toLowerCase, src.services.actions.booleanValue ## Behavioral Patterns @@ -437,50 +437,55 @@ Key functions that process and transform data: - **Confidence**: 0.90 - **Functions**: python.ast_extract.dotted_name +### state_machine_GovernedIntakeService +- **Type**: state_machine +- **Confidence**: 0.70 +- **Functions**: src.communication.intake-service.GovernedIntakeService.command, src.communication.intake-service.GovernedIntakeService.duplicate, src.communication.intake-service.GovernedIntakeService.state, src.communication.intake-service.GovernedIntakeService.actor, src.communication.intake-service.GovernedIntakeService.event + ## Public API Surface Functions exposed as public API (no underscore prefix): -- `src.services.actions.executeAction` - 65 calls -- `src.services.actions.root` - 64 calls - `sdk.python.examples.basic.main` - 62 calls -- `src.pipeline.run.runPipeline` - 54 calls -- `src.cli.main` - 44 calls -- `src.extractors.ast.typescript.extractTypeScriptFile` - 44 calls -- `src.extractors.communication.extractCommunicationIntent` - 43 calls - `scripts.research.rank-intent-graph-embeddings.main` - 43 calls -- `src.web.diff-ui.diffUiHtml` - 42 calls - `src.comparison.workspace.compareWorkspaceIntent` - 40 calls -- `src.extractors.communication.identityRegistry` - 37 calls -- `src.extractors.communication.communicationFiles` - 37 calls - `sdk.rust.src.client.parse_http_response` - 37 calls -- `src.synthesis.code-change-plan.applyCodeChangeSourcePatch` - 35 calls -- `src.communication.analyzer.analyzeCommunication` - 35 calls -- `src.synthesis.code-change-plan.proposeCodeChangePlans` - 34 calls - `sdk.rust.examples.basic.run` - 33 calls -- `src.graph.diagnostics.diagnoseGraph` - 32 calls -- `src.interfaces.a2a-message.parseCommand` - 31 calls -- `src.core.text.inferObject` - 31 calls +- `src.pipeline.run.executePipeline` - 31 calls - `scripts.research.evaluate-embedding-pairs.main` - 30 calls -- `src.core.text.normalized` - 29 calls -- `src.operations.validation.assertOperationPlan` - 28 calls -- `src.synthesis.code-change-plan.assertCodeChangeSourcePatch` - 26 calls -- `src.extractors.ast.typescript.visit` - 26 calls +- `src.interfaces.intake_cli.main` - 29 calls - `src.comparison.workspace.temporaryParent` - 25 calls - `src.comparison.workspace.baseWorktree` - 25 calls - `sdk.go.examples.basic.main.run` - 25 calls - `src.extractors.todo.extractTodo` - 24 calls +- `src.interfaces.a2a-message-command.looksLikeJson` - 24 calls - `scripts.verify-env-contract.makefile` - 24 calls - `python.ast_extract.main` - 24 calls -- `src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited` - 23 calls -- `src.graph.linker.linkIntentRecords` - 22 calls +- `src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited` - 23 calls - `src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited` - 22 calls +- `src.graph.linker.linkIntentRecords` - 22 calls - `scripts.live-model-comparison.main` - 22 calls -- `src.semantic.reranker.assertSemanticRerankResult` - 21 calls -- `src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited` - 21 calls -- `src.extractors.git.extractGitIntent` - 21 calls +- `rust-ast.src.main.main` - 21 calls +- `src.extractors.git.extractRepositoryGitIntent` - 21 calls +- `python.ast_extract.iter_python_files` - 21 calls - `sdk.typescript.examples.basic.baseUrl` - 21 calls - `sdk.typescript.examples.basic.token` - 21 calls +- `sdk.typescript.examples.basic.root` - 21 calls +- `sdk.typescript.examples.basic.main` - 21 calls +- `sdk.python.todo2code.runtime.TypeScriptRuntime.reality` - 21 calls +- `rust-ast.src.main.collect_files` - 20 calls +- `src.extractors.nl.extractNlIntent` - 20 calls +- `src.extractors.ast.extractAstIntent` - 20 calls +- `src.extractors.todo.body` - 20 calls +- `src.extractors.todo.relative` - 20 calls +- `src.extractors.todo.lines` - 20 calls +- `src.synthesis.todo-patch.createTodoPatch` - 20 calls +- `src.synthesis.todo-patch.applyTodoPatch` - 20 calls +- `src.communication.intake-service.GovernedIntakeService.validateProjection` - 20 calls +- `src.extractors.changelog.extractChangelog` - 19 calls +- `src.graph.diff.diffIntentGraphs` - 19 calls +- `php.ast_extract.parseFile` - 19 calls +- `src.cli.handleCommunication` - 18 calls ## System Interactions @@ -488,36 +493,36 @@ How components interact: ```mermaid graph TD - executeAction --> resolveRoot - executeAction --> scopedPath - executeAction --> extractNlIntentAudit - executeAction --> nlModeValue - executeAction --> extractGitIntent - root --> scopedPath - root --> extractNlIntentAudit - root --> nlModeValue - root --> extractGitIntent - root --> numberValue main --> get main --> T2CClient main --> print - runPipeline --> resolve - runPipeline --> pathExists - runPipeline --> Error - runPipeline --> newRunId - runPipeline --> join - extractTypeScriptFil --> relativePosix - extractTypeScriptFil --> createSourceFile - extractTypeScriptFil --> scriptKind - extractTypeScriptFil --> getLineAndCharacterO - extractTypeScriptFil --> getStart - extractCommunication --> resolve - extractCommunication --> assertPathWithinRoot - extractCommunication --> pathExists - extractCommunication --> relativePosix - extractCommunication --> walkFiles main --> parse_args main --> read_bytes + main --> loads + main --> sorted + compareWorkspaceInte --> resolve + compareWorkspaceInte --> git + compareWorkspaceInte --> trim + compareWorkspaceInte --> relative + compareWorkspaceInte --> startsWith + main --> list + main --> monotonic + main --> SentenceTransformer + main --> ArgumentParser + main --> add_subparsers + main --> add_parser + main --> add_argument + temporaryParent --> git + temporaryParent --> join + temporaryParent --> commonPipelineOption + temporaryParent --> optionsForRoot + temporaryParent --> runPipeline + baseWorktree --> git + baseWorktree --> join + baseWorktree --> commonPipelineOption + baseWorktree --> optionsForRoot + baseWorktree --> runPipeline + extractTodo --> resolve ``` ## Reverse Engineering Guidelines diff --git a/project/evolution.toon.yaml b/project/evolution.toon.yaml index f414e49..78036dd 100644 --- a/project/evolution.toon.yaml +++ b/project/evolution.toon.yaml @@ -1,58 +1,58 @@ -# code2llm/evolution | 2976 func | 118f | 2026-08-01 +# code2llm/evolution | 3812 func | 162f | 2026-08-04 # generated in 0.01s NEXT[10] (ranked by impact): - [1] !! SPLIT src/synthesis/code-change-plan.ts - WHY: 1310L, 10 classes, max CC=47 - EFFORT: ~4h IMPACT: 61570 + [1] !! SPLIT src/cli.ts + WHY: 942L, 1 classes, max CC=13 + EFFORT: ~4h IMPACT: 12246 - [2] !! SPLIT src/core/schema.ts - WHY: 922L, 4 classes, max CC=23 - EFFORT: ~4h IMPACT: 21206 + [2] !! SPLIT src/services/actions.ts + WHY: 806L, 1 classes, max CC=13 + EFFORT: ~4h IMPACT: 10478 - [3] !! SPLIT-FUNC executeAction CC=83 fan=65 - WHY: CC=83 exceeds 15 - EFFORT: ~1h IMPACT: 5395 + [3] !! SPLIT-FUNC parseFile CC=38 fan=19 + WHY: CC=38 exceeds 15 + EFFORT: ~1h IMPACT: 722 - [4] !! SPLIT-FUNC root CC=83 fan=64 - WHY: CC=83 exceeds 15 - EFFORT: ~1h IMPACT: 5312 + [4] ! SPLIT-FUNC Client.parse_http_response CC=18 fan=37 + WHY: CC=18 exceeds 15 + EFFORT: ~1h IMPACT: 666 - [5] !! SPLIT-FUNC main CC=95 fan=44 - WHY: CC=95 exceeds 15 - EFFORT: ~1h IMPACT: 4180 + [5] ! SPLIT-FUNC executePipeline CC=20 fan=31 + WHY: CC=20 exceeds 15 + EFFORT: ~1h IMPACT: 620 - [6] !! SPLIT-FUNC extractCommunicationIntent CC=76 fan=43 - WHY: CC=76 exceeds 15 - EFFORT: ~1h IMPACT: 3268 + [6] ! SPLIT-FUNC looksLikeJson CC=20 fan=24 + WHY: CC=20 exceeds 15 + EFFORT: ~1h IMPACT: 480 - [7] !! SPLIT-FUNC runPipeline CC=53 fan=54 - WHY: CC=53 exceeds 15 - EFFORT: ~1h IMPACT: 2862 + [7] ! SPLIT-FUNC validateOperationStep CC=23 fan=13 + WHY: CC=23 exceeds 15 + EFFORT: ~1h IMPACT: 299 - [8] !! SPLIT-FUNC identityRegistry CC=72 fan=37 - WHY: CC=72 exceeds 15 - EFFORT: ~1h IMPACT: 2664 + [8] ! SPLIT-FUNC iter_python_files CC=16 fan=15 + WHY: CC=16 exceeds 15 + EFFORT: ~1h IMPACT: 240 - [9] !! SPLIT-FUNC communicationFiles CC=72 fan=37 - WHY: CC=72 exceeds 15 - EFFORT: ~1h IMPACT: 2664 + [9] ! SPLIT-FUNC persistFailedRunState CC=19 fan=12 + WHY: CC=19 exceeds 15 + EFFORT: ~1h IMPACT: 228 - [10] !! SPLIT-FUNC assertOperationPlan CC=84 fan=28 - WHY: CC=84 exceeds 15 - EFFORT: ~1h IMPACT: 2352 + [10] ! SPLIT-FUNC collectAgentActionIssues CC=15 fan=15 + WHY: CC=15 exceeds 15 + EFFORT: ~1h IMPACT: 225 RISKS[3]: ⚠ Splitting evaluation/gold/v2/dataset.json may break 0 import paths - ⚠ Splitting src/synthesis/code-change-plan.ts may break 127 import paths - ⚠ Splitting src/core/schema.ts may break 124 import paths + ⚠ Splitting src/cli.ts may break 124 import paths + ⚠ Splitting src/services/actions.ts may break 106 import paths METRICS-TARGET: - CCΜ„: 4.0 β†’ ≀2.8 - max-CC: 95 β†’ ≀20 - god-modules: 19 β†’ 0 - high-CC(β‰₯15): 109 β†’ ≀54 + CCΜ„: 3.0 β†’ ≀2.1 + max-CC: 38 β†’ ≀19 + god-modules: 10 β†’ 0 + high-CC(β‰₯15): 14 β†’ ≀7 hub-types: 0 β†’ ≀0 PATTERNS (language parser shared logic): @@ -80,4 +80,4 @@ PATTERNS (language parser shared logic): - Standardized FunctionInfo/ClassInfo models HISTORY: - (first run β€” no previous data) + prev CCΜ„=3.0 β†’ now CCΜ„=3.0 diff --git a/project/flow.mmd b/project/flow.mmd index a8550c2..eb3602f 100644 --- a/project/flow.mmd +++ b/project/flow.mmd @@ -10,36 +10,39 @@ flowchart TD src__cli__parsed["parsed"] src__cli__command["command"] src__cli__config["config"] + src__cli__handler["handler"] + src__cli__commandHandlers["commandHandlers"] + src__cli__resolveMainCommand["resolveMainCommand"] + src__cli__handleLink["handleLink"] src__cli__files["files"] src__cli__records["records"] src__cli__graph["graph"] + src__cli__handleDiagnose["handleDiagnose"] src__cli__graphFile["graphFile"] - src__cli__diagnosticsPath["diagnosticsPath"] - src__cli__diagnostics["diagnostics"] - src__cli__result["result"] - src__cli__out["out"] - src__cli__graphPath["graphPath"] - src__cli__output["output"] - ...["+68 more"] + src__cli__handleSummarize["handleSummarize"] + ...["+109 more"] end subgraph Core - src__web__diff_ui__diffUiHtml["diffUiHtml"] - src__web__diff_ui__compareGraphs{{compareGraphs CC=15}} - src__watch__watcher__maxFiles["maxFiles"] - src__watch__watcher__absoluteRoot["absoluteRoot"] - src__watch__watcher__absolute["absolute"] - src__watch__watcher__previous["previous"] - src__watch__watcher__shown["shown"] - src__watch__watcher__rest["rest"] - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS["DEFAULT_MIN_INTERVAL_MS"] - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS["DEFAULT_SCAN_INTERVAL_MS"] - src__watch__watcher__watchRepository["watchRepository"] - src__watch__watcher__root["root"] - src__watch__watcher__minIntervalMs["minIntervalMs"] - src__watch__watcher__scanIntervalMs["scanIntervalMs"] - src__watch__watcher__signal["signal"] - ...["+2130 more"] + project__install_project_package["install_project_package"] + project__cleanup_analysis_snapshot["cleanup_analysis_snapshot"] + project__run_analysis_tool["run_analysis_tool"] + rust_ast__src__main__main["main"] + rust_ast__src__main__new["new"] + rust_ast__src__main__visit_item_mod["visit_item_mod"] + rust_ast__src__main__visit_item_use["visit_item_use"] + rust_ast__src__main__visit_item_struct["visit_item_struct"] + rust_ast__src__main__visit_item_enum["visit_item_enum"] + rust_ast__src__main__visit_item_trait["visit_item_trait"] + rust_ast__src__main__visit_item_type["visit_item_type"] + rust_ast__src__main__visit_item_const["visit_item_const"] + rust_ast__src__main__visit_item_static["visit_item_static"] + rust_ast__src__main__visit_item_fn["visit_item_fn"] + rust_ast__src__main__visit_item_impl["visit_item_impl"] + ...["+2517 more"] end - class src__cli__execFileAsync,src__cli__main,src__cli__parsed,src__cli__command,src__cli__config,src__cli__files,src__cli__records,src__cli__graph,src__cli__graphFile,src__cli__diagnosticsPath entry + subgraph Exporters + end + + class project__install_project_package,project__cleanup_analysis_snapshot,project__run_analysis_tool,rust_ast__src__main__main,rust_ast__src__main__new,rust_ast__src__main__visit_item_mod,rust_ast__src__main__visit_item_use,rust_ast__src__main__visit_item_struct,rust_ast__src__main__visit_item_enum,rust_ast__src__main__visit_item_trait entry diff --git a/project/flow.png b/project/flow.png index be26b36..64ba21e 100644 Binary files a/project/flow.png and b/project/flow.png differ diff --git a/project/index.html b/project/index.html index 3fe6ec7..06244c2 100644 --- a/project/index.html +++ b/project/index.html @@ -1,5 +1,5 @@ - + @@ -481,7 +481,7 @@

Analysis Results

// Initialize mermaid mermaid.initialize({ startOnLoad: false, theme: 'dark' }); - const files = [{"name": "calls.png", "rel_path": "calls.png", "path": "calls.png", "size": "132.2KB", "icon": "πŸ–ΌοΈ", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "compact_flow.png", "rel_path": "compact_flow.png", "path": "compact_flow.png", "size": "23.3KB", "icon": "πŸ–ΌοΈ", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "flow.png", "rel_path": "flow.png", "path": "flow.png", "size": "16.9KB", "icon": "πŸ–ΌοΈ", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "README.md", "rel_path": "README.md", "path": "README.md", "size": "9.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# code2llm - Generated Analysis Files\n\n\nThis directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase. # noqa: E501\n\n## πŸ“ Generated Files Overview\n\nWhen you run `code2llm ./ -f all`, the following files are created:\n\n### 🎯 Core Analysis Files\n\n| File | Format | Purpose | Key Insights |\n|------|--------|---------|--------------|\n| `evolution.toon.yaml` | **YAML** | **πŸ“‹ Refactoring queue** - Prioritized improvements | 0 refactoring actions needed |\n| `map.toon.yaml` | **YAML** | **πŸ—ΊοΈ Structural map + project header** - Modules, imports, exports, signatures, stats, alerts, hotspots, trend | Project architecture overview |\n\n### πŸ€– LLM-Ready Documentation\n\n| File | Format | Purpose | Use Case |\n|------|--------|---------|----------|\n| `prompt.txt` | **Text** | **πŸ“ Ready-to-send prompt** - Lists all files with instructions | Attach to LLM conversation as context guide |\n| `context.md` | **Markdown** | **πŸ“– LLM narrative** - Architecture summary | Paste into ChatGPT/Claude for code analysis |\n\n### πŸ“Š Visualizations\n\n| File | Format | Purpose | Description |\n|------|--------|---------|-------------|\n| `flow.mmd` | **Mermaid** | **πŸ”„ Control flow diagram** | Function call paths with complexity styling |\n| `calls.mmd` | **Mermaid** | **πŸ“ž Call graph** | Function dependencies (edges only) |\n| `compact_flow.mmd` | **Mermaid** | **πŸ“¦ Module overview** | Aggregated module-level view |\n\n## πŸš€ Quick Start Commands\n\n### Basic Analysis\n```bash\n# Quick health check (TOON format only)\ncode2llm ./ -f toon\n\n# Generate all formats (what created these files)\ncode2llm ./ -f all\n\n# LLM-ready context only\ncode2llm ./ -f context\n```\n\n### Performance Options\n```bash\n# Fast analysis for large projects\ncode2llm ./ -f toon --strategy quick\n\n# Memory-limited analysis\ncode2llm ./ -f all --max-memory 500\n\n# Skip PNG generation (faster)\ncode2llm ./ -f all --no-png\n```\n\n### Refactoring Focus\n```bash\n# Get refactoring recommendations\ncode2llm ./ -f evolution\n\n# Focus on specific code smells\ncode2llm ./ -f toon --refactor --smell god_function\n\n# Data flow analysis\ncode2llm ./ -f flow --data-flow\n```\n\n## πŸ“– Understanding Each File\n\n### `analysis.toon` - Health Diagnostics\n**Purpose**: Quick overview of code health issues\n**Key sections**:\n- **HEALTH**: Critical issues (πŸ”΄) and warnings (🟑)\n- **REFACTOR**: Prioritized refactoring actions\n- **COUPLING**: Module dependencies and potential cycles\n- **LAYERS**: Package complexity metrics\n- **FUNCTIONS**: High-complexity functions (CC β‰₯ 10)\n- **CLASSES**: Complex classes needing attention\n\n**Example usage**:\n```bash\n# View health issues\ncat analysis.toon | head -30\n\n# Check refactoring priorities\ngrep \"REFACTOR\" analysis.toon\n```\n\n### `evolution.toon.yaml` - Refactoring Queue\n**Purpose**: Step-by-step refactoring plan\n**Key sections**:\n- **NEXT**: Immediate actions to take\n- **RISKS**: Potential breaking changes\n- **METRICS-TARGET**: Success criteria\n\n**Example usage**:\n```bash\n# Get refactoring plan\ncat evolution.toon.yaml\n\n# Track progress\ngrep \"NEXT\" evolution.toon.yaml\n```\n\n### `flow.toon` - Legacy Data Flow Analysis\n**Purpose**: Understand data movement through the system (legacy / explicit opt-in)\n**Key sections**:\n- **PIPELINES**: Data processing chains\n- **CONTRACTS**: Function input/output contracts\n- **SIDE_EFFECTS**: Functions with external impacts\n\n**Example usage**:\n```bash\n# Find data pipelines\ngrep \"PIPELINES\" flow.toon\n\n# Identify side effects\ngrep \"SIDE_EFFECTS\" flow.toon\n```\n\n### `map.toon.yaml` - Structural Map + Project Header\n**Purpose**: High-level architecture overview plus compact project header\n**Key sections**:\n- **MODULES**: All modules with basic stats\n- **IMPORTS**: Dependency relationships\n- **EXPORTS**: Public API surface and signatures\n- **HEADER**: Stats, alerts, hotspots, evolution trend\n\n**Example usage**:\n```bash\n# See project structure\ncat map.toon.yaml | head -50\n\n# Find public APIs\ngrep \"SIGNATURES\" map.toon.yaml\n```\n\n### `project.toon.yaml` - Compact Analysis View\n**Purpose**: Compact module view generated from project.yaml data\n**Status**: Legacy view generated on demand from unified project.yaml\n\n**Example usage**:\n```bash\n# View compact project structure\ncat project.toon.yaml | head -30\n\n# Find largest files\ngrep -E \"^ .*[0-9]{3,}$\" project.toon.yaml | sort -t',' -k2 -n -r | head -10\n```\n\n### `prompt.txt` - Ready-to-Send LLM Prompt\n**Purpose**: Pre-formatted prompt listing all generated files for LLM conversation\n**Generation**: Written when `code2llm` runs with a source path and requests `-f all` (including `--no-chunk`) or `code2logic` # noqa: E501\n**Contents**:\n- **Files section**: Lists all existing generated files with descriptions, including `project.toon.yaml` when generated by `-f all` # noqa: E501\n- **Source files section**: Highlights important source files such as `cli_exports/orchestrator.py`\n- **Missing section**: Shows which files weren't generated (if any)\n- **Task section**: Refactoring brief with concrete execution instructions, not just analysis\n- **Priority Order section**: State-dependent refactoring priorities, starting with blockers and then architecture cleanup # noqa: E501\n- **Requirements section**: Guidelines for suggested changes\n\n**Example usage**:\n```bash\n# View the prompt\ncat prompt.txt\n\n# Copy to clipboard and paste into ChatGPT/Claude\ncat prompt.txt | pbcopy # macOS\ncat prompt.txt | xclip -sel clip # Linux\n```\n\n### `context.md` - LLM Narrative\n**Purpose**: Ready-to-paste context for AI assistants\n**Key sections**:\n- **Overview**: Project statistics\n- **Architecture**: Module breakdown\n- **Entry Points**: Public interfaces\n- **Patterns**: Design patterns detected\n\n**Example usage**:\n```bash\n# Copy to clipboard for LLM\ncat context.md | pbcopy # macOS\ncat context.md | xclip -sel clip # Linux\n\n# Use with Claude/ChatGPT for code analysis\n```\n\n### Visualization Files (`*.mmd`, `*.png`)\n**Purpose**: Visual understanding of code structure\n**Files**:\n- `flow.mmd` - Detailed control flow with complexity colors\n- `calls.mmd` - Simple call graph\n- `compact_flow.mmd` - High-level module view\n- `*.png` - Pre-rendered images\n\n**Example usage**:\n```bash\n# View diagrams\nopen flow.png # macOS\nxdg-open flow.png # Linux\n\n# Edit in Mermaid Live Editor\n# Copy content of .mmd files to https://mermaid.live\n```\n\n## πŸ” Common Analysis Patterns\n\n### 1. Code Health Assessment\n```bash\n# Quick health check\ncode2llm ./ -f toon\ncat analysis.toon | grep -E \"(HEALTH|REFACTOR)\"\n```\n\n### 2. Refactoring Planning\n```bash\n# Get refactoring queue\ncode2llm ./ -f evolution\ncat evolution.toon.yaml\n\n# Focus on specific issues\ncode2llm ./ -f toon --refactor --smell god_function\n```\n\n### 3. LLM Assistance\n```bash\n# Generate context for AI\ncode2llm ./ -f context\ncat context.md\n\n# Use with Claude: \"Based on this context, help me refactor the god modules\"\n```\n\n### 4. Team Documentation\n```bash\n# Generate all docs for team\ncode2llm ./ -f all -o ./docs/\n\n# Create visual diagrams\nopen docs/flow.png\n```\n\n## πŸ“Š Interpreting Metrics\n\n### Complexity Metrics (CC)\n- **πŸ”΄ Critical (β‰₯5.0)**: Immediate refactoring needed\n- **🟠 High (3.0-4.9)**: Consider refactoring\n- **🟑 Medium (1.5-2.9)**: Monitor complexity\n- **🟒 Low (0.1-1.4)**: Acceptable\n- **βšͺ Basic (0.0)**: Simple functions\n\n### Module Health\n- **GOD Module**: Too large (>500 lines, >20 methods)\n- **HUB**: High fan-out (calls many modules)\n- **FAN-IN**: High incoming dependencies\n- **CYCLES**: Circular dependencies\n\n### Data Flow Indicators\n- **PIPELINE**: Sequential data processing\n- **CONTRACT**: Clear input/output specification\n- **SIDE_EFFECT**: External state modification\n\n## πŸ› οΈ Integration Examples\n\n### CI/CD Pipeline\n```bash\n#!/bin/bash\n# Analyze code quality in CI\ncode2llm ./ -f toon -o ./analysis\nif grep -q \"πŸ”΄ GOD\" ./analysis/analysis.toon; then\n echo \"❌ God modules detected\"\n exit 1\nfi\n```\n\n### Pre-commit Hook\n```bash\n#!/bin/sh\n# .git/hooks/pre-commit\ncode2llm ./ -f toon -o ./temp_analysis\nif grep -q \"πŸ”΄\" ./temp_analysis/analysis.toon; then\n echo \"⚠️ Critical issues found. Review before committing.\"\nfi\nrm -rf ./temp_analysis\n```\n\n### Documentation Generation\n```bash\n# Generate docs for README\ncode2llm ./ -f context -o ./docs/\necho \"## Architecture\" >> README.md\ncat docs/context.md >> README.md\n```\n\n## πŸ“š Next Steps\n\n1. **Review `analysis.toon`** - Identify critical issues\n2. **Check `evolution.toon.yaml`** - Plan refactoring priorities\n3. **Use `context.md`** - Get LLM assistance for complex changes\n4. **Reference visualizations** - Understand system architecture\n5. **Track progress** - Re-run analysis after changes\n\n## πŸ”§ Advanced Usage\n\n### Custom Analysis\n```bash\n# Deep analysis with all insights\ncode2llm ./ -m hybrid -f all --max-depth 15 -v\n\n# Performance-optimized\ncode2llm ./ -m static -f toon --strategy quick\n\n# Refactoring-focused\ncode2llm ./ -f toon,evolution --refactor\n```\n\n### Output Customization\n```bash\n# Separate output directories\ncode2llm ./ -f all -o ./analysis-$(date +%Y%m%d)\n\n# Split YAML into multiple files\ncode2llm ./ -f yaml --split-output\n\n# Separate orphaned functions\ncode2llm ./ -f yaml --separate-orphans\n```\n\n---\n\n**Generated by**: `code2llm ./ -f all --readme` \n**Analysis Date**: 2026-08-01 \n**Total Functions**: 3285 \n**Total Classes**: 348 \n**Modules**: 262 \n\nFor more information about code2llm, visit: https://github.com/tom-sapletta/code2llm\n", "is_subdir": false}, {"name": "context.md", "rel_path": "context.md", "path": "context.md", "size": "33.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# System Architecture Analysis\n\n\n## Overview\n\n- **Project**: \n- **Primary Language**: typescript\n- **Languages**: typescript: 117, md: 52, json: 32, python: 15, javascript: 15\n- **Analysis Mode**: static\n- **Total Functions**: 3285\n- **Total Classes**: 348\n- **Modules**: 262\n- **Entry Points**: 2336\n\n## Architecture by Module\n\n### src.cli\n- **Functions**: 152\n- **Classes**: 1\n- **File**: `cli.ts`\n\n### src.core.schema\n- **Functions**: 151\n- **Classes**: 4\n- **File**: `schema.ts`\n\n### src.synthesis.code-change-plan\n- **Functions**: 148\n- **Classes**: 10\n- **File**: `code-change-plan.ts`\n\n### src.services.actions\n- **Functions**: 113\n- **File**: `actions.ts`\n\n### src.interfaces.a2a-task-store\n- **Functions**: 92\n- **Classes**: 3\n- **File**: `a2a-task-store.ts`\n\n### src.communication.analyzer\n- **Functions**: 79\n- **Classes**: 3\n- **File**: `analyzer.ts`\n\n### src.diff.reality\n- **Functions**: 77\n- **Classes**: 3\n- **File**: `reality.ts`\n\n### src.graph.linker\n- **Functions**: 75\n- **Classes**: 4\n- **File**: `linker.ts`\n\n### src.extractors.communication\n- **Functions**: 75\n- **Classes**: 4\n- **File**: `communication.ts`\n\n### src.pipeline.run\n- **Functions**: 64\n- **Classes**: 1\n- **File**: `run.ts`\n\n### src.evaluation.gold-cases\n- **Functions**: 57\n- **Classes**: 4\n- **File**: `gold-cases.ts`\n\n### src.core.text\n- **Functions**: 56\n- **File**: `text.ts`\n\n### src.comparison.workspace\n- **Functions**: 55\n- **Classes**: 3\n- **File**: `workspace.ts`\n\n### src.communication.llm\n- **Functions**: 55\n- **Classes**: 8\n- **File**: `llm.ts`\n\n### src.synthesis.todo-patch\n- **Functions**: 53\n- **Classes**: 5\n- **File**: `todo-patch.ts`\n\n### src.diff.text\n- **Functions**: 53\n- **Classes**: 1\n- **File**: `text.ts`\n\n### src.llm.openrouter\n- **Functions**: 49\n- **Classes**: 7\n- **File**: `openrouter.ts`\n\n### sdk.typescript.src\n- **Functions**: 48\n- **Classes**: 14\n- **File**: `index.ts`\n\n### src.operations.validation\n- **Functions**: 47\n- **File**: `validation.ts`\n\n### src.interfaces.a2a\n- **Functions**: 46\n- **File**: `a2a.ts`\n\n## Key Entry Points\n\nMain execution flows into the system:\n\n### src.services.actions.executeAction\n- **Calls**: src.services.actions.resolveRoot, src.services.actions.scopedPath, src.services.actions.extractNlIntentAudited, src.services.actions.nlModeValue, src.services.actions.extractGitIntent, src.services.actions.numberValue, src.services.actions.extractAstIntent, src.services.actions.extractConfigurationIntent\n\n### src.services.actions.root\n- **Calls**: src.services.actions.scopedPath, src.services.actions.extractNlIntentAudited, src.services.actions.nlModeValue, src.services.actions.extractGitIntent, src.services.actions.numberValue, src.services.actions.extractAstIntent, src.services.actions.extractConfigurationIntent, src.services.actions.extractMarkdownIntentAudited\n\n### sdk.python.examples.basic.main\n- **Calls**: os.environ.get, os.environ.get, os.environ.get, T2CClient, print, client.agent_card, print, client.extract_nl_result\n\n### src.pipeline.run.runPipeline\n- **Calls**: src.pipeline.run.resolve, src.pipeline.run.pathExists, src.pipeline.run.Error, src.pipeline.run.newRunId, src.pipeline.run.join, src.pipeline.run.ensureDir, src.pipeline.run.skippedAudit, src.pipeline.run.extractNlIntentAudited\n\n### src.extractors.ast.typescript.extractTypeScriptFile\n- **Calls**: src.extractors.ast.typescript.relativePosix, src.extractors.ast.typescript.createSourceFile, src.extractors.ast.typescript.scriptKind, src.extractors.ast.typescript.getLineAndCharacterOfPosition, src.extractors.ast.typescript.getStart, src.extractors.ast.typescript.getEnd, src.extractors.ast.typescript.getText, src.extractors.ast.typescript.slice\n\n### src.extractors.communication.extractCommunicationIntent\n- **Calls**: src.extractors.communication.resolve, src.extractors.communication.assertPathWithinRoot, src.extractors.communication.pathExists, src.extractors.communication.relativePosix, src.extractors.communication.walkFiles, src.extractors.communication.loadParticipantIdentityRegistry, src.extractors.communication.split, src.extractors.communication.toLowerCase\n\n### scripts.research.rank-intent-graph-embeddings.main\n- **Calls**: scripts.research.rank-intent-graph-embeddings.parse_args, args.graph.read_bytes, json.loads, sorted, sorted, time.monotonic, SentenceTransformer, model.encode\n\n### src.web.diff-ui.diffUiHtml\n- **Calls**: src.web.diff-ui.gradient, src.web.diff-ui.min, src.web.diff-ui.clamp, src.web.diff-ui.not, src.web.diff-ui.media, src.web.diff-ui.token, src.web.diff-ui.getElementById, src.web.diff-ui.byId\n\n### src.comparison.workspace.compareWorkspaceIntent\n- **Calls**: src.comparison.workspace.resolve, src.comparison.workspace.git, src.comparison.workspace.trim, src.comparison.workspace.relative, src.comparison.workspace.startsWith, src.comparison.workspace.isAbsolute, src.comparison.workspace.Error, src.comparison.workspace.scopedOutputDirectory\n\n### src.extractors.communication.identityRegistry\n- **Calls**: src.extractors.communication.relativePosix, src.extractors.communication.split, src.extractors.communication.toLowerCase, src.extractors.communication.readText, src.extractors.communication.push, src.extractors.communication.String, src.extractors.communication.parseEnvelope, src.extractors.communication.inferIdentity\n\n### src.extractors.communication.communicationFiles\n- **Calls**: src.extractors.communication.relativePosix, src.extractors.communication.split, src.extractors.communication.toLowerCase, src.extractors.communication.readText, src.extractors.communication.push, src.extractors.communication.String, src.extractors.communication.parseEnvelope, src.extractors.communication.inferIdentity\n\n### src.synthesis.code-change-plan.applyCodeChangeSourcePatch\n- **Calls**: src.synthesis.code-change-plan.assertCodeChangeSourcePatch, src.synthesis.code-change-plan.trim, src.synthesis.code-change-plan.Error, src.synthesis.code-change-plan.resolve, src.synthesis.code-change-plan.assertPathWithinRoot, src.synthesis.code-change-plan.ensureDir, src.synthesis.code-change-plan.dirname, src.synthesis.code-change-plan.open\n\n### src.communication.analyzer.analyzeCommunication\n- **Calls**: src.communication.analyzer.assertIntentGraph, src.communication.analyzer.filter, src.communication.analyzer.validateSyntheses, src.communication.analyzer.evidenceNeighbors, src.communication.analyzer.participantOf, src.communication.analyzer.get, src.communication.analyzer.push, src.communication.analyzer.set\n\n### src.synthesis.code-change-plan.proposeCodeChangePlans\n- **Calls**: src.synthesis.code-change-plan.assertIntentGraph, src.synthesis.code-change-plan.assertConclusions, src.synthesis.code-change-plan.Date, src.synthesis.code-change-plan.toISOString, src.synthesis.code-change-plan.isNaN, src.synthesis.code-change-plan.parse, src.synthesis.code-change-plan.Error, src.synthesis.code-change-plan.isInteger\n\n### src.graph.diagnostics.diagnoseGraph\n- **Calls**: src.graph.diagnostics.Date, src.graph.diagnostics.toISOString, src.graph.diagnostics.assertIntentGraph, src.graph.diagnostics.buildNeighbors, src.graph.diagnostics.Map, src.graph.diagnostics.map, src.graph.diagnostics.indexGroundedImplementationEvidence, src.graph.diagnostics.indexImplementedPaths\n\n### src.interfaces.a2a-message.parseCommand\n- **Calls**: src.interfaces.a2a-message.find, src.interfaces.a2a-message.isRecord, src.interfaces.a2a-message.commandFromData, src.interfaces.a2a-message.map, src.interfaces.a2a-message.join, src.interfaces.a2a-message.trim, src.interfaces.a2a-message.startsWith, src.interfaces.a2a-message.parse\n\n### src.core.text.inferObject\n- **Calls**: src.core.text.replace, src.core.text.trim, src.core.text.b, src.core.text.utworzy, src.core.text.doda, src.core.text.zaimplementowa, src.core.text.stworzy, src.core.text.zbudowa\n\n### scripts.research.evaluate-embedding-pairs.main\n- **Calls**: scripts.research.evaluate-embedding-pairs.parse_args, json.loads, src.synthesis.code-change-plan.list, time.monotonic, SentenceTransformer, model.encode, dict, args.output.write_text\n\n### src.core.text.normalized\n- **Calls**: src.core.text.b, src.core.text.utworzy, src.core.text.doda, src.core.text.zaimplementowa, src.core.text.stworzy, src.core.text.zbudowa, src.core.text.napraw, src.core.text.popraw\n\n### src.operations.validation.assertOperationPlan\n- **Calls**: src.operations.validation.objectValue, src.operations.validation.exactKeys, src.operations.validation.Error, src.operations.validation.test, src.operations.validation.dateString, src.operations.validation.nonBlank, src.operations.validation.uniqueStrings, src.operations.validation.assertGeneration\n\n### src.comparison.workspace.temporaryParent\n- **Calls**: src.comparison.workspace.git, src.comparison.workspace.join, src.comparison.workspace.commonPipelineOptions, src.comparison.workspace.optionsForRoot, src.comparison.workspace.runPipeline, src.comparison.workspace.all, src.comparison.workspace.buildRealityView, src.comparison.workspace.diffIntentGraphs\n\n### src.comparison.workspace.baseWorktree\n- **Calls**: src.comparison.workspace.git, src.comparison.workspace.join, src.comparison.workspace.commonPipelineOptions, src.comparison.workspace.optionsForRoot, src.comparison.workspace.runPipeline, src.comparison.workspace.all, src.comparison.workspace.buildRealityView, src.comparison.workspace.diffIntentGraphs\n\n### src.extractors.todo.extractTodo\n- **Calls**: src.extractors.todo.resolve, src.extractors.todo.pathExists, src.extractors.todo.readText, src.extractors.todo.relativePosix, src.extractors.todo.split, src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim\n\n### scripts.verify-env-contract.makefile\n- **Calls**: scripts.verify-env-contract.readFile, scripts.verify-env-contract.join, scripts.verify-env-contract.matchAll, scripts.verify-env-contract.add, scripts.verify-env-contract.b, scripts.verify-env-contract.filter, scripts.verify-env-contract.has, scripts.verify-env-contract.sort\n\n### python.ast_extract.main\n- **Calls**: argparse.ArgumentParser, parser.add_argument, parser.add_argument, parser.add_argument, parser.parse_args, None.resolve, python.ast_extract.iter_python_files, print\n\n### src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited\n- **Calls**: src.communication.llm.now, src.communication.llm.extractCommunicationIntent, src.communication.llm.CommunicationAttemptError.audit, src.communication.llm.CommunicationAttemptError.markDeterministic, src.communication.llm.CommunicationAttemptError.deterministicSyntheses, src.communication.llm.CommunicationAttemptError.deterministicGeneration, src.communication.llm.OpenRouterClient, src.communication.llm.isConfigured\n\n### src.graph.linker.linkIntentRecords\n- **Calls**: src.graph.linker.Date, src.graph.linker.toISOString, src.graph.linker.assertIntentRecords, src.graph.linker.deduplicateRecords, src.graph.linker.sort, src.graph.linker.localeCompare, src.graph.linker.Map, src.graph.linker.map\n\n### src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited\n- **Calls**: src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.now, src.extractors.nl-llm.extractNlIntent, src.extractors.nl-llm.NlAttemptError.markDeterministic, src.extractors.nl-llm.NlAttemptError.audit, src.extractors.nl-llm.OpenRouterClient, src.extractors.nl-llm.isConfigured, src.extractors.nl-llm.NlAttemptError.fallbackOrThrow\n\n### scripts.live-model-comparison.main\n- **Calls**: scripts.live-model-comparison.loadEnvFile, scripts.live-model-comparison.getConfig, scripts.live-model-comparison.Error, scripts.live-model-comparison.write, scripts.live-model-comparison.SKIPPED, scripts.live-model-comparison.Number, scripts.live-model-comparison.split, scripts.live-model-comparison.map\n\n### src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited\n- **Calls**: src.extractors.markdown-llm.now, src.extractors.markdown-llm.extractMarkdownIntent, src.extractors.markdown-llm.MarkdownAttemptError.stageAudit, src.extractors.markdown-llm.MarkdownAttemptError.markDeterministic, src.extractors.markdown-llm.OpenRouterClient, src.extractors.markdown-llm.isConfigured, src.extractors.markdown-llm.MarkdownAttemptError.fallbackOrThrow, src.extractors.markdown-llm.MarkdownAttemptError.readPrompt\n\n## Process Flows\n\nKey execution flows identified:\n\n### Flow 1: executeAction\n```\nexecuteAction [src.services.actions]\n └─> resolveRoot\n └─> scopedPath\n └─> stringValue\n```\n\n### Flow 2: root\n```\nroot [src.services.actions]\n └─> scopedPath\n └─> stringValue\n```\n\n### Flow 3: main\n```\nmain [sdk.python.examples.basic]\n```\n\n### Flow 4: runPipeline\n```\nrunPipeline [src.pipeline.run]\n```\n\n### Flow 5: extractTypeScriptFile\n```\nextractTypeScriptFile [src.extractors.ast.typescript]\n```\n\n### Flow 6: extractCommunicationIntent\n```\nextractCommunicationIntent [src.extractors.communication]\n```\n\n### Flow 7: diffUiHtml\n```\ndiffUiHtml [src.web.diff-ui]\n```\n\n### Flow 8: compareWorkspaceIntent\n```\ncompareWorkspaceIntent [src.comparison.workspace]\n └─> git\n └─> execFileAsync\n```\n\n### Flow 9: identityRegistry\n```\nidentityRegistry [src.extractors.communication]\n```\n\n### Flow 10: communicationFiles\n```\ncommunicationFiles [src.extractors.communication]\n```\n\n## Key Classes\n\n### src.llm.openrouter.OpenRouterClient\n- **Methods**: 48\n- **Key Methods**: src.llm.openrouter.OpenRouterClient.isConfigured, src.llm.openrouter.OpenRouterClient.listAvailableModels, src.llm.openrouter.OpenRouterClient.controller, src.llm.openrouter.OpenRouterClient.timeout, src.llm.openrouter.OpenRouterClient.response, src.llm.openrouter.OpenRouterClient.text, src.llm.openrouter.OpenRouterClient.clearTimeout, src.llm.openrouter.OpenRouterClient.chatText, src.llm.openrouter.OpenRouterClient.chatTextWithMetadata, src.llm.openrouter.OpenRouterClient.response\n\n### sdk.typescript.src.T2CClient\n- **Methods**: 46\n- **Key Methods**: sdk.typescript.src.T2CClient.health, sdk.typescript.src.T2CClient.agentCard, sdk.typescript.src.T2CClient.send, sdk.typescript.src.T2CClient.result, sdk.typescript.src.T2CClient.call, sdk.typescript.src.T2CClient.task, sdk.typescript.src.T2CClient.detail, sdk.typescript.src.T2CClient.part, sdk.typescript.src.T2CClient.getTask, sdk.typescript.src.T2CClient.cancelTask\n\n### src.communication.llm.CommunicationAttemptError\n- **Methods**: 40\n- **Key Methods**: src.communication.llm.CommunicationAttemptError.super, src.communication.llm.CommunicationAttemptError.enrichWithCorrection, src.communication.llm.CommunicationAttemptError.completion, src.communication.llm.CommunicationAttemptError.fallbackOrThrow, src.communication.llm.CommunicationAttemptError.failed, src.communication.llm.CommunicationAttemptError.marked, src.communication.llm.CommunicationAttemptError.participantGroups, src.communication.llm.CommunicationAttemptError.grouped, src.communication.llm.CommunicationAttemptError.participant, src.communication.llm.CommunicationAttemptError.role\n\n### src.llm.structured-schema.StructuredResponseError\n- **Methods**: 37\n- **Key Methods**: src.llm.structured-schema.StructuredResponseError.super, src.llm.structured-schema.StructuredResponseError.schema, src.llm.structured-schema.StructuredResponseError.parse, src.llm.structured-schema.StructuredResponseError.string, src.llm.structured-schema.StructuredResponseError.pattern, src.llm.structured-schema.StructuredResponseError.fail, src.llm.structured-schema.StructuredResponseError.fail, src.llm.structured-schema.StructuredResponseError.nullableString, src.llm.structured-schema.StructuredResponseError.base, src.llm.structured-schema.StructuredResponseError.number\n\n### sdk.python.todo2code.client.T2CClient\n> Client for the todo2code A2A endpoint.\n\nExample:\n >>> client = T2CClient(\"http://localhost:8787\")\n- **Methods**: 34\n- **Key Methods**: sdk.python.todo2code.client.T2CClient.__init__, sdk.python.todo2code.client.T2CClient._headers, sdk.python.todo2code.client.T2CClient._open, sdk.python.todo2code.client.T2CClient._rpc, sdk.python.todo2code.client.T2CClient._get, sdk.python.todo2code.client.T2CClient.health, sdk.python.todo2code.client.T2CClient.agent_card, sdk.python.todo2code.client.T2CClient.send, sdk.python.todo2code.client.T2CClient.call, sdk.python.todo2code.client.T2CClient.compare_workspace\n\n### src.extractors.nl-llm.NlAttemptError\n- **Methods**: 30\n- **Key Methods**: src.extractors.nl-llm.NlAttemptError.super, src.extractors.nl-llm.NlAttemptError.extractNlWithCorrection, src.extractors.nl-llm.NlAttemptError.completion, src.extractors.nl-llm.NlAttemptError.fallbackOrThrow, src.extractors.nl-llm.NlAttemptError.failedAudit, src.extractors.nl-llm.NlAttemptError.deterministic, src.extractors.nl-llm.NlAttemptError.markDeterministic, src.extractors.nl-llm.NlAttemptError.toIntentRecord, src.extractors.nl-llm.NlAttemptError.start, src.extractors.nl-llm.NlAttemptError.end\n\n### src.semantic.reranker-llm.SemanticRerankerRequiredError\n- **Methods**: 29\n- **Key Methods**: src.semantic.reranker-llm.SemanticRerankerRequiredError.super, src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates, src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet, src.semantic.reranker-llm.SemanticRerankerRequiredError.model, src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision, src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult, src.semantic.reranker-llm.SemanticRerankerRequiredError.client, src.semantic.reranker-llm.SemanticRerankerRequiredError.records, src.semantic.reranker-llm.SemanticRerankerRequiredError.payload, src.semantic.reranker-llm.SemanticRerankerRequiredError.response\n\n### src.extractors.docs-llm.DocumentationLlmRequiredError\n- **Methods**: 29\n- **Key Methods**: src.extractors.docs-llm.DocumentationLlmRequiredError.super, src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent, src.extractors.docs-llm.DocumentationLlmRequiredError.startedAt, src.extractors.docs-llm.DocumentationLlmRequiredError.client, src.extractors.docs-llm.DocumentationLlmRequiredError.requireConfiguredClient, src.extractors.docs-llm.DocumentationLlmRequiredError.cache, src.extractors.docs-llm.DocumentationLlmRequiredError.chunks, src.extractors.docs-llm.DocumentationLlmRequiredError.selectedChunks, src.extractors.docs-llm.DocumentationLlmRequiredError.systemPrompt, src.extractors.docs-llm.DocumentationLlmRequiredError.results\n\n### sdk.php.src.Client.Todo2Code.Client\n- **Methods**: 27\n- **Key Methods**: sdk.php.src.Client.Client.__construct, sdk.php.src.Client.Client.health, sdk.php.src.Client.Client.agentCard, sdk.php.src.Client.Client.send, sdk.php.src.Client.Client.call, sdk.php.src.Client.Client.rpc, sdk.php.src.Client.Client.extractAst, sdk.php.src.Client.Client.extractConfig, sdk.php.src.Client.Client.extractNl, sdk.php.src.Client.Client.extractDocs\n\n### java.JavaAstExtract.JavaAstExtract\n- **Methods**: 25\n- **Key Methods**: java.JavaAstExtract.JavaAstExtract.main, java.JavaAstExtract.JavaAstExtract.emit, java.JavaAstExtract.JavaAstExtract.parseFile, java.JavaAstExtract.JavaAstExtract.emit, java.JavaAstExtract.JavaAstExtract.collect, java.JavaAstExtract.JavaAstExtract.try, java.JavaAstExtract.JavaAstExtract.containsIgnored, java.JavaAstExtract.JavaAstExtract.try, java.JavaAstExtract.JavaAstExtract.Collector, java.JavaAstExtract.JavaAstExtract.add\n\n### src.extractors.markdown-llm.MarkdownAttemptError\n- **Methods**: 24\n- **Key Methods**: src.extractors.markdown-llm.MarkdownAttemptError.super, src.extractors.markdown-llm.MarkdownAttemptError.enrichBatchCovering, src.extractors.markdown-llm.MarkdownAttemptError.metadataByRecord, src.extractors.markdown-llm.MarkdownAttemptError.uncovered, src.extractors.markdown-llm.MarkdownAttemptError.enrichSplitBatch, src.extractors.markdown-llm.MarkdownAttemptError.half, src.extractors.markdown-llm.MarkdownAttemptError.emptyCoverage, src.extractors.markdown-llm.MarkdownAttemptError.enrichMarkdownBatchWithCorrection, src.extractors.markdown-llm.MarkdownAttemptError.completion, src.extractors.markdown-llm.MarkdownAttemptError.fallbackOrThrow\n\n### src.synthesis.tasks-llm.TaskSynthesisAttemptError\n- **Methods**: 21\n- **Key Methods**: src.synthesis.tasks-llm.TaskSynthesisAttemptError.super, src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals, src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt, src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions, src.synthesis.tasks-llm.TaskSynthesisAttemptError.client, src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt, src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload, src.synthesis.tasks-llm.TaskSynthesisAttemptError.failure, src.synthesis.tasks-llm.TaskSynthesisAttemptError.responses, src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection\n\n### src.summary.summarizer.SummaryAttemptError\n- **Methods**: 21\n- **Key Methods**: src.summary.summarizer.SummaryAttemptError.super, src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection, src.summary.summarizer.SummaryAttemptError.conclusions, src.summary.summarizer.SummaryAttemptError.generationMetadata, src.summary.summarizer.SummaryAttemptError.message, src.summary.summarizer.SummaryAttemptError.materializeConclusions, src.summary.summarizer.SummaryAttemptError.parsed, src.summary.summarizer.SummaryAttemptError.conclusions, src.summary.summarizer.SummaryAttemptError.diagnosticIds, src.summary.summarizer.SummaryAttemptError.assertConclusions\n\n### src.sdk.typescript.Todo2CodeClient\n- **Methods**: 16\n- **Key Methods**: src.sdk.typescript.Todo2CodeClient.a2a, src.sdk.typescript.Todo2CodeClient.health, src.sdk.typescript.Todo2CodeClient.diffGraphs, src.sdk.typescript.Todo2CodeClient.diffGraphFiles, src.sdk.typescript.Todo2CodeClient.compareWorkspace, src.sdk.typescript.Todo2CodeClient.proposeTodo, src.sdk.typescript.Todo2CodeClient.renderTodo, src.sdk.typescript.Todo2CodeClient.applyTodo, src.sdk.typescript.Todo2CodeClient.proposeCodeChange, src.sdk.typescript.Todo2CodeClient.renderCodeChange\n\n### src.extractors.nl-llm.NlLlmRequiredError\n- **Methods**: 15\n- **Key Methods**: src.extractors.nl-llm.NlLlmRequiredError.super, src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited, src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.NlLlmRequiredError.startedAt, src.extractors.nl-llm.NlLlmRequiredError.result, src.extractors.nl-llm.NlLlmRequiredError.client, src.extractors.nl-llm.NlLlmRequiredError.absolute, src.extractors.nl-llm.NlLlmRequiredError.body, src.extractors.nl-llm.NlLlmRequiredError.sourcePath, src.extractors.nl-llm.NlLlmRequiredError.maxLine\n\n### src.communication.llm.CommunicationLlmRequiredError\n- **Methods**: 15\n- **Key Methods**: src.communication.llm.CommunicationLlmRequiredError.super, src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited, src.communication.llm.CommunicationLlmRequiredError.startedAt, src.communication.llm.CommunicationLlmRequiredError.deterministic, src.communication.llm.CommunicationLlmRequiredError.records, src.communication.llm.CommunicationLlmRequiredError.client, src.communication.llm.CommunicationLlmRequiredError.groups, src.communication.llm.CommunicationLlmRequiredError.response, src.communication.llm.CommunicationLlmRequiredError.enrichments, src.communication.llm.CommunicationLlmRequiredError.enrichedByOriginal\n\n### src.extractors.markdown-llm.MarkdownLlmRequiredError\n- **Methods**: 13\n- **Key Methods**: src.extractors.markdown-llm.MarkdownLlmRequiredError.super, src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited, src.extractors.markdown-llm.MarkdownLlmRequiredError.startedAt, src.extractors.markdown-llm.MarkdownLlmRequiredError.deterministic, src.extractors.markdown-llm.MarkdownLlmRequiredError.client, src.extractors.markdown-llm.MarkdownLlmRequiredError.prompt, src.extractors.markdown-llm.MarkdownLlmRequiredError.enrichments, src.extractors.markdown-llm.MarkdownLlmRequiredError.responseByRecord, src.extractors.markdown-llm.MarkdownLlmRequiredError.outcomes, src.extractors.markdown-llm.MarkdownLlmRequiredError.corrected\n\n### src.core.content-cache.ContentCache\n- **Methods**: 13\n- **Key Methods**: src.core.content-cache.ContentCache.getOrCompute, src.core.content-cache.ContentCache.assertNamespace, src.core.content-cache.ContentCache.key, src.core.content-cache.ContentCache.filePath, src.core.content-cache.ContentCache.cached, src.core.content-cache.ContentCache.value, src.core.content-cache.ContentCache.snapshot, src.core.content-cache.ContentCache.envelope, src.core.content-cache.ContentCache.write, src.core.content-cache.ContentCache.directory\n\n### python.ast_extract.FactVisitor\n- **Methods**: 13\n- **Key Methods**: python.ast_extract.FactVisitor.__init__, python.ast_extract.FactVisitor.excerpt, python.ast_extract.FactVisitor.add, python.ast_extract.FactVisitor.visit_Import, python.ast_extract.FactVisitor.visit_ImportFrom, python.ast_extract.FactVisitor.visit_FunctionDef, python.ast_extract.FactVisitor.visit_AsyncFunctionDef, python.ast_extract.FactVisitor.visit_ClassDef, python.ast_extract.FactVisitor.add_named_constant, python.ast_extract.FactVisitor.visit_Assign\n- **Inherits**: ast.NodeVisitor\n\n### src.interfaces.a2a-types.BodyTooLargeError\n- **Methods**: 11\n- **Key Methods**: src.interfaces.a2a-types.BodyTooLargeError.stringParam, src.interfaces.a2a-types.BodyTooLargeError.optionalString, src.interfaces.a2a-types.BodyTooLargeError.optionalStringArray, src.interfaces.a2a-types.BodyTooLargeError.optionalInteger, src.interfaces.a2a-types.BodyTooLargeError.parsed, src.interfaces.a2a-types.BodyTooLargeError.optionalBoolean, src.interfaces.a2a-types.BodyTooLargeError.optionalTimestamp, src.interfaces.a2a-types.BodyTooLargeError.timestamp, src.interfaces.a2a-types.BodyTooLargeError.optionalTaskState, src.interfaces.a2a-types.BodyTooLargeError.recordParam\n\n## Data Transformation Functions\n\nKey functions that process and transform data:\n\n### src.cli.parsed\n- **Output to**: src.cli.printHelp\n\n### src.cli.formatWatchEvent\n- **Output to**: src.cli.Date, src.cli.toISOString, src.cli.file, src.cli.join, src.cli.change\n\n### src.cli.parseArgs\n- **Output to**: src.cli.push, src.cli.slice, src.cli.startsWith, src.cli.split, src.cli.set\n\n### src.web.diff-ui.formatBytes\n- **Output to**: src.web.diff-ui.selectedRun, src.web.diff-ui.byId\n\n### src.synthesis.validation.validateAndClassifyTodoProposals\n- **Output to**: src.synthesis.validation.assertTodoProposals, src.synthesis.validation.filter, src.synthesis.validation.map, src.synthesis.validation.duplicateEvidence, src.synthesis.validation.Boolean\n\n### src.synthesis.task-synthesis-materialize.parsed\n- **Output to**: src.synthesis.task-synthesis-materialize.map, src.synthesis.task-synthesis-materialize.sortedUnique, src.synthesis.task-synthesis-materialize.groundRecordIdsByDiagnostics, src.synthesis.task-synthesis-materialize.normalizeStringArray, src.synthesis.task-synthesis-materialize.createConclusionId\n\n### src.summary.summarizer.SummaryAttemptError.parsed\n- **Output to**: src.summary.summarizer.map, src.summary.summarizer.SummaryAttemptError.sortedUnique, src.summary.summarizer.groundRecordIdsByDiagnostics, src.summary.summarizer.createConclusionId\n\n### src.semantic.reranker.validateRetrieval\n- **Output to**: src.semantic.reranker.requiredText, src.semantic.reranker.test, src.semantic.reranker.Error\n\n### src.semantic.reranker.validateGeneration\n- **Output to**: src.semantic.reranker.Error, src.semantic.reranker.requiredText, src.semantic.reranker.test\n\n### src.semantic.reranker.validateVerdictReason\n- **Output to**: src.semantic.reranker.assertSemanticVerdictReason\n\n### src.operations.subactor.compileSubactorProcessEnvelope\n- **Output to**: src.operations.subactor.assertOperationPlan, src.operations.subactor.trim, src.operations.subactor.Error, src.operations.subactor.Map, src.operations.subactor.map\n\n### src.llm.structured-schema.StructuredResponseError.parse\n- **Output to**: src.llm.structured-schema.validate\n\n### src.llm.structured-schema.StructuredResponseError.parsed\n- **Output to**: src.llm.structured-schema.map, src.llm.structured-schema.StructuredResponseError.parse\n\n### src.llm.openrouter.OpenRouterClient.formatInvalidModelError\n- **Output to**: src.llm.openrouter.models, src.llm.openrouter.n, src.llm.openrouter.map, src.llm.openrouter.join\n\n### src.llm.openrouter.OpenRouterClient.parseJsonContent\n- **Output to**: src.llm.openrouter.trim, src.llm.openrouter.replace, src.llm.openrouter.parse, src.llm.openrouter.indexOf, src.llm.openrouter.lastIndexOf\n\n### src.llm.openrouter.OpenRouterClient.parseJsonResponse\n- **Output to**: src.llm.openrouter.OpenRouterClient.responseMetadata, src.llm.openrouter.OpenRouterClient.extractContent, src.llm.openrouter.String, src.llm.openrouter.StructuredResponseError\n\n### src.interfaces.mcp.parsed\n- **Output to**: src.interfaces.mcp.send\n\n### src.interfaces.mcp.validateModernRequest\n- **Output to**: src.interfaces.mcp.McpRequestError, src.interfaces.mcp.isArray, src.interfaces.mcp.validateModernMetadata\n\n### src.interfaces.mcp.validateModernMetadata\n- **Output to**: src.interfaces.mcp.McpRequestError, src.interfaces.mcp.isArray\n\n### src.interfaces.mcp.parseRequestLine\n\n### src.interfaces.a2a.parseRpcRequest\n- **Output to**: src.interfaces.a2a.parse, src.interfaces.a2a.readBody, src.interfaces.a2a.sendJson, src.interfaces.a2a.rpcError, src.interfaces.a2a.errorMessage\n\n### src.interfaces.a2a-types.BodyTooLargeError.parsed\n- **Output to**: src.interfaces.a2a-types.isInteger, src.interfaces.a2a-types.A2ARequestError\n\n### src.interfaces.a2a-task-store.encodeCursor\n- **Output to**: src.interfaces.a2a-task-store.from, src.interfaces.a2a-task-store.stringify, src.interfaces.a2a-task-store.toString\n\n### src.interfaces.a2a-task-store.decodeCursor\n- **Output to**: src.interfaces.a2a-task-store.parse, src.interfaces.a2a-task-store.from, src.interfaces.a2a-task-store.toString, src.interfaces.a2a-task-store.isFinite, src.interfaces.a2a-task-store.Error\n\n### src.interfaces.a2a-task-store.decoded\n- **Output to**: src.interfaces.a2a-task-store.isFinite, src.interfaces.a2a-task-store.parse, src.interfaces.a2a-task-store.Error\n\n## Behavioral Patterns\n\n### recursion_dotted_name\n- **Type**: recursion\n- **Confidence**: 0.90\n- **Functions**: python.ast_extract.dotted_name\n\n## Public API Surface\n\nFunctions exposed as public API (no underscore prefix):\n\n- `src.services.actions.executeAction` - 65 calls\n- `src.services.actions.root` - 64 calls\n- `sdk.python.examples.basic.main` - 62 calls\n- `src.pipeline.run.runPipeline` - 54 calls\n- `src.cli.main` - 44 calls\n- `src.extractors.ast.typescript.extractTypeScriptFile` - 44 calls\n- `src.extractors.communication.extractCommunicationIntent` - 43 calls\n- `scripts.research.rank-intent-graph-embeddings.main` - 43 calls\n- `src.web.diff-ui.diffUiHtml` - 42 calls\n- `src.comparison.workspace.compareWorkspaceIntent` - 40 calls\n- `src.extractors.communication.identityRegistry` - 37 calls\n- `src.extractors.communication.communicationFiles` - 37 calls\n- `sdk.rust.src.client.parse_http_response` - 37 calls\n- `src.synthesis.code-change-plan.applyCodeChangeSourcePatch` - 35 calls\n- `src.communication.analyzer.analyzeCommunication` - 35 calls\n- `src.synthesis.code-change-plan.proposeCodeChangePlans` - 34 calls\n- `sdk.rust.examples.basic.run` - 33 calls\n- `src.graph.diagnostics.diagnoseGraph` - 32 calls\n- `src.interfaces.a2a-message.parseCommand` - 31 calls\n- `src.core.text.inferObject` - 31 calls\n- `scripts.research.evaluate-embedding-pairs.main` - 30 calls\n- `src.core.text.normalized` - 29 calls\n- `src.operations.validation.assertOperationPlan` - 28 calls\n- `src.synthesis.code-change-plan.assertCodeChangeSourcePatch` - 26 calls\n- `src.extractors.ast.typescript.visit` - 26 calls\n- `src.comparison.workspace.temporaryParent` - 25 calls\n- `src.comparison.workspace.baseWorktree` - 25 calls\n- `sdk.go.examples.basic.main.run` - 25 calls\n- `src.extractors.todo.extractTodo` - 24 calls\n- `scripts.verify-env-contract.makefile` - 24 calls\n- `python.ast_extract.main` - 24 calls\n- `src.communication.llm.CommunicationLlmRequiredError.extractCommunicationIntentAudited` - 23 calls\n- `src.graph.linker.linkIntentRecords` - 22 calls\n- `src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited` - 22 calls\n- `scripts.live-model-comparison.main` - 22 calls\n- `src.semantic.reranker.assertSemanticRerankResult` - 21 calls\n- `src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited` - 21 calls\n- `src.extractors.git.extractGitIntent` - 21 calls\n- `sdk.typescript.examples.basic.baseUrl` - 21 calls\n- `sdk.typescript.examples.basic.token` - 21 calls\n\n## System Interactions\n\nHow components interact:\n\n```mermaid\ngraph TD\n executeAction --> resolveRoot\n executeAction --> scopedPath\n executeAction --> extractNlIntentAudit\n executeAction --> nlModeValue\n executeAction --> extractGitIntent\n root --> scopedPath\n root --> extractNlIntentAudit\n root --> nlModeValue\n root --> extractGitIntent\n root --> numberValue\n main --> get\n main --> T2CClient\n main --> print\n runPipeline --> resolve\n runPipeline --> pathExists\n runPipeline --> Error\n runPipeline --> newRunId\n runPipeline --> join\n extractTypeScriptFil --> relativePosix\n extractTypeScriptFil --> createSourceFile\n extractTypeScriptFil --> scriptKind\n extractTypeScriptFil --> getLineAndCharacterO\n extractTypeScriptFil --> getStart\n extractCommunication --> resolve\n extractCommunication --> assertPathWithinRoot\n extractCommunication --> pathExists\n extractCommunication --> relativePosix\n extractCommunication --> walkFiles\n main --> parse_args\n main --> read_bytes\n```\n\n## Reverse Engineering Guidelines\n\n1. **Entry Points**: Start analysis from the entry points listed above\n2. **Core Logic**: Focus on classes with many methods\n3. **Data Flow**: Follow data transformation functions\n4. **Process Flows**: Use the flow diagrams for execution paths\n5. **API Surface**: Public API functions reveal the interface\n\n## Context for LLM\n\nMaintain the identified architectural patterns and public API surface when suggesting changes.", "is_subdir": false}, {"name": "calls.mmd", "rel_path": "calls.mmd", "path": "calls.mmd", "size": "67.0KB", "icon": "πŸ“ˆ", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart LR\n%% generated in 0.04s\n subgraph src__cli\n src__cli__handleExtract["handleExtract"]\n src__cli__optionLlmMode["optionLlmMode"]\n src__cli__maxRows["maxRows"]\n src__cli__optionBoolean["optionBoolean"]\n src__cli__optionPipelineTaskMode["optionPipelineTaskMode"]\n src__cli__formatWatchEvent["formatWatchEvent"]\n src__cli__diff["diff"]\n src__cli__handleWatch["handleWatch"]\n src__cli__file["file"]\n src__cli__initProject["initProject"]\n src__cli__taskFile["taskFile"]\n src__cli__optionNumber["optionNumber"]\n src__cli__printHelp["printHelp"]\n src__cli__invokedPath["invokedPath"]\n src__cli__optionSummaryMode["optionSummaryMode"]\n src__cli__svg["svg"]\n src__cli__handleReality["handleReality"]\n src__cli__stamp["stamp"]\n src__cli__handleCommunication["handleCommunication"]\n src__cli__result["result"]\n src__cli__parsed["parsed"]\n src__cli__mode["mode"]\n src__cli__main["main"]\n src__cli__extractor["extractor"]\n src__cli__execFileAsync["execFileAsync"]\n src__cli__optionNullableString["optionNullableString"]\n src__cli__html["html"]\n src__cli__doctor["doctor"]\n src__cli__optionNlMode["optionNlMode"]\n src__cli__command["command"]\n src__cli__emitExtraction["emitExtraction"]\n src__cli__parseArgs["parseArgs"]\n src__cli__isPlanSet["isPlanSet"]\n src__cli__stop["stop"]\n src__cli__diagnosticsPath["diagnosticsPath"]\n src__cli__root["root"]\n src__cli__handleDiff["handleDiff"]\n src__cli__optionList["optionList"]\n src__cli__optionString["optionString"]\n src__cli__optionTaskMode["optionTaskMode"]\n src__cli__diagnostics["diagnostics"]\n src__cli__context["context"]\n src__cli__controller["controller"]\n src__cli__view["view"]\n end\n subgraph src__operations\n src__operations__validation__dateString["dateString"]\n src__operations__validation__exactKeys["exactKeys"]\n src__operations__validation__principals["principals"]\n src__operations__validation__objectValue["objectValue"]\n src__operations__validation__nonBlank["nonBlank"]\n src__operations__validation__uniqueStrings["uniqueStrings"]\n src__operations__validation__assertVariableContract["assertVariableContract"]\n src__operations__validation__assertPrincipalList["assertPrincipalList"]\n end\n subgraph src__pipeline\n src__pipeline__run__docs["docs"]\n src__pipeline__run__configurationExtraction["configurationExtraction"]\n src__pipeline__run__reason["reason"]\n src__pipeline__run__persistFailedRun["persistFailedRun"]\n src__pipeline__run__manifestConfiguration["manifestConfiguration"]\n src__pipeline__run__stageValue["stageValue"]\n src__pipeline__run__runPipeline["runPipeline"]\n src__pipeline__run__failedAudit["failedAudit"]\n src__pipeline__run__communicationInputPresent["communicationInputPresent"]\n src__pipeline__run__communicationStartedAt["communicationStartedAt"]\n src__pipeline__run__communicationAudit["communicationAudit"]\n src__pipeline__run__values["values"]\n src__pipeline__run__message["message"]\n src__pipeline__run__knownAudit["knownAudit"]\n src__pipeline__run__aborted["aborted"]\n src__pipeline__run__failureCode["failureCode"]\n src__pipeline__run__includeCommunication["includeCommunication"]\n src__pipeline__run__skippedAudit["skippedAudit"]\n src__pipeline__run__collectTargetHints["collectTargetHints"]\n end\n subgraph src__semantic\n src__semantic__reranker__validDate["validDate"]\n src__semantic__reranker__createSemanticCandidateSet["createSemanticCandidateSet"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticCandidateSet["assertSemanticCandidateSet"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates["rerankSemanticCandidates"]\n src__semantic__reranker__assertSemanticVerdictReason["assertSemanticVerdictReason"]\n src__semantic__reranker__roundedConfidence["roundedConfidence"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord["projectRecord"]\n src__semantic__reranker__values["values"]\n src__semantic__reranker__requiredText["requiredText"]\n src__semantic__reranker__acceptedDeclarations["acceptedDeclarations"]\n src__semantic__reranker__records["records"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__model["model"]\n src__semantic__reranker__validateGeneration["validateGeneration"]\n src__semantic__reranker__validateRetrieval["validateRetrieval"]\n src__semantic__reranker__validateVerdictReason["validateVerdictReason"]\n src__semantic__reranker__assertGroundedQuote["assertGroundedQuote"]\n src__semantic__reranker__seenIds["seenIds"]\n src__semantic__reranker__quote["quote"]\n src__semantic__reranker__applyAcceptedSemanticRelations["applyAcceptedSemanticRelations"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult["assertSemanticRerankResult"]\n src__semantic__reranker__assertSemanticRerankResult["assertSemanticRerankResult"]\n src__semantic__reranker__byDeclaration["byDeclaration"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__payload["payload"]\n src__semantic__reranker__seenDecisions["seenDecisions"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__modelRevision["modelRevision"]\n src__semantic__reranker__decisions["decisions"]\n src__semantic__reranker__assertSemanticCandidateSet["assertSemanticCandidateSet"]\n src__semantic__reranker__createSemanticRerankResult["createSemanticRerankResult"]\n src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshot["assertTrackedSnapshot"]\n src__semantic__reranker__seenPairs["seenPairs"]\n src__semantic__reranker__boundedScore["boundedScore"]\n end\n subgraph src__services\n src__services__actions__value["value"]\n src__services__actions__patch["patch"]\n src__services__actions__afterPath["afterPath"]\n src__services__actions__beforeInput["beforeInput"]\n src__services__actions__graph["graph"]\n src__services__actions__numberValue["numberValue"]\n src__services__actions__llmModeValue["llmModeValue"]\n src__services__actions__scopedPath["scopedPath"]\n src__services__actions__root["root"]\n src__services__actions__afterDiagnostics["afterDiagnostics"]\n src__services__actions__analysis["analysis"]\n src__services__actions__conclusions["conclusions"]\n src__services__actions__executeAction["executeAction"]\n src__services__actions__nullableString["nullableString"]\n src__services__actions__title["title"]\n src__services__actions__booleanValue["booleanValue"]\n src__services__actions__nlModeValue["nlModeValue"]\n src__services__actions__before["before"]\n src__services__actions__beforeDiagnostics["beforeDiagnostics"]\n src__services__actions__todoPath["todoPath"]\n src__services__actions__stringValue["stringValue"]\n src__services__actions__resolveRoot["resolveRoot"]\n src__services__actions__receiptPath["receiptPath"]\n src__services__actions__after["after"]\n src__services__actions__filterCommunicationGraph["filterCommunicationGraph"]\n src__services__actions__afterInput["afterInput"]\n src__services__actions__svg["svg"]\n src__services__actions__result["result"]\n src__services__actions__proposals["proposals"]\n src__services__actions__diff["diff"]\n src__services__actions__readRecords["readRecords"]\n src__services__actions__diagnostics["diagnostics"]\n src__services__actions__afterGraph["afterGraph"]\n src__services__actions__summaryModeValue["summaryModeValue"]\n src__services__actions__nullableScopedPath["nullableScopedPath"]\n src__services__actions__stringList["stringList"]\n src__services__actions__view["view"]\n src__services__actions__withTextDiffViews["withTextDiffViews"]\n src__services__actions__beforeGraph["beforeGraph"]\n src__services__actions__hasInputValue["hasInputValue"]\n src__services__actions__beforePath["beforePath"]\n end\n subgraph src__summary\n src__summary__summarizer__client["client"]\n src__summary__summarizer__SummaryAttemptError__conclusions["conclusions"]\n src__summary__render__renderConclusion["renderConclusion"]\n src__summary__render__actions["actions"]\n src__summary__summarizer__SummaryAttemptError__readPrompt["readPrompt"]\n src__summary__render__renderRecords["renderRecords"]\n src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection["summarizeWithCorrection"]\n src__summary__render__confidence["confidence"]\n src__summary__summarizer__systemPrompt["systemPrompt"]\n src__summary__summarizer__SummaryAttemptError__deterministicConclusions["deterministicConclusions"]\n src__summary__render__recordCitations["recordCitations"]\n src__summary__summarizer__SummaryAttemptError__summaryMode["summaryMode"]\n src__summary__summarizer__SummaryAttemptError__materializeConclusions["materializeConclusions"]\n src__summary__summarizer__payload["payload"]\n src__summary__summarizer__SummaryAttemptError__parsed["parsed"]\n src__summary__summarizer__SummaryAttemptError__sortedUnique["sortedUnique"]\n src__summary__summarizer__mode["mode"]\n src__summary__summarizer__summarizeGraph["summarizeGraph"]\n src__summary__summarizer__SummaryAttemptError__generationMetadata["generationMetadata"]\n src__summary__render__renderSummaryMarkdown["renderSummaryMarkdown"]\n src__summary__summarizer__SummaryAttemptError__assertConclusions["assertConclusions"]\n end\n subgraph src__synthesis\n src__synthesis__code_change_plan__buildChanges["buildChanges"]\n src__synthesis__task_synthesis_contract__taskIds["taskIds"]\n src__synthesis__task_synthesis_materialize__proposalKeys["proposalKeys"]\n src__synthesis__code_change_plan__assertSourcePatchStrings["assertSourcePatchStrings"]\n src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse["materializeTaskSynthesisRespon"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions["assertConclusions"]\n src__synthesis__todo_patch__uniqueStrings["uniqueStrings"]\n src__synthesis__code_change_plan__relatedRecords["relatedRecords"]\n src__synthesis__task_synthesis_materialize__normalizeLocalKeys["normalizeLocalKeys"]\n src__synthesis__todo_patch__result["result"]\n src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria["normalizeAcceptanceCriteria"]\n src__synthesis__task_synthesis_materialize__proposalDrafts["proposalDrafts"]\n src__synthesis__task_synthesis_materialize__conclusionByKey["conclusionByKey"]\n src__synthesis__todo_patch__orderedSelected["orderedSelected"]\n src__synthesis__code_change_plan__fileHashesAfter["fileHashesAfter"]\n src__synthesis__todo_patch__diagnosticReportFingerprint["diagnosticReportFingerprint"]\n src__synthesis__validation__dependencyFirstPriorityOrder["dependencyFirstPriorityOrder"]\n src__synthesis__code_change_plan__collectTarget["collectTarget"]\n src__synthesis__validation__sharedTicket["sharedTicket"]\n src__synthesis__task_synthesis_materialize__diagnosticIds["diagnosticIds"]\n src__synthesis__todo_patch__inline["inline"]\n src__synthesis__code_change_plan__planHash["planHash"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals["synthesizeTodoProposals"]\n src__synthesis__code_change_plan__assertExistingSourceReceipt["assertExistingSourceReceipt"]\n src__synthesis__task_synthesis_contract__nonBlank["nonBlank"]\n src__synthesis__todo_patch__selected["selected"]\n src__synthesis__code_change_plan__assertCodeChangeSourcePatch["assertCodeChangeSourcePatch"]\n src__synthesis__code_change_plan__conclusionsByDiagnostic["conclusionsByDiagnostic"]\n src__synthesis__code_change_plan__descriptionFor["descriptionFor"]\n src__synthesis__code_change_plan__applyUnifiedDiffToText["applyUnifiedDiffToText"]\n src__synthesis__code_change_plan__changes["changes"]\n src__synthesis__todo_patch__applyTodoPatch["applyTodoPatch"]\n src__synthesis__task_synthesis_materialize__sortedUnique["sortedUnique"]\n src__synthesis__code_change_plan__rollbackFor["rollbackFor"]\n src__synthesis__todo_patch__markdown["markdown"]\n src__synthesis__code_change_plan__instructionFor["instructionFor"]\n src__synthesis__code_change_path__isPlannablePath["isPlannablePath"]\n src__synthesis__task_synthesis_materialize__normalizeRawTarget["normalizeRawTarget"]\n src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown["renderCodeChangeReviewMarkdown"]\n src__synthesis__code_change_plan__applyCodeChangeSourcePatch["applyCodeChangeSourcePatch"]\n src__synthesis__code_change_plan__createCodeChangeReviewPatch["createCodeChangeReviewPatch"]\n src__synthesis__code_change_plan__unifiedDiff["unifiedDiff"]\n src__synthesis__todo_patch__applied["applied"]\n src__synthesis__code_change_plan__index["index"]\n src__synthesis__code_change_plan__planIds["planIds"]\n src__synthesis__code_change_plan__confidenceFor["confidenceFor"]\n src__synthesis__code_change_plan__candidates["candidates"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__client["client"]\n src__synthesis__todo_patch__renderTodoPatchMarkdown["renderTodoPatchMarkdown"]\n src__synthesis__todo_patch__sourceTodo["sourceTodo"]\n src__synthesis__code_change_plan__priorityRank["priorityRank"]\n src__synthesis__todo_patch__current["current"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow["fallbackOrThrow"]\n src__synthesis__todo_patch__renderTargets["renderTargets"]\n src__synthesis__todo_patch__assertReceipt["assertReceipt"]\n src__synthesis__validation__duplicateEvidence["duplicateEvidence"]\n src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT["RAW_PROPOSAL_CONTRACT"]\n src__synthesis__todo_patch__uniqueIds["uniqueIds"]\n src__synthesis__code_change_plan__rawDiff["rawDiff"]\n src__synthesis__code_change_plan__deterministicGeneration["deterministicGeneration"]\n src__synthesis__code_change_plan__patchHash["patchHash"]\n src__synthesis__code_change_plan__proposalsByDiagnostic["proposalsByDiagnostic"]\n src__synthesis__todo_patch__wasAlreadyAppended["wasAlreadyAppended"]\n src__synthesis__task_synthesis_materialize__proposals["proposals"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__startedAt["startedAt"]\n src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet["assertCodeChangeSourcePatchSet"]\n src__synthesis__todo_patch__duplicates["duplicates"]\n src__synthesis__task_synthesis_materialize__proposalIdByKey["proposalIdByKey"]\n src__synthesis__code_change_plan__acceptedCount["acceptedCount"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__payload["payload"]\n src__synthesis__code_change_plan__indexProposalsByDiagnostic["indexProposalsByDiagnostic"]\n src__synthesis__todo_patch__classified["classified"]\n src__synthesis__code_change_plan__object["object"]\n src__synthesis__code_change_plan__patchIds["patchIds"]\n src__synthesis__code_change_path__isUsefulCodeChangePath["isUsefulCodeChangePath"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__generationMetadata["generationMetadata"]\n src__synthesis__task_synthesis_materialize__conclusions["conclusions"]\n src__synthesis__code_change_plan__conclusions["conclusions"]\n src__synthesis__code_change_plan__set["set"]\n src__synthesis__validation__intersects["intersects"]\n src__synthesis__validation__target["target"]\n src__synthesis__code_change_plan__uniqueSorted["uniqueSorted"]\n src__synthesis__todo_patch__renderIds["renderIds"]\n src__synthesis__code_change_plan__startsWithImperative["startsWithImperative"]\n src__synthesis__code_change_plan__assertSourcePatchIds["assertSourcePatchIds"]\n src__synthesis__validation__sharedPath["sharedPath"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesisAudit["synthesisAudit"]\n src__synthesis__code_change_plan__createCodeChangeSourcePatch["createCodeChangeSourcePatch"]\n src__synthesis__code_change_plan__recordsById["recordsById"]\n src__synthesis__task_synthesis_contract__taskStrings["taskStrings"]\n src__synthesis__code_change_plan__now["now"]\n src__synthesis__task_synthesis_materialize__keys["keys"]\n src__synthesis__code_change_plan__target["target"]\n src__synthesis__todo_patch__isoDate["isoDate"]\n src__synthesis__code_change_plan__acceptances["acceptances"]\n src__synthesis__todo_patch__currentHash["currentHash"]\n src__synthesis__validation__validateAndClassifyTodoProposals["validateAndClassifyTodoProposa"]\n src__synthesis__todo_patch__createTodoPatch["createTodoPatch"]\n src__synthesis__code_change_plan__markdown["markdown"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__readPrompt["readPrompt"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__prompt["prompt"]\n src__synthesis__todo_patch__normalizePath["normalizePath"]\n src__synthesis__code_change_plan__plansById["plansById"]\n src__synthesis__todo_patch__hash["hash"]\n src__synthesis__todo_patch__rendered["rendered"]\n src__synthesis__code_change_plan__record["record"]\n src__synthesis__task_synthesis_materialize__conclusionIdByKey["conclusionIdByKey"]\n src__synthesis__code_change_plan__normalizeUnifiedDiff["normalizeUnifiedDiff"]\n src__synthesis__validation__proposalWords["proposalWords"]\n src__synthesis__code_change_plan__titleFor["titleFor"]\n src__synthesis__todo_patch__writeTodoPatchArtifacts["writeTodoPatchArtifacts"]\n src__synthesis__code_change_plan__acceptanceCriteriaFor["acceptanceCriteriaFor"]\n src__synthesis__code_change_plan__paths["paths"]\n src__synthesis__validation__similarity["similarity"]\n src__synthesis__code_change_plan__assertSourceApplyReceipt["assertSourceApplyReceipt"]\n src__synthesis__todo_patch__assertApproval["assertApproval"]\n src__synthesis__todo_patch__artifact["artifact"]\n src__synthesis__todo_patch__appendPatch["appendPatch"]\n src__synthesis__code_change_plan__indexConclusionsByDiagnostic["indexConclusionsByDiagnostic"]\n src__synthesis__code_change_plan__exactSourcePatchKeys["exactSourcePatchKeys"]\n src__synthesis__code_change_plan__exactSourcePatchSet["exactSourcePatchSet"]\n src__synthesis__code_change_plan__splitKeep["splitKeep"]\n src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT["RAW_CONCLUSION_CONTRACT"]\n src__synthesis__task_synthesis_materialize__parsed["parsed"]\n src__synthesis__code_change_plan__riskFor["riskFor"]\n src__synthesis__todo_patch__now["now"]\n src__synthesis__task_synthesis_materialize__normalizeStringArray["normalizeStringArray"]\n src__synthesis__todo_patch__recovered["recovered"]\n src__synthesis__validation__jaccard["jaccard"]\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection["synthesizeWithCorrection"]\n src__synthesis__todo_patch__object["object"]\n src__synthesis__todo_patch__exactKeys["exactKeys"]\n src__synthesis__code_change_plan__createCodeChangeSourcePatchSet["createCodeChangeSourcePatchSet"]\n src__synthesis__code_change_plan__renderIds["renderIds"]\n src__synthesis__validation__words["words"]\n src__synthesis__todo_patch__nonBlank["nonBlank"]\n src__synthesis__task_synthesis_materialize__mapKeys["mapKeys"]\n src__synthesis__code_change_plan__evaluateCodeChangeAcceptance["evaluateCodeChangeAcceptance"]\n src__synthesis__validation__sharedSymbol["sharedSymbol"]\n src__synthesis__todo_patch__assertTodoPatchArtifact["assertTodoPatchArtifact"]\n src__synthesis__code_change_plan__proposals["proposals"]\n src__synthesis__code_change_plan__generatedAt["generatedAt"]\n src__synthesis__todo_patch__sameArray["sameArray"]\n src__synthesis__code_change_plan__matchingConclusions["matchingConclusions"]\n src__synthesis__todo_patch__atomicWrite["atomicWrite"]\n src__synthesis__code_change_plan__inline["inline"]\n src__synthesis__code_change_plan__matchingProposals["matchingProposals"]\n end\n subgraph src__tf\n src__tf__classifier__classifyAction["classifyAction"]\n src__tf__classifier__dynamicImport["dynamicImport"]\n src__tf__classifier__vectorize["vectorize"]\n src__tf__classifier__importer["importer"]\n src__tf__classifier__loadClassifier["loadClassifier"]\n src__tf__classifier__loadAssets["loadAssets"]\n end\n subgraph src__watch\n src__watch__watcher__waitMs["waitMs"]\n src__watch__watcher__diffSnapshots["diffSnapshots"]\n src__watch__watcher__emit["emit"]\n src__watch__watcher__snapshot["snapshot"]\n src__watch__watcher__describeDelta["describeDelta"]\n src__watch__watcher__visit["visit"]\n src__watch__watcher__relative["relative"]\n src__watch__watcher__sleep["sleep"]\n src__watch__watcher__lastReportStartedAt["lastReportStartedAt"]\n src__watch__watcher__current["current"]\n src__watch__watcher__defaultSleep["defaultSleep"]\n src__watch__watcher__pending["pending"]\n src__watch__watcher__onAbort["onAbort"]\n src__watch__watcher__generate["generate"]\n src__watch__watcher__watchRepository["watchRepository"]\n src__watch__watcher__absolute["absolute"]\n src__watch__watcher__finish["finish"]\n src__watch__watcher__result["result"]\n src__watch__watcher__now["now"]\n src__watch__watcher__maxFiles["maxFiles"]\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS["DEFAULT_MIN_INTERVAL_MS"]\n src__watch__watcher__scanTree["scanTree"]\n src__watch__watcher__delta["delta"]\n src__watch__watcher__absoluteRoot["absoluteRoot"]\n src__watch__watcher__runReport["runReport"]\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS["DEFAULT_SCAN_INTERVAL_MS"]\n src__watch__watcher__timer["timer"]\n src__watch__watcher__startedAt["startedAt"]\n end\n subgraph src__web\n src__web__diff_ui__loadRuns["loadRuns"]\n src__web__diff_ui__fillSelect["fillSelect"]\n src__web__diff_ui__requestHeaders["requestHeaders"]\n src__web__diff_ui__compareGraphs["compareGraphs"]\n src__web__diff_ui__byId["byId"]\n src__web__diff_ui__selectedRun["selectedRun"]\n src__web__diff_ui__diffUiHtml["diffUiHtml"]\n src__web__diff_ui__updateMeta["updateMeta"]\n src__web__diff_ui__formatBytes["formatBytes"]\n end\n src__cli__main --> src__cli__printHelp\n src__cli__main --> src__cli__parseArgs\n src__cli__main --> src__cli__initProject\n src__cli__parsed --> src__cli__printHelp\n src__cli__command --> src__cli__printHelp\n src__cli__diagnosticsPath --> src__cli__optionNumber\n src__cli__diagnosticsPath --> src__cli__optionBoolean\n src__cli__diagnostics --> src__cli__optionNumber\n src__cli__diagnostics --> src__cli__optionBoolean\n src__cli__result --> src__cli__execFileAsync\n src__cli__isPlanSet --> src__cli__optionString\n src__cli__root --> src__cli__optionString\n src__cli__root --> src__cli__optionNullableString\n src__cli__root --> src__cli__optionLlmMode\n src__cli__handleWatch --> src__cli__optionNullableString\n src__cli__handleWatch --> src__cli__optionList\n src__cli__handleWatch --> src__cli__optionBoolean\n src__cli__handleWatch --> src__cli__optionString\n src__cli__handleWatch --> src__cli__optionNumber\n src__cli__handleWatch --> src__cli__optionNlMode\n src__cli__taskFile --> src__cli__optionNullableString\n src__cli__taskFile --> src__cli__optionList\n src__cli__taskFile --> src__cli__optionBoolean\n src__cli__taskFile --> src__cli__optionString\n src__cli__taskFile --> src__cli__optionNumber\n src__cli__taskFile --> src__cli__optionNlMode\n src__cli__taskFile --> src__cli__optionLlmMode\n src__cli__taskFile --> src__cli__optionPipelineTaskMode\n src__cli__controller --> src__cli__optionNumber\n src__cli__controller --> src__cli__optionBoolean\n src__cli__controller --> src__cli__formatWatchEvent\n src__cli__stop --> src__cli__optionNumber\n src__cli__stop --> src__cli__optionBoolean\n src__cli__stop --> src__cli__formatWatchEvent\n src__cli__formatWatchEvent --> src__cli__file\n src__cli__stamp --> src__cli__file\n src__cli__handleDiff --> src__cli__optionString\n src__cli__handleDiff --> src__cli__optionNumber\n src__cli__mode --> src__cli__optionNumber\n src__cli__svg --> src__cli__optionNumber\n src__cli__svg --> src__cli__optionBoolean\n src__cli__html --> src__cli__optionNumber\n src__cli__diff --> src__cli__optionNumber\n src__cli__context --> src__cli__optionString\n src__cli__context --> src__cli__optionBoolean\n src__cli__context --> src__cli__optionNumber\n src__cli__maxRows --> src__cli__optionString\n src__cli__maxRows --> src__cli__optionBoolean\n src__cli__maxRows --> src__cli__optionNumber\n src__cli__handleReality --> src__cli__optionString\n src__cli__handleReality --> src__cli__optionNumber\n src__cli__handleReality --> src__cli__optionBoolean\n src__cli__view --> src__cli__optionNumber\n src__cli__view --> src__cli__optionBoolean\n src__cli__handleExtract --> src__cli__optionString\n src__cli__handleExtract --> src__cli__optionNlMode\n src__cli__handleExtract --> src__cli__emitExtraction\n src__cli__handleExtract --> src__cli__optionNumber\n src__cli__extractor --> src__cli__optionString\n src__cli__extractor --> src__cli__optionNlMode\n src__cli__extractor --> src__cli__emitExtraction\n src__cli__handleCommunication --> src__cli__optionString\n src__cli__handleCommunication --> src__cli__optionNullableString\n src__cli__handleCommunication --> src__cli__optionLlmMode\n src__cli__handleCommunication --> src__cli__optionNumber\n src__cli__handleCommunication --> src__cli__optionBoolean\n src__cli__doctor --> src__cli__execFileAsync\n src__cli__optionNumber --> src__cli__optionString\n src__cli__optionList --> src__cli__optionString\n src__cli__optionNlMode --> src__cli__optionLlmMode\n src__cli__optionLlmMode --> src__cli__optionString\n src__cli__optionTaskMode --> src__cli__optionString\n src__cli__optionSummaryMode --> src__cli__optionLlmMode\n src__cli__optionSummaryMode --> src__cli__optionBoolean\n src__cli__optionPipelineTaskMode --> src__cli__optionString\n src__cli__invokedPath --> src__cli__main\n src__web__diff_ui__diffUiHtml --> src__web__diff_ui__byId\n src__web__diff_ui__requestHeaders --> src__web__diff_ui__byId\n src__web__diff_ui__formatBytes --> src__web__diff_ui__selectedRun\n src__web__diff_ui__formatBytes --> src__web__diff_ui__byId\n src__web__diff_ui__selectedRun --> src__web__diff_ui__byId\n src__web__diff_ui__selectedRun --> src__web__diff_ui__formatBytes\n src__web__diff_ui__updateMeta --> src__web__diff_ui__selectedRun\n src__web__diff_ui__updateMeta --> src__web__diff_ui__byId\n src__web__diff_ui__updateMeta --> src__web__diff_ui__formatBytes\n src__web__diff_ui__fillSelect --> src__web__diff_ui__byId\n src__web__diff_ui__fillSelect --> src__web__diff_ui__updateMeta\n src__web__diff_ui__loadRuns --> src__web__diff_ui__byId\n src__web__diff_ui__loadRuns --> src__web__diff_ui__requestHeaders\n src__web__diff_ui__compareGraphs --> src__web__diff_ui__byId\n src__web__diff_ui__compareGraphs --> src__web__diff_ui__requestHeaders\n src__watch__watcher__scanTree --> src__watch__watcher__relative\n src__watch__watcher__maxFiles --> src__watch__watcher__relative\n src__watch__watcher__maxFiles --> src__watch__watcher__visit\n src__watch__watcher__absoluteRoot --> src__watch__watcher__relative\n src__watch__watcher__absoluteRoot --> src__watch__watcher__visit\n src__watch__watcher__visit --> src__watch__watcher__relative\n src__watch__watcher__absolute --> src__watch__watcher__visit\n src__watch__watcher__relative --> src__watch__watcher__visit\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__now\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__scanTree\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__emit\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__generate\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__sleep\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__diffSnapshots\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__now\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__scanTree\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__emit\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__generate\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__sleep\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__diffSnapshots\n src__watch__watcher__watchRepository --> src__watch__watcher__now\n src__watch__watcher__watchRepository --> src__watch__watcher__scanTree\n src__watch__watcher__watchRepository --> src__watch__watcher__emit\n src__watch__watcher__watchRepository --> src__watch__watcher__generate\n src__watch__watcher__watchRepository --> src__watch__watcher__sleep\n src__watch__watcher__watchRepository --> src__watch__watcher__diffSnapshots\n src__watch__watcher__result --> src__watch__watcher__emit\n src__watch__watcher__result --> src__watch__watcher__now\n src__watch__watcher__snapshot --> src__watch__watcher__emit\n src__watch__watcher__lastReportStartedAt --> src__watch__watcher__now\n src__watch__watcher__lastReportStartedAt --> src__watch__watcher__generate\n src__watch__watcher__pending --> src__watch__watcher__now\n src__watch__watcher__pending --> src__watch__watcher__generate\n src__watch__watcher__current --> src__watch__watcher__describeDelta\n src__watch__watcher__current --> src__watch__watcher__emit\n src__watch__watcher__delta --> src__watch__watcher__describeDelta\n src__watch__watcher__delta --> src__watch__watcher__emit\n src__watch__watcher__waitMs --> src__watch__watcher__emit\n src__watch__watcher__generate --> src__watch__watcher__emit\n src__watch__watcher__generate --> src__watch__watcher__now\n src__watch__watcher__generate --> src__watch__watcher__runReport\n src__watch__watcher__generate --> src__watch__watcher__scanTree\n src__watch__watcher__startedAt --> src__watch__watcher__runReport\n src__watch__watcher__startedAt --> src__watch__watcher__emit\n src__watch__watcher__startedAt --> src__watch__watcher__now\n src__watch__watcher__defaultSleep --> src__watch__watcher__finish\n src__watch__watcher__timer --> src__watch__watcher__finish\n src__watch__watcher__onAbort --> src__watch__watcher__finish\n src__tf__classifier__dynamicImport --> src__tf__classifier__importer\n src__tf__classifier__loadClassifier --> src__tf__classifier__dynamicImport\n src__tf__classifier__loadClassifier --> src__tf__classifier__loadAssets\n src__tf__classifier__classifyAction --> src__tf__classifier__loadClassifier\n src__tf__classifier__classifyAction --> src__tf__classifier__vectorize\n src__synthesis__validation__validateAndClassifyTodoProposals --> src__synthesis__validation__duplicateEvidence\n src__synthesis__validation__validateAndClassifyTodoProposals --> src__synthesis__validation__dependencyFirstPriorityOrder\n src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__words\n src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__intersects\n src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__jaccard\n src__synthesis__validation__proposalWords --> src__synthesis__validation__words\n src__synthesis__validation__target --> src__synthesis__validation__jaccard\n src__synthesis__validation__target --> src__synthesis__validation__words\n src__synthesis__validation__sharedTicket --> src__synthesis__validation__jaccard\n src__synthesis__validation__sharedTicket --> src__synthesis__validation__words\n src__synthesis__validation__sharedSymbol --> src__synthesis__validation__jaccard\n src__synthesis__validation__sharedSymbol --> src__synthesis__validation__words\n src__synthesis__validation__sharedPath --> src__synthesis__validation__jaccard\n src__synthesis__validation__sharedPath --> src__synthesis__validation__words\n src__synthesis__validation__similarity --> src__synthesis__validation__jaccard\n src__synthesis__validation__similarity --> src__synthesis__validation__words\n src__synthesis__todo_patch__createTodoPatch --> src__synthesis__todo_patch__sameArray\n src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__object\n src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__exactKeys\n src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__uniqueIds\n src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__uniqueStrings\n src__synthesis__todo_patch__orderedSelected --> src__synthesis__todo_patch__sameArray\n src__synthesis__todo_patch__markdown --> src__synthesis__todo_patch__normalizePath\n src__synthesis__todo_patch__markdown --> src__synthesis__todo_patch__diagnosticReportFingerprint\n src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__inline\n src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__renderTargets\n src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__renderIds\n src__synthesis__todo_patch__writeTodoPatchArtifacts --> src__synthesis__todo_patch__createTodoPatch\n src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertTodoPatchArtifact\n src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertApproval\n src__synthesis__todo_patch__current --> src__synthesis__todo_patch__assertReceipt\n src__synthesis__todo_patch__now --> src__synthesis__todo_patch__appendPatch\n src__synthesis__todo_patch__now --> src__synthesis__todo_patch__atomicWrite\n src__synthesis__todo_patch__now --> src__synthesis__todo_patch__wasAlreadyAppended\n src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__appendPatch\n src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__atomicWrite\n src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__wasAlreadyAppended\n src__synthesis__todo_patch__result --> src__synthesis__todo_patch__appendPatch\n src__synthesis__todo_patch__result --> src__synthesis__todo_patch__atomicWrite\n src__synthesis__todo_patch__result --> src__synthesis__todo_patch__wasAlreadyAppended\n src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__appendPatch\n src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__atomicWrite\n src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__wasAlreadyAppended\n src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__appendPatch\n src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__atomicWrite\n src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__wasAlreadyAppended\n src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__object\n src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__exactKeys\n src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__isoDate\n src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__hash\n src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__nonBlank\n src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__uniqueIds\n src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__object\n src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__exactKeys\n src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__uniqueIds\n src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__uniqueStrings\n src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__object\n src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__exactKeys\n src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__uniqueIds\n src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__uniqueStrings\n src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__object\n src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__exactKeys\n src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__uniqueIds\n src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__uniqueStrings\n src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__object\n src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__exactKeys\n src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__uniqueIds\n src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__uniqueStrings\n src__synthesis__todo_patch__assertApproval --> src__synthesis__todo_patch__nonBlank\n src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__sameArray\n src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__nonBlank\n src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__isoDate\n src__synthesis__todo_patch__renderTargets --> src__synthesis__todo_patch__inline\n src__synthesis__todo_patch__rendered --> src__synthesis__todo_patch__inline\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__readPrompt\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__startedAt --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__client --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__prompt --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__payload --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__generationMetadata\n src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesisAudit\n src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeLocalKeys\n src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__parsed --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__parsed --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__proposalKeys --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__proposalKeys --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__conclusions --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__conclusions --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__diagnosticIds --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeRawTarget\n src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria\n src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__mapKeys\n src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeRawTarget\n src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria\n src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__mapKeys\n src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeRawTarget\n src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria\n src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__mapKeys\n src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__proposalIdByKey --> src__synthesis__task_synthesis_materialize__mapKeys\n src__synthesis__task_synthesis_materialize__proposals --> src__synthesis__task_synthesis_materialize__mapKeys\n src__synthesis__task_synthesis_materialize__keys --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__mapKeys --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__mapKeys --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_materialize__sortedUnique --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__normalizeRawTarget --> src__synthesis__task_synthesis_materialize__normalizeStringArray\n src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria --> src__synthesis__task_synthesis_materialize__sortedUnique\n src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT --> src__synthesis__task_synthesis_contract__nonBlank\n src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT --> src__synthesis__task_synthesis_contract__taskIds\n src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__nonBlank\n src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__taskStrings\n src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__taskIds\n src__synthesis__code_change_plan__generatedAt --> src__synthesis__code_change_plan__createCodeChangeSourcePatch\n src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__collectTarget\n src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__buildChanges\n src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__titleFor\n src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__descriptionFor\n src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__collectTarget\n src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__buildChanges\n src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__titleFor\n src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__descriptionFor\n src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__collectTarget\n src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__buildChanges\n src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__titleFor\n src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__descriptionFor\n src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__collectTarget\n src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__buildChanges\n src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__titleFor\n src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__descriptionFor\n src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__collectTarget\n src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__buildChanges\n src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__titleFor\n src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__descriptionFor\n src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__collectTarget\n src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__buildChanges\n src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__titleFor\n src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__descriptionFor\n src__synthesis__code_change_plan__relatedRecords --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__matchingProposals --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__matchingConclusions --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__target --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__changes --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__planHash --> src__synthesis__code_change_plan__confidenceFor\n src__synthesis__code_change_plan__planIds --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance\n src__synthesis__code_change_plan__acceptances --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance\n src__synthesis__code_change_plan__acceptedCount --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__indexProposalsByDiagnostic --> src__synthesis__code_change_plan__set\n src__synthesis__code_change_plan__index --> src__synthesis__code_change_plan__set\n src__synthesis__code_change_plan__indexConclusionsByDiagnostic --> src__synthesis__code_change_plan__set\n src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__exactSourcePatchKeys\n src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__assertSourcePatchStrings\n src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__normalizeUnifiedDiff\n src__synthesis__code_change_plan__buildChanges --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__titleFor --> src__synthesis__code_change_plan__startsWithImperative\n src__synthesis__code_change_plan__record --> src__synthesis__code_change_plan__startsWithImperative\n src__synthesis__code_change_plan__object --> src__synthesis__code_change_plan__startsWithImperative\n src__synthesis__code_change_plan__acceptanceCriteriaFor --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__riskFor --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__rollbackFor --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__createCodeChangeReviewPatch --> src__synthesis__code_change_plan__priorityRank\n src__synthesis__code_change_plan__markdown --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown --> src__synthesis__code_change_plan__inline\n src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown --> src__synthesis__code_change_plan__renderIds\n src__synthesis__code_change_plan__rawDiff --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__rawDiff --> src__synthesis__code_change_plan__instructionFor\n src__synthesis__code_change_plan__unifiedDiff --> src__synthesis__code_change_plan__uniqueSorted\n src__synthesis__code_change_plan__unifiedDiff --> src__synthesis__code_change_plan__instructionFor\n src__synthesis__code_change_plan__patchHash --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__createCodeChangeSourcePatch\n src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__exactSourcePatchKeys\n src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertSourcePatchIds\n src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertSourcePatchStrings\n src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__exactSourcePatchKeys\n src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch\n src__synthesis__code_change_plan__plansById --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch\n src__synthesis__code_change_plan__patchIds --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch\n src__synthesis__code_change_plan__applyCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch\n src__synthesis__code_change_plan__applyCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertExistingSourceReceipt\n src__synthesis__code_change_plan__now --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__fileHashesAfter --> src__synthesis__code_change_plan__deterministicGeneration\n src__synthesis__code_change_plan__assertExistingSourceReceipt --> src__synthesis__code_change_plan__assertSourceApplyReceipt\n src__synthesis__code_change_plan__assertSourceApplyReceipt --> src__synthesis__code_change_plan__exactSourcePatchKeys\n src__synthesis__code_change_plan__assertSourceApplyReceipt --> src__synthesis__code_change_plan__exactSourcePatchSet\n src__synthesis__code_change_plan__applyUnifiedDiffToText --> src__synthesis__code_change_plan__normalizeUnifiedDiff\n src__synthesis__code_change_plan__applyUnifiedDiffToText --> src__synthesis__code_change_plan__splitKeep\n src__synthesis__code_change_path__isUsefulCodeChangePath --> src__synthesis__code_change_path__isPlannablePath\n src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__assertConclusions\n src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__summaryMode\n src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions\n src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__generationMetadata\n src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__readPrompt\n src__summary__summarizer__mode --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions\n src__summary__summarizer__mode --> src__summary__summarizer__SummaryAttemptError__generationMetadata\n src__summary__summarizer__client --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions\n src__summary__summarizer__client --> src__summary__summarizer__SummaryAttemptError__generationMetadata\n src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection\n src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions\n src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__generationMetadata\n src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection\n src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions\n src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__generationMetadata\n src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection --> src__summary__summarizer__SummaryAttemptError__materializeConclusions\n src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection --> src__summary__summarizer__SummaryAttemptError__generationMetadata\n src__summary__summarizer__SummaryAttemptError__conclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique\n src__summary__summarizer__SummaryAttemptError__materializeConclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique\n src__summary__summarizer__SummaryAttemptError__materializeConclusions --> src__summary__summarizer__SummaryAttemptError__assertConclusions\n src__summary__summarizer__SummaryAttemptError__parsed --> src__summary__summarizer__SummaryAttemptError__sortedUnique\n src__summary__summarizer__SummaryAttemptError__deterministicConclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique\n src__summary__summarizer__SummaryAttemptError__deterministicConclusions --> src__summary__summarizer__SummaryAttemptError__assertConclusions\n src__summary__render__renderSummaryMarkdown --> src__summary__render__renderRecords\n src__summary__render__renderSummaryMarkdown --> src__summary__render__renderConclusion\n src__summary__render__renderSummaryMarkdown --> src__summary__render__recordCitations\n src__summary__render__actions --> src__summary__render__recordCitations\n src__summary__render__confidence --> src__summary__render__recordCitations\n src__summary__render__renderConclusion --> src__summary__render__recordCitations\n src__services__actions__executeAction --> src__services__actions__resolveRoot\n src__services__actions__executeAction --> src__services__actions__scopedPath\n src__services__actions__executeAction --> src__services__actions__nlModeValue\n src__services__actions__executeAction --> src__services__actions__numberValue\n src__services__actions__executeAction --> src__services__actions__nullableScopedPath\n src__services__actions__root --> src__services__actions__scopedPath\n src__services__actions__root --> src__services__actions__nlModeValue\n src__services__actions__root --> src__services__actions__numberValue\n src__services__actions__root --> src__services__actions__nullableScopedPath\n src__services__actions__root --> src__services__actions__llmModeValue\n src__services__actions__analysis --> src__services__actions__booleanValue\n src__services__actions__graph --> src__services__actions__booleanValue\n src__services__actions__graph --> src__services__actions__numberValue\n src__services__actions__diagnostics --> src__services__actions__booleanValue\n src__services__actions__diagnostics --> src__services__actions__numberValue\n src__services__actions__result --> src__services__actions__stringValue\n src__services__actions__result --> src__services__actions__booleanValue\n src__services__actions__result --> src__services__actions__numberValue\n src__services__actions__todoPath --> src__services__actions__stringValue\n src__services__actions__receiptPath --> src__services__actions__stringValue\n src__services__actions__conclusions --> src__services__actions__numberValue\n src__services__actions__proposals --> src__services__actions__numberValue\n src__services__actions__patch --> src__services__actions__stringValue\n src__services__actions__beforeGraph --> src__services__actions__hasInputValue\n src__services__actions__beforeDiagnostics --> src__services__actions__hasInputValue\n src__services__actions__afterGraph --> src__services__actions__hasInputValue\n src__services__actions__afterDiagnostics --> src__services__actions__hasInputValue\n src__services__actions__value --> src__services__actions__hasInputValue\n src__services__actions__beforeInput --> src__services__actions__numberValue\n src__services__actions__afterInput --> src__services__actions__numberValue\n src__services__actions__before --> src__services__actions__numberValue\n src__services__actions__after --> src__services__actions__numberValue\n src__services__actions__diff --> src__services__actions__stringValue\n src__services__actions__diff --> src__services__actions__numberValue\n src__services__actions__svg --> src__services__actions__numberValue\n src__services__actions__beforePath --> src__services__actions__stringValue\n src__services__actions__beforePath --> src__services__actions__numberValue\n src__services__actions__afterPath --> src__services__actions__stringValue\n src__services__actions__afterPath --> src__services__actions__numberValue\n src__services__actions__view --> src__services__actions__booleanValue\n src__services__actions__view --> src__services__actions__numberValue\n src__services__actions__filterCommunicationGraph --> src__services__actions__stringValue\n src__services__actions__filterCommunicationGraph --> src__services__actions__booleanValue\n src__services__actions__nlModeValue --> src__services__actions__llmModeValue\n src__services__actions__summaryModeValue --> src__services__actions__llmModeValue\n src__services__actions__summaryModeValue --> src__services__actions__booleanValue\n src__services__actions__withTextDiffViews --> src__services__actions__stringValue\n src__services__actions__withTextDiffViews --> src__services__actions__booleanValue\n src__services__actions__withTextDiffViews --> src__services__actions__numberValue\n src__services__actions__title --> src__services__actions__booleanValue\n src__services__actions__title --> src__services__actions__numberValue\n src__services__actions__scopedPath --> src__services__actions__stringValue\n src__services__actions__nullableScopedPath --> src__services__actions__nullableString\n src__services__actions__readRecords --> src__services__actions__stringList\n src__semantic__reranker__createSemanticCandidateSet --> src__semantic__reranker__requiredText\n src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__validDate\n src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__validateRetrieval\n src__semantic__reranker__records --> src__semantic__reranker__roundedConfidence\n src__semantic__reranker__records --> src__semantic__reranker__validateVerdictReason\n src__semantic__reranker__records --> src__semantic__reranker__requiredText\n src__semantic__reranker__seenIds --> src__semantic__reranker__boundedScore\n src__semantic__reranker__seenPairs --> src__semantic__reranker__boundedScore\n src__semantic__reranker__byDeclaration --> src__semantic__reranker__boundedScore\n src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__assertSemanticCandidateSet\n src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__requiredText\n src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__roundedConfidence\n src__semantic__reranker__decisions --> src__semantic__reranker__roundedConfidence\n src__semantic__reranker__decisions --> src__semantic__reranker__requiredText\n src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__assertSemanticCandidateSet\n src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validDate\n src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validateGeneration\n src__semantic__reranker__seenDecisions --> src__semantic__reranker__roundedConfidence\n src__semantic__reranker__seenDecisions --> src__semantic__reranker__validateVerdictReason\n src__semantic__reranker__seenDecisions --> src__semantic__reranker__requiredText\n src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__roundedConfidence\n src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__validateVerdictReason\n src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__requiredText\n src__semantic__reranker__applyAcceptedSemanticRelations --> src__semantic__reranker__assertSemanticRerankResult\n src__semantic__reranker__applyAcceptedSemanticRelations --> src__semantic__reranker__values\n src__semantic__reranker__validateRetrieval --> src__semantic__reranker__requiredText\n src__semantic__reranker__validateGeneration --> src__semantic__reranker__requiredText\n src__semantic__reranker__validateVerdictReason --> src__semantic__reranker__assertSemanticVerdictReason\n src__semantic__reranker__assertGroundedQuote --> src__semantic__reranker__requiredText\n src__semantic__reranker__quote --> src__semantic__reranker__requiredText\n src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticCandidateSet\n src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult\n src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshot\n src__semantic__reranker_llm__SemanticRerankerRequiredError__model --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult\n src__semantic__reranker_llm__SemanticRerankerRequiredError__modelRevision --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult\n src__semantic__reranker_llm__SemanticRerankerRequiredError__payload --> src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord\n src__pipeline__run__runPipeline --> src__pipeline__run__skippedAudit\n src__pipeline__run__docs --> src__pipeline__run__collectTargetHints\n src__pipeline__run__docs --> src__pipeline__run__values\n src__pipeline__run__configurationExtraction --> src__pipeline__run__skippedAudit\n src__pipeline__run__includeCommunication --> src__pipeline__run__skippedAudit\n src__pipeline__run__communicationStartedAt --> src__pipeline__run__skippedAudit\n src__pipeline__run__communicationAudit --> src__pipeline__run__skippedAudit\n src__pipeline__run__communicationInputPresent --> src__pipeline__run__skippedAudit\n src__pipeline__run__collectTargetHints --> src__pipeline__run__values\n src__pipeline__run__persistFailedRun --> src__pipeline__run__skippedAudit\n src__pipeline__run__persistFailedRun --> src__pipeline__run__failureCode\n src__pipeline__run__persistFailedRun --> src__pipeline__run__failedAudit\n src__pipeline__run__persistFailedRun --> src__pipeline__run__aborted\n src__pipeline__run__persistFailedRun --> src__pipeline__run__stageValue\n src__pipeline__run__persistFailedRun --> src__pipeline__run__manifestConfiguration\n src__pipeline__run__aborted --> src__pipeline__run__skippedAudit\n src__pipeline__run__message --> src__pipeline__run__failureCode\n src__pipeline__run__knownAudit --> src__pipeline__run__failureCode\n src__pipeline__run__failedAudit --> src__pipeline__run__failureCode\n src__pipeline__run__stageValue --> src__pipeline__run__failedAudit\n src__pipeline__run__stageValue --> src__pipeline__run__aborted\n src__pipeline__run__reason --> src__pipeline__run__failureCode\n src__operations__validation__dateString --> src__operations__validation__nonBlank\n src__operations__validation__assertPrincipalList --> src__operations__validation__uniqueStrings\n src__operations__validation__principals --> src__operations__validation__uniqueStrings\n src__operations__validation__assertVariableContract --> src__operations__validation__objectValue\n src__operations__validation__assertVariableContract --> src__operations__validation__exactKeys\n src__operations__validation__assertVariableContract --> src__operations__validation__nonBlank\n", "is_subdir": false}, {"name": "compact_flow.mmd", "rel_path": "compact_flow.mmd", "path": "compact_flow.mmd", "size": "644B", "icon": "πŸ“ˆ", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.04s\n python__ast_extract["python.ast_extract<br/>18 funcs"]\n scripts__research["scripts.research<br/>71 funcs"]\n sdk__python["sdk.python<br/>68 funcs"]\n src__diff["src.diff<br/>182 funcs"]\n src__graph["src.graph<br/>192 funcs"]\n src__live["src.live<br/>60 funcs"]\n src__synthesis["src.synthesis<br/>292 funcs"]\n scripts__research ==>|7| src__live\n sdk__python ==>|6| src__synthesis\n python__ast_extract ==>|4| src__diff\n sdk__python -->|2| src__graph\n scripts__research -->|2| src__synthesis\n scripts__research -->|2| src__diff\n python__ast_extract -->|1| src__synthesis\n", "is_subdir": false}, {"name": "flow.mmd", "rel_path": "flow.mmd", "path": "flow.mmd", "size": "1.8KB", "icon": "πŸ“ˆ", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.04s\n\n %% Entry points (blue)\n classDef entry fill:#4dabf7,stroke:#1971c2,color:#fff\n\n subgraph CLI\n src__cli__execFileAsync["execFileAsync"]\n src__cli__main["main"]\n src__cli__parsed["parsed"]\n src__cli__command["command"]\n src__cli__config["config"]\n src__cli__files["files"]\n src__cli__records["records"]\n src__cli__graph["graph"]\n src__cli__graphFile["graphFile"]\n src__cli__diagnosticsPath["diagnosticsPath"]\n src__cli__diagnostics["diagnostics"]\n src__cli__result["result"]\n src__cli__out["out"]\n src__cli__graphPath["graphPath"]\n src__cli__output["output"]\n ...["+68 more"]\n end\n\n subgraph Core\n src__web__diff_ui__diffUiHtml["diffUiHtml"]\n src__web__diff_ui__compareGraphs{{compareGraphs CC=15}}\n src__watch__watcher__maxFiles["maxFiles"]\n src__watch__watcher__absoluteRoot["absoluteRoot"]\n src__watch__watcher__absolute["absolute"]\n src__watch__watcher__previous["previous"]\n src__watch__watcher__shown["shown"]\n src__watch__watcher__rest["rest"]\n src__watch__watcher__DEFAULT_MIN_INTERVAL_MS["DEFAULT_MIN_INTERVAL_MS"]\n src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS["DEFAULT_SCAN_INTERVAL_MS"]\n src__watch__watcher__watchRepository["watchRepository"]\n src__watch__watcher__root["root"]\n src__watch__watcher__minIntervalMs["minIntervalMs"]\n src__watch__watcher__scanIntervalMs["scanIntervalMs"]\n src__watch__watcher__signal["signal"]\n ...["+2130 more"]\n end\n\n class src__cli__execFileAsync,src__cli__main,src__cli__parsed,src__cli__command,src__cli__config,src__cli__files,src__cli__records,src__cli__graph,src__cli__graphFile,src__cli__diagnosticsPath entry\n", "is_subdir": false}, {"name": "prompt.txt", "rel_path": "prompt.txt", "path": "prompt.txt", "size": "2.9KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "You are an AI assistant helping me understand and improve a codebase.\n# generated in 0.00s\nUse the attached/generated files as the authoritative context.\nYour goal is to refactor the project based on these files, not just summarize it.\n\nwe are in project path: todo2code\n\nFiles for analysis:\n\nNote: project/validation.toon.yaml and project/duplication.toon.yaml are generated by external tools (vallm and redup)\n- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [24KB]\n- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [136KB]\n- evolution.toon.yaml (Refactoring queue - ranked actions by impact/effort, risks, metrics targets, history) [2KB]\n- project.toon.yaml (Compact project overview - generated from project.yaml data) [2KB]\n- context.md (LLM narrative - architecture summary and project context) [33KB]\n\nMissing files (not generated in this run):\n- README.md\n\nTask:\n- Treat this prompt as a refactoring brief: identify the highest-priority changes and prepare concrete edits.\n- Use the file set to decide whether the first pass should focus on correctness, duplication, complexity reduction, or architecture cleanup.\n- If you can safely implement the refactor, do it; otherwise give an exact file-by-file change plan and test plan.\n- Use analysis.toon.yaml to locate high-CC functions and god modules that should be split first.\n- Keep module boundaries intact and update imports/exports according to map.toon.yaml.\n- Use evolution.toon.yaml as the execution backlog and work from the top-ranked items.\n- Keep project.toon.yaml aligned with the refactored architecture.\n\nPriority Order:\nP1 β€” Split or simplify the highest-CC / god modules identified in analysis.toon.yaml.\nP1 β€” Preserve module boundaries and update imports/exports according to map.toon.yaml.\nP2 β€” Keep the compact project overview in project.toon.yaml aligned with the refactor.\nP2 β€” Execute the highest-impact items from evolution.toon.yaml in order of benefit/risk.\n\nFocus Areas for Analysis:\n1. **Code Health Analysis** - Review complexity metrics, god modules, coupling issues from analysis.toon.yaml\n2. **Structural Map** - Use map.toon.yaml to inspect imports, exports, signatures, and the project header\n3. **Refactoring Priorities** - Examine ranked refactoring actions and risk assessment from evolution.toon.yaml\n4. **Project Overview** - Review the compact project overview from project.toon.yaml\n\nAnalysis Strategy:\n- Start with analysis.toon.yaml for health metrics, then map.toon.yaml for structure and signatures\n- Review evolution.toon.yaml for action priorities and next steps\n- Compare the compact project overview in project.toon.yaml with the main analysis files\n\nConstraints:\n- Prefer minimal, incremental changes.\n- Maintain full backward compatibility.\n- Base recommendations on concrete metrics from the provided files.\n- If uncertain, ask clarifying questions.\n", "is_subdir": false}, {"name": "mermaid.export", "rel_path": "mermaid.export", "path": "mermaid.export", "size": "163.2KB", "icon": "πŸ“„", "type": "unknown", "type_name": "EXPORT", "content": "[Binary file]", "is_subdir": false}, {"name": "analysis.toon.yaml", "rel_path": "analysis.toon.yaml", "path": "analysis.toon.yaml", "size": "24.2KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# code2llm | 262f 45160L | typescript:117,md:52,json:32,python:15,javascript:15,rust:7,go:6,shell:6,php:4,yml:2,toml:2,txt:1,java:1 | 2026-08-01\n# generated in 0.21s\n# CCΜ…=4.0 | critical:120/3285 | dups:0 | cycles:0\n\nHEALTH[20]:\n πŸ”΄ GOD src/synthesis/code-change-plan.ts = 1310L, 10 classes, 127m, max CC=47\n πŸ”΄ GOD src/semantic/reranker.ts = 509L, 11 classes, 35m, max CC=27\n πŸ”΄ GOD src/core/schema.ts = 922L, 4 classes, 124m, max CC=23\n πŸ”΄ GOD src/communication/llm.ts = 514L, 8 classes, 53m, max CC=12\n πŸ”΄ GOD src/core/types.ts = 673L, 41 classes, 0m, max CC=0.0\n 🟑 CC main CC=95 (limit:15)\n 🟑 CC handleDiff CC=24 (limit:15)\n 🟑 CC handleExtract CC=16 (limit:15)\n 🟑 CC diffUiHtml CC=52 (limit:15)\n 🟑 CC compareGraphs CC=15 (limit:15)\n 🟑 CC DEFAULT_MIN_INTERVAL_MS CC=19 (limit:15)\n 🟑 CC DEFAULT_SCAN_INTERVAL_MS CC=19 (limit:15)\n 🟑 CC watchRepository CC=19 (limit:15)\n 🟑 CC classifyAction CC=17 (limit:15)\n 🟑 CC proposeCodeChangePlans CC=17 (limit:15)\n 🟑 CC paths CC=16 (limit:15)\n 🟑 CC assertCodeChangeReviewPatch CC=23 (limit:15)\n 🟑 CC assertCodeChangeSourcePatch CC=47 (limit:15)\n 🟑 CC assertCodeChangeSourcePatchSet CC=18 (limit:15)\n 🟑 CC normalizeUnifiedDiff CC=17 (limit:15)\n\nREFACTOR[6]:\n 1. split src/synthesis/code-change-plan.ts (god module)\n 2. split src/semantic/reranker.ts (god module)\n 3. split src/core/schema.ts (god module)\n 4. split src/communication/llm.ts (god module)\n 5. split src/core/types.ts (god module)\n 6. split 15 high-CC methods (CC>15)\n\nPIPELINES[1882]:\n [1] Src [parsed]: parsed β†’ printHelp\n PURITY: 100% pure\n [2] Src [command]: command β†’ printHelp\n PURITY: 100% pure\n [3] Src [config]: config\n PURITY: 100% pure\n [4] Src [graphFile]: graphFile\n PURITY: 100% pure\n [5] Src [diagnosticsPath]: diagnosticsPath β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [6] Src [diagnostics]: diagnostics β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [7] Src [result]: result β†’ execFileAsync\n PURITY: 100% pure\n [8] Src [graphPath]: graphPath\n PURITY: 100% pure\n [9] Src [output]: output\n PURITY: 100% pure\n [10] Src [synthesisPath]: synthesisPath\n PURITY: 100% pure\n [11] Src [patch]: patch\n PURITY: 100% pure\n [12] Src [audit]: audit\n PURITY: 100% pure\n [13] Src [receipt]: receipt\n PURITY: 100% pure\n [14] Src [actor]: actor\n PURITY: 100% pure\n [15] Src [approvalHash]: approvalHash\n PURITY: 100% pure\n [16] Src [plansPath]: plansPath\n PURITY: 100% pure\n [17] Src [inputPath]: inputPath\n PURITY: 100% pure\n [18] Src [isPlanSet]: isPlanSet β†’ optionString\n PURITY: 100% pure\n [19] Src [patchPath]: patchPath\n PURITY: 100% pure\n [20] Src [planPath]: planPath\n PURITY: 100% pure\n [21] Src [beforeGraphPath]: beforeGraphPath\n PURITY: 100% pure\n [22] Src [afterGraphPath]: afterGraphPath\n PURITY: 100% pure\n [23] Src [root]: root β†’ optionString\n PURITY: 100% pure\n [24] Src [taskFile]: taskFile β†’ optionNullableString\n PURITY: 100% pure\n [25] Src [controller]: controller β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [26] Src [stop]: stop β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [27] Src [stamp]: stamp β†’ file\n PURITY: 100% pure\n [28] Src [mode]: mode β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [29] Src [svg]: svg β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [30] Src [html]: html β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [31] Src [beforeFile]: beforeFile\n PURITY: 100% pure\n [32] Src [afterFile]: afterFile\n PURITY: 100% pure\n [33] Src [diff]: diff β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [34] Src [context]: context β†’ optionString\n PURITY: 100% pure\n [35] Src [maxRows]: maxRows β†’ optionString\n PURITY: 100% pure\n [36] Src [view]: view β†’ optionNumber β†’ optionString\n PURITY: 100% pure\n [37] Src [extractor]: extractor β†’ optionString\n PURITY: 100% pure\n [38] Src [moduleRoot]: moduleRoot\n PURITY: 100% pure\n [39] Src [sourceEnv]: sourceEnv\n PURITY: 100% pure\n [40] Src [targetEnv]: targetEnv\n PURITY: 100% pure\n [41] Src [task]: task\n PURITY: 100% pure\n [42] Src [sourceIgnore]: sourceIgnore\n PURITY: 100% pure\n [43] Src [targetIgnore]: targetIgnore\n PURITY: 100% pure\n [44] Src [options]: options\n PURITY: 100% pure\n [45] Src [next]: next\n PURITY: 100% pure\n [46] Src [name]: name\n PURITY: 100% pure\n [47] Src [number]: number\n PURITY: 100% pure\n [48] Src [invokedPath]: invokedPath β†’ main β†’ printHelp\n PURITY: 100% pure\n [49] Src [diffUiHtml]: diffUiHtml β†’ byId\n PURITY: 100% pure\n [50] Src [maxFiles]: maxFiles β†’ relative β†’ visit\n PURITY: 100% pure\n\nLAYERS:\n php/ CCΜ„=8.7 ←in:0 β†’out:0\n β”‚ !! ast_extract.php 233L 0C 7m CC=38 ←0\n β”‚\n golang/ CCΜ„=5.3 ←in:0 β†’out:0\n β”‚ ast_extract.go 368L 3C 15m CC=14 ←0\n β”‚\n src/ CCΜ„=4.2 ←in:0 β†’out:0\n β”‚ !! code-change-plan.ts 1310L 10C 127m CC=47 ←6\n β”‚ !! schema.ts 922L 4C 124m CC=23 ←0\n β”‚ !! cli.ts 827L 1C 83m CC=95 ←0\n β”‚ !! actions.ts 700L 0C 74m CC=83 ←0\n β”‚ !! types.ts 673L 41C 0m CC=0.0 ←0\n β”‚ !! reality.ts 609L 3C 73m CC=26 ←0\n β”‚ !! run.ts 602L 1C 64m CC=53 ←0\n β”‚ !! analyzer.ts 542L 3C 72m CC=48 ←0\n β”‚ !! llm.ts 514L 8C 53m CC=12 ←0\n β”‚ !! a2a-task-store.ts 513L 3C 81m CC=11 ←0\n β”‚ !! reranker.ts 509L 11C 35m CC=27 ←0\n β”‚ !! text.ts 491L 0C 51m CC=34 ←0\n β”‚ !! linker.ts 489L 4C 72m CC=18 ←0\n β”‚ !! markdown-llm.ts 458L 6C 38m CC=19 ←0\n β”‚ !! communication.ts 422L 4C 70m CC=76 ←0\n β”‚ !! gold-types.ts 378L 15C 11m CC=32 ←0\n β”‚ todo-patch.ts 372L 5C 52m CC=12 ←0\n β”‚ !! gold-cases.ts 366L 4C 42m CC=18 ←0\n β”‚ !! diagnostics.ts 361L 0C 40m CC=40 ←1\n β”‚ !! openrouter.ts 338L 7C 39m CC=31 ←0\n β”‚ summarizer.ts 333L 5C 27m CC=10 ←0\n β”‚ gold.ts 329L 3C 31m CC=14 ←0\n β”‚ workspace.ts 327L 3C 54m CC=12 ←0\n β”‚ a2a.ts 320L 0C 45m CC=9 ←0\n β”‚ contract-check.ts 317L 6C 39m CC=14 ←0\n β”‚ !! nl-llm.ts 316L 5C 45m CC=18 ←0\n β”‚ mcp-tools.ts 307L 1C 10m CC=8 ←0\n β”‚ !! docs-deterministic.ts 304L 1C 33m CC=18 ←0\n β”‚ !! validation.ts 281L 0C 47m CC=84 ←0\n β”‚ docs-llm.ts 269L 1C 28m CC=12 ←0\n β”‚ tasks-llm.ts 266L 4C 22m CC=11 ←1\n β”‚ mcp.ts 261L 2C 38m CC=9 ←0\n β”‚ text-render.ts 251L 2C 33m CC=13 ←0\n β”‚ !! watcher.ts 243L 4C 37m CC=19 ←0\n β”‚ !! text.ts 239L 1C 48m CC=19 ←2\n β”‚ diff.ts 235L 1C 38m CC=11 ←0\n β”‚ env.ts 227L 1C 20m CC=13 ←0\n β”‚ !! a2a-history.ts 226L 3C 37m CC=18 ←0\n β”‚ structured-schema.ts 218L 5C 25m CC=10 ←0\n β”‚ model-comparison.ts 218L 4C 21m CC=12 ←2\n β”‚ !! reranker-llm.ts 210L 2C 24m CC=25 ←0\n β”‚ configuration.ts 208L 1C 38m CC=10 ←0\n β”‚ !! code-change-path.ts 204L 0C 14m CC=38 ←0\n β”‚ ignore.ts 200L 3C 23m CC=10 ←0\n β”‚ docs-record.ts 193L 0C 34m CC=14 ←0\n β”‚ !! a2a-message.ts 184L 0C 33m CC=57 ←0\n β”‚ git.ts 180L 3C 26m CC=13 ←0\n β”‚ !! io.ts 177L 1C 32m CC=15 ←0\n β”‚ task-synthesis-materialize.ts 172L 0C 35m CC=5 ←0\n β”‚ typescript.ts 172L 6C 16m CC=2 ←0\n β”‚ !! record.ts 172L 2C 9m CC=18 ←0\n β”‚ a2a-card.ts 169L 0C 7m CC=3 ←0\n β”‚ ast.ts 167L 2C 15m CC=12 ←0\n β”‚ id.ts 167L 0C 16m CC=5 ←0\n β”‚ !! typescript.ts 166L 0C 19m CC=43 ←0\n β”‚ !! git.ts 161L 3C 21m CC=22 ←0\n β”‚ a2a-types.ts 160L 9C 14m CC=10 ←0\n β”‚ types.ts 155L 8C 0m CC=0.0 ←0\n β”‚ docs-chunks.ts 147L 0C 29m CC=8 ←0\n β”‚ content-cache.ts 139L 4C 12m CC=5 ←0\n β”‚ gold-extraction.ts 127L 0C 13m CC=5 ←0\n β”‚ subactor.ts 122L 1C 9m CC=13 ←0\n β”‚ !! markdown-paths.ts 122L 1C 17m CC=17 ←0\n β”‚ !! symbol-resolution.ts 120L 3C 16m CC=15 ←0\n β”‚ validation.ts 113L 2C 28m CC=11 ←0\n β”‚ nl.ts 107L 1C 12m CC=10 ←0\n β”‚ svg.ts 104L 2C 7m CC=2 ←0\n β”‚ !! identity.ts 100L 3C 14m CC=30 ←0\n β”‚ changelog.ts 99L 0C 16m CC=11 ←0\n β”‚ records.ts 97L 0C 10m CC=6 ←0\n β”‚ !! classifier.ts 96L 4C 27m CC=17 ←0\n β”‚ todo.ts 93L 0C 18m CC=5 ←0\n β”‚ changelog-signal.ts 89L 0C 12m CC=8 ←0\n β”‚ mcp-resources.ts 88L 0C 13m CC=6 ←0\n β”‚ contract.ts 84L 0C 7m CC=1 ←0\n β”‚ task-synthesis-payload.ts 70L 0C 8m CC=3 ←0\n β”‚ docs-types.ts 68L 7C 0m CC=0.0 ←0\n β”‚ markdown-block.ts 67L 1C 3m CC=10 ←0\n β”‚ task-synthesis-contract.ts 66L 3C 6m CC=1 ←0\n β”‚ artifact.ts 66L 2C 10m CC=6 ←0\n β”‚ payload.ts 65L 0C 8m CC=12 ←0\n β”‚ capability-evidence.ts 62L 0C 14m CC=10 ←0\n β”‚ render.ts 61L 0C 13m CC=10 ←0\n β”‚ target.ts 57L 0C 12m CC=9 ←0\n β”‚ security.ts 55L 0C 11m CC=7 ←0\n β”‚ index.ts 53L 0C 0m CC=0.0 ←0\n β”‚ gold-metrics.ts 50L 1C 11m CC=4 ←0\n β”‚ !! diff-ui.ts 48L 0C 9m CC=52 ←0\n β”‚ external.ts 48L 1C 5m CC=9 ←0\n β”‚ gold-cli.ts 44L 0C 10m CC=12 ←0\n β”‚ docs-schema.ts 43L 0C 5m CC=1 ←0\n β”‚ reranker-response.ts 42L 1C 5m CC=1 ←0\n β”‚ python.ts 39L 0C 6m CC=2 ←0\n β”‚ text-types.ts 39L 4C 0m CC=0.0 ←0\n β”‚ markdown.ts 35L 1C 4m CC=4 ←0\n β”‚ compile-cli.ts 34L 0C 7m CC=10 ←0\n β”‚ php.ts 34L 0C 6m CC=2 ←0\n β”‚ unsupported.ts 30L 0C 4m CC=5 ←0\n β”‚ failure.ts 25L 1C 3m CC=7 ←0\n β”‚ grounding.ts 24L 0C 5m CC=5 ←0\n β”‚ rust.ts 20L 0C 2m CC=1 ←0\n β”‚ java.ts 20L 0C 2m CC=1 ←0\n β”‚ go.ts 20L 0C 2m CC=1 ←0\n β”‚ types.ts 20L 2C 0m CC=0.0 ←0\n β”‚ audit.ts 19L 0C 1m CC=1 ←0\n β”‚ mcp-errors.ts 10L 1C 2m CC=3 ←0\n β”‚ version.ts 2L 0C 0m CC=0.0 ←0\n β”‚ version.ts 2L 0C 0m CC=0.0 ←0\n β”‚\n python/ CCΜ„=4.2 ←in:0 β†’out:5\n β”‚ !! ast_extract 221L 1C 18m CC=16 ←0\n β”‚ requirements.txt 1L 0C 0m CC=0.0 ←0\n β”‚\n scripts/ CCΜ„=3.4 ←in:0 β†’out:0\n β”‚ audit-changelog-sample.mjs 226L 0C 39m CC=11 ←0\n β”‚ examples-check.sh 210L 0C 3m CC=0.0 ←0\n β”‚ live-contract-check.mjs 200L 0C 26m CC=5 ←0\n β”‚ rerank-embedding-shortlist.mjs 191L 0C 27m CC=14 ←0\n β”‚ !! rank-intent-graph-embeddings 174L 0C 3m CC=27 ←0\n β”‚ live-model-comparison.mjs 125L 0C 15m CC=13 ←0\n β”‚ e2e.sh 109L 0C 3m CC=0.0 ←0\n β”‚ !! verify-env-contract.mjs 103L 0C 15m CC=28 ←0\n β”‚ evaluate-embedding-pairs 101L 0C 2m CC=9 ←0\n β”‚ verify-generated-analysis.mjs 88L 0C 14m CC=8 ←0\n β”‚ verify-module-boundaries.mjs 87L 0C 16m CC=7 ←0\n β”‚ !! verify-no-llm-imports.mjs 78L 0C 6m CC=15 ←0\n β”‚ sync-generated-readme-metadata.mjs 66L 0C 14m CC=4 ←0\n β”‚ smoke.sh 57L 0C 0m CC=0.0 ←0\n β”‚ assert-demollm-run.mjs 45L 0C 9m CC=2 ←0\n β”‚ verify-workflow-yaml.mjs 43L 0C 9m CC=11 ←0\n β”‚ docker-smoke.sh 36L 0C 1m CC=0.0 ←0\n β”‚ verify-structured-responses.mjs 35L 0C 7m CC=8 ←0\n β”‚ normalize-generated-analysis-roots.mjs 34L 0C 7m CC=4 ←0\n β”‚ generate-response-schemas.mjs 27L 0C 4m CC=2 ←0\n β”‚ README.md 27L 0C 0m CC=0.0 ←0\n β”‚ vallm-compatible 25L 0C 1m CC=2 ←0\n β”‚ package 25L 0C 0m CC=0.0 ←0\n β”‚ a2a-request.sh 23L 0C 0m CC=0.0 ←0\n β”‚ mcp-request.sh 11L 0C 0m CC=0.0 ←0\n β”‚\n java/ CCΜ„=3.0 ←in:0 β†’out:0\n β”‚ JavaAstExtract.java 260L 1C 12m CC=10 ←0\n β”‚\n sdk/ CCΜ„=2.7 ←in:0 β†’out:0\n β”‚ client 469L 7C 45m CC=7 ←0\n β”‚ index.ts 420L 14C 45m CC=8 ←0\n β”‚ Client.php 401L 1C 27m CC=11 ←0\n β”‚ runtime 225L 3C 10m CC=9 ←0\n β”‚ !! client.rs 221L 1C 19m CC=18 ←0\n β”‚ types.go 215L 19C 2m CC=4 ←0\n β”‚ client.go 197L 3C 10m CC=9 ←0\n β”‚ todo2code_sdk 171L 1C 11m CC=2 ←0\n β”‚ !! main.go 163L 0C 5m CC=26 ←0\n β”‚ types.rs 140L 11C 1m CC=2 ←0\n β”‚ actions.go 136L 0C 18m CC=3 ←0\n β”‚ basic.php 112L 0C 0m CC=0.0 ←0\n β”‚ !! basic.rs 108L 0C 3m CC=20 ←0\n β”‚ README.md 107L 0C 0m CC=0.0 ←0\n β”‚ actions.rs 100L 1C 20m CC=4 ←0\n β”‚ basic 95L 0C 1m CC=11 ←0\n β”‚ !! basic.ts 84L 0C 19m CC=17 ←0\n β”‚ README.md 68L 0C 0m CC=0.0 ←0\n β”‚ lib.rs 49L 0C 0m CC=0.0 ←0\n β”‚ error.rs 37L 2C 2m CC=2 ←0\n β”‚ local_runtime 36L 0C 1m CC=1 ←0\n β”‚ __init__ 33L 0C 0m CC=0.0 ←0\n β”‚ todo2code.go 30L 0C 0m CC=0.0 ←0\n β”‚ package.json 28L 0C 0m CC=0.0 ←0\n β”‚ Error.php 25L 1C 2m CC=1 ←0\n β”‚ README.md 24L 0C 0m CC=0.0 ←0\n β”‚ README.md 23L 0C 0m CC=0.0 ←0\n β”‚ README.md 21L 0C 0m CC=0.0 ←0\n β”‚ tsconfig.json 20L 0C 0m CC=0.0 ←0\n β”‚ README.md 20L 0C 0m CC=0.0 ←0\n β”‚ composer.json 18L 0C 0m CC=0.0 ←0\n β”‚ Cargo.toml 17L 0C 0m CC=0.0 ←0\n β”‚ __init__ 13L 0C 0m CC=0.0 ←0\n β”‚ __init__ 1L 0C 0m CC=0.0 ←0\n β”‚\n examples/ CCΜ„=2.4 ←in:0 β†’out:0\n β”‚ !! server.ts 99L 1C 18m CC=16 ←0\n β”‚ render.ts 64L 1C 12m CC=4 ←0\n β”‚ api.ts 50L 3C 6m CC=6 ←0\n β”‚ store.ts 48L 3C 4m CC=1 ←0\n β”‚ README.md 46L 0C 0m CC=0.0 ←0\n β”‚ app.ts 43L 1C 7m CC=4 ←0\n β”‚ README.md 35L 0C 0m CC=0.0 ←0\n β”‚ validation.ts 31L 1C 7m CC=10 ←0\n β”‚ python 23L 0C 0m CC=0.0 ←0\n β”‚ task.md 18L 0C 0m CC=0.0 ←0\n β”‚ task.md 17L 0C 0m CC=0.0 ←0\n β”‚ typescript.mjs 16L 0C 1m CC=1 ←0\n β”‚ tsconfig.json 15L 0C 0m CC=0.0 ←0\n β”‚ tsconfig.json 14L 0C 0m CC=0.0 ←0\n β”‚ runtime.ts 13L 1C 2m CC=2 ←0\n β”‚ CHANGELOG.md 11L 0C 0m CC=0.0 ←0\n β”‚ CHANGELOG.md 11L 0C 0m CC=0.0 ←0\n β”‚ CHANGELOG.md 11L 0C 0m CC=0.0 ←0\n β”‚ helper 9L 0C 2m CC=1 ←0\n β”‚ task.md 9L 0C 0m CC=0.0 ←0\n β”‚ ARCHITECTURE.md 9L 0C 0m CC=0.0 ←0\n β”‚ TODO.md 8L 0C 0m CC=0.0 ←0\n β”‚ TODO.md 7L 0C 0m CC=0.0 ←0\n β”‚ TODO.md 7L 0C 0m CC=0.0 ←0\n β”‚\n rust-ast/ CCΜ„=1.9 ←in:0 β†’out:0\n β”‚ main.rs 322L 3C 23m CC=9 ←0\n β”‚ Cargo.toml 12L 0C 0m CC=0.0 ←0\n β”‚\n ./ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! README.md 871L 0C 0m CC=0.0 ←0\n β”‚ !! CHANGELOG.md 670L 0C 0m CC=0.0 ←0\n β”‚ TODO.md 391L 0C 0m CC=0.0 ←0\n β”‚ Makefile 129L 0C 0m CC=0.0 ←0\n β”‚ package.json 48L 0C 0m CC=0.0 ←0\n β”‚ Dockerfile 45L 0C 0m CC=0.0 ←0\n β”‚ CONTRIBUTION.md 37L 0C 0m CC=0.0 ←0\n β”‚ compose.e2e.yml 27L 0C 0m CC=0.0 ←0\n β”‚ tsconfig.json 23L 0C 0m CC=0.0 ←0\n β”‚ docker-compose.yml 18L 0C 0m CC=0.0 ←0\n β”‚ TASK.md 10L 0C 0m CC=0.0 ←0\n β”‚\n schemas/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! gold-dataset.schema.json 585L 0C 0m CC=0.0 ←0\n β”‚ document-extraction-response.schema.json 186L 0C 0m CC=0.0 ←0\n β”‚ intent-record.schema.json 132L 0C 0m CC=0.0 ←0\n β”‚ semantic-rerank.schema.json 113L 0C 0m CC=0.0 ←0\n β”‚ code-change-plan.schema.json 98L 0C 0m CC=0.0 ←0\n β”‚ operation-plan.schema.json 94L 0C 0m CC=0.0 ←0\n β”‚ intent-graph-diff.schema.json 80L 0C 0m CC=0.0 ←0\n β”‚ code-change-source-patch.schema.json 63L 0C 0m CC=0.0 ←0\n β”‚ todo-proposal.schema.json 61L 0C 0m CC=0.0 ←0\n β”‚ todo-patch.schema.json 59L 0C 0m CC=0.0 ←0\n β”‚ semantic-candidate-set.schema.json 54L 0C 0m CC=0.0 ←0\n β”‚ code-change-acceptance.schema.json 53L 0C 0m CC=0.0 ←0\n β”‚ conclusion.schema.json 51L 0C 0m CC=0.0 ←0\n β”‚ intent-graph.schema.json 40L 0C 0m CC=0.0 ←0\n β”‚ participant-synthesis.schema.json 39L 0C 0m CC=0.0 ←0\n β”‚ variable-contract.schema.json 38L 0C 0m CC=0.0 ←0\n β”‚ code-change-source-apply-receipt.schema.json 31L 0C 0m CC=0.0 ←0\n β”‚ participant-registry.schema.json 27L 0C 0m CC=0.0 ←0\n β”‚ code-change-review.schema.json 27L 0C 0m CC=0.0 ←0\n β”‚ code-change-close-result.schema.json 26L 0C 0m CC=0.0 ←0\n β”‚ code-change-plan-set.schema.json 22L 0C 0m CC=0.0 ←0\n β”‚ code-change-source-patch-set.schema.json 18L 0C 0m CC=0.0 ←0\n β”‚\n prompts/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ tasks-from-dsl.system.md 52L 0C 0m CC=0.0 ←0\n β”‚ summarize.system.md 51L 0C 0m CC=0.0 ←0\n β”‚ docs-to-intent.system.md 23L 0C 0m CC=0.0 ←0\n β”‚ nl-to-intent.system.md 15L 0C 0m CC=0.0 ←0\n β”‚ communication-to-intent.system.md 7L 0C 0m CC=0.0 ←0\n β”‚ markdown-to-intent.system.md 5L 0C 0m CC=0.0 ←0\n β”‚\n evaluation/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! dataset.json 2410L 0C 0m CC=0.0 ←0\n β”‚ !! dataset.json 761L 0C 0m CC=0.0 ←0\n β”‚ README.md 87L 0C 0m CC=0.0 ←0\n β”‚\n docs/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md 872L 0C 0m CC=0.0 ←0\n β”‚ !! original-monitoring-design.md 872L 0C 0m CC=0.0 ←0\n β”‚ !! TEST_REPORT.md 587L 0C 0m CC=0.0 ←0\n β”‚ PIPELINE_DSL_NL.md 464L 0C 0m CC=0.0 ←0\n β”‚ DSL.md 457L 0C 0m CC=0.0 ←0\n β”‚ READINESS.md 442L 0C 0m CC=0.0 ←0\n β”‚ ALL_DIAGRAMS.md 410L 0C 0m CC=0.0 ←0\n β”‚ CLI_GUIDE.md 328L 0C 0m CC=0.0 ←0\n β”‚ GROK-PLAN.md 269L 0C 0m CC=0.0 ←0\n β”‚ TEAM_COMMUNICATION.md 268L 0C 0m CC=0.0 ←0\n β”‚ OPTIMIZATION.md 249L 0C 0m CC=0.0 ←0\n β”‚ ARCHITECTURE.md 200L 0C 0m CC=0.0 ←0\n β”‚ VALIDATION.md 198L 0C 0m CC=0.0 ←0\n β”‚ DEMOLLM.md 175L 0C 0m CC=0.0 ←0\n β”‚ CODE_CHANGE_PLANS.md 173L 0C 0m CC=0.0 ←0\n β”‚ PROTOCOLS.md 124L 0C 0m CC=0.0 ←0\n β”‚ E2E.md 52L 0C 0m CC=0.0 ←0\n β”‚ SECURITY.md 50L 0C 0m CC=0.0 ←0\n β”‚ REQUIREMENTS.md 39L 0C 0m CC=0.0 ←0\n β”‚ SUBACTOR_OPERATION_DSL.md 33L 0C 0m CC=0.0 ←0\n β”‚ README.md 22L 0C 0m CC=0.0 ←0\n β”‚\n adapters/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ package.json 10L 0C 0m CC=0.0 ←0\n β”‚\n\nCOUPLING:\n scripts.research src.synthesis sdk.python src.live src.diff python src.graph\n scripts.research ── 2 7 2 !! fan-out\n src.synthesis ←2 ── ←6 ←1 hub\n sdk.python 6 ── 2 !! fan-out\n src.live ←7 ── hub\n src.diff ←2 ── ←4 hub\n python 1 4 ── \n src.graph ←2 ──\n CYCLES: none\n HUB: src.diff/ (fan-in=6)\n HUB: src.synthesis/ (fan-in=9)\n HUB: src.live/ (fan-in=7)\n SMELL: sdk.python/ fan-out=8 β†’ split needed\n SMELL: scripts.research/ fan-out=11 β†’ split needed\n\nEXTERNAL:\n validation: run `vallm batch .` β†’ validation.toon\n duplication: run `redup scan .` β†’ duplication.toon\n", "is_subdir": false}, {"name": "calls.toon.yaml", "rel_path": "calls.toon.yaml", "path": "calls.toon.yaml", "size": "9.3KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# code2llm call graph | \n# generated in 0.21s\n# nodes: 354 | edges: 500 | modules: 18\n# CCΜ„=4.0\n\nHUBS[20]:\n src.services.actions.executeAction\n CC=83 in:0 out:65 total:65\n src.services.actions.root\n CC=83 in:0 out:64 total:64\n src.pipeline.run.runPipeline\n CC=53 in:0 out:54 total:54\n src.cli.main\n CC=95 in:1 out:44 total:45\n src.web.diff-ui.diffUiHtml\n CC=52 in:0 out:42 total:42\n src.synthesis.code-change-plan.applyCodeChangeSourcePatch\n CC=41 in:0 out:35 total:35\n src.synthesis.code-change-plan.assertCodeChangeSourcePatch\n CC=47 in:5 out:26 total:31\n src.synthesis.code-change-plan.uniqueSorted\n CC=1 in:20 out:5 total:25\n src.cli.optionNumber\n CC=5 in:18 out:5 total:23\n src.semantic.reranker.assertSemanticRerankResult\n CC=21 in:2 out:21 total:23\n src.services.actions.numberValue\n CC=6 in:18 out:4 total:22\n src.synthesis.code-change-plan.createCodeChangeSourcePatch\n CC=13 in:2 out:20 total:22\n src.synthesis.code-change-plan.deterministicGeneration\n CC=1 in:18 out:3 total:21\n src.synthesis.todo-patch.createTodoPatch\n CC=8 in:1 out:20 total:21\n src.semantic.reranker.assertSemanticCandidateSet\n CC=27 in:3 out:18 total:21\n src.watch.watcher.scanTree\n CC=12 in:4 out:17 total:21\n src.synthesis.code-change-plan.evaluateCodeChangeAcceptance\n CC=9 in:3 out:18 total:21\n src.synthesis.todo-patch.applyTodoPatch\n CC=12 in:0 out:20 total:20\n src.cli.handleDiff\n CC=24 in:1 out:19 total:20\n src.cli.handleExtract\n CC=16 in:1 out:18 total:19\n\nMODULES:\n src.cli [44 funcs]\n command CC=4 out:1\n context CC=9 out:10\n controller CC=1 out:5\n diagnostics CC=2 out:5\n diagnosticsPath CC=2 out:5\n diff CC=2 out:4\n doctor CC=6 out:7\n emitExtraction CC=4 out:4\n execFileAsync CC=2 out:2\n extractor CC=6 out:6\n src.operations.validation [8 funcs]\n assertPrincipalList CC=2 out:4\n assertVariableContract CC=20 out:14\n dateString CC=2 out:4\n exactKeys CC=2 out:5\n nonBlank CC=3 out:2\n objectValue CC=4 out:2\n principals CC=1 out:1\n uniqueStrings CC=8 out:5\n src.pipeline.run [19 funcs]\n aborted CC=1 out:1\n collectTargetHints CC=1 out:4\n communicationAudit CC=10 out:5\n communicationInputPresent CC=10 out:5\n communicationStartedAt CC=10 out:5\n configurationExtraction CC=10 out:5\n docs CC=2 out:4\n failedAudit CC=9 out:2\n failureCode CC=1 out:2\n includeCommunication CC=10 out:5\n src.semantic.reranker [23 funcs]\n acceptedDeclarations CC=16 out:15\n applyAcceptedSemanticRelations CC=2 out:13\n assertGroundedQuote CC=3 out:7\n assertSemanticCandidateSet CC=27 out:18\n assertSemanticRerankResult CC=21 out:21\n assertSemanticVerdictReason CC=7 out:2\n boundedScore CC=4 out:3\n byDeclaration CC=14 out:9\n createSemanticCandidateSet CC=8 out:17\n createSemanticRerankResult CC=4 out:11\n src.semantic.reranker-llm [8 funcs]\n assertSemanticCandidateSet CC=2 out:1\n assertSemanticRerankResult CC=2 out:1\n assertTrackedSnapshot CC=1 out:0\n model CC=4 out:2\n modelRevision CC=4 out:2\n payload CC=1 out:3\n projectRecord CC=3 out:3\n rerankSemanticCandidates CC=25 out:19\n src.services.actions [41 funcs]\n after CC=2 out:2\n afterDiagnostics CC=8 out:2\n afterGraph CC=8 out:2\n afterInput CC=2 out:2\n afterPath CC=1 out:4\n analysis CC=2 out:4\n before CC=2 out:2\n beforeDiagnostics CC=8 out:2\n beforeGraph CC=8 out:2\n beforeInput CC=2 out:2\n src.summary.render [6 funcs]\n actions CC=2 out:2\n confidence CC=1 out:2\n recordCitations CC=1 out:1\n renderConclusion CC=1 out:3\n renderRecords CC=2 out:3\n renderSummaryMarkdown CC=10 out:9\n src.summary.summarizer [15 funcs]\n assertConclusions CC=1 out:0\n conclusions CC=3 out:3\n deterministicConclusions CC=4 out:7\n generationMetadata CC=9 out:5\n materializeConclusions CC=1 out:7\n parsed CC=1 out:4\n readPrompt CC=2 out:6\n sortedUnique CC=2 out:5\n summarizeWithCorrection CC=10 out:7\n summaryMode CC=7 out:1\n src.synthesis.code-change-path [2 funcs]\n isPlannablePath CC=38 out:13\n isUsefulCodeChangePath CC=1 out:1\n src.synthesis.code-change-plan [63 funcs]\n acceptanceCriteriaFor CC=4 out:3\n acceptances CC=1 out:2\n acceptedCount CC=2 out:1\n applyCodeChangeSourcePatch CC=41 out:35\n applyUnifiedDiffToText CC=47 out:13\n assertCodeChangeSourcePatch CC=47 out:26\n assertCodeChangeSourcePatchSet CC=18 out:14\n assertExistingSourceReceipt CC=8 out:10\n assertSourceApplyReceipt CC=11 out:13\n assertSourcePatchIds CC=6 out:5\n src.synthesis.task-synthesis-contract [5 funcs]\n RAW_CONCLUSION_CONTRACT CC=1 out:5\n RAW_PROPOSAL_CONTRACT CC=1 out:6\n nonBlank CC=1 out:1\n taskIds CC=1 out:2\n taskStrings CC=1 out:2\n src.synthesis.task-synthesis-materialize [17 funcs]\n conclusionByKey CC=2 out:10\n conclusionIdByKey CC=2 out:10\n conclusions CC=1 out:5\n diagnosticIds CC=1 out:2\n keys CC=2 out:4\n mapKeys CC=2 out:5\n materializeTaskSynthesisResponse CC=2 out:18\n normalizeAcceptanceCriteria CC=4 out:2\n normalizeLocalKeys CC=1 out:0\n normalizeRawTarget CC=3 out:2\n src.synthesis.tasks-llm [11 funcs]\n assertConclusions CC=1 out:0\n client CC=2 out:2\n fallbackOrThrow CC=2 out:6\n generationMetadata CC=3 out:5\n payload CC=1 out:1\n prompt CC=1 out:1\n readPrompt CC=2 out:6\n startedAt CC=1 out:1\n synthesisAudit CC=1 out:1\n synthesizeTodoProposals CC=5 out:12\n src.synthesis.todo-patch [37 funcs]\n appendPatch CC=2 out:1\n applied CC=5 out:4\n applyTodoPatch CC=12 out:20\n artifact CC=6 out:8\n assertApproval CC=3 out:2\n assertReceipt CC=7 out:4\n assertTodoPatchArtifact CC=11 out:16\n atomicWrite CC=5 out:13\n classified CC=6 out:8\n createTodoPatch CC=8 out:20\n src.synthesis.validation [12 funcs]\n dependencyFirstPriorityOrder CC=11 out:10\n duplicateEvidence CC=11 out:9\n intersects CC=1 out:5\n jaccard CC=5 out:1\n proposalWords CC=1 out:1\n sharedPath CC=1 out:2\n sharedSymbol CC=1 out:2\n sharedTicket CC=1 out:2\n similarity CC=1 out:2\n target CC=1 out:2\n src.tf.classifier [6 funcs]\n classifyAction CC=17 out:12\n dynamicImport CC=1 out:3\n importer CC=1 out:0\n loadAssets CC=2 out:6\n loadClassifier CC=6 out:5\n vectorize CC=6 out:5\n src.watch.watcher [28 funcs]\n DEFAULT_MIN_INTERVAL_MS CC=19 out:14\n DEFAULT_SCAN_INTERVAL_MS CC=19 out:14\n absolute CC=3 out:3\n absoluteRoot CC=11 out:14\n current CC=2 out:2\n defaultSleep CC=6 out:7\n delta CC=2 out:2\n describeDelta CC=2 out:4\n diffSnapshots CC=6 out:5\n emit CC=2 out:0\n src.web.diff-ui [9 funcs]\n byId CC=1 out:0\n compareGraphs CC=15 out:13\n diffUiHtml CC=52 out:42\n fillSelect CC=6 out:9\n formatBytes CC=7 out:2\n loadRuns CC=12 out:14\n requestHeaders CC=3 out:2\n selectedRun CC=7 out:2\n updateMeta CC=7 out:3\n\nEDGES:\n src.cli.main β†’ src.cli.printHelp\n src.cli.main β†’ src.cli.parseArgs\n src.cli.main β†’ src.cli.initProject\n src.cli.parsed β†’ src.cli.printHelp\n src.cli.command β†’ src.cli.printHelp\n src.cli.diagnosticsPath β†’ src.cli.optionNumber\n src.cli.diagnosticsPath β†’ src.cli.optionBoolean\n src.cli.diagnostics β†’ src.cli.optionNumber\n src.cli.diagnostics β†’ src.cli.optionBoolean\n src.cli.result β†’ src.cli.execFileAsync\n src.cli.isPlanSet β†’ src.cli.optionString\n src.cli.root β†’ src.cli.optionString\n src.cli.root β†’ src.cli.optionNullableString\n src.cli.root β†’ src.cli.optionLlmMode\n src.cli.handleWatch β†’ src.cli.optionNullableString\n src.cli.handleWatch β†’ src.cli.optionList\n src.cli.handleWatch β†’ src.cli.optionBoolean\n src.cli.handleWatch β†’ src.cli.optionString\n src.cli.handleWatch β†’ src.cli.optionNumber\n src.cli.handleWatch β†’ src.cli.optionNlMode\n src.cli.taskFile β†’ src.cli.optionNullableString\n src.cli.taskFile β†’ src.cli.optionList\n src.cli.taskFile β†’ src.cli.optionBoolean\n src.cli.taskFile β†’ src.cli.optionString\n src.cli.taskFile β†’ src.cli.optionNumber\n src.cli.taskFile β†’ src.cli.optionNlMode\n src.cli.taskFile β†’ src.cli.optionLlmMode\n src.cli.taskFile β†’ src.cli.optionPipelineTaskMode\n src.cli.controller β†’ src.cli.optionNumber\n src.cli.controller β†’ src.cli.optionBoolean\n src.cli.controller β†’ src.cli.formatWatchEvent\n src.cli.stop β†’ src.cli.optionNumber\n src.cli.stop β†’ src.cli.optionBoolean\n src.cli.stop β†’ src.cli.formatWatchEvent\n src.cli.formatWatchEvent β†’ src.cli.file\n src.cli.stamp β†’ src.cli.file\n src.cli.handleDiff β†’ src.cli.optionString\n src.cli.handleDiff β†’ src.cli.optionNumber\n src.cli.mode β†’ src.cli.optionNumber\n src.cli.svg β†’ src.cli.optionNumber\n src.cli.svg β†’ src.cli.optionBoolean\n src.cli.html β†’ src.cli.optionNumber\n src.cli.diff β†’ src.cli.optionNumber\n src.cli.context β†’ src.cli.optionString\n src.cli.context β†’ src.cli.optionBoolean\n src.cli.context β†’ src.cli.optionNumber\n src.cli.maxRows β†’ src.cli.optionString\n src.cli.maxRows β†’ src.cli.optionBoolean\n src.cli.maxRows β†’ src.cli.optionNumber\n src.cli.handleReality β†’ src.cli.optionString\n", "is_subdir": false}, {"name": "calls.yaml", "rel_path": "calls.yaml", "path": "calls.yaml", "size": "223.5KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "project: \ngenerated_from: code2llm call graph analysis\nstats:\n total_nodes: 354\n total_edges: 500\n modules_count: 18\nnodes:\n src.synthesis.code-change-plan.buildChanges:\n name: buildChanges\n module: src.synthesis.code-change-plan\n line: 380\n cyclomatic_complexity: 11\n calls_out: 7\n calls_in: 7\n src.cli.handleExtract:\n name: handleExtract\n module: src.cli\n line: 518\n cyclomatic_complexity: 16\n calls_out: 18\n calls_in: 1\n src.synthesis.task-synthesis-contract.taskIds:\n name: taskIds\n module: src.synthesis.task-synthesis-contract\n line: 35\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.cli.optionLlmMode:\n name: optionLlmMode\n module: src.cli\n line: 741\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 8\n src.synthesis.task-synthesis-materialize.proposalKeys:\n name: proposalKeys\n module: src.synthesis.task-synthesis-materialize\n line: 26\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.web.diff-ui.loadRuns:\n name: loadRuns\n module: src.web.diff-ui\n line: 43\n cyclomatic_complexity: 12\n calls_out: 14\n calls_in: 1\n src.synthesis.code-change-plan.assertSourcePatchStrings:\n name: assertSourcePatchStrings\n module: src.synthesis.code-change-plan\n line: 953\n cyclomatic_complexity: 8\n calls_out: 5\n calls_in: 2\n src.web.diff-ui.fillSelect:\n name: fillSelect\n module: src.web.diff-ui\n line: 42\n cyclomatic_complexity: 6\n calls_out: 9\n calls_in: 2\n src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse:\n name: materializeTaskSynthesisResponse\n module: src.synthesis.task-synthesis-materialize\n line: 14\n cyclomatic_complexity: 2\n calls_out: 18\n calls_in: 0\n src.services.actions.value:\n name: value\n module: src.services.actions\n line: 369\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions:\n name: assertConclusions\n module: src.synthesis.tasks-llm\n line: 71\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.synthesis.todo-patch.uniqueStrings:\n name: uniqueStrings\n module: src.synthesis.todo-patch\n line: 366\n cyclomatic_complexity: 7\n calls_out: 5\n calls_in: 6\n src.synthesis.code-change-plan.relatedRecords:\n name: relatedRecords\n module: src.synthesis.code-change-plan\n line: 136\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.pipeline.run.docs:\n name: docs\n module: src.pipeline.run\n line: 146\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.cli.maxRows:\n name: maxRows\n module: src.cli\n line: 452\n cyclomatic_complexity: 9\n calls_out: 10\n calls_in: 0\n src.tf.classifier.classifyAction:\n name: classifyAction\n module: src.tf.classifier\n line: 69\n cyclomatic_complexity: 17\n calls_out: 12\n calls_in: 0\n src.pipeline.run.configurationExtraction:\n name: configurationExtraction\n module: src.pipeline.run\n line: 182\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.summary.summarizer.client:\n name: client\n module: src.summary.summarizer\n line: 85\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 0\n src.semantic.reranker.validDate:\n name: validDate\n module: src.semantic.reranker\n line: 499\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n src.services.actions.patch:\n name: patch\n module: src.services.actions\n line: 302\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.services.actions.afterPath:\n name: afterPath\n module: src.services.actions\n line: 428\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.watch.watcher.waitMs:\n name: waitMs\n module: src.watch.watcher\n line: 192\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.cli.optionBoolean:\n name: optionBoolean\n module: src.cli\n line: 717\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 15\n src.watch.watcher.diffSnapshots:\n name: diffSnapshots\n module: src.watch.watcher\n line: 80\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 3\n src.cli.optionPipelineTaskMode:\n name: optionPipelineTaskMode\n module: src.cli\n line: 763\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 3\n src.synthesis.task-synthesis-materialize.normalizeLocalKeys:\n name: normalizeLocalKeys\n module: src.synthesis.task-synthesis-materialize\n line: 92\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.summary.summarizer.SummaryAttemptError.conclusions:\n name: conclusions\n module: src.summary.summarizer\n line: 264\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.semantic.reranker.createSemanticCandidateSet:\n name: createSemanticCandidateSet\n module: src.semantic.reranker\n line: 113\n cyclomatic_complexity: 8\n calls_out: 17\n calls_in: 0\n src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet:\n name: assertSemanticCandidateSet\n module: src.semantic.reranker-llm\n line: 44\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.synthesis.todo-patch.result:\n name: result\n module: src.synthesis.todo-patch\n line: 188\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 0\n src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates:\n name: rerankSemanticCandidates\n module: src.semantic.reranker-llm\n line: 38\n cyclomatic_complexity: 25\n calls_out: 19\n calls_in: 0\n src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria:\n name: normalizeAcceptanceCriteria\n module: src.synthesis.task-synthesis-materialize\n line: 152\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 4\n src.synthesis.task-synthesis-materialize.proposalDrafts:\n name: proposalDrafts\n module: src.synthesis.task-synthesis-materialize\n line: 49\n cyclomatic_complexity: 2\n calls_out: 10\n calls_in: 0\n src.synthesis.task-synthesis-materialize.conclusionByKey:\n name: conclusionByKey\n module: src.synthesis.task-synthesis-materialize\n line: 47\n cyclomatic_complexity: 2\n calls_out: 10\n calls_in: 0\n src.cli.formatWatchEvent:\n name: formatWatchEvent\n module: src.cli\n line: 408\n cyclomatic_complexity: 10\n calls_out: 7\n calls_in: 3\n src.pipeline.run.reason:\n name: reason\n module: src.pipeline.run\n line: 549\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 0\n src.semantic.reranker.assertSemanticVerdictReason:\n name: assertSemanticVerdictReason\n module: src.semantic.reranker\n line: 443\n cyclomatic_complexity: 7\n calls_out: 2\n calls_in: 1\n src.cli.diff:\n name: diff\n module: src.cli\n line: 444\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.semantic.reranker.roundedConfidence:\n name: roundedConfidence\n module: src.semantic.reranker\n line: 487\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 6\n src.summary.render.renderConclusion:\n name: renderConclusion\n module: src.summary.render\n line: 54\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.cli.handleWatch:\n name: handleWatch\n module: src.cli\n line: 366\n cyclomatic_complexity: 6\n calls_out: 18\n calls_in: 1\n src.pipeline.run.persistFailedRun:\n name: persistFailedRun\n module: src.pipeline.run\n line: 497\n cyclomatic_complexity: 19\n calls_out: 12\n calls_in: 1\n src.watch.watcher.emit:\n name: emit\n module: src.watch.watcher\n line: 151\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 10\n src.pipeline.run.manifestConfiguration:\n name: manifestConfiguration\n module: src.pipeline.run\n line: 433\n cyclomatic_complexity: 8\n calls_out: 3\n calls_in: 2\n src.services.actions.beforeInput:\n name: beforeInput\n module: src.services.actions\n line: 400\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.synthesis.todo-patch.orderedSelected:\n name: orderedSelected\n module: src.synthesis.todo-patch\n line: 91\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.cli.file:\n name: file\n module: src.cli\n line: 523\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 2\n src.synthesis.code-change-plan.fileHashesAfter:\n name: fileHashesAfter\n module: src.synthesis.code-change-plan\n line: 1100\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.synthesis.todo-patch.diagnosticReportFingerprint:\n name: diagnosticReportFingerprint\n module: src.synthesis.todo-patch\n line: 60\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 2\n src.summary.render.actions:\n name: actions\n module: src.summary.render\n line: 32\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.services.actions.graph:\n name: graph\n module: src.services.actions\n line: 452\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.synthesis.validation.dependencyFirstPriorityOrder:\n name: dependencyFirstPriorityOrder\n module: src.synthesis.validation\n line: 64\n cyclomatic_complexity: 11\n calls_out: 10\n calls_in: 1\n src.semantic.reranker-llm.SemanticRerankerRequiredError.projectRecord:\n name: projectRecord\n module: src.semantic.reranker-llm\n line: 195\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n src.synthesis.code-change-plan.collectTarget:\n name: collectTarget\n module: src.synthesis.code-change-plan\n line: 355\n cyclomatic_complexity: 11\n calls_out: 3\n calls_in: 7\n src.synthesis.validation.sharedTicket:\n name: sharedTicket\n module: src.synthesis.validation\n line: 44\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.summary.summarizer.SummaryAttemptError.readPrompt:\n name: readPrompt\n module: src.summary.summarizer\n line: 329\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 1\n src.pipeline.run.stageValue:\n name: stageValue\n module: src.pipeline.run\n line: 535\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.web.diff-ui.requestHeaders:\n name: requestHeaders\n module: src.web.diff-ui\n line: 38\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 3\n src.synthesis.task-synthesis-materialize.diagnosticIds:\n name: diagnosticIds\n module: src.synthesis.task-synthesis-materialize\n line: 32\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.cli.initProject:\n name: initProject\n module: src.cli\n line: 623\n cyclomatic_complexity: 6\n calls_out: 9\n calls_in: 1\n src.semantic.reranker.values:\n name: values\n module: src.semantic.reranker\n line: 226\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 1\n src.synthesis.todo-patch.inline:\n name: inline\n module: src.synthesis.todo-patch\n line: 321\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 3\n src.pipeline.run.runPipeline:\n name: runPipeline\n module: src.pipeline.run\n line: 55\n cyclomatic_complexity: 53\n calls_out: 54\n calls_in: 0\n src.cli.taskFile:\n name: taskFile\n module: src.cli\n line: 368\n cyclomatic_complexity: 3\n calls_out: 8\n calls_in: 0\n src.cli.optionNumber:\n name: optionNumber\n module: src.cli\n line: 724\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 18\n src.cli.printHelp:\n name: printHelp\n module: src.cli\n line: 777\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 3\n src.operations.validation.dateString:\n name: dateString\n module: src.operations.validation\n line: 35\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 2\n src.synthesis.code-change-plan.planHash:\n name: planHash\n module: src.synthesis.code-change-plan\n line: 166\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals:\n name: synthesizeTodoProposals\n module: src.synthesis.tasks-llm\n line: 62\n cyclomatic_complexity: 5\n calls_out: 12\n calls_in: 0\n src.services.actions.numberValue:\n name: numberValue\n module: src.services.actions\n line: 651\n cyclomatic_complexity: 6\n calls_out: 4\n calls_in: 18\n src.semantic.reranker.requiredText:\n name: requiredText\n module: src.semantic.reranker\n line: 494\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 11\n src.synthesis.code-change-plan.assertExistingSourceReceipt:\n name: assertExistingSourceReceipt\n module: src.synthesis.code-change-plan\n line: 1152\n cyclomatic_complexity: 8\n calls_out: 10\n calls_in: 1\n src.web.diff-ui.compareGraphs:\n name: compareGraphs\n module: src.web.diff-ui\n line: 45\n cyclomatic_complexity: 15\n calls_out: 13\n calls_in: 2\n src.synthesis.task-synthesis-contract.nonBlank:\n name: nonBlank\n module: src.synthesis.task-synthesis-contract\n line: 36\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.synthesis.todo-patch.selected:\n name: selected\n module: src.synthesis.todo-patch\n line: 238\n cyclomatic_complexity: 6\n calls_out: 8\n calls_in: 0\n src.synthesis.code-change-plan.assertCodeChangeSourcePatch:\n name: assertCodeChangeSourcePatch\n module: src.synthesis.code-change-plan\n line: 790\n cyclomatic_complexity: 47\n calls_out: 26\n calls_in: 5\n src.synthesis.code-change-plan.conclusionsByDiagnostic:\n name: conclusionsByDiagnostic\n module: src.synthesis.code-change-plan\n line: 122\n cyclomatic_complexity: 7\n calls_out: 18\n calls_in: 0\n src.synthesis.code-change-plan.descriptionFor:\n name: descriptionFor\n module: src.synthesis.code-change-plan\n line: 444\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 7\n src.watch.watcher.snapshot:\n name: snapshot\n module: src.watch.watcher\n line: 163\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.synthesis.code-change-plan.applyUnifiedDiffToText:\n name: applyUnifiedDiffToText\n module: src.synthesis.code-change-plan\n line: 1222\n cyclomatic_complexity: 47\n calls_out: 13\n calls_in: 1\n src.synthesis.code-change-plan.changes:\n name: changes\n module: src.synthesis.code-change-plan\n line: 144\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.operations.validation.exactKeys:\n name: exactKeys\n module: src.operations.validation\n line: 23\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 12\n src.synthesis.todo-patch.applyTodoPatch:\n name: applyTodoPatch\n module: src.synthesis.todo-patch\n line: 160\n cyclomatic_complexity: 12\n calls_out: 20\n calls_in: 0\n src.semantic.reranker.acceptedDeclarations:\n name: acceptedDeclarations\n module: src.semantic.reranker\n line: 328\n cyclomatic_complexity: 16\n calls_out: 15\n calls_in: 0\n src.synthesis.task-synthesis-materialize.sortedUnique:\n name: sortedUnique\n module: src.synthesis.task-synthesis-materialize\n line: 130\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 10\n src.synthesis.code-change-plan.rollbackFor:\n name: rollbackFor\n module: src.synthesis.code-change-plan\n line: 500\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 7\n src.semantic.reranker.records:\n name: records\n module: src.semantic.reranker\n line: 326\n cyclomatic_complexity: 16\n calls_out: 15\n calls_in: 0\n src.summary.render.renderRecords:\n name: renderRecords\n module: src.summary.render\n line: 46\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.services.actions.llmModeValue:\n name: llmModeValue\n module: src.services.actions\n line: 532\n cyclomatic_complexity: 5\n calls_out: 1\n calls_in: 4\n src.operations.validation.principals:\n name: principals\n module: src.operations.validation\n line: 50\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.synthesis.todo-patch.markdown:\n name: markdown\n module: src.synthesis.todo-patch\n line: 95\n cyclomatic_complexity: 2\n calls_out: 9\n calls_in: 0\n src.pipeline.run.failedAudit:\n name: failedAudit\n module: src.pipeline.run\n line: 519\n cyclomatic_complexity: 9\n calls_out: 2\n calls_in: 2\n src.synthesis.code-change-plan.instructionFor:\n name: instructionFor\n module: src.synthesis.code-change-plan\n line: 969\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 3\n src.synthesis.code-change-path.isPlannablePath:\n name: isPlannablePath\n module: src.synthesis.code-change-path\n line: 138\n cyclomatic_complexity: 38\n calls_out: 13\n calls_in: 1\n src.services.actions.scopedPath:\n name: scopedPath\n module: src.services.actions\n line: 603\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 2\n src.synthesis.task-synthesis-materialize.normalizeRawTarget:\n name: normalizeRawTarget\n module: src.synthesis.task-synthesis-materialize\n line: 142\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 4\n src.semantic.reranker-llm.SemanticRerankerRequiredError.model:\n name: model\n module: src.semantic.reranker-llm\n line: 51\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 0\n src.watch.watcher.describeDelta:\n name: describeDelta\n module: src.watch.watcher\n line: 100\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 5\n src.synthesis.code-change-plan.renderCodeChangeReviewMarkdown:\n name: renderCodeChangeReviewMarkdown\n module: src.synthesis.code-change-plan\n line: 572\n cyclomatic_complexity: 10\n calls_out: 6\n calls_in: 1\n src.synthesis.code-change-plan.applyCodeChangeSourcePatch:\n name: applyCodeChangeSourcePatch\n module: src.synthesis.code-change-plan\n line: 1031\n cyclomatic_complexity: 41\n calls_out: 35\n calls_in: 0\n src.synthesis.code-change-plan.createCodeChangeReviewPatch:\n name: createCodeChangeReviewPatch\n module: src.synthesis.code-change-plan\n line: 547\n cyclomatic_complexity: 6\n calls_out: 15\n calls_in: 0\n src.semantic.reranker.validateGeneration:\n name: validateGeneration\n module: src.semantic.reranker\n line: 422\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.synthesis.code-change-plan.unifiedDiff:\n name: unifiedDiff\n module: src.synthesis.code-change-plan\n line: 724\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.todo-patch.applied:\n name: applied\n module: src.synthesis.todo-patch\n line: 189\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 0\n src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection:\n name: summarizeWithCorrection\n module: src.summary.summarizer\n line: 169\n cyclomatic_complexity: 10\n calls_out: 7\n calls_in: 3\n src.synthesis.code-change-plan.index:\n name: index\n module: src.synthesis.code-change-plan\n line: 344\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 0\n src.synthesis.code-change-plan.planIds:\n name: planIds\n module: src.synthesis.code-change-plan\n line: 306\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.summary.render.confidence:\n name: confidence\n module: src.summary.render\n line: 55\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.cli.invokedPath:\n name: invokedPath\n module: src.cli\n line: 821\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 0\n src.synthesis.code-change-plan.confidenceFor:\n name: confidenceFor\n module: src.synthesis.code-change-plan\n line: 480\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 8\n src.watch.watcher.visit:\n name: visit\n module: src.watch.watcher\n line: 42\n cyclomatic_complexity: 11\n calls_out: 13\n calls_in: 5\n src.cli.optionSummaryMode:\n name: optionSummaryMode\n module: src.cli\n line: 753\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n src.summary.summarizer.systemPrompt:\n name: systemPrompt\n module: src.summary.summarizer\n line: 103\n cyclomatic_complexity: 6\n calls_out: 6\n calls_in: 0\n src.cli.svg:\n name: svg\n module: src.cli\n line: 505\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.synthesis.code-change-plan.candidates:\n name: candidates\n module: src.synthesis.code-change-plan\n line: 124\n cyclomatic_complexity: 7\n calls_out: 18\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.client:\n name: client\n module: src.synthesis.tasks-llm\n line: 72\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.watch.watcher.relative:\n name: relative\n module: src.watch.watcher\n line: 55\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 4\n src.synthesis.todo-patch.renderTodoPatchMarkdown:\n name: renderTodoPatchMarkdown\n module: src.synthesis.todo-patch\n line: 119\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 1\n src.synthesis.todo-patch.sourceTodo:\n name: sourceTodo\n module: src.synthesis.todo-patch\n line: 232\n cyclomatic_complexity: 6\n calls_out: 8\n calls_in: 0\n src.synthesis.code-change-plan.priorityRank:\n name: priorityRank\n module: src.synthesis.code-change-plan\n line: 672\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.watch.watcher.sleep:\n name: sleep\n module: src.watch.watcher\n line: 153\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 3\n src.synthesis.todo-patch.current:\n name: current\n module: src.synthesis.todo-patch\n line: 179\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.watch.watcher.lastReportStartedAt:\n name: lastReportStartedAt\n module: src.watch.watcher\n line: 168\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow:\n name: fallbackOrThrow\n module: src.synthesis.tasks-llm\n line: 177\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 2\n src.semantic.reranker.validateRetrieval:\n name: validateRetrieval\n module: src.semantic.reranker\n line: 414\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.services.actions.root:\n name: root\n module: src.services.actions\n line: 73\n cyclomatic_complexity: 83\n calls_out: 64\n calls_in: 0\n src.synthesis.todo-patch.renderTargets:\n name: renderTargets\n module: src.synthesis.todo-patch\n line: 307\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 1\n src.synthesis.todo-patch.assertReceipt:\n name: assertReceipt\n module: src.synthesis.todo-patch\n line: 262\n cyclomatic_complexity: 7\n calls_out: 4\n calls_in: 2\n src.synthesis.validation.duplicateEvidence:\n name: duplicateEvidence\n module: src.synthesis.validation\n line: 38\n cyclomatic_complexity: 11\n calls_out: 9\n calls_in: 1\n src.summary.summarizer.SummaryAttemptError.deterministicConclusions:\n name: deterministicConclusions\n module: src.summary.summarizer\n line: 259\n cyclomatic_complexity: 4\n calls_out: 7\n calls_in: 5\n src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT:\n name: RAW_PROPOSAL_CONTRACT\n module: src.synthesis.task-synthesis-contract\n line: 49\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 0\n src.synthesis.todo-patch.uniqueIds:\n name: uniqueIds\n module: src.synthesis.todo-patch\n line: 358\n cyclomatic_complexity: 7\n calls_out: 5\n calls_in: 6\n src.pipeline.run.communicationInputPresent:\n name: communicationInputPresent\n module: src.pipeline.run\n line: 189\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.tf.classifier.dynamicImport:\n name: dynamicImport\n module: src.tf.classifier\n line: 29\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.synthesis.code-change-plan.rawDiff:\n name: rawDiff\n module: src.synthesis.code-change-plan\n line: 723\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.code-change-plan.deterministicGeneration:\n name: deterministicGeneration\n module: src.synthesis.code-change-plan\n line: 504\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 18\n src.synthesis.code-change-plan.patchHash:\n name: patchHash\n module: src.synthesis.code-change-plan\n line: 745\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.code-change-plan.proposalsByDiagnostic:\n name: proposalsByDiagnostic\n module: src.synthesis.code-change-plan\n line: 121\n cyclomatic_complexity: 7\n calls_out: 18\n calls_in: 0\n src.cli.handleReality:\n name: handleReality\n module: src.cli\n line: 492\n cyclomatic_complexity: 9\n calls_out: 12\n calls_in: 1\n src.synthesis.todo-patch.wasAlreadyAppended:\n name: wasAlreadyAppended\n module: src.synthesis.todo-patch\n line: 299\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 6\n src.services.actions.afterDiagnostics:\n name: afterDiagnostics\n module: src.services.actions\n line: 361\n cyclomatic_complexity: 8\n calls_out: 2\n calls_in: 0\n src.synthesis.task-synthesis-materialize.proposals:\n name: proposals\n module: src.synthesis.task-synthesis-materialize\n line: 77\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt:\n name: startedAt\n module: src.synthesis.tasks-llm\n line: 68\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet:\n name: assertCodeChangeSourcePatchSet\n module: src.synthesis.code-change-plan\n line: 896\n cyclomatic_complexity: 18\n calls_out: 14\n calls_in: 1\n src.synthesis.todo-patch.duplicates:\n name: duplicates\n module: src.synthesis.todo-patch\n line: 239\n cyclomatic_complexity: 6\n calls_out: 8\n calls_in: 0\n src.synthesis.task-synthesis-materialize.proposalIdByKey:\n name: proposalIdByKey\n module: src.synthesis.task-synthesis-materialize\n line: 76\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.code-change-plan.acceptedCount:\n name: acceptedCount\n module: src.synthesis.code-change-plan\n line: 316\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.services.actions.analysis:\n name: analysis\n module: src.services.actions\n line: 130\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload:\n name: payload\n module: src.synthesis.tasks-llm\n line: 82\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.semantic.reranker.validateVerdictReason:\n name: validateVerdictReason\n module: src.semantic.reranker\n line: 435\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 4\n src.pipeline.run.communicationStartedAt:\n name: communicationStartedAt\n module: src.pipeline.run\n line: 187\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.synthesis.code-change-plan.indexProposalsByDiagnostic:\n name: indexProposalsByDiagnostic\n module: src.synthesis.code-change-plan\n line: 331\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n src.services.actions.conclusions:\n name: conclusions\n module: src.services.actions\n line: 223\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.services.actions.executeAction:\n name: executeAction\n module: src.services.actions\n line: 72\n cyclomatic_complexity: 83\n calls_out: 65\n calls_in: 0\n src.watch.watcher.current:\n name: current\n module: src.watch.watcher\n line: 181\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.services.actions.nullableString:\n name: nullableString\n module: src.services.actions\n line: 640\n cyclomatic_complexity: 5\n calls_out: 1\n calls_in: 3\n src.operations.validation.objectValue:\n name: objectValue\n module: src.operations.validation\n line: 18\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 16\n src.synthesis.todo-patch.classified:\n name: classified\n module: src.synthesis.todo-patch\n line: 242\n cyclomatic_complexity: 6\n calls_out: 8\n calls_in: 0\n src.cli.stamp:\n name: stamp\n module: src.cli\n line: 409\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.services.actions.title:\n name: title\n module: src.services.actions\n line: 557\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 0\n src.watch.watcher.defaultSleep:\n name: defaultSleep\n module: src.watch.watcher\n line: 226\n cyclomatic_complexity: 6\n calls_out: 7\n calls_in: 0\n src.synthesis.code-change-plan.object:\n name: object\n module: src.synthesis.code-change-plan\n line: 426\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 0\n src.summary.render.recordCitations:\n name: recordCitations\n module: src.summary.render\n line: 59\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 4\n src.synthesis.code-change-plan.patchIds:\n name: patchIds\n module: src.synthesis.code-change-plan\n line: 918\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 0\n src.services.actions.booleanValue:\n name: booleanValue\n module: src.services.actions\n line: 675\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 11\n src.watch.watcher.pending:\n name: pending\n module: src.watch.watcher\n line: 169\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.synthesis.code-change-path.isUsefulCodeChangePath:\n name: isUsefulCodeChangePath\n module: src.synthesis.code-change-path\n line: 202\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.services.actions.nlModeValue:\n name: nlModeValue\n module: src.services.actions\n line: 528\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.summary.summarizer.SummaryAttemptError.summaryMode:\n name: summaryMode\n module: src.summary.summarizer\n line: 313\n cyclomatic_complexity: 7\n calls_out: 1\n calls_in: 1\n src.services.actions.before:\n name: before\n module: src.services.actions\n line: 402\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.semantic.reranker.assertGroundedQuote:\n name: assertGroundedQuote\n module: src.semantic.reranker\n line: 460\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 4\n src.web.diff-ui.byId:\n name: byId\n module: src.web.diff-ui\n line: 36\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 8\n src.operations.validation.nonBlank:\n name: nonBlank\n module: src.operations.validation\n line: 31\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 12\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.generationMetadata:\n name: generationMetadata\n module: src.synthesis.tasks-llm\n line: 213\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 1\n src.synthesis.task-synthesis-materialize.conclusions:\n name: conclusions\n module: src.synthesis.task-synthesis-materialize\n line: 31\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.synthesis.code-change-plan.conclusions:\n name: conclusions\n module: src.synthesis.code-change-plan\n line: 118\n cyclomatic_complexity: 7\n calls_out: 18\n calls_in: 0\n src.synthesis.code-change-plan.set:\n name: set\n module: src.synthesis.code-change-plan\n line: 903\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 6\n src.semantic.reranker.seenIds:\n name: seenIds\n module: src.semantic.reranker\n line: 203\n cyclomatic_complexity: 14\n calls_out: 9\n calls_in: 0\n src.watch.watcher.onAbort:\n name: onAbort\n module: src.watch.watcher\n line: 233\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.validation.intersects:\n name: intersects\n module: src.synthesis.validation\n line: 110\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 1\n src.synthesis.validation.target:\n name: target\n module: src.synthesis.validation\n line: 43\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.code-change-plan.uniqueSorted:\n name: uniqueSorted\n module: src.synthesis.code-change-plan\n line: 525\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 20\n src.cli.handleCommunication:\n name: handleCommunication\n module: src.cli\n line: 583\n cyclomatic_complexity: 11\n calls_out: 18\n calls_in: 1\n src.synthesis.todo-patch.renderIds:\n name: renderIds\n module: src.synthesis.todo-patch\n line: 317\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.synthesis.code-change-plan.startsWithImperative:\n name: startsWithImperative\n module: src.synthesis.code-change-plan\n line: 439\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 3\n src.synthesis.code-change-plan.assertSourcePatchIds:\n name: assertSourcePatchIds\n module: src.synthesis.code-change-plan\n line: 945\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 1\n src.synthesis.validation.sharedPath:\n name: sharedPath\n module: src.synthesis.validation\n line: 46\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.services.actions.beforeDiagnostics:\n name: beforeDiagnostics\n module: src.services.actions\n line: 353\n cyclomatic_complexity: 8\n calls_out: 2\n calls_in: 0\n src.services.actions.todoPath:\n name: todoPath\n module: src.services.actions\n line: 201\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesisAudit:\n name: synthesisAudit\n module: src.synthesis.tasks-llm\n line: 235\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.semantic.reranker.quote:\n name: quote\n module: src.semantic.reranker\n line: 465\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.synthesis.code-change-plan.createCodeChangeSourcePatch:\n name: createCodeChangeSourcePatch\n module: src.synthesis.code-change-plan\n line: 698\n cyclomatic_complexity: 13\n calls_out: 20\n calls_in: 2\n src.cli.result:\n name: result\n module: src.cli\n line: 657\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.pipeline.run.communicationAudit:\n name: communicationAudit\n module: src.pipeline.run\n line: 188\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.summary.summarizer.SummaryAttemptError.materializeConclusions:\n name: materializeConclusions\n module: src.summary.summarizer\n line: 233\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 1\n src.services.actions.stringValue:\n name: stringValue\n module: src.services.actions\n line: 636\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 12\n src.semantic.reranker.applyAcceptedSemanticRelations:\n name: applyAcceptedSemanticRelations\n module: src.semantic.reranker\n line: 372\n cyclomatic_complexity: 2\n calls_out: 13\n calls_in: 0\n src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticRerankResult:\n name: assertSemanticRerankResult\n module: src.semantic.reranker-llm\n line: 55\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 3\n src.watch.watcher.generate:\n name: generate\n module: src.watch.watcher\n line: 207\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 5\n src.synthesis.code-change-plan.recordsById:\n name: recordsById\n module: src.synthesis.code-change-plan\n line: 120\n cyclomatic_complexity: 7\n calls_out: 18\n calls_in: 0\n src.semantic.reranker.assertSemanticRerankResult:\n name: assertSemanticRerankResult\n module: src.semantic.reranker\n line: 311\n cyclomatic_complexity: 21\n calls_out: 21\n calls_in: 2\n src.synthesis.task-synthesis-contract.taskStrings:\n name: taskStrings\n module: src.synthesis.task-synthesis-contract\n line: 34\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.synthesis.code-change-plan.now:\n name: now\n module: src.synthesis.code-change-plan\n line: 1099\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.pipeline.run.values:\n name: values\n module: src.pipeline.run\n line: 486\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 3\n src.cli.parsed:\n name: parsed\n module: src.cli\n line: 63\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 0\n src.services.actions.resolveRoot:\n name: resolveRoot\n module: src.services.actions\n line: 598\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.pipeline.run.message:\n name: message\n module: src.pipeline.run\n line: 511\n cyclomatic_complexity: 9\n calls_out: 2\n calls_in: 0\n src.tf.classifier.vectorize:\n name: vectorize\n module: src.tf.classifier\n line: 60\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 1\n src.semantic.reranker.byDeclaration:\n name: byDeclaration\n module: src.semantic.reranker\n line: 205\n cyclomatic_complexity: 14\n calls_out: 9\n calls_in: 0\n src.watch.watcher.watchRepository:\n name: watchRepository\n module: src.watch.watcher\n line: 147\n cyclomatic_complexity: 19\n calls_out: 14\n calls_in: 0\n src.watch.watcher.absolute:\n name: absolute\n module: src.watch.watcher\n line: 54\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.pipeline.run.knownAudit:\n name: knownAudit\n module: src.pipeline.run\n line: 512\n cyclomatic_complexity: 9\n calls_out: 2\n calls_in: 0\n src.synthesis.task-synthesis-materialize.keys:\n name: keys\n module: src.synthesis.task-synthesis-materialize\n line: 122\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.synthesis.code-change-plan.target:\n name: target\n module: src.synthesis.code-change-plan\n line: 143\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.watch.watcher.finish:\n name: finish\n module: src.watch.watcher\n line: 238\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 3\n src.summary.summarizer.payload:\n name: payload\n module: src.summary.summarizer\n line: 104\n cyclomatic_complexity: 6\n calls_out: 6\n calls_in: 0\n src.synthesis.todo-patch.isoDate:\n name: isoDate\n module: src.synthesis.todo-patch\n line: 354\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n src.synthesis.code-change-plan.acceptances:\n name: acceptances\n module: src.synthesis.code-change-plan\n line: 309\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.summary.summarizer.SummaryAttemptError.parsed:\n name: parsed\n module: src.summary.summarizer\n line: 239\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.semantic.reranker-llm.SemanticRerankerRequiredError.payload:\n name: payload\n module: src.semantic.reranker-llm\n line: 73\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.semantic.reranker.seenDecisions:\n name: seenDecisions\n module: src.semantic.reranker\n line: 327\n cyclomatic_complexity: 16\n calls_out: 15\n calls_in: 0\n src.synthesis.todo-patch.currentHash:\n name: currentHash\n module: src.synthesis.todo-patch\n line: 187\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 0\n src.synthesis.validation.validateAndClassifyTodoProposals:\n name: validateAndClassifyTodoProposals\n module: src.synthesis.validation\n line: 17\n cyclomatic_complexity: 1\n calls_out: 10\n calls_in: 0\n src.tf.classifier.importer:\n name: importer\n module: src.tf.classifier\n line: 30\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.summary.summarizer.SummaryAttemptError.sortedUnique:\n name: sortedUnique\n module: src.summary.summarizer\n line: 324\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 4\n src.synthesis.todo-patch.createTodoPatch:\n name: createTodoPatch\n module: src.synthesis.todo-patch\n line: 69\n cyclomatic_complexity: 8\n calls_out: 20\n calls_in: 1\n src.synthesis.code-change-plan.markdown:\n name: markdown\n module: src.synthesis.code-change-plan\n line: 558\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.services.actions.receiptPath:\n name: receiptPath\n module: src.services.actions\n line: 303\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.web.diff-ui.selectedRun:\n name: selectedRun\n module: src.web.diff-ui\n line: 40\n cyclomatic_complexity: 7\n calls_out: 2\n calls_in: 3\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.readPrompt:\n name: readPrompt\n module: src.synthesis.tasks-llm\n line: 262\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 1\n src.services.actions.after:\n name: after\n module: src.services.actions\n line: 403\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt:\n name: prompt\n module: src.synthesis.tasks-llm\n line: 81\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.cli.mode:\n name: mode\n module: src.cli\n line: 429\n cyclomatic_complexity: 8\n calls_out: 10\n calls_in: 0\n src.web.diff-ui.diffUiHtml:\n name: diffUiHtml\n module: src.web.diff-ui\n line: 1\n cyclomatic_complexity: 52\n calls_out: 42\n calls_in: 0\n src.cli.main:\n name: main\n module: src.cli\n line: 53\n cyclomatic_complexity: 95\n calls_out: 44\n calls_in: 1\n src.cli.extractor:\n name: extractor\n module: src.cli\n line: 519\n cyclomatic_complexity: 6\n calls_out: 6\n calls_in: 0\n src.synthesis.todo-patch.normalizePath:\n name: normalizePath\n module: src.synthesis.todo-patch\n line: 325\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.synthesis.code-change-plan.plansById:\n name: plansById\n module: src.synthesis.code-change-plan\n line: 917\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 0\n src.services.actions.filterCommunicationGraph:\n name: filterCommunicationGraph\n module: src.services.actions\n line: 511\n cyclomatic_complexity: 17\n calls_out: 7\n calls_in: 2\n src.cli.execFileAsync:\n name: execFileAsync\n module: src.cli\n line: 39\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 2\n src.pipeline.run.aborted:\n name: aborted\n module: src.pipeline.run\n line: 507\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.cli.optionNullableString:\n name: optionNullableString\n module: src.cli\n line: 710\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 6\n src.cli.html:\n name: html\n module: src.cli\n line: 432\n cyclomatic_complexity: 8\n calls_out: 10\n calls_in: 0\n src.synthesis.todo-patch.hash:\n name: hash\n module: src.synthesis.todo-patch\n line: 350\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.synthesis.todo-patch.rendered:\n name: rendered\n module: src.synthesis.todo-patch\n line: 312\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.pipeline.run.failureCode:\n name: failureCode\n module: src.pipeline.run\n line: 575\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 5\n src.synthesis.code-change-plan.record:\n name: record\n module: src.synthesis.code-change-plan\n line: 425\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 0\n src.watch.watcher.result:\n name: result\n module: src.watch.watcher\n line: 211\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.synthesis.task-synthesis-materialize.conclusionIdByKey:\n name: conclusionIdByKey\n module: src.synthesis.task-synthesis-materialize\n line: 46\n cyclomatic_complexity: 2\n calls_out: 10\n calls_in: 0\n src.synthesis.code-change-plan.normalizeUnifiedDiff:\n name: normalizeUnifiedDiff\n module: src.synthesis.code-change-plan\n line: 983\n cyclomatic_complexity: 17\n calls_out: 9\n calls_in: 4\n src.synthesis.validation.proposalWords:\n name: proposalWords\n module: src.synthesis.validation\n line: 40\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.synthesis.code-change-plan.titleFor:\n name: titleFor\n module: src.synthesis.code-change-plan\n line: 424\n cyclomatic_complexity: 9\n calls_out: 4\n calls_in: 7\n src.cli.doctor:\n name: doctor\n module: src.cli\n line: 644\n cyclomatic_complexity: 6\n calls_out: 7\n calls_in: 1\n src.tf.classifier.loadClassifier:\n name: loadClassifier\n module: src.tf.classifier\n line: 47\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 1\n src.cli.optionNlMode:\n name: optionNlMode\n module: src.cli\n line: 737\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 5\n src.pipeline.run.includeCommunication:\n name: includeCommunication\n module: src.pipeline.run\n line: 186\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.cli.command:\n name: command\n module: src.cli\n line: 64\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 0\n src.services.actions.afterInput:\n name: afterInput\n module: src.services.actions\n line: 401\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.synthesis.todo-patch.writeTodoPatchArtifacts:\n name: writeTodoPatchArtifacts\n module: src.synthesis.todo-patch\n line: 152\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 0\n src.synthesis.code-change-plan.acceptanceCriteriaFor:\n name: acceptanceCriteriaFor\n module: src.synthesis.code-change-plan\n line: 459\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 7\n src.synthesis.code-change-plan.paths:\n name: paths\n module: src.synthesis.code-change-plan\n line: 830\n cyclomatic_complexity: 16\n calls_out: 12\n calls_in: 0\n src.services.actions.svg:\n name: svg\n module: src.services.actions\n line: 405\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.services.actions.result:\n name: result\n module: src.services.actions\n line: 442\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.synthesis.validation.similarity:\n name: similarity\n module: src.synthesis.validation\n line: 47\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.cli.emitExtraction:\n name: emitExtraction\n module: src.cli\n line: 608\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 2\n src.synthesis.code-change-plan.assertSourceApplyReceipt:\n name: assertSourceApplyReceipt\n module: src.synthesis.code-change-plan\n line: 1180\n cyclomatic_complexity: 11\n calls_out: 13\n calls_in: 2\n src.cli.parseArgs:\n name: parseArgs\n module: src.cli\n line: 666\n cyclomatic_complexity: 13\n calls_out: 5\n calls_in: 1\n src.synthesis.todo-patch.assertApproval:\n name: assertApproval\n module: src.synthesis.todo-patch\n line: 256\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision:\n name: modelRevision\n module: src.semantic.reranker-llm\n line: 52\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 0\n src.cli.isPlanSet:\n name: isPlanSet\n module: src.cli\n line: 246\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.services.actions.proposals:\n name: proposals\n module: src.services.actions\n line: 226\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.cli.stop:\n name: stop\n module: src.cli\n line: 393\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.watch.watcher.now:\n name: now\n module: src.watch.watcher\n line: 152\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 8\n src.cli.diagnosticsPath:\n name: diagnosticsPath\n module: src.cli\n line: 498\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.synthesis.todo-patch.artifact:\n name: artifact\n module: src.synthesis.todo-patch\n line: 222\n cyclomatic_complexity: 6\n calls_out: 8\n calls_in: 0\n src.synthesis.todo-patch.appendPatch:\n name: appendPatch\n module: src.synthesis.todo-patch\n line: 294\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 6\n src.cli.root:\n name: root\n module: src.cli\n line: 584\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.services.actions.diff:\n name: diff\n module: src.services.actions\n line: 433\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.synthesis.code-change-plan.indexConclusionsByDiagnostic:\n name: indexConclusionsByDiagnostic\n module: src.synthesis.code-change-plan\n line: 343\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n src.summary.summarizer.mode:\n name: mode\n module: src.summary.summarizer\n line: 66\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.operations.validation.uniqueStrings:\n name: uniqueStrings\n module: src.operations.validation\n line: 40\n cyclomatic_complexity: 8\n calls_out: 5\n calls_in: 13\n src.synthesis.code-change-plan.exactSourcePatchKeys:\n name: exactSourcePatchKeys\n module: src.synthesis.code-change-plan\n line: 937\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 4\n src.cli.handleDiff:\n name: handleDiff\n module: src.cli\n line: 428\n cyclomatic_complexity: 24\n calls_out: 19\n calls_in: 1\n src.services.actions.readRecords:\n name: readRecords\n module: src.services.actions\n line: 624\n cyclomatic_complexity: 4\n calls_out: 7\n calls_in: 2\n src.synthesis.code-change-plan.exactSourcePatchSet:\n name: exactSourcePatchSet\n module: src.synthesis.code-change-plan\n line: 961\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 3\n src.watch.watcher.maxFiles:\n name: maxFiles\n module: src.watch.watcher\n line: 38\n cyclomatic_complexity: 11\n calls_out: 14\n calls_in: 0\n src.synthesis.code-change-plan.splitKeep:\n name: splitKeep\n module: src.synthesis.code-change-plan\n line: 1305\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.semantic.reranker.decisions:\n name: decisions\n module: src.semantic.reranker\n line: 274\n cyclomatic_complexity: 2\n calls_out: 9\n calls_in: 0\n src.services.actions.diagnostics:\n name: diagnostics\n module: src.services.actions\n line: 453\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.services.actions.afterGraph:\n name: afterGraph\n module: src.services.actions\n line: 358\n cyclomatic_complexity: 8\n calls_out: 2\n calls_in: 0\n src.watch.watcher.DEFAULT_MIN_INTERVAL_MS:\n name: DEFAULT_MIN_INTERVAL_MS\n module: src.watch.watcher\n line: 144\n cyclomatic_complexity: 19\n calls_out: 14\n calls_in: 0\n src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT:\n name: RAW_CONCLUSION_CONTRACT\n module: src.synthesis.task-synthesis-contract\n line: 38\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.synthesis.task-synthesis-materialize.parsed:\n name: parsed\n module: src.synthesis.task-synthesis-materialize\n line: 20\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.cli.optionList:\n name: optionList\n module: src.cli\n line: 732\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 4\n src.web.diff-ui.updateMeta:\n name: updateMeta\n module: src.web.diff-ui\n line: 41\n cyclomatic_complexity: 7\n calls_out: 3\n calls_in: 2\n src.cli.optionString:\n name: optionString\n module: src.cli\n line: 705\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 17\n src.pipeline.run.skippedAudit:\n name: skippedAudit\n module: src.pipeline.run\n line: 579\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 8\n src.synthesis.code-change-plan.riskFor:\n name: riskFor\n module: src.synthesis.code-change-plan\n line: 489\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 7\n src.services.actions.summaryModeValue:\n name: summaryModeValue\n module: src.services.actions\n line: 544\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 2\n src.services.actions.nullableScopedPath:\n name: nullableScopedPath\n module: src.services.actions\n line: 613\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 2\n src.pipeline.run.collectTargetHints:\n name: collectTargetHints\n module: src.pipeline.run\n line: 485\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 2\n src.semantic.reranker.assertSemanticCandidateSet:\n name: assertSemanticCandidateSet\n module: src.semantic.reranker\n line: 184\n cyclomatic_complexity: 27\n calls_out: 18\n calls_in: 3\n src.cli.optionTaskMode:\n name: optionTaskMode\n module: src.cli\n line: 747\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.summary.summarizer.summarizeGraph:\n name: summarizeGraph\n module: src.summary.summarizer\n line: 57\n cyclomatic_complexity: 10\n calls_out: 13\n calls_in: 0\n src.watch.watcher.scanTree:\n name: scanTree\n module: src.watch.watcher\n line: 37\n cyclomatic_complexity: 12\n calls_out: 17\n calls_in: 4\n src.watch.watcher.delta:\n name: delta\n module: src.watch.watcher\n line: 182\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.semantic.reranker.createSemanticRerankResult:\n name: createSemanticRerankResult\n module: src.semantic.reranker\n line: 251\n cyclomatic_complexity: 4\n calls_out: 11\n calls_in: 0\n src.synthesis.todo-patch.now:\n name: now\n module: src.synthesis.todo-patch\n line: 186\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 0\n src.synthesis.task-synthesis-materialize.normalizeStringArray:\n name: normalizeStringArray\n module: src.synthesis.task-synthesis-materialize\n line: 134\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 11\n src.synthesis.todo-patch.recovered:\n name: recovered\n module: src.synthesis.todo-patch\n line: 190\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 0\n src.synthesis.validation.jaccard:\n name: jaccard\n module: src.synthesis.validation\n line: 103\n cyclomatic_complexity: 5\n calls_out: 1\n calls_in: 6\n src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection:\n name: synthesizeWithCorrection\n module: src.synthesis.tasks-llm\n line: 117\n cyclomatic_complexity: 11\n calls_out: 8\n calls_in: 3\n src.operations.validation.assertVariableContract:\n name: assertVariableContract\n module: src.operations.validation\n line: 62\n cyclomatic_complexity: 20\n calls_out: 14\n calls_in: 0\n src.synthesis.todo-patch.object:\n name: object\n module: src.synthesis.todo-patch\n line: 333\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 6\n src.summary.summarizer.SummaryAttemptError.generationMetadata:\n name: generationMetadata\n module: src.summary.summarizer\n line: 285\n cyclomatic_complexity: 9\n calls_out: 5\n calls_in: 6\n src.synthesis.todo-patch.exactKeys:\n name: exactKeys\n module: src.synthesis.todo-patch\n line: 338\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 6\n src.synthesis.code-change-plan.createCodeChangeSourcePatchSet:\n name: createCodeChangeSourcePatchSet\n module: src.synthesis.code-change-plan\n line: 759\n cyclomatic_complexity: 8\n calls_out: 11\n calls_in: 0\n src.services.actions.stringList:\n name: stringList\n module: src.services.actions\n line: 645\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 3\n src.watch.watcher.absoluteRoot:\n name: absoluteRoot\n module: src.watch.watcher\n line: 40\n cyclomatic_complexity: 11\n calls_out: 14\n calls_in: 0\n src.synthesis.code-change-plan.renderIds:\n name: renderIds\n module: src.synthesis.code-change-plan\n line: 680\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.services.actions.view:\n name: view\n module: src.services.actions\n line: 456\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.services.actions.withTextDiffViews:\n name: withTextDiffViews\n module: src.services.actions\n line: 556\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 2\n src.synthesis.validation.words:\n name: words\n module: src.synthesis.validation\n line: 99\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 7\n src.semantic.reranker-llm.SemanticRerankerRequiredError.assertTrackedSnapshot:\n name: assertTrackedSnapshot\n module: src.semantic.reranker-llm\n line: 140\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.cli.diagnostics:\n name: diagnostics\n module: src.cli\n line: 499\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.synthesis.todo-patch.nonBlank:\n name: nonBlank\n module: src.synthesis.todo-patch\n line: 346\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 3\n src.watch.watcher.runReport:\n name: runReport\n module: src.watch.watcher\n line: 157\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 5\n src.semantic.reranker.seenPairs:\n name: seenPairs\n module: src.semantic.reranker\n line: 204\n cyclomatic_complexity: 14\n calls_out: 9\n calls_in: 0\n src.cli.context:\n name: context\n module: src.cli\n line: 451\n cyclomatic_complexity: 9\n calls_out: 10\n calls_in: 0\n src.services.actions.beforeGraph:\n name: beforeGraph\n module: src.services.actions\n line: 350\n cyclomatic_complexity: 8\n calls_out: 2\n calls_in: 0\n src.synthesis.task-synthesis-materialize.mapKeys:\n name: mapKeys\n module: src.synthesis.task-synthesis-materialize\n line: 121\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 6\n src.synthesis.code-change-plan.evaluateCodeChangeAcceptance:\n name: evaluateCodeChangeAcceptance\n module: src.synthesis.code-change-plan\n line: 224\n cyclomatic_complexity: 9\n calls_out: 18\n calls_in: 3\n src.synthesis.validation.sharedSymbol:\n name: sharedSymbol\n module: src.synthesis.validation\n line: 45\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.web.diff-ui.formatBytes:\n name: formatBytes\n module: src.web.diff-ui\n line: 39\n cyclomatic_complexity: 7\n calls_out: 2\n calls_in: 3\n src.synthesis.todo-patch.assertTodoPatchArtifact:\n name: assertTodoPatchArtifact\n module: src.synthesis.todo-patch\n line: 221\n cyclomatic_complexity: 11\n calls_out: 16\n calls_in: 2\n src.services.actions.hasInputValue:\n name: hasInputValue\n module: src.services.actions\n line: 657\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 7\n src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS:\n name: DEFAULT_SCAN_INTERVAL_MS\n module: src.watch.watcher\n line: 145\n cyclomatic_complexity: 19\n calls_out: 14\n calls_in: 0\n src.synthesis.code-change-plan.proposals:\n name: proposals\n module: src.synthesis.code-change-plan\n line: 119\n cyclomatic_complexity: 7\n calls_out: 18\n calls_in: 0\n src.synthesis.code-change-plan.generatedAt:\n name: generatedAt\n module: src.synthesis.code-change-plan\n line: 769\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.summary.render.renderSummaryMarkdown:\n name: renderSummaryMarkdown\n module: src.summary.render\n line: 3\n cyclomatic_complexity: 10\n calls_out: 9\n calls_in: 0\n src.operations.validation.assertPrincipalList:\n name: assertPrincipalList\n module: src.operations.validation\n line: 49\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 3\n src.semantic.reranker.boundedScore:\n name: boundedScore\n module: src.semantic.reranker\n line: 480\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 5\n src.tf.classifier.loadAssets:\n name: loadAssets\n module: src.tf.classifier\n line: 34\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 1\n src.cli.controller:\n name: controller\n module: src.cli\n line: 392\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.synthesis.todo-patch.sameArray:\n name: sameArray\n module: src.synthesis.todo-patch\n line: 329\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 4\n src.services.actions.beforePath:\n name: beforePath\n module: src.services.actions\n line: 427\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.synthesis.code-change-plan.matchingConclusions:\n name: matchingConclusions\n module: src.synthesis.code-change-plan\n line: 142\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.watch.watcher.timer:\n name: timer\n module: src.watch.watcher\n line: 232\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.watch.watcher.startedAt:\n name: startedAt\n module: src.watch.watcher\n line: 209\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.synthesis.todo-patch.atomicWrite:\n name: atomicWrite\n module: src.synthesis.todo-patch\n line: 274\n cyclomatic_complexity: 5\n calls_out: 13\n calls_in: 6\n src.summary.summarizer.SummaryAttemptError.assertConclusions:\n name: assertConclusions\n module: src.summary.summarizer\n line: 281\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 3\n src.synthesis.code-change-plan.inline:\n name: inline\n module: src.synthesis.code-change-plan\n line: 676\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.synthesis.code-change-plan.matchingProposals:\n name: matchingProposals\n module: src.synthesis.code-change-plan\n line: 141\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.cli.view:\n name: view\n module: src.cli\n line: 502\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\nedges:\n- caller: src.cli.main\n callee: src.cli.printHelp\n call_type: resolved\n- caller: src.cli.main\n callee: src.cli.parseArgs\n call_type: resolved\n- caller: src.cli.main\n callee: src.cli.initProject\n call_type: resolved\n- caller: src.cli.parsed\n callee: src.cli.printHelp\n call_type: resolved\n- caller: src.cli.command\n callee: src.cli.printHelp\n call_type: resolved\n- caller: src.cli.diagnosticsPath\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.diagnosticsPath\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.diagnostics\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.diagnostics\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.result\n callee: src.cli.execFileAsync\n call_type: resolved\n- caller: src.cli.isPlanSet\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.root\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.root\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.root\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionList\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionNlMode\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionList\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionNlMode\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionPipelineTaskMode\n call_type: resolved\n- caller: src.cli.controller\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.controller\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.controller\n callee: src.cli.formatWatchEvent\n call_type: resolved\n- caller: src.cli.stop\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.stop\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.stop\n callee: src.cli.formatWatchEvent\n call_type: resolved\n- caller: src.cli.formatWatchEvent\n callee: src.cli.file\n call_type: resolved\n- caller: src.cli.stamp\n callee: src.cli.file\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.mode\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.svg\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.svg\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.html\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.diff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.context\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.context\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.context\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.maxRows\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.maxRows\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.maxRows\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleReality\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleReality\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleReality\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.view\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.view\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.handleExtract\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleExtract\n callee: src.cli.optionNlMode\n call_type: resolved\n- caller: src.cli.handleExtract\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtract\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.extractor\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.extractor\n callee: src.cli.optionNlMode\n call_type: resolved\n- caller: src.cli.extractor\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.doctor\n callee: src.cli.execFileAsync\n call_type: resolved\n- caller: src.cli.optionNumber\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionList\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionNlMode\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.optionLlmMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionTaskMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionSummaryMode\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.optionSummaryMode\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.optionPipelineTaskMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.invokedPath\n callee: src.cli.main\n call_type: resolved\n- caller: src.web.diff-ui.diffUiHtml\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.requestHeaders\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.formatBytes\n callee: src.web.diff-ui.selectedRun\n call_type: resolved\n- caller: src.web.diff-ui.formatBytes\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.selectedRun\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.selectedRun\n callee: src.web.diff-ui.formatBytes\n call_type: resolved\n- caller: src.web.diff-ui.updateMeta\n callee: src.web.diff-ui.selectedRun\n call_type: resolved\n- caller: src.web.diff-ui.updateMeta\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.updateMeta\n callee: src.web.diff-ui.formatBytes\n call_type: resolved\n- caller: src.web.diff-ui.fillSelect\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.fillSelect\n callee: src.web.diff-ui.updateMeta\n call_type: resolved\n- caller: src.web.diff-ui.loadRuns\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.loadRuns\n callee: src.web.diff-ui.requestHeaders\n call_type: resolved\n- caller: src.web.diff-ui.compareGraphs\n callee: src.web.diff-ui.byId\n call_type: resolved\n- caller: src.web.diff-ui.compareGraphs\n callee: src.web.diff-ui.requestHeaders\n call_type: resolved\n- caller: src.watch.watcher.scanTree\n callee: src.watch.watcher.relative\n call_type: resolved\n- caller: src.watch.watcher.maxFiles\n callee: src.watch.watcher.relative\n call_type: resolved\n- caller: src.watch.watcher.maxFiles\n callee: src.watch.watcher.visit\n call_type: resolved\n- caller: src.watch.watcher.absoluteRoot\n callee: src.watch.watcher.relative\n call_type: resolved\n- caller: src.watch.watcher.absoluteRoot\n callee: src.watch.watcher.visit\n call_type: resolved\n- caller: src.watch.watcher.visit\n callee: src.watch.watcher.relative\n call_type: resolved\n- caller: src.watch.watcher.absolute\n callee: src.watch.watcher.visit\n call_type: resolved\n- caller: src.watch.watcher.relative\n callee: src.watch.watcher.visit\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n callee: src.watch.watcher.scanTree\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n callee: src.watch.watcher.generate\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n callee: src.watch.watcher.sleep\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n callee: src.watch.watcher.diffSnapshots\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n callee: src.watch.watcher.scanTree\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n callee: src.watch.watcher.generate\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n callee: src.watch.watcher.sleep\n call_type: resolved\n- caller: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n callee: src.watch.watcher.diffSnapshots\n call_type: resolved\n- caller: src.watch.watcher.watchRepository\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.watchRepository\n callee: src.watch.watcher.scanTree\n call_type: resolved\n- caller: src.watch.watcher.watchRepository\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.watchRepository\n callee: src.watch.watcher.generate\n call_type: resolved\n- caller: src.watch.watcher.watchRepository\n callee: src.watch.watcher.sleep\n call_type: resolved\n- caller: src.watch.watcher.watchRepository\n callee: src.watch.watcher.diffSnapshots\n call_type: resolved\n- caller: src.watch.watcher.result\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.result\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.snapshot\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.lastReportStartedAt\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.lastReportStartedAt\n callee: src.watch.watcher.generate\n call_type: resolved\n- caller: src.watch.watcher.pending\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.pending\n callee: src.watch.watcher.generate\n call_type: resolved\n- caller: src.watch.watcher.current\n callee: src.watch.watcher.describeDelta\n call_type: resolved\n- caller: src.watch.watcher.current\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.delta\n callee: src.watch.watcher.describeDelta\n call_type: resolved\n- caller: src.watch.watcher.delta\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.waitMs\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.generate\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.generate\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.generate\n callee: src.watch.watcher.runReport\n call_type: resolved\n- caller: src.watch.watcher.generate\n callee: src.watch.watcher.scanTree\n call_type: resolved\n- caller: src.watch.watcher.startedAt\n callee: src.watch.watcher.runReport\n call_type: resolved\n- caller: src.watch.watcher.startedAt\n callee: src.watch.watcher.emit\n call_type: resolved\n- caller: src.watch.watcher.startedAt\n callee: src.watch.watcher.now\n call_type: resolved\n- caller: src.watch.watcher.defaultSleep\n callee: src.watch.watcher.finish\n call_type: resolved\n- caller: src.watch.watcher.timer\n callee: src.watch.watcher.finish\n call_type: resolved\n- caller: src.watch.watcher.onAbort\n callee: src.watch.watcher.finish\n call_type: resolved\n- caller: src.tf.classifier.dynamicImport\n callee: src.tf.classifier.importer\n call_type: resolved\n- caller: src.tf.classifier.loadClassifier\n callee: src.tf.classifier.dynamicImport\n call_type: resolved\n- caller: src.tf.classifier.loadClassifier\n callee: src.tf.classifier.loadAssets\n call_type: resolved\n- caller: src.tf.classifier.classifyAction\n callee: src.tf.classifier.loadClassifier\n call_type: resolved\n- caller: src.tf.classifier.classifyAction\n callee: src.tf.classifier.vectorize\n call_type: resolved\n- caller: src.synthesis.validation.validateAndClassifyTodoProposals\n callee: src.synthesis.validation.duplicateEvidence\n call_type: resolved\n- caller: src.synthesis.validation.validateAndClassifyTodoProposals\n callee: src.synthesis.validation.dependencyFirstPriorityOrder\n call_type: resolved\n- caller: src.synthesis.validation.duplicateEvidence\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.validation.duplicateEvidence\n callee: src.synthesis.validation.intersects\n call_type: resolved\n- caller: src.synthesis.validation.duplicateEvidence\n callee: src.synthesis.validation.jaccard\n call_type: resolved\n- caller: src.synthesis.validation.proposalWords\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.validation.target\n callee: src.synthesis.validation.jaccard\n call_type: resolved\n- caller: src.synthesis.validation.target\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.validation.sharedTicket\n callee: src.synthesis.validation.jaccard\n call_type: resolved\n- caller: src.synthesis.validation.sharedTicket\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.validation.sharedSymbol\n callee: src.synthesis.validation.jaccard\n call_type: resolved\n- caller: src.synthesis.validation.sharedSymbol\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.validation.sharedPath\n callee: src.synthesis.validation.jaccard\n call_type: resolved\n- caller: src.synthesis.validation.sharedPath\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.validation.similarity\n callee: src.synthesis.validation.jaccard\n call_type: resolved\n- caller: src.synthesis.validation.similarity\n callee: src.synthesis.validation.words\n call_type: resolved\n- caller: src.synthesis.todo-patch.createTodoPatch\n callee: src.synthesis.todo-patch.sameArray\n call_type: resolved\n- caller: src.synthesis.todo-patch.selected\n callee: src.synthesis.todo-patch.object\n call_type: resolved\n- caller: src.synthesis.todo-patch.selected\n callee: src.synthesis.todo-patch.exactKeys\n call_type: resolved\n- caller: src.synthesis.todo-patch.selected\n callee: src.synthesis.todo-patch.uniqueIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.selected\n callee: src.synthesis.todo-patch.uniqueStrings\n call_type: resolved\n- caller: src.synthesis.todo-patch.orderedSelected\n callee: src.synthesis.todo-patch.sameArray\n call_type: resolved\n- caller: src.synthesis.todo-patch.markdown\n callee: src.synthesis.todo-patch.normalizePath\n call_type: resolved\n- caller: src.synthesis.todo-patch.markdown\n callee: src.synthesis.todo-patch.diagnosticReportFingerprint\n call_type: resolved\n- caller: src.synthesis.todo-patch.renderTodoPatchMarkdown\n callee: src.synthesis.todo-patch.inline\n call_type: resolved\n- caller: src.synthesis.todo-patch.renderTodoPatchMarkdown\n callee: src.synthesis.todo-patch.renderTargets\n call_type: resolved\n- caller: src.synthesis.todo-patch.renderTodoPatchMarkdown\n callee: src.synthesis.todo-patch.renderIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.writeTodoPatchArtifacts\n callee: src.synthesis.todo-patch.createTodoPatch\n call_type: resolved\n- caller: src.synthesis.todo-patch.applyTodoPatch\n callee: src.synthesis.todo-patch.assertTodoPatchArtifact\n call_type: resolved\n- caller: src.synthesis.todo-patch.applyTodoPatch\n callee: src.synthesis.todo-patch.assertApproval\n call_type: resolved\n- caller: src.synthesis.todo-patch.current\n callee: src.synthesis.todo-patch.assertReceipt\n call_type: resolved\n- caller: src.synthesis.todo-patch.now\n callee: src.synthesis.todo-patch.appendPatch\n call_type: resolved\n- caller: src.synthesis.todo-patch.now\n callee: src.synthesis.todo-patch.atomicWrite\n call_type: resolved\n- caller: src.synthesis.todo-patch.now\n callee: src.synthesis.todo-patch.wasAlreadyAppended\n call_type: resolved\n- caller: src.synthesis.todo-patch.currentHash\n callee: src.synthesis.todo-patch.appendPatch\n call_type: resolved\n- caller: src.synthesis.todo-patch.currentHash\n callee: src.synthesis.todo-patch.atomicWrite\n call_type: resolved\n- caller: src.synthesis.todo-patch.currentHash\n callee: src.synthesis.todo-patch.wasAlreadyAppended\n call_type: resolved\n- caller: src.synthesis.todo-patch.result\n callee: src.synthesis.todo-patch.appendPatch\n call_type: resolved\n- caller: src.synthesis.todo-patch.result\n callee: src.synthesis.todo-patch.atomicWrite\n call_type: resolved\n- caller: src.synthesis.todo-patch.result\n callee: src.synthesis.todo-patch.wasAlreadyAppended\n call_type: resolved\n- caller: src.synthesis.todo-patch.applied\n callee: src.synthesis.todo-patch.appendPatch\n call_type: resolved\n- caller: src.synthesis.todo-patch.applied\n callee: src.synthesis.todo-patch.atomicWrite\n call_type: resolved\n- caller: src.synthesis.todo-patch.applied\n callee: src.synthesis.todo-patch.wasAlreadyAppended\n call_type: resolved\n- caller: src.synthesis.todo-patch.recovered\n callee: src.synthesis.todo-patch.appendPatch\n call_type: resolved\n- caller: src.synthesis.todo-patch.recovered\n callee: src.synthesis.todo-patch.atomicWrite\n call_type: resolved\n- caller: src.synthesis.todo-patch.recovered\n callee: src.synthesis.todo-patch.wasAlreadyAppended\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertTodoPatchArtifact\n callee: src.synthesis.todo-patch.object\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertTodoPatchArtifact\n callee: src.synthesis.todo-patch.exactKeys\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertTodoPatchArtifact\n callee: src.synthesis.todo-patch.isoDate\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertTodoPatchArtifact\n callee: src.synthesis.todo-patch.hash\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertTodoPatchArtifact\n callee: src.synthesis.todo-patch.nonBlank\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertTodoPatchArtifact\n callee: src.synthesis.todo-patch.uniqueIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.artifact\n callee: src.synthesis.todo-patch.object\n call_type: resolved\n- caller: src.synthesis.todo-patch.artifact\n callee: src.synthesis.todo-patch.exactKeys\n call_type: resolved\n- caller: src.synthesis.todo-patch.artifact\n callee: src.synthesis.todo-patch.uniqueIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.artifact\n callee: src.synthesis.todo-patch.uniqueStrings\n call_type: resolved\n- caller: src.synthesis.todo-patch.sourceTodo\n callee: src.synthesis.todo-patch.object\n call_type: resolved\n- caller: src.synthesis.todo-patch.sourceTodo\n callee: src.synthesis.todo-patch.exactKeys\n call_type: resolved\n- caller: src.synthesis.todo-patch.sourceTodo\n callee: src.synthesis.todo-patch.uniqueIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.sourceTodo\n callee: src.synthesis.todo-patch.uniqueStrings\n call_type: resolved\n- caller: src.synthesis.todo-patch.duplicates\n callee: src.synthesis.todo-patch.object\n call_type: resolved\n- caller: src.synthesis.todo-patch.duplicates\n callee: src.synthesis.todo-patch.exactKeys\n call_type: resolved\n- caller: src.synthesis.todo-patch.duplicates\n callee: src.synthesis.todo-patch.uniqueIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.duplicates\n callee: src.synthesis.todo-patch.uniqueStrings\n call_type: resolved\n- caller: src.synthesis.todo-patch.classified\n callee: src.synthesis.todo-patch.object\n call_type: resolved\n- caller: src.synthesis.todo-patch.classified\n callee: src.synthesis.todo-patch.exactKeys\n call_type: resolved\n- caller: src.synthesis.todo-patch.classified\n callee: src.synthesis.todo-patch.uniqueIds\n call_type: resolved\n- caller: src.synthesis.todo-patch.classified\n callee: src.synthesis.todo-patch.uniqueStrings\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertApproval\n callee: src.synthesis.todo-patch.nonBlank\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertReceipt\n callee: src.synthesis.todo-patch.sameArray\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertReceipt\n callee: src.synthesis.todo-patch.nonBlank\n call_type: resolved\n- caller: src.synthesis.todo-patch.assertReceipt\n callee: src.synthesis.todo-patch.isoDate\n call_type: resolved\n- caller: src.synthesis.todo-patch.renderTargets\n callee: src.synthesis.todo-patch.inline\n call_type: resolved\n- caller: src.synthesis.todo-patch.rendered\n callee: src.synthesis.todo-patch.inline\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.readPrompt\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.client\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.generationMetadata\n call_type: resolved\n- caller: src.synthesis.tasks-llm.TaskSynthesisAttemptError.fallbackOrThrow\n callee: src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesisAudit\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse\n callee: src.synthesis.task-synthesis-materialize.normalizeLocalKeys\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.materializeTaskSynthesisResponse\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.parsed\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.parsed\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalKeys\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalKeys\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusions\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusions\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.diagnosticIds\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey\n callee: src.synthesis.task-synthesis-materialize.normalizeRawTarget\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey\n callee: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey\n callee: src.synthesis.task-synthesis-materialize.mapKeys\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionIdByKey\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionByKey\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionByKey\n callee: src.synthesis.task-synthesis-materialize.normalizeRawTarget\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionByKey\n callee: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionByKey\n callee: src.synthesis.task-synthesis-materialize.mapKeys\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.conclusionByKey\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalDrafts\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalDrafts\n callee: src.synthesis.task-synthesis-materialize.normalizeRawTarget\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalDrafts\n callee: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalDrafts\n callee: src.synthesis.task-synthesis-materialize.mapKeys\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalDrafts\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposalIdByKey\n callee: src.synthesis.task-synthesis-materialize.mapKeys\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.proposals\n callee: src.synthesis.task-synthesis-materialize.mapKeys\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.keys\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.mapKeys\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.mapKeys\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.sortedUnique\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.normalizeRawTarget\n callee: src.synthesis.task-synthesis-materialize.normalizeStringArray\n call_type: resolved\n- caller: src.synthesis.task-synthesis-materialize.normalizeAcceptanceCriteria\n callee: src.synthesis.task-synthesis-materialize.sortedUnique\n call_type: resolved\n- caller: src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT\n callee: src.synthesis.task-synthesis-contract.nonBlank\n call_type: resolved\n- caller: src.synthesis.task-synthesis-contract.RAW_CONCLUSION_CONTRACT\n callee: src.synthesis.task-synthesis-contract.taskIds\n call_type: resolved\n- caller: src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT\n callee: src.synthesis.task-synthesis-contract.nonBlank\n call_type: resolved\n- caller: src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT\n callee: src.synthesis.task-synthesis-contract.taskStrings\n call_type: resolved\n- caller: src.synthesis.task-synthesis-contract.RAW_PROPOSAL_CONTRACT\n callee: src.synthesis.task-synthesis-contract.taskIds\n call_type: resolved\n- caller: src.synthesis.code-change-plan.generatedAt\n callee: src.synthesis.code-change-plan.createCodeChangeSourcePatch\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusions\n callee: src.synthesis.code-change-plan.collectTarget\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusions\n callee: src.synthesis.code-change-plan.buildChanges\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusions\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusions\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusions\n callee: src.synthesis.code-change-plan.titleFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusions\n callee: src.synthesis.code-change-plan.descriptionFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposals\n callee: src.synthesis.code-change-plan.collectTarget\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposals\n callee: src.synthesis.code-change-plan.buildChanges\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposals\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposals\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposals\n callee: src.synthesis.code-change-plan.titleFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposals\n callee: src.synthesis.code-change-plan.descriptionFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.recordsById\n callee: src.synthesis.code-change-plan.collectTarget\n call_type: resolved\n- caller: src.synthesis.code-change-plan.recordsById\n callee: src.synthesis.code-change-plan.buildChanges\n call_type: resolved\n- caller: src.synthesis.code-change-plan.recordsById\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.recordsById\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.recordsById\n callee: src.synthesis.code-change-plan.titleFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.recordsById\n callee: src.synthesis.code-change-plan.descriptionFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposalsByDiagnostic\n callee: src.synthesis.code-change-plan.collectTarget\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposalsByDiagnostic\n callee: src.synthesis.code-change-plan.buildChanges\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposalsByDiagnostic\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposalsByDiagnostic\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposalsByDiagnostic\n callee: src.synthesis.code-change-plan.titleFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.proposalsByDiagnostic\n callee: src.synthesis.code-change-plan.descriptionFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.collectTarget\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.buildChanges\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.titleFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.conclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.descriptionFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.candidates\n callee: src.synthesis.code-change-plan.collectTarget\n call_type: resolved\n- caller: src.synthesis.code-change-plan.candidates\n callee: src.synthesis.code-change-plan.buildChanges\n call_type: resolved\n- caller: src.synthesis.code-change-plan.candidates\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.candidates\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.candidates\n callee: src.synthesis.code-change-plan.titleFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.candidates\n callee: src.synthesis.code-change-plan.descriptionFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.relatedRecords\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.matchingProposals\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.matchingConclusions\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.target\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.changes\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.planHash\n callee: src.synthesis.code-change-plan.confidenceFor\n call_type: resolved\n- caller: src.synthesis.code-change-plan.planIds\n callee: src.synthesis.code-change-plan.evaluateCodeChangeAcceptance\n call_type: resolved\n- caller: src.synthesis.code-change-plan.acceptances\n callee: src.synthesis.code-change-plan.evaluateCodeChangeAcceptance\n call_type: resolved\n- caller: src.synthesis.code-change-plan.acceptedCount\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.indexProposalsByDiagnostic\n callee: src.synthesis.code-change-plan.set\n call_type: resolved\n- caller: src.synthesis.code-change-plan.index\n callee: src.synthesis.code-change-plan.set\n call_type: resolved\n- caller: src.synthesis.code-change-plan.indexConclusionsByDiagnostic\n callee: src.synthesis.code-change-plan.set\n call_type: resolved\n- caller: src.synthesis.code-change-plan.paths\n callee: src.synthesis.code-change-plan.exactSourcePatchKeys\n call_type: resolved\n- caller: src.synthesis.code-change-plan.paths\n callee: src.synthesis.code-change-plan.assertSourcePatchStrings\n call_type: resolved\n- caller: src.synthesis.code-change-plan.paths\n callee: src.synthesis.code-change-plan.normalizeUnifiedDiff\n call_type: resolved\n- caller: src.synthesis.code-change-plan.buildChanges\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.titleFor\n callee: src.synthesis.code-change-plan.startsWithImperative\n call_type: resolved\n- caller: src.synthesis.code-change-plan.record\n callee: src.synthesis.code-change-plan.startsWithImperative\n call_type: resolved\n- caller: src.synthesis.code-change-plan.object\n callee: src.synthesis.code-change-plan.startsWithImperative\n call_type: resolved\n- caller: src.synthesis.code-change-plan.acceptanceCriteriaFor\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.riskFor\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.rollbackFor\n callee: src.synthesis.code-change-plan.uniqueSorted\n call_type: resolved\n- caller: src.synthesis.code-change-plan.createCodeChangeReviewPatch\n callee: src.synthesis.code-change-plan.priorityRank\n call_type: resolved\n- caller: src.synthesis.code-change-plan.markdown\n callee: src.synthesis.code-change-plan.deterministicGeneration\n call_type: resolved\n- caller: src.synthesis.code-change-plan.renderCodeChangeReviewMarkdown\n callee: src.synthesis.code-change-pla\n\n... [truncated - file too large]", "is_subdir": false}, {"name": "duplication.toon.yaml", "rel_path": "duplication.toon.yaml", "path": "duplication.toon.yaml", "size": "9.8KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# redup/duplication | 17 groups | 172f 30805L | 2026-08-01\n\nSUMMARY:\n files_scanned: 172\n total_lines: 30805\n dup_groups: 17\n actionable: 17\n review: 0\n generated: 0\n actionable_L: 120\n review_L: 0\n generated_L: 0\n dup_fragments: 44\n saved_lines: 120\n scan_ms: 1116\n\nHOTSPOTS[7] (files with most duplication):\n src/extractors/markdown-llm.ts dup=27L groups=5 frags=5 (0.1%)\n src/communication/llm.ts dup=27L groups=5 frags=5 (0.1%)\n src/extractors/nl-llm.ts dup=22L groups=6 frags=6 (0.1%)\n src/synthesis/tasks-llm.ts dup=13L groups=3 frags=3 (0.0%)\n src/extractors/docs-llm.ts dup=12L groups=3 frags=3 (0.0%)\n src/live/contract-check.ts dup=12L groups=2 frags=2 (0.0%)\n src/live/model-comparison.ts dup=12L groups=2 frags=2 (0.0%)\n\nDUPLICATES[17] (ranked by impact):\n [ff0b7d1fb897f5eb] EXAC readPrompt L=5 N=5 saved=20 sim=1.00\n src/extractors/docs-llm.ts:261-265 (readPrompt)\n src/extractors/markdown-llm.ts:431-435 (readPrompt)\n src/extractors/nl-llm.ts:283-287 (readPrompt)\n src/summary/summarizer.ts:329-333 (readPrompt)\n src/synthesis/tasks-llm.ts:262-266 (readPrompt)\n [09873fe5d7f53db8] STRU constructor L=4 N=5 saved=16 sim=1.00\n src/communication/llm.ts:80-83 (constructor)\n src/extractors/docs-llm.ts:39-42 (constructor)\n src/extractors/markdown-llm.ts:49-52 (constructor)\n src/extractors/nl-llm.ts:47-50 (constructor)\n src/synthesis/tasks-llm.ts:49-52 (constructor)\n [bd6578d73c14c374] STRU constructor L=4 N=5 saved=16 sim=1.00\n src/communication/llm.ts:162-165 (constructor)\n src/extractors/markdown-llm.ts:146-149 (constructor)\n src/extractors/nl-llm.ts:109-112 (constructor)\n src/summary/summarizer.ts:154-157 (constructor)\n src/synthesis/tasks-llm.ts:56-59 (constructor)\n [8f9cb44a5788fdd0] EXAC collect L=9 N=2 saved=9 sim=1.00\n scripts/verify-env-contract.mjs:95-103 (collect)\n scripts/verify-module-boundaries.mjs:59-67 (collect)\n [6363b0c657dbde27] EXAC sumUsage L=9 N=2 saved=9 sim=1.00\n src/live/contract-check.ts:148-156 (sumUsage)\n src/live/model-comparison.ts:206-214 (sumUsage)\n [040774ed1317816e] EXAC markDeterministic L=8 N=2 saved=8 sim=1.00\n src/communication/llm.ts:417-424 (markDeterministic)\n src/extractors/markdown-llm.ts:402-409 (markDeterministic)\n [a81abf06a2409abf] EXAC arrow_function L=6 N=2 saved=6 sim=1.00\n src/communication/llm.ts:418-423 (arrow_function)\n src/extractors/markdown-llm.ts:403-408 (arrow_function)\n [2e20d0fc42b5b689] EXAC errorMessage L=3 N=3 saved=6 sim=1.00\n src/extractors/docs-llm.ts:267-269 (errorMessage)\n src/interfaces/a2a-task-store.ts:511-513 (errorMessage)\n src/interfaces/a2a.ts:310-312 (errorMessage)\n [13e54260c09235cb] EXAC roleOf L=5 N=2 saved=5 sim=1.00\n src/communication/analyzer.ts:464-468 (roleOf)\n src/communication/llm.ts:476-480 (roleOf)\n [5a74faa98e248ba6] EXAC objectValue L=4 N=2 saved=4 sim=1.00\n src/core/schema.ts:771-774 (objectValue)\n src/operations/validation.ts:18-21 (objectValue)\n [6108e7bc94eb85d0] EXAC readJson L=3 N=2 saved=3 sim=1.00\n scripts/research/audit-changelog-sample.mjs:205-207 (readJson)\n scripts/research/rerank-embedding-shortlist.mjs:160-162 (readJson)\n [cf429410d135f725] EXAC clampLine L=3 N=2 saved=3 sim=1.00\n src/extractors/docs-record.ts:179-181 (clampLine)\n src/extractors/nl-llm.ts:271-273 (clampLine)\n [85958beabc80c768] EXAC allowedAction L=3 N=2 saved=3 sim=1.00\n src/extractors/docs-record.ts:183-185 (allowedAction)\n src/extractors/nl-llm.ts:275-277 (allowedAction)\n [9b7097c5386e9cfa] EXAC allowedModality L=3 N=2 saved=3 sim=1.00\n src/extractors/docs-record.ts:187-189 (allowedModality)\n src/extractors/nl-llm.ts:279-281 (allowedModality)\n [b31b50027fdfb178] EXAC round L=3 N=2 saved=3 sim=1.00\n src/live/contract-check.ts:315-317 (round)\n src/live/model-comparison.ts:216-218 (round)\n [dabffb80a2fd2146] EXAC nonBlank L=3 N=2 saved=3 sim=1.00\n src/operations/validation.ts:31-33 (nonBlank)\n src/synthesis/todo-patch.ts:346-348 (nonBlank)\n [21ba1336248390a4] EXAC renderIds L=3 N=2 saved=3 sim=1.00\n src/synthesis/code-change-plan.ts:680-682 (renderIds)\n src/synthesis/todo-patch.ts:317-319 (renderIds)\n\nREFACTOR[17] (ranked by priority):\n [1] β—‹ extract_function β†’ src/utils/readPrompt.py\n WHY: 5 occurrences of 5-line block across 5 files β€” saves 20 lines\n FILES: src/extractors/docs-llm.ts, src/extractors/markdown-llm.ts, src/extractors/nl-llm.ts, src/summary/summarizer.ts, src/synthesis/tasks-llm.ts\n [2] β—‹ extract_function β†’ src/utils/constructor.py\n WHY: 5 occurrences of 4-line block across 5 files β€” saves 16 lines\n FILES: src/communication/llm.ts, src/extractors/docs-llm.ts, src/extractors/markdown-llm.ts, src/extractors/nl-llm.ts, src/synthesis/tasks-llm.ts\n [3] β—‹ extract_function β†’ src/utils/constructor.py\n WHY: 5 occurrences of 4-line block across 5 files β€” saves 16 lines\n FILES: src/communication/llm.ts, src/extractors/markdown-llm.ts, src/extractors/nl-llm.ts, src/summary/summarizer.ts, src/synthesis/tasks-llm.ts\n [4] β—‹ extract_function β†’ scripts/utils/collect.py\n WHY: 2 occurrences of 9-line block across 2 files β€” saves 9 lines\n FILES: scripts/verify-env-contract.mjs, scripts/verify-module-boundaries.mjs\n [5] β—‹ extract_function β†’ src/live/utils/sumUsage.py\n WHY: 2 occurrences of 9-line block across 2 files β€” saves 9 lines\n FILES: src/live/contract-check.ts, src/live/model-comparison.ts\n [6] β—‹ extract_function β†’ src/utils/markDeterministic.py\n WHY: 2 occurrences of 8-line block across 2 files β€” saves 8 lines\n FILES: src/communication/llm.ts, src/extractors/markdown-llm.ts\n [7] β—‹ extract_function β†’ src/utils/arrow_function.py\n WHY: 2 occurrences of 6-line block across 2 files β€” saves 6 lines\n FILES: src/communication/llm.ts, src/extractors/markdown-llm.ts\n [8] β—‹ extract_function β†’ src/utils/errorMessage.py\n WHY: 3 occurrences of 3-line block across 3 files β€” saves 6 lines\n FILES: src/extractors/docs-llm.ts, src/interfaces/a2a-task-store.ts, src/interfaces/a2a.ts\n [9] β—‹ extract_function β†’ src/communication/utils/roleOf.py\n WHY: 2 occurrences of 5-line block across 2 files β€” saves 5 lines\n FILES: src/communication/analyzer.ts, src/communication/llm.ts\n [10] β—‹ extract_function β†’ src/utils/objectValue.py\n WHY: 2 occurrences of 4-line block across 2 files β€” saves 4 lines\n FILES: src/core/schema.ts, src/operations/validation.ts\n [11] β—‹ extract_function β†’ scripts/research/utils/readJson.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: scripts/research/audit-changelog-sample.mjs, scripts/research/rerank-embedding-shortlist.mjs\n [12] β—‹ extract_function β†’ src/extractors/utils/clampLine.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/extractors/docs-record.ts, src/extractors/nl-llm.ts\n [13] β—‹ extract_function β†’ src/extractors/utils/allowedAction.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/extractors/docs-record.ts, src/extractors/nl-llm.ts\n [14] β—‹ extract_function β†’ src/extractors/utils/allowedModality.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/extractors/docs-record.ts, src/extractors/nl-llm.ts\n [15] β—‹ extract_function β†’ src/live/utils/round.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/live/contract-check.ts, src/live/model-comparison.ts\n [16] β—‹ extract_function β†’ src/utils/nonBlank.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/operations/validation.ts, src/synthesis/todo-patch.ts\n [17] β—‹ extract_function β†’ src/synthesis/utils/renderIds.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/synthesis/code-change-plan.ts, src/synthesis/todo-patch.ts\n\nQUICK_WINS[8] (low risk, high savings β€” do first):\n [1] extract_function saved=20L β†’ src/utils/readPrompt.py\n FILES: docs-llm.ts, markdown-llm.ts, nl-llm.ts +2\n [2] extract_function saved=16L β†’ src/utils/constructor.py\n FILES: llm.ts, docs-llm.ts, markdown-llm.ts +2\n [3] extract_function saved=16L β†’ src/utils/constructor.py\n FILES: llm.ts, markdown-llm.ts, nl-llm.ts +2\n [4] extract_function saved=9L β†’ scripts/utils/collect.py\n FILES: verify-env-contract.mjs, verify-module-boundaries.mjs\n [5] extract_function saved=9L β†’ src/live/utils/sumUsage.py\n FILES: contract-check.ts, model-comparison.ts\n [6] extract_function saved=8L β†’ src/utils/markDeterministic.py\n FILES: llm.ts, markdown-llm.ts\n [7] extract_function saved=6L β†’ src/utils/arrow_function.py\n FILES: llm.ts, markdown-llm.ts\n [8] extract_function saved=6L β†’ src/utils/errorMessage.py\n FILES: docs-llm.ts, a2a-task-store.ts, a2a.ts\n\nEFFORT_ESTIMATE (total β‰ˆ 4.0h):\n medium readPrompt saved=20L ~40min\n medium constructor saved=16L ~32min\n medium constructor saved=16L ~32min\n easy collect saved=9L ~18min\n easy sumUsage saved=9L ~18min\n easy markDeterministic saved=8L ~16min\n easy arrow_function saved=6L ~12min\n easy errorMessage saved=6L ~12min\n easy roleOf saved=5L ~10min\n easy objectValue saved=4L ~8min\n ... +7 more (~42min)\n\nMETRICS-TARGET:\n dup_groups: 17 β†’ 0\n saved_lines: 120 lines recoverable\n", "is_subdir": false}, {"name": "evolution.toon.yaml", "rel_path": "evolution.toon.yaml", "path": "evolution.toon.yaml", "size": "2.7KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# code2llm/evolution | 2976 func | 118f | 2026-08-01\n# generated in 0.01s\n\nNEXT[10] (ranked by impact):\n [1] !! SPLIT src/synthesis/code-change-plan.ts\n WHY: 1310L, 10 classes, max CC=47\n EFFORT: ~4h IMPACT: 61570\n\n [2] !! SPLIT src/core/schema.ts\n WHY: 922L, 4 classes, max CC=23\n EFFORT: ~4h IMPACT: 21206\n\n [3] !! SPLIT-FUNC executeAction CC=83 fan=65\n WHY: CC=83 exceeds 15\n EFFORT: ~1h IMPACT: 5395\n\n [4] !! SPLIT-FUNC root CC=83 fan=64\n WHY: CC=83 exceeds 15\n EFFORT: ~1h IMPACT: 5312\n\n [5] !! SPLIT-FUNC main CC=95 fan=44\n WHY: CC=95 exceeds 15\n EFFORT: ~1h IMPACT: 4180\n\n [6] !! SPLIT-FUNC extractCommunicationIntent CC=76 fan=43\n WHY: CC=76 exceeds 15\n EFFORT: ~1h IMPACT: 3268\n\n [7] !! SPLIT-FUNC runPipeline CC=53 fan=54\n WHY: CC=53 exceeds 15\n EFFORT: ~1h IMPACT: 2862\n\n [8] !! SPLIT-FUNC identityRegistry CC=72 fan=37\n WHY: CC=72 exceeds 15\n EFFORT: ~1h IMPACT: 2664\n\n [9] !! SPLIT-FUNC communicationFiles CC=72 fan=37\n WHY: CC=72 exceeds 15\n EFFORT: ~1h IMPACT: 2664\n\n [10] !! SPLIT-FUNC assertOperationPlan CC=84 fan=28\n WHY: CC=84 exceeds 15\n EFFORT: ~1h IMPACT: 2352\n\n\nRISKS[3]:\n ⚠ Splitting evaluation/gold/v2/dataset.json may break 0 import paths\n ⚠ Splitting src/synthesis/code-change-plan.ts may break 127 import paths\n ⚠ Splitting src/core/schema.ts may break 124 import paths\n\nMETRICS-TARGET:\n CCΜ„: 4.0 β†’ ≀2.8\n max-CC: 95 β†’ ≀20\n god-modules: 19 β†’ 0\n high-CC(β‰₯15): 109 β†’ ≀54\n hub-types: 0 β†’ ≀0\n\nPATTERNS (language parser shared logic):\n _extract_declarations() in base.py β€” unified extraction for:\n - TypeScript: interfaces, types, classes, functions, arrow funcs\n - PHP: namespaces, traits, classes, functions, includes\n - Ruby: modules, classes, methods, requires\n - C++: classes, structs, functions, #includes\n - C#: classes, interfaces, methods, usings\n - Java: classes, interfaces, methods, imports\n - Go: packages, functions, structs\n - Rust: modules, functions, traits, use statements\n\n Shared regex patterns per language:\n - import: language-specific import/require/using patterns\n - class: class/struct/trait declarations with inheritance\n - function: function/method signatures with visibility\n - brace_tracking: for C-family languages ({ })\n - end_keyword_tracking: for Ruby (module/class/def...end)\n\n Benefits:\n - Consistent extraction logic across all languages\n - Reduced code duplication (~70% reduction in parser LOC)\n - Easier maintenance: fix once, apply everywhere\n - Standardized FunctionInfo/ClassInfo models\n\nHISTORY:\n (first run β€” no previous data)\n", "is_subdir": false}, {"name": "map.toon.yaml", "rel_path": "map.toon.yaml", "path": "map.toon.yaml", "size": "136.2KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# todo2code | 262f 45160L | json:32,yml:2,md:52,typescript:117,python:15,toml:2,rust:7,php:4,go:6,javascript:15,shell:6,txt:1,java:1 | 2026-08-01\n# generated in 0.03s\n# producer: code2llm | artifact: map.toon.yaml | schema: 1\n# stats: 3285 func | 0 cls | 262 mod | CCΜ„=4.0 | critical:120 | cycles:0\n# alerts[5]: CC main=95; CC assertOperationPlan=84; CC executeAction=83; CC root=83; CC extractCommunicationIntent=76\n# hotspots[5]: executeAction fan=65; root fan=64; runPipeline fan=54; main fan=44; extractTypeScriptFile fan=44\n# evolution: baseline\n# Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods\nM[262]:\n CHANGELOG.md,670\n CONTRIBUTION.md,37\n Dockerfile,45\n Makefile,129\n README.md,871\n TASK.md,10\n TODO.md,391\n adapters/tensorflow/package.json,10\n compose.e2e.yml,27\n docker-compose.yml,18\n docs/ARCHITECTURE.md,200\n docs/CLI_GUIDE.md,328\n docs/CODE_CHANGE_PLANS.md,173\n docs/DEMOLLM.md,175\n docs/DSL.md,457\n docs/E2E.md,52\n docs/GROK-PLAN.md,269\n docs/OPTIMIZATION.md,249\n docs/PIPELINE_DSL_NL.md,464\n docs/PROTOCOLS.md,124\n docs/READINESS.md,442\n docs/REQUIREMENTS.md,39\n docs/SECURITY.md,50\n docs/SUBACTOR_OPERATION_DSL.md,33\n docs/SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md,872\n docs/TEAM_COMMUNICATION.md,268\n docs/TEST_REPORT.md,587\n docs/VALIDATION.md,198\n docs/intent-guard-diagrams/ALL_DIAGRAMS.md,410\n docs/intent-guard-diagrams/README.md,22\n docs/reference/original-monitoring-design.md,872\n evaluation/gold/README.md,87\n evaluation/gold/v1/dataset.json,761\n evaluation/gold/v2/dataset.json,2410\n examples/CHANGELOG.md,11\n examples/TODO.md,7\n examples/backend/CHANGELOG.md,11\n examples/backend/README.md,46\n examples/backend/TODO.md,8\n examples/backend/src/server.ts,99\n examples/backend/src/store.ts,48\n examples/backend/src/validation.ts,31\n examples/backend/task.md,18\n examples/backend/tsconfig.json,14\n examples/docs/ARCHITECTURE.md,9\n examples/frontend/CHANGELOG.md,11\n examples/frontend/README.md,35\n examples/frontend/TODO.md,7\n examples/frontend/src/api.ts,50\n examples/frontend/src/app.ts,43\n examples/frontend/src/render.ts,64\n examples/frontend/task.md,17\n examples/frontend/tsconfig.json,15\n examples/sdk/python.py,23\n examples/sdk/typescript.mjs,16\n examples/src/helper.py,9\n examples/src/runtime.ts,13\n examples/task.md,9\n golang/ast_extract.go,368\n java/JavaAstExtract.java,260\n package.json,48\n php/ast_extract.php,233\n prompts/communication-to-intent.system.md,7\n prompts/docs-to-intent.system.md,23\n prompts/markdown-to-intent.system.md,5\n prompts/nl-to-intent.system.md,15\n prompts/summarize.system.md,51\n prompts/tasks-from-dsl.system.md,52\n python/ast_extract.py,221\n python/requirements.txt,1\n rust-ast/Cargo.toml,12\n rust-ast/src/main.rs,322\n schemas/code-change-acceptance.schema.json,53\n schemas/code-change-close-result.schema.json,26\n schemas/code-change-plan-set.schema.json,22\n schemas/code-change-plan.schema.json,98\n schemas/code-change-review.schema.json,27\n schemas/code-change-source-apply-receipt.schema.json,31\n schemas/code-change-source-patch-set.schema.json,18\n schemas/code-change-source-patch.schema.json,63\n schemas/conclusion.schema.json,51\n schemas/document-extraction-response.schema.json,186\n schemas/gold-dataset.schema.json,585\n schemas/intent-graph-diff.schema.json,80\n schemas/intent-graph.schema.json,40\n schemas/intent-record.schema.json,132\n schemas/operation-plan.schema.json,94\n schemas/participant-registry.schema.json,27\n schemas/participant-synthesis.schema.json,39\n schemas/semantic-candidate-set.schema.json,54\n schemas/semantic-rerank.schema.json,113\n schemas/todo-patch.schema.json,59\n schemas/todo-proposal.schema.json,61\n schemas/variable-contract.schema.json,38\n scripts/a2a-request.sh,23\n scripts/assert-demollm-run.mjs,45\n scripts/docker-smoke.sh,36\n scripts/e2e.sh,109\n scripts/examples-check.sh,210\n scripts/generate-response-schemas.mjs,27\n scripts/live-contract-check.mjs,200\n scripts/live-model-comparison.mjs,125\n scripts/mcp-request.sh,11\n scripts/normalize-generated-analysis-roots.mjs,34\n scripts/package.py,25\n scripts/research/README.md,27\n scripts/research/audit-changelog-sample.mjs,226\n scripts/research/evaluate-embedding-pairs.py,101\n scripts/research/rank-intent-graph-embeddings.py,174\n scripts/research/rerank-embedding-shortlist.mjs,191\n scripts/smoke.sh,57\n scripts/sync-generated-readme-metadata.mjs,66\n scripts/vallm-compatible.py,25\n scripts/verify-env-contract.mjs,103\n scripts/verify-generated-analysis.mjs,88\n scripts/verify-module-boundaries.mjs,87\n scripts/verify-no-llm-imports.mjs,78\n scripts/verify-structured-responses.mjs,35\n scripts/verify-workflow-yaml.mjs,43\n sdk/__init__.py,1\n sdk/README.md,107\n sdk/go/README.md,20\n sdk/go/actions.go,136\n sdk/go/client.go,197\n sdk/go/examples/basic/main.go,163\n sdk/go/todo2code.go,30\n sdk/go/types.go,215\n sdk/php/README.md,21\n sdk/php/composer.json,18\n sdk/php/examples/basic.php,112\n sdk/php/src/Client.php,401\n sdk/php/src/Error.php,25\n sdk/python/__init__.py,13\n sdk/python/README.md,68\n sdk/python/examples/basic.py,95\n sdk/python/examples/local_runtime.py,36\n sdk/python/todo2code/__init__.py,33\n sdk/python/todo2code/client.py,469\n sdk/python/todo2code/runtime.py,225\n sdk/python/todo2code_sdk.py,171\n sdk/rust/Cargo.toml,17\n sdk/rust/README.md,24\n sdk/rust/examples/basic.rs,108\n sdk/rust/src/lib.rs,49\n sdk/rust/src/actions.rs,100\n sdk/rust/src/client.rs,221\n sdk/rust/src/error.rs,37\n sdk/rust/src/types.rs,140\n sdk/typescript/README.md,23\n sdk/typescript/examples/basic.ts,84\n sdk/typescript/package.json,28\n sdk/typescript/src/index.ts,420\n sdk/typescript/tsconfig.json,20\n src/index.ts,53\n src/cli.ts,827\n src/communication/analyzer.ts,542\n src/communication/identity.ts,100\n src/communication/llm.ts,514\n src/comparison/workspace.ts,327\n src/config/env.ts,227\n src/core/content-cache.ts,139\n src/core/grounding.ts,24\n src/core/id.ts,167\n src/core/ignore.ts,200\n src/core/io.ts,177\n src/core/record.ts,172\n src/core/schema.ts,922\n src/core/security.ts,55\n src/core/target.ts,57\n src/core/text.ts,491\n src/core/types.ts,673\n src/core/version.ts,2\n src/diff/git.ts,161\n src/diff/reality.ts,609\n src/diff/svg.ts,104\n src/diff/text.ts,239\n src/diff/text-render.ts,251\n src/diff/text-types.ts,39\n src/evaluation/gold.ts,329\n src/evaluation/gold-cases.ts,366\n src/evaluation/gold-cli.ts,44\n src/evaluation/gold-extraction.ts,127\n src/evaluation/gold-metrics.ts,50\n src/evaluation/gold-types.ts,378\n src/extractors/ast.ts,167\n src/extractors/ast/external.ts,48\n src/extractors/ast/go.ts,20\n src/extractors/ast/java.ts,20\n src/extractors/ast/php.ts,34\n src/extractors/ast/python.ts,39\n src/extractors/ast/records.ts,97\n src/extractors/ast/rust.ts,20\n src/extractors/ast/types.ts,20\n src/extractors/ast/typescript.ts,166\n src/extractors/ast/unsupported.ts,30\n src/extractors/changelog.ts,99\n src/extractors/communication.ts,422\n src/extractors/configuration.ts,208\n src/extractors/docs-chunks.ts,147\n src/extractors/docs-deterministic.ts,304\n src/extractors/docs-llm.ts,269\n src/extractors/docs-record.ts,193\n src/extractors/docs-schema.ts,43\n src/extractors/docs-types.ts,68\n src/extractors/git.ts,180\n src/extractors/markdown.ts,35\n src/extractors/markdown-block.ts,67\n src/extractors/markdown-llm.ts,458\n src/extractors/markdown-paths.ts,122\n src/extractors/nl.ts,107\n src/extractors/nl-llm.ts,316\n src/extractors/todo.ts,93\n src/graph/capability-evidence.ts,62\n src/graph/changelog-signal.ts,89\n src/graph/diagnostics.ts,361\n src/graph/diff.ts,235\n src/graph/linker.ts,489\n src/graph/symbol-resolution.ts,120\n src/interfaces/a2a.ts,320\n src/interfaces/a2a-card.ts,169\n src/interfaces/a2a-history.ts,226\n src/interfaces/a2a-message.ts,184\n src/interfaces/a2a-task-store.ts,513\n src/interfaces/a2a-types.ts,160\n src/interfaces/mcp.ts,261\n src/interfaces/mcp-errors.ts,10\n src/interfaces/mcp-resources.ts,88\n src/interfaces/mcp-tools.ts,307\n src/live/contract-check.ts,317\n src/live/model-comparison.ts,218\n src/llm/audit.ts,19\n src/llm/failure.ts,25\n src/llm/openrouter.ts,338\n src/llm/structured-schema.ts,218\n src/operations/artifact.ts,66\n src/operations/compile-cli.ts,34\n src/operations/contract.ts,84\n src/operations/subactor.ts,122\n src/operations/types.ts,155\n src/operations/validation.ts,281\n src/pipeline/run.ts,602\n src/sdk/typescript.ts,172\n src/semantic/reranker.ts,509\n src/semantic/reranker-llm.ts,210\n src/semantic/reranker-response.ts,42\n src/services/actions.ts,700\n src/summary/payload.ts,65\n src/summary/render.ts,61\n src/summary/summarizer.ts,333\n src/synthesis/code-change-path.ts,204\n src/synthesis/code-change-plan.ts,1310\n src/synthesis/task-synthesis-contract.ts,66\n src/synthesis/task-synthesis-materialize.ts,172\n src/synthesis/task-synthesis-payload.ts,70\n src/synthesis/tasks-llm.ts,266\n src/synthesis/todo-patch.ts,372\n src/synthesis/validation.ts,113\n src/tf/classifier.ts,96\n src/version.ts,2\n src/watch/watcher.ts,243\n src/web/diff-ui.ts,48\n tsconfig.json,23\nD:\n src/cli.ts:\n i: ./communication/analyzer.js,./communication/llm.js,./comparison/workspace.js,./config/env.js,./core/io.js,./core/types.js,./diff/git.js,./diff/reality.js,./extractors/ast.js,./extractors/configuration.js,./extractors/docs-llm.js,./extractors/git.js,./extractors/markdown-llm.js,./extractors/nl-llm.js,./graph/diagnostics.js,./graph/diff.js,./graph/linker.js,./interfaces/a2a.js,./interfaces/mcp.js,./pipeline/run.js,./services/actions.js,./summary/summarizer.js,./version.js,./watch/watcher.js,node:child_process,node:fs,node:path,node:url,node:util\n e: ParsedArgs,execFileAsync,main,parsed,command,config,files,records,graph,graphFile,graph,graphFile,graph,diagnosticsPath,diagnostics,result,out,graphPath,diagnosticsPath,output,result,synthesisPath,graphPath,diagnosticsPath,patch,audit,result,patch,audit,receipt,actor,approvalHash,result,graphPath,diagnosticsPath,output,result,plansPath,patch,audit,result,inputPath,output,isPlanSet,result,patchPath,actor,approvalHash,receipt,result,planPath,beforeGraphPath,afterGraphPath,output,result,inputPath,beforeGraphPath,afterGraphPath,output,result,root,result,root,result,handleWatch,root,taskFile,controller,stop,formatWatchEvent,stamp,handleDiff,mode,out,svg,html,beforeFile,afterFile,diff,context,maxRows,beforeFile,afterFile,root,result,handleReality,graphFile,graph,diagnosticsPath,diagnostics,view,out,svg,markdown,handleExtract,extractor,root,out,file,inline,result,result,result,result,result,result,result,handleCommunication,root,graph,analysis,out,markdown,graphOut,emitExtraction,emitJson,initProject,moduleRoot,sourceEnv,targetEnv,task,sourceIgnore,targetIgnore,doctor,result,parseArgs,options,value,next,name,next,optionString,value,optionNullableString,value,optionBoolean,value,optionNumber,value,number,optionList,value,optionNlMode,optionLlmMode,value,optionTaskMode,value,optionSummaryMode,optionPipelineTaskMode,value,reportPipelineDegradation,printHelp,invokedPath\n ParsedArgs:\n execFileAsync()\n main()\n parsed()\n command()\n config()\n files()\n records()\n graph()\n graphFile()\n graph()\n graphFile()\n graph()\n diagnosticsPath()\n diagnostics()\n result()\n out()\n graphPath()\n diagnosticsPath()\n output()\n result()\n synthesisPath()\n graphPath()\n diagnosticsPath()\n patch()\n audit()\n result()\n patch()\n audit()\n receipt()\n actor()\n approvalHash()\n result()\n graphPath()\n diagnosticsPath()\n output()\n result()\n plansPath()\n patch()\n audit()\n result()\n inputPath()\n output()\n isPlanSet()\n result()\n patchPath()\n actor()\n approvalHash()\n receipt()\n result()\n planPath()\n beforeGraphPath()\n afterGraphPath()\n output()\n result()\n inputPath()\n beforeGraphPath()\n afterGraphPath()\n output()\n result()\n root()\n result()\n root()\n result()\n handleWatch()\n root()\n taskFile()\n controller()\n stop()\n formatWatchEvent()\n stamp()\n handleDiff()\n mode()\n out()\n svg()\n html()\n beforeFile()\n afterFile()\n diff()\n context()\n maxRows()\n beforeFile()\n afterFile()\n root()\n result()\n handleReality()\n graphFile()\n graph()\n diagnosticsPath()\n diagnostics()\n view()\n out()\n svg()\n markdown()\n handleExtract()\n extractor()\n root()\n out()\n file()\n inline()\n result()\n result()\n result()\n result()\n result()\n result()\n result()\n handleCommunication()\n root()\n graph()\n analysis()\n out()\n markdown()\n graphOut()\n emitExtraction()\n emitJson()\n initProject()\n moduleRoot()\n sourceEnv()\n targetEnv()\n task()\n sourceIgnore()\n targetIgnore()\n doctor()\n result()\n parseArgs()\n options()\n value()\n next()\n name()\n next()\n optionString()\n value()\n optionNullableString()\n value()\n optionBoolean()\n value()\n optionNumber()\n value()\n number()\n optionList()\n value()\n optionNlMode()\n optionLlmMode()\n value()\n optionTaskMode()\n value()\n optionSummaryMode()\n optionPipelineTaskMode()\n value()\n reportPipelineDegradation()\n printHelp()\n invokedPath()\n src/operations/validation.ts:\n i: ../core/id.js,../core/types.js,./types.js\n e: VALUE_TYPES,CLASSIFICATIONS,SOURCE_KINDS,RISK_CLASSES,objectValue,exactKeys,actual,nonBlank,dateString,uniqueStrings,assertPrincipalList,principals,isJsonValue,assertVariableContract,contract,source,access,readers,writers,assertGeneration,generation,assertAcyclic,ids,visiting,visited,byId,visit,assertOperationPlan,plan,evidence,variables,variableById,steps,stepIds,founderDecisionRequired,step,parameters,reference,variable,rollback,coveredSteps,expectationIds,expectation,verifiedBy,decision,verification,expectedHash\n VALUE_TYPES()\n CLASSIFICATIONS()\n SOURCE_KINDS()\n RISK_CLASSES()\n objectValue()\n exactKeys()\n actual()\n nonBlank()\n dateString()\n uniqueStrings()\n assertPrincipalList()\n principals()\n isJsonValue()\n assertVariableContract()\n contract()\n source()\n access()\n readers()\n writers()\n assertGeneration()\n generation()\n assertAcyclic()\n ids()\n visiting()\n visited()\n byId()\n visit()\n assertOperationPlan()\n plan()\n evidence()\n variables()\n variableById()\n steps()\n stepIds()\n founderDecisionRequired()\n step()\n parameters()\n reference()\n variable()\n rollback()\n coveredSteps()\n expectationIds()\n expectation()\n verifiedBy()\n decision()\n verification()\n expectedHash()\n src/services/actions.ts:\n i: ../communication/analyzer.js,../communication/llm.js,../comparison/workspace.js,../config/env.js,../core/io.js,../core/security.js,../core/types.js,../core/types.js,../diff/git.js,../diff/reality.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../graph/diagnostics.js,../graph/diff.js,../graph/linker.js,../pipeline/run.js,../summary/summarizer.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,node:path\n e: executeAction,root,file,text,analysis,records,graph,graph,diagnostics,graph,diagnostics,result,output,graph,diagnostics,synthesis,todoPath,patchPath,auditPath,todoContent,rendered,todoPath,patchPath,auditPath,receiptPath,result,graph,diagnostics,conclusions,proposals,result,output,planSet,review,patchPath,auditPath,plan,unifiedDiffs,patch,output,planSet,result,output,patch,receiptPath,result,plan,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,result,output,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,value,planSet,result,output,beforeInput,afterInput,before,after,diff,svg,beforePath,afterPath,diff,result,graph,diagnostics,view,filterCommunicationGraph,participant,role,ticket,communicationOnly,records,isCommunication,nlModeValue,llmModeValue,taskSynthesisMode,summaryModeValue,pipelineTaskMode,withTextDiffViews,title,readGraphInput,safePath,readActionObject,safePath,resolveRoot,requested,scopedPath,selected,nullableScopedPath,selected,readRecords,files,safeFile,stringValue,nullableString,stringList,numberValue,number,hasInputValue,objectMapOfStrings,booleanValue,objectValue,registerRunArtifacts,manifestPath,manifest\n executeAction()\n root()\n file()\n text()\n analysis()\n records()\n graph()\n graph()\n diagnostics()\n graph()\n diagnostics()\n result()\n output()\n graph()\n diagnostics()\n synthesis()\n todoPath()\n patchPath()\n auditPath()\n todoContent()\n rendered()\n todoPath()\n patchPath()\n auditPath()\n receiptPath()\n result()\n graph()\n diagnostics()\n conclusions()\n proposals()\n result()\n output()\n planSet()\n review()\n patchPath()\n auditPath()\n plan()\n unifiedDiffs()\n patch()\n output()\n planSet()\n result()\n output()\n patch()\n receiptPath()\n result()\n plan()\n beforeGraph()\n beforeDiagnostics()\n afterGraph()\n afterDiagnostics()\n result()\n output()\n beforeGraph()\n beforeDiagnostics()\n afterGraph()\n afterDiagnostics()\n value()\n planSet()\n result()\n output()\n beforeInput()\n afterInput()\n before()\n after()\n diff()\n svg()\n beforePath()\n afterPath()\n diff()\n result()\n graph()\n diagnostics()\n view()\n filterCommunicationGraph()\n participant()\n role()\n ticket()\n communicationOnly()\n records()\n isCommunication()\n nlModeValue()\n llmModeValue()\n taskSynthesisMode()\n summaryModeValue()\n pipelineTaskMode()\n withTextDiffViews()\n title()\n readGraphInput()\n safePath()\n readActionObject()\n safePath()\n resolveRoot()\n requested()\n scopedPath()\n selected()\n nullableScopedPath()\n selected()\n readRecords()\n files()\n safeFile()\n stringValue()\n nullableString()\n stringList()\n numberValue()\n number()\n hasInputValue()\n objectMapOfStrings()\n booleanValue()\n objectValue()\n registerRunArtifacts()\n manifestPath()\n manifest()\n src/extractors/communication.ts:\n i: ../communication/identity.js,../config/env.js,../core/io.js,../core/record.js,../core/security.js,../core/types.js,../tf/classifier.js,node:path\n e: CommunicationExtractionOptions,CommunicationEnvelope,InferredCommunicationIdentity,CommunicationSegment,extractCommunicationIntent,root,projectRoot,files,identityRegistry,communicationFiles,relativeToProject,parts,pathTicket,envelope,inferred,explicitEnvelope,declaredParticipant,declaredRole,declaredParticipantId,identity,participant,role,displayName,explicitMessageType,messageType,ticket,recipient,timestamp,declaredGitAuthors,gitAuthors,declaredA2aAgentId,explicitPaths,explicitSymbols,segments,segmentType,semantics,classified,action,line,resolveIdentity,sameStrings,normalize,parseEnvelope,lines,end,match,inferIdentity,parts,basename,governance,fileParts,nestedRoleIndex,nestedRole,nestedParticipant,isTicketEvidenceFile,basename,communicationSegments,lines,flush,item,raw,heading,cleaned,isCommunicationNoise,normalized,governanceSectionType,normalized,looksLikeTicket,normalizeRole,normalizeType,normalized,isCommunicationType,semanticsFor,first,listValue,stripped,unquote,validTimestamp,parsed\n CommunicationExtractionOptions:\n CommunicationEnvelope:\n InferredCommunicationIdentity:\n CommunicationSegment:\n extractCommunicationIntent()\n root()\n projectRoot()\n files()\n identityRegistry()\n communicationFiles()\n relativeToProject()\n parts()\n pathTicket()\n envelope()\n inferred()\n explicitEnvelope()\n declaredParticipant()\n declaredRole()\n declaredParticipantId()\n identity()\n participant()\n role()\n displayName()\n explicitMessageType()\n messageType()\n ticket()\n recipient()\n timestamp()\n declaredGitAuthors()\n gitAuthors()\n declaredA2aAgentId()\n explicitPaths()\n explicitSymbols()\n segments()\n segmentType()\n semantics()\n classified()\n action()\n line()\n resolveIdentity()\n sameStrings()\n normalize()\n parseEnvelope()\n lines()\n end()\n match()\n inferIdentity()\n parts()\n basename()\n governance()\n fileParts()\n nestedRoleIndex()\n nestedRole()\n nestedParticipant()\n isTicketEvidenceFile()\n basename()\n communicationSegments()\n lines()\n flush()\n item()\n raw()\n heading()\n cleaned()\n isCommunicationNoise()\n normalized()\n governanceSectionType()\n normalized()\n looksLikeTicket()\n normalizeRole()\n normalizeType()\n normalized()\n isCommunicationType()\n semanticsFor()\n first()\n listValue()\n stripped()\n unquote()\n validTimestamp()\n parsed()\n src/interfaces/a2a-message.ts:\n i: ../services/actions.js\n e: parseSendConfiguration,validateOutputModes,supported,parseCommand,objectData,text,first,commandFromData,action,nested,parseKeyValues,key,raw,stringValue,parseScalar,parseMessage,messageId,contextId,taskId,referenceTaskIds,extensions,metadata,parsePart,output,parsePartContent,content,qualifier,ensureSupportedMessageContent,supported,normalizeAction,normalized,action,cloneMessage,clonePart,normalizeUserMessage\n parseSendConfiguration()\n validateOutputModes()\n supported()\n parseCommand()\n objectData()\n text()\n first()\n commandFromData()\n action()\n nested()\n parseKeyValues()\n key()\n raw()\n stringValue()\n parseScalar()\n parseMessage()\n messageId()\n contextId()\n taskId()\n referenceTaskIds()\n extensions()\n metadata()\n parsePart()\n output()\n parsePartContent()\n content()\n qualifier()\n ensureSupportedMessageContent()\n supported()\n normalizeAction()\n normalized()\n action()\n cloneMessage()\n clonePart()\n normalizeUserMessage()\n src/pipeline/run.ts:\n i: ../communication/analyzer.js,../communication/llm.js,../config/env.js,../config/env.js,../core/id.js,../core/io.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-deterministic.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../graph/diagnostics.js,../graph/linker.js,../llm/audit.js,../summary/summarizer.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,../version.js,node:path\n e: PipelineResult,runPipeline,root,runId,baseOutput,runDirectory,naturalLanguageAudit,result,git,ast,markdown,deterministicDocumentFiles,documentationStartedAt,deterministicDocs,docs,configurationExtraction,includeCommunication,communicationStartedAt,communicationAudit,communicationInputPresent,communication,missingDirectory,allRecords,generatedAt,graph,communicationAnalysis,diagnostics,taskSynthesisMode,taskSynthesisAudit,todoContent,codeChangePlans,codeChangeReview,codeChangeSourcePatches,summaryStartedAt,includeSummaryLlm,summary,filePath,graphPath,diagnosticsPath,summaryPath,summaryConclusionsPath,taskSynthesisPath,todoValidationPath,todoPatchPath,todoPatchAuditPath,codeChangePlansPath,codeChangeReviewPath,codeChangeReviewAuditPath,codeChangeSourcePatchesPath,communicationAnalysisPath,communicationMarkdownPath,configuration,manifestConfiguration,collectTargetHints,values,persistFailedRun,aborted,message,knownAudit,failedAudit,stageValue,reason,failureCode,skippedAudit,appendLlmNotConfigured\n PipelineResult:\n runPipeline()\n root()\n runId()\n baseOutput()\n runDirectory()\n naturalLanguageAudit()\n result()\n git()\n ast()\n markdown()\n deterministicDocumentFiles()\n documentationStartedAt()\n deterministicDocs()\n docs()\n configurationExtraction()\n includeCommunication()\n communicationStartedAt()\n communicationAudit()\n communicationInputPresent()\n communication()\n missingDirectory()\n allRecords()\n generatedAt()\n graph()\n communicationAnalysis()\n diagnostics()\n taskSynthesisMode()\n taskSynthesisAudit()\n todoContent()\n codeChangePlans()\n codeChangeReview()\n codeChangeSourcePatches()\n summaryStartedAt()\n includeSummaryLlm()\n summary()\n filePath()\n graphPath()\n diagnosticsPath()\n summaryPath()\n summaryConclusionsPath()\n taskSynthesisPath()\n todoValidationPath()\n todoPatchPath()\n todoPatchAuditPath()\n codeChangePlansPath()\n codeChangeReviewPath()\n codeChangeReviewAuditPath()\n codeChangeSourcePatchesPath()\n communicationAnalysisPath()\n communicationMarkdownPath()\n configuration()\n manifestConfiguration()\n collectTargetHints()\n values()\n persistFailedRun()\n aborted()\n message()\n knownAudit()\n failedAudit()\n stageValue()\n reason()\n failureCode()\n skippedAudit()\n appendLlmNotConfigured()\n src/web/diff-ui.ts:\n e: diffUiHtml,byId,requestHeaders,formatBytes,selectedRun,updateMeta,fillSelect,loadRuns,compareGraphs\n diffUiHtml()\n byId()\n requestHeaders()\n formatBytes()\n selectedRun()\n updateMeta()\n fillSelect()\n loadRuns()\n compareGraphs()\n src/communication/analyzer.ts:\n i: ../core/id.js,../core/schema.js,../core/text.js,../core/types.js,../extractors/communication.js,./llm.js\n e: CommunicationIssue,ParticipantCommunicationAnalysis,CommunicationAnalysis,analyzeCommunication,communication,evidenceByRecord,participants,participant,values,left,right,leftRole,rightRole,code,responseRequiredFrom,humanRequests,agentMessages,response,type,participantGit,linked,matchedRequest,aliases,matchedGit,evidence,validateSyntheses,byId,ids,record,renderCommunicationMarkdown,addCommunicationIssuesToDiagnostics,hasSerious,communicationIssueTitle,evidenceNeighbors,records,output,left,right,isEvidenceRecord,matchedGitRecords,aliases,semanticMatch,conflictSemanticMatch,leftHasExplicitTarget,rightHasExplicitTarget,agentResponseCoversRequest,candidates,bySource,values,aggregateTopicMatch,requested,response,shared,agentWorkCoveredByHumanScope,requests,sourceRecords,plans,agentSourceRecords,isBroadRequest,isActionableAgentWork,isPositiveImplementationClaim,isHumanDecisionClaim,hasImplementationVerb,withoutTickets,value,intersects,values,participantOf,participantsForRole,roleOf,typeOf,ticketOf,gitAliases,normalizeIdentity,append,values,issue,sortedRespondents,explicitResponseRoute,severityRank,escapeCell,escapeRegex\n CommunicationIssue:\n ParticipantCommunicationAnalysis:\n CommunicationAnalysis:\n analyzeCommunication()\n communication()\n evidenceByRecord()\n participants()\n participant()\n values()\n left()\n right()\n leftRole()\n rightRole()\n code()\n responseRequiredFrom()\n humanRequests()\n agentMessages()\n response()\n type()\n participantGit()\n linked()\n matchedRequest()\n aliases()\n matchedGit()\n evidence()\n validateSyntheses()\n byId()\n ids()\n record()\n renderCommunicationMarkdown()\n addCommunicationIssuesToDiagnostics()\n hasSerious()\n communicationIssueTitle()\n evidenceNeighbors()\n records()\n output()\n left()\n right()\n isEvidenceRecord()\n matchedGitRecords()\n aliases()\n semanticMatch()\n conflictSemanticMatch()\n leftHasExplicitTarget()\n rightHasExplicitTarget()\n agentResponseCoversRequest()\n candidates()\n bySource()\n values()\n aggregateTopicMatch()\n requested()\n response()\n shared()\n agentWorkCoveredByHumanScope()\n requests()\n sourceRecords()\n plans()\n agentSourceRecords()\n isBroadRequest()\n isActionableAgentWork()\n isPositiveImplementationClaim()\n isHumanDecisionClaim()\n hasImplementationVerb()\n withoutTickets()\n value()\n intersects()\n values()\n participantOf()\n participantsForRole()\n roleOf()\n typeOf()\n ticketOf()\n gitAliases()\n normalizeIdentity()\n append()\n values()\n issue()\n sortedRespondents()\n explicitResponseRoute()\n severityRank()\n escapeCell()\n escapeRegex()\n src/synthesis/code-change-plan.ts:\n i: ../core/io.js,../core/security.js,../core/target.js,../graph/diagnostics.js,../version.js,./code-change-path.js,node:crypto,node:fs,node:path\n e: ProposeCodeChangePlansOptions,ProposeCodeChangePlansResult,EvaluateCodeChangeAcceptanceOptions,CloseCodeChangesOptions,CreateCodeChangeReviewOptions,CreatedCodeChangeReview,CreateCodeChangeSourcePatchOptions,ApplyCodeChangeSourcePatchOptions,ApplyCodeChangeSourcePatchResult,PreparedSourceEdit,IMPLEMENTATION_DIAGNOSTIC_CODES,proposeCodeChangePlans,generatedAt,maxPlans,conclusions,proposals,recordsById,proposalsByDiagnostic,conclusionsByDiagnostic,candidates,relatedRecords,matchingProposals,matchingConclusions,target,changes,generation,planHash,createRepositoryPathProbe,base,absolute,implementationDiagnosticRank,evaluateCodeChangeAcceptance,afterDiagnostics,beforeIds,afterById,targeted,clearedDiagnosticIds,remainingDiagnosticIds,newBlockingDiagnosticIds,accepted,evaluatedAt,closeCodeChanges,evaluatedAt,afterDiagnostics,planIds,acceptances,acceptedCount,indexProposalsByDiagnostic,index,list,indexConclusionsByDiagnostic,index,list,collectTarget,paths,symbols,tickets,versions,buildChanges,symbols,sourceIntents,rationale,normalized,exists,titleFor,record,object,startsWithImperative,descriptionFor,acceptanceCriteriaFor,priorityFor,confidenceFor,riskFor,level,rollbackFor,deterministicGeneration,uniqueSorted,createCodeChangeReviewPatch,createdAt,markdown,renderCodeChangeReviewMarkdown,symbols,assertCodeChangeReviewPatch,artifact,generation,priorityRank,inline,renderIds,createCodeChangeSourcePatch,plan,graphFingerprint,createdAt,allowed,diffs,normalized,path,rawDiff,unifiedDiff,patchHash,createCodeChangeSourcePatchSet,generatedAt,assertCodeChangeSourcePatch,patch,paths,path,expectedHash,allowed,expectedChanges,editPath,assertCodeChangeSourcePatchSet,set,plansById,patchIds,exactSourcePatchKeys,actual,assertSourcePatchIds,assertSourcePatchStrings,exactSourcePatchSet,instructionFor,symbols,criteria,normalizeUnifiedDiff,normalized,path,bare,stripped,applyCodeChangeSourcePatch,root,receiptPath,existing,relative,absolute,exists,before,after,now,fileHashesAfter,assertExistingSourceReceipt,relative,absolute,exists,current,assertSourceApplyReceipt,expectedPaths,hashPaths,atomicWriteRaw,applyUnifiedDiffToText,normalizedDiff,baseLines,diffLines,cursor,oldIndex,oldCount,newCount,mark,body,splitKeep,lines\n ProposeCodeChangePlansOptions:\n ProposeCodeChangePlansResult:\n EvaluateCodeChangeAcceptanceOptions:\n CloseCodeChangesOptions:\n CreateCodeChangeReviewOptions:\n CreatedCodeChangeReview:\n CreateCodeChangeSourcePatchOptions:\n ApplyCodeChangeSourcePatchOptions:\n ApplyCodeChangeSourcePatchResult:\n PreparedSourceEdit:\n IMPLEMENTATION_DIAGNOSTIC_CODES()\n proposeCodeChangePlans()\n generatedAt()\n maxPlans()\n conclusions()\n proposals()\n recordsById()\n proposalsByDiagnostic()\n conclusionsByDiagnostic()\n candidates()\n relatedRecords()\n matchingProposals()\n matchingConclusions()\n target()\n changes()\n generation()\n planHash()\n createRepositoryPathProbe()\n base()\n absolute()\n implementationDiagnosticRank()\n evaluateCodeChangeAcceptance()\n afterDiagnostics()\n beforeIds()\n afterById()\n targeted()\n clearedDiagnosticIds()\n remainingDiagnosticIds()\n newBlockingDiagnosticIds()\n accepted()\n evaluatedAt()\n closeCodeChanges()\n evaluatedAt()\n afterDiagnostics()\n planIds()\n acceptances()\n acceptedCount()\n indexProposalsByDiagnostic()\n index()\n list()\n indexConclusionsByDiagnostic()\n index()\n list()\n collectTarget()\n paths()\n symbols()\n tickets()\n versions()\n buildChanges()\n symbols()\n sourceIntents()\n rationale()\n normalized()\n exists()\n titleFor()\n record()\n object()\n startsWithImperative()\n descriptionFor()\n acceptanceCriteriaFor()\n priorityFor()\n confidenceFor()\n riskFor()\n level()\n rollbackFor()\n deterministicGeneration()\n uniqueSorted()\n createCodeChangeReviewPatch()\n createdAt()\n markdown()\n renderCodeChangeReviewMarkdown()\n symbols()\n assertCodeChangeReviewPatch()\n artifact()\n generation()\n priorityRank()\n inline()\n renderIds()\n createCodeChangeSourcePatch()\n plan()\n graphFingerprint()\n createdAt()\n allowed()\n diffs()\n normalized()\n path()\n rawDiff()\n unifiedDiff()\n patchHash()\n createCodeChangeSourcePatchSet()\n generatedAt()\n assertCodeChangeSourcePatch()\n patch()\n paths()\n path()\n expectedHash()\n allowed()\n expectedChanges()\n editPath()\n assertCodeChangeSourcePatchSet()\n set()\n plansById()\n patchIds()\n exactSourcePatchKeys()\n actual()\n assertSourcePatchIds()\n assertSourcePatchStrings()\n exactSourcePatchSet()\n instructionFor()\n symbols()\n criteria()\n normalizeUnifiedDiff()\n normalized()\n path()\n bare()\n stripped()\n applyCodeChangeSourcePatch()\n root()\n receiptPath()\n existing()\n relative()\n absolute()\n exists()\n before()\n after()\n now()\n fileHashesAfter()\n assertExistingSourceReceipt()\n relative()\n absolute()\n exists()\n current()\n assertSourceApplyReceipt()\n expectedPaths()\n hashPaths()\n atomicWriteRaw()\n applyUnifiedDiffToText()\n normalizedDiff()\n baseLines()\n diffLines()\n cursor()\n oldIndex()\n oldCount()\n newCount()\n mark()\n body()\n splitKeep()\n lines()\n src/extractors/ast/typescript.ts:\n i: ../../core/io.js,../../core/record.js,../../core/types.js,./records.js,node:path,typescript\n e: extractTypeScriptFile,relative,sourceFile,moduleCapabilities,lineRange,excerpt,add,symbol,nameOf,modifiers,visit,symbol,symbolModifiers,declarationIsCallable,callee,capabilities,isTopLevel,scriptKind,extension,languageName,extension\n extractTypeScriptFile()\n relative()\n sourceFile()\n moduleCapabilities()\n lineRange()\n excerpt()\n add()\n symbol()\n nameOf()\n modifiers()\n visit()\n symbol()\n symbolModifiers()\n declarationIsCallable()\n callee()\n capabilities()\n isTopLevel()\n scriptKind()\n extension()\n languageName()\n extension()\n src/graph/diagnostics.ts:\n i: ../core/id.js,../core/schema.js,../core/target.js,./capability-evidence.js,./changelog-signal.js,./symbol-resolution.js\n e: diagnoseGraph,neighbors,recordsById,groundedImplementation,implementedPaths,documentedPaths,symbolResolutionIndex,related,evidenced,hasLocationOnlyEvidence,missingFields,symbolIssues,detail,indexGroundedImplementationEvidence,grounded,left,right,relationSupportsImplementation,basis,score,ambiguityDetail,paths,ambiguityAction,actions,buildNeighbors,map,appendNeighbor,values,indexImplementedPaths,paths,indexDocumentedPaths,paths,hasImplementedTarget,hasDocumentedTarget,isPlan,isImplementationEvidence,isPublicImplementation,symbol,isReleaseCandidate,isImportantRecord,makeDiagnostic,severityRank\n diagnoseGraph()\n neighbors()\n recordsById()\n groundedImplementation()\n implementedPaths()\n documentedPaths()\n symbolResolutionIndex()\n related()\n evidenced()\n hasLocationOnlyEvidence()\n missingFields()\n symbolIssues()\n detail()\n indexGroundedImplementationEvidence()\n grounded()\n left()\n right()\n relationSupportsImplementation()\n basis()\n score()\n ambiguityDetail()\n paths()\n ambiguityAction()\n actions()\n buildNeighbors()\n map()\n appendNeighbor()\n values()\n indexImplementedPaths()\n paths()\n indexDocumentedPaths()\n paths()\n hasImplementedTarget()\n hasDocumentedTarget()\n isPlan()\n isImplementationEvidence()\n isPublicImplementation()\n symbol()\n isReleaseCandidate()\n isImportantRecord()\n makeDiagnostic()\n severityRank()\n src/synthesis/code-change-path.ts:\n e: NON_SOURCE_DIR_SEGMENTS,BINARY_EXTENSIONS,GENERATED_ANALYSIS_BASENAMES,T2C_ARTIFACT_BASENAMES,EXTENSIONLESS_SOURCE_BASENAMES,isPlannablePath,normalized,segments,lowerSegments,basename,lowerBasename,dot,ext,isUsefulCodeChangePath\n NON_SOURCE_DIR_SEGMENTS()\n BINARY_EXTENSIONS()\n GENERATED_ANALYSIS_BASENAMES()\n T2C_ARTIFACT_BASENAMES()\n EXTENSIONLESS_SOURCE_BASENAMES()\n isPlannablePath()\n normalized()\n segments()\n lowerSegments()\n basename()\n lowerBasename()\n dot()\n ext()\n isUsefulCodeChangePath()\n php/ast_extract.php:\n e: argumentValue,normalizedToken,significant,qualifiedName,sourceExcerpt,addFact,parseFile\n argumentValue()\n normalizedToken()\n significant()\n qualifiedName()\n sourceExcerpt()\n addFact()\n parseFile()\n src/core/text.ts:\n i: ./types.js\n e: STOP_WORDS,classifyActionHeuristically,conventional,prose,searchable,detectModality,prose,searchable,matches,detectPolarity,prose,stripped,normalized,normalizeToken,keywords,GENERIC_TOPICS,topicKeywords,separated,foldTopicToken,aliased,singular,similarity,left,right,intersection,extractBacktickValues,value,extractPaths,FILE_EXTENSIONS,hasFileExtension,last,dot,PATH_ROOTS,isPathLike,segments,HOST_TLDS,isHostname,parts,tld,extractSymbols,repositoryPaths,backticks,camel,ticketPrefixes,extractTickets,values,extractVersions,inferObject,normalized,result,splitIntentLines,lines,raw,cleaned,pieces,value\n STOP_WORDS()\n classifyActionHeuristically()\n conventional()\n prose()\n searchable()\n detectModality()\n prose()\n searchable()\n matches()\n detectPolarity()\n prose()\n stripped()\n normalized()\n normalizeToken()\n keywords()\n GENERIC_TOPICS()\n topicKeywords()\n separated()\n foldTopicToken()\n aliased()\n singular()\n similarity()\n left()\n right()\n intersection()\n extractBacktickValues()\n value()\n extractPaths()\n FILE_EXTENSIONS()\n hasFileExtension()\n last()\n dot()\n PATH_ROOTS()\n isPathLike()\n segments()\n HOST_TLDS()\n isHostname()\n parts()\n tld()\n extractSymbols()\n repositoryPaths()\n backticks()\n camel()\n ticketPrefixes()\n extractTickets()\n values()\n extractVersions()\n inferObject()\n normalized()\n result()\n splitIntentLines()\n lines()\n raw()\n cleaned()\n pieces()\n value()\n src/evaluation/gold-types.ts:\n e: GoldRecordProjection,GoldDocumentModelRecord,GoldExtractionCase,GoldFixtureRecord,GoldExpectedRelation,GoldRerankerDecisionFixture,GoldRerankerFixture,GoldLinkingCase,GoldProposalFixture,GoldDsl2TodoCase,GoldExpectedDiagnostic,GoldDiagnosticsCase,GoldDataset,BinaryMetric,GoldEvaluationReport,assertGoldDataset,dataset,assertDatasetObject,assertDatasetMetadata,assertDatasetCollections,assertUniqueCaseIds,assertExtractionCoverage,channels,assertLinkingCohorts,labels,modules\n GoldRecordProjection:\n GoldDocumentModelRecord:\n GoldExtractionCase:\n GoldFixtureRecord:\n GoldExpectedRelation:\n GoldRerankerDecisionFixture:\n GoldRerankerFixture:\n GoldLinkingCase:\n GoldProposalFixture:\n GoldDsl2TodoCase:\n GoldExpectedDiagnostic:\n GoldDiagnosticsCase:\n GoldDataset:\n BinaryMetric:\n GoldEvaluationReport:\n assertGoldDataset()\n dataset()\n assertDatasetObject()\n assertDatasetMetadata()\n assertDatasetCollections()\n assertUniqueCaseIds()\n assertExtractionCoverage()\n channels()\n assertLinkingCohorts()\n labels()\n modules()\n src/llm/openrouter.ts:\n i: ../config/env.js,../core/types.js,./structured-schema.js\n e: ChatMessage,OpenRouterChoice,OpenRouterResponse,OpenRouterResult,OpenRouterModelsResponse,OpenRouterModelError,OpenRouterClient\n ChatMessage:\n OpenRouterChoice:\n OpenRouterResponse:\n OpenRouterResult:\n OpenRouterModelsResponse:\n OpenRouterModelError: super(-1)\n OpenRouterClient: isConfigured(-1),listAvailableModels(-1),controller(-1),timeout(-1),response(-1),text(-1),clearTimeout(-1),chatText(-1),chatTextWithMetadata(-1),response(-1),content(-1),chatJson(-1),result(-1),chatJsonWithMetadata(-1),response(-1),fallback(-1),request(-1),apiKey(-1),controller(-1),externalSignal(-1),abortFromExternal(-1),timeout(-1),response(-1),text(-1),message(-1),error(-1),model(-1),availableModels(-1),formatInvalidModelError(-1),clearTimeout(-1),responseMetadata(-1),usage(-1),stringOrNull(-1),finiteOrNull(-1),shouldRetryWithoutJsonSchema(-1),isInvalidModelError(-1),formatInvalidModelError(-1),removeUndefined(-1),extractContent(-1),content(-1),parseJsonContent(-1),trimmed(-1),start(-1),end(-1),parseJsonResponse(-1),metadata(-1),message(-1),sleep(-1)\n src/communication/identity.ts:\n i: ../core/io.js,../core/security.js,node:path\n e: ParticipantIdentityEntry,ParticipantIdentityRegistry,LoadedParticipantIdentityRegistry,loadParticipantIdentityRegistry,registryPath,assertParticipantIdentityRegistry,registry,ids,external,entry,values,normalized,owner,exactKeys,allowed,missing,extra\n ParticipantIdentityEntry:\n ParticipantIdentityRegistry:\n LoadedParticipantIdentityRegistry:\n loadParticipantIdentityRegistry()\n registryPath()\n assertParticipantIdentityRegistry()\n registry()\n ids()\n external()\n entry()\n values()\n normalized()\n owner()\n exactKeys()\n allowed()\n missing()\n extra()\n scripts/verify-env-contract.mjs:\n i: node:fs,node:path\n e: root,examplePath,example,declared,match,expected,configBody,body,makefile,body,local,auditLocalKeys,body,keys,collectExisting,absolute,collect,absolute\n root()\n examplePath()\n example()\n declared()\n match()\n expected()\n configBody()\n body()\n makefile()\n body()\n local()\n auditLocalKeys()\n body()\n keys()\n collectExisting()\n absolute()\n collect()\n absolute()\n src/semantic/reranker.ts:\n i: ../core/id.js,../core/schema.js,../core/types.js,../version.js\n e: SemanticRetrievalIdentity,SemanticCandidate,SemanticCandidateSet,SemanticCandidateInput,SemanticRetrievalInput,SemanticEvidenceCitation,SemanticRerankDecisionInput,SemanticRerankDecision,SemanticRerankGeneration,SemanticRerankResult,SemanticRerankGenerationInput,createSemanticCandidateSet,grouped,values,assertSemanticCandidateSet,records,seenIds,seenPairs,byDeclaration,declaration,module,values,expectedHash,createSemanticRerankResult,decisions,assertSemanticRerankResult,candidates,records,seenDecisions,acceptedDeclarations,candidate,citations,record,expectedHash,applyAcceptedSemanticRelations,candidates,added,candidate,validateRetrieval,validateGeneration,validateVerdictReason,assertSemanticVerdictReason,allowed,reasons,assertGroundedQuote,quote,boundedScore,roundedConfidence,requiredText,validDate,comparePair\n SemanticRetrievalIdentity:\n SemanticCandidate:\n SemanticCandidateSet:\n SemanticCandidateInput:\n SemanticRetrievalInput:\n SemanticEvidenceCitation:\n SemanticRerankDecisionInput:\n SemanticRerankDecision:\n SemanticRerankGeneration:\n SemanticRerankResult:\n SemanticRerankGenerationInput:\n createSemanticCandidateSet()\n grouped()\n values()\n assertSemanticCandidateSet()\n records()\n seenIds()\n seenPairs()\n byDeclaration()\n declaration()\n module()\n values()\n expectedHash()\n createSemanticRerankResult()\n decisions()\n assertSemanticRerankResult()\n candidates()\n records()\n seenDecisions()\n acceptedDeclarations()\n candidate()\n citations()\n record()\n expectedHash()\n applyAcceptedSemanticRelations()\n candidates()\n added()\n candidate()\n validateRetrieval()\n validateGeneration()\n validateVerdictReason()\n assertSemanticVerdictReason()\n allowed()\n reasons()\n assertGroundedQuote()\n quote()\n boundedScore()\n roundedConfidence()\n requiredText()\n validDate()\n comparePair()\n scripts/research/rank-intent-graph-embeddings.py:\n e: parse_args,projection_text,main\n parse_args()\n projection_text(record;prefix)\n main()\n src/diff/reality.ts:\n i: ../core/id.js,../core/schema.js,../core/target.js\n e: RealityRow,IntentRealityView,RealitySvgOptions,buildRealityView,components,diagnosticsByRecord,codes,status,bySeverity,alignment,bySize,declaredRecords,observedRecords,aligned,declaredTopics,observedTopics,implementationAlignedTopics,documentedObservedTopics,ratio,documentedCoverageLabel,LABEL_CHAR,BADGE_CHAR,widestLabel,groupIntoTopics,symbolPaths,anchors,groups,key,bucket,indexModuleAnchors,modulePaths,targetless,candidates,path,values,resolvesToFile,resolved,indexUnambiguousSymbolPaths,candidates,paths,values,primaryTargetKey,anchor,indexDiagnostics,index,bucket,resolveEvidence,resolveStatus,declared,observed,changelog,topicLabel,separator,value,declared,object,renderRealitySvg,theme,maxRows,title,rows,visible,laneX,laneStep,statusX,statusWidth,width,rowHeight,headerY,y,isDeclared,color,count,cx,fill,label,pillWidth,renderRealityMarkdown,lanes,escapeMarkdown\n RealityRow:\n IntentRealityView:\n RealitySvgOptions:\n buildRealityView()\n components()\n diagnosticsByRecord()\n codes()\n status()\n bySeverity()\n alignment()\n bySize()\n declaredRecords()\n observedRecords()\n aligned()\n declaredTopics()\n observedTopics()\n implementationAlignedTopics()\n documentedObservedTopics()\n ratio()\n documentedCoverageLabel()\n LABEL_CHAR()\n BADGE_CHAR()\n widestLabel()\n groupIntoTopics()\n symbolPaths()\n anchors()\n groups()\n key()\n bucket()\n indexModuleAnchors()\n modulePaths()\n targetless()\n candidates()\n path()\n values()\n resolvesToFile()\n resolved()\n indexUnambiguousSymbolPaths()\n candidates()\n paths()\n values()\n primaryTargetKey()\n anchor()\n indexDiagnostics()\n index()\n bucket()\n resolveEvidence()\n resolveStatus()\n declared()\n observed()\n changelog()\n topicLabel()\n separator()\n value()\n declared()\n object()\n renderRealitySvg()\n theme()\n maxRows()\n title()\n rows()\n visible()\n laneX()\n laneStep()\n statusX()\n statusWidth()\n width()\n rowHeight()\n headerY()\n y()\n isDeclared()\n color()\n count()\n cx()\n fill()\n label()\n pillWidth()\n renderRealityMarkdown()\n lanes()\n escapeMarkdown()\n sdk/go/examples/basic/main.go:\n e: main,run,envOr,truncate,joinedIDs\n main()\n run()\n envOr()\n truncate()\n joinedIDs()\n src/semantic/reranker-llm.ts:\n i: ../config/env.js,../core/id.js,../core/types.js,../llm/openrouter.js,../llm/structured-schema.js,node:child_process,node:path,node:util\n e: SemanticRerankerOptions,SemanticRerankerRequiredError\n SemanticRerankerOptions:\n SemanticRerankerRequiredError: super(-1),rerankSemanticCandidates(-1),assertSemanticCandidateSet(-1),model(-1),modelRevision(-1),assertSemanticRerankResult(-1),client(-1),records(-1),payload(-1),response(-1),metadata(-1),assertSemanticRerankerResponse(-1),execFileAsync(-1),assertTrackedSnapshot(-1),root(-1),revision(-1),execFileAsync(-1),execFileAsync(-1),execFileAsync(-1),execFileAsync(-1),head(-1),resolvedRevision(-1),tracked(-1),records(-1),recordIds(-1),record(-1),sourcePath(-1),semanticRerankCacheKey(-1),projectRecord(-1)\n src/core/schema.ts:\n e: GroundedValidationContext,TodoProposalValidationContext,CodeChangePlanValidationContext,CodeChangeAcceptanceValidationContext,ACTIONS,MODALITIES,POLARITIES,LIFECYCLES,SOURCE_KINDS,EPISTEMIC_CLASSES,RELATION_TYPES,CONCLUSION_KINDS,DIAGNOSTIC_SEVERITIES,TODO_PRIORITIES,GENERATION_REQUESTED_MODES,GENERATION_EFFECTIVE_MODES,CODE_CHANGE_ACTIONS,CODE_CHANGE_RISK_LEVELS,assertIntentRecord,record,statement,target,lifecycle,source,lines,epistemic,metadata,assertGenerationMatchesExtractor,generation,separator,expectedGenerator,assertIntentGenerationMetadata,generation,assertIntentRecords,assertIntentGraph,graph,recordIds,relationIds,stats,records,expectedFingerprint,assertIntentGraphDiff,diff,records,change,relations,summary,assertConclusion,known,assertConclusions,known,ids,id,assertTodoProposal,known,assertTodoProposals,known,proposalIds,id,assertCodeChangePlan,known,assertCodeChangePlans,known,ids,id,assertCodeChangePlansForReview,ids,plan,evidence,id,assertCodeChangePlanForAcceptance,known,plan,evidence,assertPlanGraphFingerprint,assertCodeChangeAcceptance,beforeKnown,afterKnown,acceptance,expectedCleared,expectedRemaining,expectedBlocking,expectedAccepted,assertConclusionValue,conclusion,expectedId,assertTodoProposalValue,proposal,target,expectedId,assertGroundedGenerationMetadata,generation,validateGroundedContext,report,diagnosticIds,diagnostic,validateTodoProposalContext,known,validateCodeChangePlanContext,known,conclusions,proposals,referencedConclusionIds,proposal,proposalIds,assertCodeChangePlanValue,plan,target,targetPaths,changePaths,change,normalizedPath,risk,evidence,semantic,expectedHash,expectedId,assertRelation,relation,objectValue,exactKeys,expectedSet,missing,extra,nonEmptyString,nonBlankString,nullableString,enumValue,stringArray,nonEmptyUniqueStringArray,repositoryPath,normalized,exactStringSet,uniqueIdArray,nonEmptyUniqueIdArray,knownReferences,unknown,confidence,assertAcyclicProposalDependencies,byId,visiting,visited,visit,start,dateString,nullableDate,fingerprint,nonNegativeInteger,countMap,map,countRecords,key,exactCounts,actual,isJsonValue\n GroundedValidationContext:\n TodoProposalValidationContext:\n CodeChangePlanValidationContext:\n CodeChangeAcceptanceValidationContext:\n ACTIONS()\n MODALITIES()\n POLARITIES()\n LIFECYCLES()\n SOURCE_KINDS()\n EPISTEMIC_CLASSES()\n RELATION_TYPES()\n CONCLUSION_KINDS()\n DIAGNOSTIC_SEVERITIES()\n TODO_PRIORITIES()\n GENERATION_REQUESTED_MODES()\n GENERATION_EFFECTIVE_MODES()\n CODE_CHANGE_ACTIONS()\n CODE_CHANGE_RISK_LEVELS()\n assertIntentRecord()\n record()\n statement()\n target()\n lifecycle()\n source()\n lines()\n epistemic()\n metadata()\n assertGenerationMatchesExtractor()\n generation()\n separator()\n expectedGenerator()\n assertIntentGenerationMetadata()\n generation()\n assertIntentRecords()\n assertIntentGraph()\n graph()\n recordIds()\n relationIds()\n stats()\n records()\n expectedFingerprint()\n assertIntentGraphDiff()\n diff()\n records()\n change()\n relations()\n summary()\n assertConclusion()\n known()\n assertConclusions()\n known()\n ids()\n id()\n assertTodoProposal()\n known()\n assertTodoProposals()\n known()\n proposalIds()\n id()\n assertCodeChangePlan()\n known()\n assertCodeChangePlans()\n known()\n ids()\n id()\n assertCodeChangePlansForReview()\n ids()\n plan()\n evidence()\n id()\n assertCodeChangePlanForAcceptance()\n known()\n plan()\n evidence()\n assertPlanGraphFingerprint()\n assertCodeChangeAcceptance()\n beforeKnown()\n afterKnown()\n acceptance()\n expectedCleared()\n expectedRemaining()\n expectedBlocking()\n expectedAccepted()\n assertConclusionValue()\n conclusion()\n expectedId()\n assertTodoProposalValue()\n proposal()\n target()\n expectedId()\n assertGroundedGenerationMetadata()\n generation()\n validateGroundedContext()\n report()\n diagnosticIds()\n diagnostic()\n validateTodoProposalContext()\n known()\n validateCodeChangePlanContext()\n known()\n conclusions()\n proposals()\n referencedConclusionIds()\n proposal()\n proposalIds()\n assertCodeChangePlanValue()\n plan()\n target()\n targetPaths()\n changePaths()\n change()\n normalizedPath()\n risk()\n evidence()\n semantic()\n expectedHash()\n expectedId()\n assertRelation()\n relation()\n objectValue()\n exactKeys()\n expectedSet()\n missing()\n extra()\n nonEmptyString()\n nonBlankString()\n nullableString()\n enumValue()\n stringArray()\n nonEmptyUniqueStringArray()\n repositoryPath()\n normalized()\n exactStringSet()\n uniqueIdArray()\n nonEmptyUniqueIdArray()\n knownReferences()\n unknown()\n confidence()\n assertAcyclicProposalDependencies()\n byId()\n visiting()\n visited()\n visit()\n start()\n dateString()\n nullableDate()\n fingerprint()\n nonNegativeInteger()\n countMap()\n map()\n countRecords()\n key()\n exactCounts()\n actual()\n isJsonValue()\n src/diff/git.ts:\n i: ./text.js,node:child_process,node:fs,node:path,node:util\n e: GitDiffOptions,GitDiffResult,ChangedEntry,execFileAsync,BINARY_EXTENSIONS,collectGitDiff,root,revision,staged,maxFiles,inside,beforePath,before,after,diff,parseNameStatus,parts,status,isProbablyBinary,readBlob,readStagedBlob,readWorkingFile,runGit,result\n GitDiffOptions:\n GitDiffResult:\n ChangedEntry:\n execFileAsync()\n BINARY_EXTENSIONS()\n collectGitDiff()\n root()\n revision()\n staged()\n maxFiles()\n inside()\n beforePath()\n before()\n after()\n diff()\n parseNameStatus()\n parts()\n status()\n isProbablyBinary()\n readBlob()\n readStagedBlob()\n readWorkingFile()\n runGit()\n result()\n sdk/rust/examples/basic.rs:\n i: serde_json::json,std::env,todo2code::Client\n e: main,run,joined_ids\n main()\n run()\n joined_ids()\n src/watch/watcher.ts:\n i: ../config/env.js,../core/ignore.js,../core/types.js,../pipeline/run.js,node:fs,node:path\n e: SnapshotDelta,ScanOptions,ReportResult,WatchOptions,scanTree,maxFiles,absoluteRoot,visit,absolute,relative,stat,diffSnapshots,previous,describeDelta,shown,rest,DEFAULT_MIN_INTERVAL_MS,DEFAULT_SCAN_INTERVAL_MS,watchRepository,root,minIntervalMs,scanIntervalMs,emit,now,sleep,signal,matcher,runReport,result,snapshot,lastReportStartedAt,pending,current,delta,waitMs,generate,startedAt,result,defaultSleep,timer,onAbort,finish\n SnapshotDelta:\n ScanOptions:\n ReportResult:\n WatchOptions:\n scanTree()\n maxFiles()\n absoluteRoot()\n visit()\n absolute()\n relative()\n stat()\n diffSnapshots()\n previous()\n describeDelta()\n shown()\n rest()\n DEFAULT_MIN_INTERVAL_MS()\n DEFAULT_SCAN_INTERVAL_MS()\n watchRepository()\n root()\n minIntervalMs()\n scanIntervalMs()\n emit()\n now()\n sleep()\n signal()\n matcher()\n runReport()\n result()\n snapshot()\n lastReportStartedAt()\n pending()\n current()\n delta()\n waitMs()\n generate()\n startedAt()\n result()\n defaultSleep()\n timer()\n onAbort()\n finish()\n src/extractors/markdown-llm.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,./markdown.js,node:fs,node:path,node:url\n e: MarkdownEnrichment,MarkdownResponse,AuditedMarkdownExtractionResult,MarkdownLlmRequiredError,MarkdownAttemptError,CoveredBatch,MARKDOWN_LLM_BATCH_RECORDS\n MarkdownEnrichment:\n MarkdownResponse:\n AuditedMarkdownExtractionResult:\n MarkdownLlmRequiredError: super(-1),extractMarkdownIntentAudited(-1),startedAt(-1),deterministic(-1),client(-1),prompt(-1),enrichments(-1),responseByRecord(-1),outcomes(-1),corrected(-1),failed(-1),failure(-1),failedResponses(-1)\n MarkdownAttemptError: super(-1),enrichBatchCovering(-1),metadataByRecord(-1),uncovered(-1),enrichSplitBatch(-1),half(-1),emptyCoverage(-1),enrichMarkdownBatchWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failed(-1),promptRecord(-1),validateEnrichments(-1),expected(-1),output(-1),enrichRecord(-1),markDeterministic(-1),marked(-1),stageAudit(-1),readPrompt(-1),promptPath(-1),markdownResponseContract(-1),strings(-1),enrichment(-1)\n CoveredBatch:\n MARKDOWN_LLM_BATCH_RECORDS()\n src/diff/text.ts:\n i: ./text-types.js\n e: RawOp,DEFAULT_CONTEXT,DEFAULT_MAX_COMPARE_LINES,splitLines,normalized,lines,diffText,diffLineArrays,context,maxCompareLines,beforePath,afterPath,summarizeLines,computeLineDiff,prefix,suffix,lines,middleBefore,middleAfter,truncated,middleOps,sharedPrefixLength,prefix,sharedSuffixLength,suffix,prefixLines,suffixLines,beforeIndex,afterIndex,blockReplace,myers,n,m,max,offset,v,y,backtrack,x,y,v,k,previousK,previousX,previousY,buildHunks,changeIndexes,start,end,last,hunkFromRange,slice,beforeNumbers,afterNumbers\n RawOp:\n DEFAULT_CONTEXT()\n DEFAULT_MAX_COMPARE_LINES()\n splitLines()\n normalized()\n lines()\n diffText()\n diffLineArrays()\n context()\n maxCompareLines()\n beforePath()\n afterPath()\n summarizeLines()\n computeLineDiff()\n prefix()\n suffix()\n lines()\n middleBefore()\n middleAfter()\n truncated()\n middleOps()\n sharedPrefixLength()\n prefix()\n sharedSuffixLength()\n suffix()\n prefixLines()\n suffixLines()\n beforeIndex()\n afterIndex()\n blockReplace()\n myers()\n n()\n m()\n max()\n offset()\n v()\n y()\n backtrack()\n x()\n y()\n v()\n k()\n previousK()\n previousX()\n previousY()\n buildHunks()\n changeIndexes()\n start()\n end()\n last()\n hunkFromRange()\n slice()\n beforeNumbers()\n afterNumbers()\n src/interfaces/a2a-history.ts:\n i: ../config/env.js,../core/security.js,./a2a-types.js,node:fs,node:path\n e: IntentRunListItem,CommunicationRunSummary,RunHistoryFilters,listIntentRuns,runsDirectory,entries,items,readRunEntries,readRun,runDirectory,graphPath,manifestPath,manifest,safeRunPath,runListItem,files,llm,runtime,warnings,validTimestamp,validStatus,llmSummary,readCommunicationSummary,relative,filePath,stat,value,participants,issues,participantSummary,matchesRunFilters,participant,role,ticket,severity,normalized,stringArray,safeManifestFiles,absolute,relative,relativeApiPath\n IntentRunListItem:\n CommunicationRunSummary:\n RunHistoryFilters:\n listIntentRuns()\n runsDirectory()\n entries()\n items()\n readRunEntries()\n readRun()\n runDirectory()\n graphPath()\n manifestPath()\n manifest()\n safeRunPath()\n runListItem()\n files()\n llm()\n runtime()\n warnings()\n validTimestamp()\n validStatus()\n llmSummary()\n readCommunicationSummary()\n relative()\n filePath()\n stat()\n value()\n participants()\n issues()\n participantSummary()\n matchesRunFilters()\n participant()\n role()\n ticket()\n severity()\n normalized()\n stringArray()\n safeManifestFiles()\n absolute()\n relative()\n relativeApiPath()\n src/graph/linker.ts:\n i: ../core/id.js,../core/schema.js,../core/target.js,../core/text.js,../core/types.js,./capability-evidence.js,./symbol-resolution.js\n e: PairEvidence,RecordKeywords,DirectedRelation,SourceRelationRule,indexKeywords,jaccard,intersection,linkIntentRecords,records,byId,keywordIndex,symbolResolutionIndex,candidatePairs,resolvableBasenames,left,right,evidence,directed,deduplicateRecords,byId,existing,collectCandidatePairs,buckets,astIds,moduleAstIds,declarationAstIds,configurationIds,isModuleTopicSource,indexTargetBuckets,indexAliases,indexKeywordBuckets,indexTopicBuckets,addToBucket,values,isSuppressedConfigurationPair,pairsFromBuckets,output,leftId,rightId,isSuppressedAstPair,leftAst,rightAst,astId,indexResolvableBasenames,owners,normalized,basename,paths,pathsIntersect,expand,output,aliases,full,leftSet,scorePair,score,leftKeywords,rightKeywords,resolvedNlAstSymbol,capabilityOverlap,objectSimilarity,sharedTopics,intersectionSize,size,isFileAggregateEvidencePair,isModuleTopicEvidencePair,determineRelation,textScore,sourceRelation,relationForSourceKinds,relation,matchSourceRule,orientRelation,intersects,set,intersectsAliases,set,countBy,key\n PairEvidence:\n RecordKeywords:\n DirectedRelation:\n SourceRelationRule:\n indexKeywords()\n jaccard()\n intersection()\n linkIntentRecords()\n records()\n byId()\n keywordIndex()\n symbolResolutionIndex()\n candidatePairs()\n resolvableBasenames()\n left()\n right()\n evidence()\n directed()\n deduplicateRecords()\n byId()\n existing()\n collectCandidatePairs()\n buckets()\n astIds()\n moduleAstIds()\n declarationAstIds()\n configurationIds()\n isModuleTopicSource()\n indexTargetBuckets()\n indexAliases()\n indexKeywordBuckets()\n indexTopicBuckets()\n addToBucket()\n values()\n isSuppressedConfigurationPair()\n pairsFromBuckets()\n output()\n leftId()\n rightId()\n isSuppressedAstPair()\n leftAst()\n rightAst()\n astId()\n indexResolvableBasenames()\n owners()\n normalized()\n basename()\n paths()\n pathsIntersect()\n expand()\n output()\n aliases()\n full()\n leftSet()\n scorePair()\n score()\n leftKeywords()\n rightKeywords()\n resolvedNlAstSymbol()\n capabilityOverlap()\n objectSimilarity()\n sharedTopics()\n intersectionSize()\n size()\n isFileAggregateEvidencePair()\n isModuleTopicEvidencePair()\n determineRelation()\n textScore()\n sourceRelation()\n relationForSourceKinds()\n relation()\n matchSourceRule()\n orientRelation()\n intersects()\n set()\n intersectsAliases()\n set()\n countBy()\n key()\n src/extractors/nl-llm.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./nl.js,node:fs,node:path,node:url\n e: RawNlRecord,NlResponse,AuditedNlExtractionResult,NlLlmRequiredError,NlAttemptError\n RawNlRecord:\n NlResponse:\n AuditedNlExtractionResult:\n NlLlmRequiredError: super(-1),extractNlIntentAudited(-1),assertNlExtractionOptions(-1),startedAt(-1),result(-1),client(-1),absolute(-1),body(-1),sourcePath(-1),maxLine(-1),prompt(-1),response(-1),records(-1),failure(-1),responses(-1)\n NlAttemptError: super(-1),extractNlWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failedAudit(-1),deterministic(-1),markDeterministic(-1),toIntentRecord(-1),start(-1),end(-1),lines(-1),excerpt(-1),action(-1),normalizedText(-1),statementText(-1),OBJECT_PLACEHOLDERS(-1),nonEmptyText(-1),isPlaceholder(-1),text(-1),resolveObject(-1),fallback(-1),audit(-1),clampLine(-1),allowedAction(-1),allowedModality(-1),readPrompt(-1),promptPath(-1),nlStrings(-1),NL_RECORD_CONTRACT(-1),NL_RESPONSE_CONTRACT(-1)\n src/extractors/docs-deterministic.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path\n e: DeterministicDocumentationOptions,MAX_HEADING_LEVEL,MIN_STATEMENT_CHARS,extractDocumentationBaseline,root,resolver,body,primePathMapper,resolved,mapped,convertDocument,relative,lines,raw,fenceMatch,marker,language,record,heading,level,title,bullet,block,record,paragraph,record,readParagraph,cursor,line,qualifyingStatement,target,hasCodeSpanIdentifier,statementRecord,action,codeBlockRecord,targetsOf\n DeterministicDocumentationOptions:\n MAX_HEADING_LEVEL()\n MIN_STATEMENT_CHARS()\n extractDocumentationBaseline()\n root()\n resolver()\n body()\n primePathMapper()\n resolved()\n mapped()\n convertDocument()\n relative()\n lines()\n raw()\n fenceMatch()\n marker()\n language()\n record()\n heading()\n level()\n title()\n bullet()\n block()\n record()\n paragraph()\n record()\n readParagraph()\n cursor()\n line()\n qualifyingStatement()\n target()\n hasCodeSpanIdentifier()\n statementRecord()\n action()\n codeBlockRecord()\n targetsOf()\n src/evaluation/gold-cases.ts:\n i: ../core/id.js,../core/record.js,../core/types.js,../graph/diagnostics.js,../graph/linker.js,../synthesis/validation.js,../version.js,./gold-metrics.js\n e: LinkingCaseResult,RerankingCaseResult,DiagnosticsCaseResult,Dsl2TodoCaseResult,evaluateLinkingCase,idToLabel,graph,observed,actual,expected,byClass,forbidden,forbiddenViolations,evaluateRerankingCase,idToLabel,declarationRecordId,graph,candidates,moduleRecordId,candidateByModule,decisions,moduleRecordId,candidate,rerank,augmented,observed,expected,forbidden,forbiddenViolations,classifyRelation,exact,evaluateDiagnosticsCase,idToLabel,graph,report,observed,forbidden,forbiddenViolations,evaluateDsl2TodoCase,graph,diagnostics,diagnosticIds,conclusion,proposals,validation,duplicateIds,actual,expected,citations,buildConclusion,buildProposal,recordIds,id,countCitations,citationRequired,citationCited,buildFixtureRecords,labels,records,record,deterministicGeneration\n LinkingCaseResult:\n RerankingCaseResult:\n DiagnosticsCaseResult:\n Dsl2TodoCaseResult:\n evaluateLinkingCase()\n idToLabel()\n graph()\n observed()\n actual()\n expected()\n byClass()\n forbidden()\n forbiddenViolations()\n evaluateRerankingCase()\n idToLabel()\n declarationRecordId()\n graph()\n candidates()\n moduleRecordId()\n candidateByModule()\n decisions()\n moduleRecordId()\n candidate()\n rerank()\n augmented()\n observed()\n expected()\n forbidden()\n forbiddenViolations()\n classifyRelation()\n exact()\n evaluateDiagnosticsCase()\n idToLabel()\n graph()\n report()\n observed()\n forbidden()\n forbiddenViolations()\n evaluateDsl2TodoCase()\n graph()\n diagnostics()\n diagnosticIds()\n conclusion()\n proposals()\n validation()\n duplicateIds()\n actual()\n expected()\n citations()\n buildConclusion()\n buildProposal()\n recordIds()\n id()\n countCitations()\n citationRequired()\n citationCited()\n buildFixtureRecords()\n labels()\n records()\n record()\n deterministicGeneration()\n src/core/record.ts:\n i: ./id.js,./target.js,./version.js\n e: BuildRecordGenerationInput,BuildRecordInput,buildRecord,rawExcerpt,withRecordGeneration,generationMetadata,used,extractorIdentity,separator,clamp,sourcePrefix\n BuildRecordGenerationInput:\n BuildRecordInput:\n buildRecord()\n rawExcerpt()\n withRecordGeneration()\n generationMetadata()\n used()\n extractorIdentity()\n separator()\n clamp()\n sourcePrefix()\n sdk/rust/src/client.rs:\n i: crate::,serde_json::,std::io::,std::net::,std::sync::atomic::,std::time::,super::\n e: Client\n Client:\n src/tf/classifier.ts:\n i: ../config/env.js,../core/text.js,../core/types.js,node:fs,node:path,node:url\n e: TfTensor,TfModel,TfModule,ModelAssets,dynamicImport,importer,loadAssets,directory,vocabularyPath,labels,loadClassifier,modelPath,modulePath,moduleValue,absolute,model,assets,vectorize,values,index,classifyAction,fallback,loaded,vector,input,predictionValue,prediction,probabilities,bestIndex,action,confidence\n TfTensor:\n TfModel:\n TfModule:\n ModelAssets:\n dynamicImport()\n importer()\n loadAssets()\n directory()\n vocabularyPath()\n labels()\n loadClassifier()\n modelPath()\n modulePath()\n moduleValue()\n absolute()\n model()\n assets()\n vectorize()\n values()\n index()\n classifyAction()\n fallback()\n loaded()\n vector()\n input()\n predictionValue()\n prediction()\n probabilities()\n bestIndex()\n action()\n confidence()\n src/extractors/markdown-paths.ts:\n i: ../core/io.js,node:fs,node:fs,node:path\n e: MarkdownPathResolver,PATH_SEARCH_EXCLUDES,MAX_INDEXED_FILES,createMarkdownPathResolver,repositoryRoot,basenames,headingDirectories,normalized,candidate,matches,isRepositoryPath,absolute,headingScopes,buildBasenameIndex,index,base,seen,directory,absolute,matches\n MarkdownPathResolver:\n PATH_SEARCH_EXCLUDES()\n MAX_INDEXED_FILES()\n createMarkdownPathResolver()\n repositoryRoot()\n basenames()\n headingDirectories()\n normalized()\n candidate()\n matches()\n isRepositoryPath()\n absolute()\n headingScopes()\n buildBasenameIndex()\n index()\n base()\n seen()\n directory()\n absolute()\n matches()\n sdk/typescript/examples/basic.ts:\n i: ../src/index.js\n e: baseUrl,token,root,main,client,health,card,nl,ast,markdown,graph,diagnostics,synthesis,validation,rendered,artifact,reality,gitDiff,comparison\n baseUrl()\n token()\n root()\n main()\n client()\n health()\n card()\n nl()\n ast()\n markdown()\n graph()\n diagnostics()\n synthesis()\n validation()\n rendered()\n artifact()\n reality()\n gitDiff()\n comparison()\n python/ast_extract.py:\n e: FactVisitor,source_hash,dotted_name,is_module_entrypoint,iter_python_files,main\n FactVisitor(ast.NodeVisitor): __init__(2),excerpt(1),add(6),visit_Import(1),visit_ImportFrom(1),visit_FunctionDef(1),visit_AsyncFunctionDef(1),visit_ClassDef(1),add_named_constant(3),visit_Assign(1),visit_AnnAssign(1),visit_If(1),visit_Call(1)\n source_hash(value)\n dotted_name(node)\n is_module_entrypoint(node)\n iter_python_files(root;files_from)\n main()\n examples/backend/src/server.ts:\n i: ./store.js,./validation.js,node:http\n e: BackendOptions,MAX_BODY_BYTES,createBackend,store,server,handleRequest,url,body,validation,event,offset,limit,readBody,size,buffer,sendJson,body,startBackend,port,host\n BackendOptions:\n MAX_BODY_BYTES()\n createBackend()\n store()\n server()\n handleRequest()\n url()\n body()\n validation()\n event()\n offset()\n limit()\n readBody()\n size()\n buffer()\n sendJson()\n body()\n startBackend()\n port()\n host()\n src/graph/symbol-resolution.ts:\n i: ../core/target.js,../core/types.js\n e: AstSymbolCandidate,NlSymbolResolution,SymbolResolutionIndex,buildSymbolResolutionIndex,byAlias,values,byNlRecord,hasResolvedNlAstSymbolPair,nl,ast,resolveSymbol,matched,selected,paths,pathSelects,normalized,candidatePath,uniquePaths,isAstDeclaration\n AstSymbolCandidate:\n NlSymbolResolution:\n SymbolResolutionIndex:\n buildSymbolResolutionIndex()\n byAlias()\n values()\n byNlRecord()\n hasResolvedNlAstSymbolPair()\n nl()\n ast()\n resolveSymbol()\n matched()\n selected()\n paths()\n pathSelects()\n normalized()\n candidatePath()\n uniquePaths()\n isAstDeclaration()\n src/core/io.ts:\n i: ./types.js,node:fs,node:path\n e: WalkOptions,DEFAULT_IGNORED_DIRS,ensureDir,readText,stat,pathExists,writeJson,writeText,writeJsonl,readJsonl,body,readJson,walkFiles,ignored,extensions,maxFiles,matcher,base,visit,entries,absolute,relative,extension,escapeRegex,globToRegExp,normalized,char,next,after,matchesAnyGlob,normalized,resolveGlobs,files,absolute,relative,relative,relativePosix\n WalkOptions:\n DEFAULT_IGNORED_DIRS()\n ensureDir()\n readText()\n stat()\n pathExists()\n writeJson()\n writeText()\n writeJsonl()\n readJsonl()\n body()\n readJson()\n walkFiles()\n ignored()\n extensions()\n maxFiles()\n matcher()\n base()\n visit()\n entries()\n absolute()\n relative()\n extension()\n escapeRegex()\n globToRegExp()\n normalized()\n char()\n next()\n after()\n matchesAnyGlob()\n normalized()\n resolveGlobs()\n files()\n absolute()\n relative()\n relative()\n relativePosix()\n scripts/verify-no-llm-imports.mjs:\n i: node:fs,node:path\n e: visited,visit,body,resolved,resolveSource,raw\n visited()\n visit()\n body()\n resolved()\n resolveSource()\n raw()\n src/live/contract-check.ts:\n i: ../core/types.js\n e: LiveBudget,LiveStageMeasurement,LiveHistoryRecord,LiveHistoryStageSummary,LiveHistorySummary,LiveContractAudit,LIVE_HISTORY_LIMIT,liveRequestTimeoutMs,measureLiveStages,missingLiveStages,measureStage,responses,overLatency,sumUsage,values,buildLiveAudit,stages,missingStages,totalLatencyMs,costs,totalCostUsd,overCost,overTotalLatency,buildRecordedLiveAudit,initial,history,toLiveHistoryRecord,appendLiveHistory,kept,summarizeLiveHistory,runs,byStage,entries,redactLiveMessage,renderLiveReport,lines,status,cost,detail,total,median,middle,value,ratio,round\n LiveBudget:\n LiveStageMeasurement:\n LiveHistoryRecord:\n LiveHistoryStageSummary:\n LiveHistorySummary:\n LiveContractAudit:\n LIVE_HISTORY_LIMIT()\n liveRequestTimeoutMs()\n measureLiveStages()\n missingLiveStages()\n measureStage()\n responses()\n overLatency()\n sumUsage()\n values()\n buildLiveAudit()\n stages()\n missingStages()\n totalLatencyMs()\n costs()\n totalCostUsd()\n overCost()\n overTotalLatency()\n buildRecordedLiveAudit()\n initial()\n history()\n toLiveHistoryRecord()\n appendLiveHistory()\n kept()\n summarizeLiveHistory()\n runs()\n byStage()\n entries()\n redactLiveMessage()\n renderLiveReport()\n lines()\n status()\n cost()\n detail()\n total()\n median()\n middle()\n value()\n ratio()\n round()\n src/extractors/docs-record.ts:\n i: ../core/record.js,../version.js,./docs-types.js\n e: OBJECT_PLACEHOLDERS,toDocumentIntentRecord,statementText,target,action,modality,isPlaceholder,resolveObject,fallback,anchorToSource,claimedStart,claimedEnd,wanted,lines,scores,claimedScore,bestScore,bestIndex,anchored,keywordOverlap,present,shared,resolveTarget,hasTarget,resolveAction,derived,resolveModality,derived,linesFromChunk,lines,relativeStart,relativeEnd,clampLine,allowedAction,allowedModality,allowedLifecycle\n OBJECT_PLACEHOLDERS()\n toDocumentIntentRecord()\n statementText()\n target()\n action()\n modality()\n isPlaceholder()\n resolveObject()\n fallback()\n anchorToSource()\n claimedStart()\n claimedEnd()\n wanted()\n lines()\n scores()\n claimedScore()\n bestScore()\n bestIndex()\n anchored()\n keywordOverlap()\n present()\n shared()\n resolveTarget()\n hasTarget()\n resolveAction()\n derived()\n resolveModality()\n derived()\n linesFromChunk()\n lines()\n relativeStart()\n relativeEnd()\n clampLine()\n allowedAction()\n allowedModality()\n allowedLifecycle()\n src/evaluation/gold.ts:\n i: ../core/id.js,./gold-extraction.js,node:fs\n e: EvaluationCore,EvaluationRun,EvaluationResult,loadGoldDataset,parsed,evaluateGoldDataset,first,second,stable,goldReportIsPerfect,renderGoldReportMarkdown,percent,support,rows,value,evaluateOnce,extraction,linking,dsl2todo,diagnostics,evaluateExtraction,byChannel,actual,overall,evaluateDiagnostics,counts,forbiddenViolations,snapshots,result,evaluateLinking,counts,byClass,forbiddenViolations,snapshots,result,reranking,evaluateDsl2Todo,duplicateCounts,snapshots,result\n EvaluationCore:\n EvaluationRun:\n EvaluationResult:\n loadGoldDataset()\n parsed()\n evaluateGoldDataset()\n first()\n second()\n stable()\n goldReportIsPerfect()\n renderGoldReportMarkdown()\n percent()\n support()\n rows()\n value()\n evaluateOnce()\n extraction()\n linking()\n dsl2todo()\n diagnostics()\n evaluateExtraction()\n byChannel()\n actual()\n overall()\n evaluateDiagnostics()\n counts()\n forbiddenViolations()\n snapshots()\n result()\n evaluateLinking()\n counts()\n byClass()\n forbiddenViolations()\n snapshots()\n result()\n reranking()\n evaluateDsl2Todo()\n duplicateCounts()\n snapshots()\n result()\n scripts/research/rerank-embedding-shortlist.mjs:\n i: ../../dist/src/config/env.js,../../dist/src/semantic/reranker-llm.js,node:fs,node:path\n e: options,records,selectedRows,declaration,module,candidateSet,config,rerank,augmentedGraph,originalRelationIds,originallyRelatedPairs,candidateById,accepted,candidate,relation,verdictCounts,resolveDeclaration,exact,matches,resolveModule,exact,matches,readJson,parseArgs,values,key,value,required,value,top\n options()\n records()\n selectedRows()\n declaration()\n module()\n candidateSet()\n config()\n rerank()\n augmentedGraph()\n originalRelationIds()\n originallyRelatedPairs()\n candidateById()\n accepted()\n candidate()\n relation()\n verdictCounts()\n resolveDeclaration()\n exact()\n matches()\n resolveModule()\n exact()\n matches()\n readJson()\n parseArgs()\n values()\n key()\n value()\n required()\n value()\n top()\n golang/ast_extract.go:\n e: Fact,output,factCollector,main,emit,collectGoFiles,parseFile,position,excerpt,add,visitDecl,visitFunc,visitGenDecl,visitCalls,typeName,declaredTypeKind,strPtr,toSlash\n Fact:\n output:\n factCollector:\n main()\n emit()\n collectGoFiles()\n parseFile()\n position()\n excerpt()\n add()\n visitDecl()\n visitFunc()\n visitGenDecl()\n visitCalls()\n typeName()\n declaredTypeKind()\n strPtr()\n toSlash()\n src/operations/subactor.ts:\n i: ../core/types.js,./validation.js\n e: CompileSubactorEnvelopeOptions,valueMatchesType,assertBinding,ageSeconds,compileSubactorProcessEnvelope,variableById,referenced,variable,binding,humanApproval,binding\n CompileSubactorEnvelopeOptions:\n valueMatchesType()\n assertBinding()\n ageSeconds()\n compileSubactorProcessEnvelope()\n variableById()\n referenced()\n variable()\n binding()\n humanApproval()\n binding()\n src/extractors/git.ts:\n i: ../config/env.js,../core/record.js,../core/text.js,../core/types.js,../tf/classifier.js,node:child_process,node:path,node:util\n e: GitCommit,ChangedFile,GitExtractionOptions,execFileAsync,extractGitIntent,root,count,inside,message,commit,changedFiles,stats,diff,classified,inferredSymbols,docOnly,runGit,result,readCommits,output,readChangedFiles,output,parts,status,readStats,output,additions,deletions,extractChangedSymbols,output,symbol,isDocumentationPath\n GitCommit:\n ChangedFile:\n GitExtractionOptions:\n execFileAsync()\n extractGitIntent()\n root()\n count()\n inside()\n message()\n commit()\n changedFiles()\n stats()\n diff()\n classified()\n inferredSymbols()\n docOnly()\n runGit()\n result()\n readCommits()\n output()\n readChangedFiles()\n output()\n parts()\n status()\n readStats()\n output()\n additions()\n deletions()\n extractChangedSymbols()\n output()\n symbol()\n isDocumentationPath()\n src/diff/text-render.ts:\n i: ./text-types.js\n e: TextDiffSvgOptions,SideBySideRow,renderUnifiedDiff,marker,toSideBySideRows,index,line,pairs,renderTextDiffSvg,theme,maxRows,maxColumns,title,charWidth,rowHeight,gutterWidth,columnWidth,width,totals,y,rendered,skipped,summarizeDiffs,diffHeading,svgBody,sideBySideRowMarkup,changed,number,renderTextDiffHtml,title,sections,renderHtmlSection,hunks,rows,htmlCell,cssClass,number\n TextDiffSvgOptions:\n SideBySideRow:\n renderUnifiedDiff()\n marker()\n toSideBySideRows()\n index()\n line()\n pairs()\n renderTextDiffSvg()\n theme()\n maxRows()\n maxColumns()\n title()\n charWidth()\n rowHeight()\n gutterWidth()\n columnWidth()\n width()\n totals()\n y()\n rendered()\n skipped()\n summarizeDiffs()\n diffHeading()\n svgBody()\n sideBySideRowMarkup()\n changed()\n number()\n renderTextDiffHtml()\n title()\n sections()\n renderHtmlSection()\n hunks()\n rows()\n htmlCell()\n cssClass()\n number()\n src/config/env.ts:\n i: ../core/io.js,../core/types.js,../version.js,node:fs,node:path\n e: T2CConfig,loadEnvFile,explicit,candidates,content,trimmed,separator,key,value,envString,value,envOptional,value,envNumber,raw,value,envBoolean,raw,envList,raw,envLlmMode,value,getConfig,model,root,configForDisplay,hasOpenRouter\n T2CConfig:\n loadEnvFile()\n explicit()\n candidates()\n content()\n trimmed()\n separator()\n key()\n value()\n envString()\n value()\n envOptional()\n value()\n envNumber()\n raw()\n value()\n envBoolean()\n raw()\n envList()\n raw()\n envLlmMode()\n value()\n getConfig()\n model()\n root()\n configForDisplay()\n hasOpenRouter()\n scripts/live-model-comparison.mjs:\n i: node:fs,node:path,node:url\n e: REPO_ROOT,main,probe,timeoutMs,models,root,config,result,comparison,rendered,jsonTarget,markdownTarget,failedAudit,message,writeFile\n REPO_ROOT()\n main()\n probe()\n timeoutMs()\n models()\n root()\n config()\n result()\n comparison()\n rendered()\n jsonTarget()\n markdownTarget()\n failedAudit()\n message()\n writeFile()\n src/synthesis/todo-patch.ts:\n i: ../core/id.js,../core/io.js,./validation.js,node:crypto,node:fs,node:path\n e: CreateTodoPatchOptions,CreatedTodoPatch,WriteTodoPatchOptions,WrittenTodoPatch,ApplyTodoPatchOptions,diagnosticReportFingerprint,createTodoPatch,expectedValidation,proposalById,selected,proposal,orderedSelected,markdown,renderTodoPatchMarkdown,writeTodoPatchArtifacts,created,patchPath,auditPath,applyTodoPatch,current,receipt,now,currentHash,result,applied,recovered,assertTodoPatchArtifact,artifact,sourceTodo,selected,duplicates,classified,duplicate,assertApproval,assertReceipt,atomicWrite,temporary,existing,handle,appendPatch,separator,wasAlreadyAppended,renderTargets,rendered,renderIds,inline,normalizePath,sameArray,object,exactKeys,expected,missing,extra,nonBlank,hash,isoDate,uniqueIds,uniqueStrings\n CreateTodoPatchOptions:\n CreatedTodoPatch:\n WriteTodoPatchOptions:\n WrittenTodoPatch:\n ApplyTodoPatchOptions:\n diagnosticReportFingerprint()\n createTodoPatch()\n expectedValidation()\n proposalById()\n selected()\n proposal()\n orderedSelected()\n markdown()\n renderTodoPatchMarkdown()\n writeTodoPatchArtifacts()\n created()\n patchPath()\n auditPath()\n applyTodoPatch()\n current()\n receipt()\n now()\n currentHash()\n result()\n applied()\n recovered()\n assertTodoPatchArtifact()\n artifact()\n sourceTodo()\n selected()\n duplicates()\n classified()\n duplicate()\n assertApproval()\n assertReceipt()\n atomicWrite()\n temporary()\n existing()\n handle()\n appendPatch()\n separator()\n wasAlreadyAppended()\n renderTargets()\n rendered()\n renderIds()\n inline()\n normalizePath()\n sameArray()\n object()\n exactKeys()\n expected()\n missing()\n extra()\n nonBlank()\n hash()\n isoDate()\n uniqueIds()\n uniqueStrings()\n src/summary/payload.ts:\n i: ../core/types.js\n e: compactSummaryPayload,referenced,nonAst,moduleAst,relevantAst,ids,selectedRelations,compactRecord\n compactSummaryPayload()\n referenced()\n nonAst()\n moduleAst()\n relevantAst()\n ids()\n selectedRelations()\n compactRecord()\n src/live/model-comparison.ts:\n i: ../core/types.js,./contract-check.js\n e: LiveModelRun,LiveModelMeasurement,LiveModelAgreement,LiveModelComparison,measureLiveModelRun,responses,records,enrichedRecords,costUsd,isLlmEnriched,sourceKey,lines,compareLiveModelOutputs,rightBySource,pairs,agreeing,buildLiveModelComparison,models,passing,pick,measured,renderLiveModelComparison,sumUsage,values,round\n LiveModelRun:\n LiveModelMeasurement:\n LiveModelAgreement:\n LiveModelComparison:\n measureLiveModelRun()\n responses()\n records()\n enrichedRecords()\n costUsd()\n isLlmEnriched()\n sourceKey()\n lines()\n compareLiveModelOutputs()\n rightBySource()\n pairs()\n agreeing()\n buildLiveModelComparison()\n models()\n passing()\n pick()\n measured()\n renderLiveModelComparison()\n sumUsage()\n values()\n round()\n src/extractors/docs-llm.ts:\n i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/io.js,../core/types.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,./docs-record.js,./docs-schema.js,node:fs,node:path,node:url\n e: DocumentationLlmRequiredError\n DocumentationLlmRequiredError: super(-1),extractDocumentationIntent(-1),startedAt(-1),client(-1),requireConfiguredClient(-1),cache(-1),chunks(-1),selectedChunks(-1),systemPrompt(-1),results(-1),requireConfiguredClient(-1),loadDocumentChunks(-1),files(-1),body(-1),relative(-1),fileChunks(-1),isDocumentChunks(-1),candidate(-1),selectWithinBudget(-1),prioritized(-1),selected(-1),extractChunk(-1),contract(-1),records(-1),buildAudit(-1),status(-1),readPrompt(-1),promptPath(-1),errorMessage(-1)\n src/extractors/ast.ts:\n i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/ignore.js,../core/io.js,../core/schema.js,../core/types.js,../version.js,./ast/go.js,./ast/java.js,./ast/php.js,./ast/python.js,./ast/rust.js,./ast/typescript.js,./ast/unsupported.js,node:path\n e: AstExtractionOptions,ExternalCacheAdapter,extractAstIntent,root,cache,matcher,files,body,relative,extracted,adapterFiles,manifest,result,unsupported,sourceManifest,body,isIntentRecords,isExtractionResult,result\n AstExtractionOptions:\n ExternalCacheAdapter:\n extractAstIntent()\n root()\n cache()\n matcher()\n files()\n body()\n relative()\n extracted()\n adapterFiles()\n manifest()\n result()\n unsupported()\n sourceManifest()\n body()\n isIntentRecords()\n isExtractionResult()\n result()\n src/evaluation/gold-cli.ts:\n i: node:fs,node:path\n e: main,args,arg,json,requirePerfect,outIndex,outPath,dataset,report,rendered\n main()\n args()\n arg()\n json()\n requirePerfect()\n outIndex()\n outPath()\n dataset()\n report()\n rendered()\n src/comparison/workspace.ts:\n i: ../config/env.js,../core/id.js,../core/io.js,../core/security.js,../core/types.js,../diff/reality.js,../graph/diff.js,../pipeline/run.js,node:child_process,node:fs,node:os,node:path,node:util\n e: WorkspaceComparisonOptions,CoverageSnapshot,WorkspaceComparison,execFileAsync,compareWorkspaceIntent,root,repositoryRoot,relativeAnalysisRoot,outputDir,baseRef,baseCommit,headCommit,status,changedFiles,temporaryParent,baseWorktree,baseRoot,pipelineOptions,baseOptions,currentOptions,baseRun,currentRun,baseReality,currentReality,diff,baseCoverage,currentCoverage,alignmentRateDelta,implementationCoverageDelta,plannedCodeCoverageDelta,documentedCodeCoverageDelta,gapsDelta,diagnosticsDelta,comparisonId,comparisonDirectory,artifacts,scopedOutputDirectory,absolute,commonPipelineOptions,optionsForRoot,existingFile,relative,coverage,diagnosticDelta,classifyWorkspaceTrend,severeDelta,improved,regressed,parseAheadBehind,defaultBaseRef,rounded,artifactPaths,relative,renderTrendMarkdown,percent,documentationLine,git,result\n WorkspaceComparisonOptions:\n CoverageSnapshot:\n WorkspaceComparison:\n execFileAsync()\n compareWorkspaceIntent()\n root()\n repositoryRoot()\n relativeAnalysisRoot()\n outputDir()\n baseRef()\n baseCommit()\n headCommit()\n status()\n changedFiles()\n temporaryParent()\n baseWorktree()\n baseRoot()\n pipelineOptions()\n baseOptions()\n currentOptions()\n baseRun()\n currentRun()\n baseReality()\n currentReality()\n diff()\n baseCoverage()\n currentCoverage()\n alignmentRateDelta()\n implementationCoverageDelta()\n plannedCodeCoverageDelta()\n documentedCodeCoverageDelta()\n gapsDelta()\n diagnosticsDelta()\n comparisonId()\n comparisonDirectory()\n artifacts()\n scopedOutputDirectory()\n absolute()\n commonPipelineOptions()\n optionsForRoot()\n existingFile()\n relative()\n coverage()\n diagnosticDelta()\n classifyWorkspaceTrend()\n severeDelta()\n improved()\n regressed()\n parseAheadBehind()\n defaultBaseRef()\n rounded()\n artifactPaths()\n relative()\n renderTrendMarkdown()\n percent()\n documentationLine()\n git()\n result()\n src/communication/llm.ts:\n i: ../config/env.js,../core/id.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,node:fs,node:path,node:url\n e: RawCommunicationEnrichment,RawParticipantSynthesis,RawCommunicationResponse,ParticipantCommunicationSynthesis,AuditedCommunicationExtractionResult,CommunicationLlmRequiredError,CommunicationAttemptError,ParticipantGroup\n RawCommunicationEnrichment:\n RawParticipantSynthesis:\n RawCommunicationResponse:\n ParticipantCommunicationSynthesis:\n AuditedCommunicationExtractionResult:\n CommunicationLlmRequiredError: super(-1),extractCommunicationIntentAudited(-1),startedAt(-1),deterministic(-1),records(-1),client(-1),groups(-1),response(-1),enrichments(-1),enrichedByOriginal(-1),generation(-1),participants(-1),failure(-1),responses(-1),classifyLlmFailure(-1)\n CommunicationAttemptError: super(-1),enrichWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failed(-1),marked(-1),participantGroups(-1),grouped(-1),participant(-1),role(-1),key(-1),values(-1),promptPayload(-1),validateEnrichments(-1),expected(-1),output(-1),materializeSyntheses(-1),byKey(-1),seen(-1),output(-1),group(-1),permitted(-1),recordIds(-1),enrichRecord(-1),deterministicSyntheses(-1),synthesis(-1),markDeterministic(-1),marked(-1),deterministicGeneration(-1),fallbackGeneration(-1),llmGeneration(-1),audit(-1),roleOf(-1),sortedUnique(-1),readPrompt(-1),promptPath(-1),communicationStrings(-1),COMMUNICATION_ENRICHMENT_CONTRACT(-1),PARTICIPANT_SYNTHESIS_CONTRACT(-1),COMMUNICATION_RESPONSE_CONTRACT(-1)\n ParticipantGroup:\n src/synthesis/validation.ts:\n i: ../core/schema.js,../core/types.js\n e: TodoProposalDuplicate,TodoProposalValidationResult,validateAndClassifyTodoProposals,existing,duplicates,orderedProposalIds,duplicateProposalIds,duplicateIds,duplicateEvidence,proposalWords,target,sharedTicket,sharedSymbol,sharedPath,similarity,dependencyFirstPriorityOrder,byId,remainingDependencies,dependents,values,compare,left,right,ready,id,remaining,words,jaccard,common,intersects,values\n TodoProposalDuplicate:\n TodoProposalValidationResult:\n validateAndClassifyTodoProposals()\n existing()\n duplicates()\n orderedProposalIds()\n duplicateProposalIds()\n duplicateIds()\n duplicateEvidence()\n proposalWords()\n target()\n sharedTicket()\n sharedSymbol()\n sharedPath()\n similarity()\n dependencyFirstPriorityOrder()\n byId()\n remainingDependencies()\n dependents()\n values()\n compare()\n left()\n right()\n ready()\n id()\n remaining()\n words()\n jaccard()\n common()\n intersects()\n values()\n src/synthesis/tasks-llm.ts:\n i: ../config/env.js,../core/id.js,../core/io.js,../core/schema.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./task-synthesis-contract.js,./task-synthesis-materialize.js,./task-synthesis-payload.js,node:fs,node:path,node:url\n e: RawDiagnosticAction,AuditedTaskSynthesisResult,TaskSynthesisRequiredError,TaskSynthesisAttemptError\n RawDiagnosticAction:\n AuditedTaskSynthesisResult:\n TaskSynthesisRequiredError: super(-1)\n TaskSynthesisAttemptError: super(-1),synthesizeTodoProposals(-1),startedAt(-1),assertConclusions(-1),client(-1),prompt(-1),payload(-1),failure(-1),responses(-1),synthesizeWithCorrection(-1),generation(-1),message(-1),wrapped(-1),fallbackOrThrow(-1),failedAudit(-1),rawDiagnosticActions(-1),generationMetadata(-1),configuration(-1),synthesisAudit(-1),readPrompt(-1),promptPath(-1)\n src/interfaces/a2a-task-store.ts:\n i: ../config/env.js,../core/security.js,../services/actions.js,node:crypto,node:fs,node:path,node:timers/promises\n e: PreparedTask,ListCursor,TaskStoreSnapshot,tasks,messageTaskIndex,clearA2aTaskStoreForTests,handleA2aRpc,handleRpcInTaskStore,params,sendMessage,message,sendConfiguration,prepared,getTask,task,historyLength,cancelTask,task,fullTaskView,scheduleTaskExecution,task,withTaskStore,storePath,release,result,configuredTaskStorePath,acquireTaskStoreLock,deadline,removeLock,removeStaleLock,stat,loadTaskStore,content,snapshot,restored,readTaskStore,stat,restoreTask,assertStoredTask,saveTaskStore,removeTemporaryFile,prepareTask,key,indexedTask,taskForMessage,indexedTaskId,task,continueTask,existing,continuationError,message,createTask,taskId,contextId,executeMessage,command,result,currentTaskState,completeTask,message,failTask,message,agentMessage,listTasks,contextId,status,pageSize,historyLength,includeArtifacts,statusTimestampAfter,filter,filtered,pageToken,start,page,last,filteredTasks,compareTasksByUpdate,timestampOrder,indexAfterCursor,exact,cursorTime,next,taskTime,encodeCursor,decodeCursor,decoded,taskView,effectiveHistoryLength,history,cloneArtifact,ownedTask,task,messageKey,errorMessage\n PreparedTask:\n ListCursor:\n TaskStoreSnapshot:\n tasks()\n messageTaskIndex()\n clearA2aTaskStoreForTests()\n handleA2aRpc()\n handleRpcInTaskStore()\n params()\n sendMessage()\n message()\n sendConfiguration()\n prepared()\n getTask()\n task()\n historyLength()\n cancelTask()\n task()\n fullTaskView()\n scheduleTaskExecution()\n task()\n withTaskStore()\n storePath()\n release()\n result()\n configuredTaskStorePath()\n acquireTaskStoreLock()\n deadline()\n removeLock()\n removeStaleLock()\n stat()\n loadTaskStore()\n content()\n snapshot()\n restored()\n readTaskStore()\n stat()\n restoreTask()\n assertStoredTask()\n saveTaskStore()\n removeTemporaryFile()\n prepareTask()\n key()\n indexedTask()\n taskForMessage()\n indexedTaskId()\n task()\n continueTask()\n existing()\n continuationError()\n message()\n createTask()\n taskId()\n contextId()\n executeMessage()\n command()\n result()\n currentTaskState()\n completeTask()\n message()\n failTask()\n message()\n agentMessage()\n listTasks()\n contextId()\n status()\n pageSize()\n historyLength()\n includeArtifacts()\n statusTimestampAfter()\n filter()\n filtered()\n pageToken()\n start()\n page()\n last()\n filteredTasks()\n compareTasksByUpdate()\n timestampOrder()\n indexAfterCursor()\n exact()\n cursorTime()\n next()\n taskTime()\n encodeCursor()\n decodeCursor()\n decoded()\n taskView()\n effectiveHistoryLength()\n history()\n cloneArtifact()\n ownedTask()\n task()\n messageKey()\n errorMessage()\n src/graph/diff.ts:\n i: ../core/id.js,../core/schema.js\n e: DiffSvgOptions,diffIntentGraphs,beforeById,afterById,unchangedRecords,beforeGroups,afterGroups,left,right,paired,beforeRecord,afterRecord,beforeRelations,afterRelations,fingerprint,renderGraphDiffSvg,maxItems,title,visibleRows,width,height,y,assertGraph,groupRecords,groups,identity,values,recordIdentity,normalizeRecord,changedFieldPaths,isObject,relationKey,compareRecords,compareRelations,recordLabel,changeLabel,metricCard,escapeXml,truncate\n DiffSvgOptions:\n diffIntentGraphs()\n beforeById()\n afterById()\n unchangedRecords()\n beforeGroups()\n afterGroups()\n left()\n right()\n paired()\n beforeRecord()\n afterRecord()\n beforeRelations()\n afterRelations()\n fingerprint()\n renderGraphDiffSvg()\n maxItems()\n title()\n visibleRows()\n width()\n height()\n y()\n assertGraph()\n groupRecords()\n groups()\n identity()\n values()\n recordIdentity()\n normalizeRecord()\n changedFieldPaths()\n isObject()\n relationKey()\n compareRecords()\n compareRelations()\n recordLabel()\n changeLabel()\n metricCard()\n escapeXml()\n truncate()\n src/extractors/changelog.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path\n e: extractChangelog,absolute,body,relative,lines,raw,versionHeading,categoryHeading,bullet,block,text,action,resolvedPaths,changelogAction,normalized,lower\n extractChangelog()\n absolute()\n body()\n relative()\n lines()\n raw()\n versionHeading()\n categoryHeading()\n bullet()\n block()\n text()\n action()\n resolvedPaths()\n changelogAction()\n normalized()\n lower()\n sdk/python/examples/basic.py:\n e: main\n main()\n sdk/php/src/Client.php:\n e: Client\n Client:\n scripts/verify-workflow-yaml.mjs:\n i: node:fs,node:path\n e: explicit,files,body,seen,match,key,previous,workflowFiles,directory\n explicit()\n files()\n body()\n seen()\n match()\n key()\n previous()\n workflowFiles()\n directory()\n scripts/research/audit-changelog-sample.mjs:\n i: node:child_process,node:fs,node:path\n e: options,entries,root,latest,runDirectory,diagnostics,graph,recordsById,findings,selected,trackedFiles,classification,labelCounts,labelRepositories,stratifiedSample,groups,values,added,record,targetClass,target,classify,text,file,exactFileUpdate,match,candidate,basename,pathOwners,file,countBy,item,readJson,parseArgs,value,index,limitIndex,limit,intentDirectoryIndex,intentDirectory\n options()\n entries()\n root()\n latest()\n runDirectory()\n diagnostics()\n graph()\n recordsById()\n findings()\n selected()\n trackedFiles()\n classification()\n labelCounts()\n labelRepositories()\n stratifiedSample()\n groups()\n values()\n added()\n record()\n targetClass()\n target()\n classify()\n text()\n file()\n exactFileUpdate()\n match()\n candidate()\n basename()\n pathOwners()\n file()\n countBy()\n item()\n readJson()\n parseArgs()\n value()\n index()\n limitIndex()\n limit()\n intentDirectoryIndex()\n intentDirectory()\n src/summary/summarizer.ts:\n i: ../config/env.js,../core/grounding.js,../core/id.js,../core/io.js,../core/schema.js,../llm/audit.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./payload.js,./render.js,node:fs,node:path,node:url\n e: SummaryResult,SummaryOptions,RawConclusion,RawSummaryResponse,SummaryAttemptError,summarizeGraph,mode,conclusions,client,conclusions,systemPrompt,payload,failure,responses,conclusions,SUMMARY_CONCLUSION_CONTRACT,SUMMARY_RESPONSE_CONTRACT\n SummaryResult:\n SummaryOptions:\n RawConclusion:\n RawSummaryResponse:\n SummaryAttemptError: super(-1),summarizeWithCorrection(-1),conclusions(-1),generationMetadata(-1),message(-1),materializeConclusions(-1),parsed(-1),conclusions(-1),diagnosticIds(-1),assertConclusions(-1),deterministicConclusions(-1),conclusions(-1),assertConclusions(-1),generationMetadata(-1),effectiveMode(-1),degraded(-1),configuration(-1),summaryMode(-1),sortedUnique(-1),readPrompt(-1),promptPath(-1)\n summarizeGraph()\n mode()\n conclusions()\n client()\n conclusions()\n systemPrompt()\n payload()\n failure()\n responses()\n conclusions()\n SUMMARY_CONCLUSION_CONTRACT()\n SUMMARY_RESPONSE_CONTRACT()\n src/summary/render.ts:\n i: ../core/types.js\n e: renderSummaryMarkdown,plans,git,moduleFacts,facts,releases,communication,actions,compareConclusions,renderRecords,confidence,renderConclusion,confidence,recordCitations\n renderSummaryMarkdown()\n plans()\n git()\n moduleFacts()\n facts()\n releases()\n communication()\n actions()\n compareConclusions()\n renderRecords()\n confidence()\n renderConclusion()\n confidence()\n recordCitations()\n src/operations/compile-cli.ts:\n i: ./artifact.js\n e: argumentsByName,key,value,allowed,unknown,main,args\n argumentsByName()\n key()\n value()\n allowed()\n unknown()\n main()\n args()\n src/llm/structured-schema.ts:\n i: ../core/types.js\n e: StructuredSchema,StructuredResponseError,StringOptions,NumberOptions,ArrayOptions\n StructuredSchema:\n StructuredResponseError: super(-1),schema(-1),parse(-1),string(-1),pattern(-1),fail(-1),fail(-1),nullableString(-1),base(-1),number(-1),fail(-1),checkNumberBounds(-1),integer(-1),numeric(-1),parsed(-1),enumValue(-1),allowed(-1),fail(-1),array(-1),fail(-1),fail(-1),parsed(-1),identities(-1),object(-1),keys(-1),allowed(-1),fail(-1),candidate(-1),unknown(-1),missing(-1),checkNumberBounds(-1),fail(-1),fail(-1),jsonIdentity(-1),record(-1),describe(-1),fail(-1)\n StringOptions:\n NumberOptions:\n ArrayOptions:\n src/interfaces/a2a-types.ts:\n i: ../services/actions.js\n e: JsonRpcRequest,A2APart,A2AMessage,A2AArtifact,A2ATask,St\n\n... [truncated - file too large]", "is_subdir": false}, {"name": "planfile-tickets.yaml", "rel_path": "planfile-tickets.yaml", "path": "planfile-tickets.yaml", "size": "191.8KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "source: code2llm\n# generated in 0.17s\nschema: code2llm.planfile_tickets.v1\nproject_root: \ntickets:\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: php.ast_extract.parseFile (CC=38)'\n description: 'code2llm reports `php.ast_extract.parseFile` at `php/ast_extract.php:77`\n with cyclomatic complexity 38 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - php/ast_extract.php\n dedupe_key: code2llm:cc:php/ast_extract.php:php.ast_extract.parseFile\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.research.rank-intent-graph-embeddings.main\n (CC=27)'\n description: 'code2llm reports `scripts.research.rank-intent-graph-embeddings.main`\n at `scripts/research/rank-intent-graph-embeddings.py:35` with cyclomatic complexity\n 27 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/research/rank-intent-graph-embeddings.py\n dedupe_key: code2llm:cc:scripts/research/rank-intent-graph-embeddings.py:scripts.research.rank-intent-graph-embeddings.main\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.verify-env-contract.makefile (CC=28)'\n description: 'code2llm reports `scripts.verify-env-contract.makefile` at `scripts/verify-env-contract.mjs:41`\n with cyclomatic complexity 28 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/verify-env-contract.mjs\n dedupe_key: code2llm:cc:scripts/verify-env-contract.mjs:scripts.verify-env-contract.makefile\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.go.examples.basic.main.run (CC=26)'\n description: 'code2llm reports `sdk.go.examples.basic.main.run` at `sdk/go/examples/basic/main.go:29`\n with cyclomatic complexity 26 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/go/examples/basic/main.go\n dedupe_key: code2llm:cc:sdk/go/examples/basic/main.go:sdk.go.examples.basic.main.run\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.cli.main (CC=95)'\n description: 'code2llm reports `src.cli.main` at `src/cli.ts:53` with cyclomatic\n complexity 95 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/cli.ts\n dedupe_key: code2llm:cc:src/cli.ts:src.cli.main\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.communication.analyzer.analyzeCommunication\n (CC=48)'\n description: 'code2llm reports `src.communication.analyzer.analyzeCommunication`\n at `src/communication/analyzer.ts:56` with cyclomatic complexity 48 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/communication/analyzer.ts\n dedupe_key: code2llm:cc:src/communication/analyzer.ts:src.communication.analyzer.analyzeCommunication\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.communication.identity.assertParticipantIdentityRegistry\n (CC=30)'\n description: 'code2llm reports `src.communication.identity.assertParticipantIdentityRegistry`\n at `src/communication/identity.ts:51` with cyclomatic complexity 30 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/communication/identity.ts\n dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.assertParticipantIdentityRegistry\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.communication.identity.external (CC=25)'\n description: 'code2llm reports `src.communication.identity.external` at `src/communication/identity.ts:58`\n with cyclomatic complexity 25 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/communication/identity.ts\n dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.external\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.communication.identity.ids (CC=25)'\n description: 'code2llm reports `src.communication.identity.ids` at `src/communication/identity.ts:57`\n with cyclomatic complexity 25 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/communication/identity.ts\n dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.ids\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.communication.identity.registry (CC=25)'\n description: 'code2llm reports `src.communication.identity.registry` at `src/communication/identity.ts:53`\n with cyclomatic complexity 25 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/communication/identity.ts\n dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.registry\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.text.inferObject (CC=34)'\n description: 'code2llm reports `src.core.text.inferObject` at `src/core/text.ts:440`\n with cyclomatic complexity 34 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/text.ts\n dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.inferObject\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.text.normalized (CC=30)'\n description: 'code2llm reports `src.core.text.normalized` at `src/core/text.ts:441`\n with cyclomatic complexity 30 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/text.ts\n dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.normalized\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.reality.buildRealityView (CC=26)'\n description: 'code2llm reports `src.diff.reality.buildRealityView` at `src/diff/reality.ts:153`\n with cyclomatic complexity 26 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/reality.ts\n dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.buildRealityView\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.assertLinkingCohorts\n (CC=32)'\n description: 'code2llm reports `src.evaluation.gold-types.assertLinkingCohorts`\n at `src/evaluation/gold-types.ts:341` with cyclomatic complexity 32 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-types.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.assertLinkingCohorts\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.ast.typescript.extractTypeScriptFile\n (CC=43)'\n description: 'code2llm reports `src.extractors.ast.typescript.extractTypeScriptFile`\n at `src/extractors/ast/typescript.ts:11` with cyclomatic complexity 43 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/ast/typescript.ts\n dedupe_key: code2llm:cc:src/extractors/ast/typescript.ts:src.extractors.ast.typescript.extractTypeScriptFile\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.ast.typescript.visit (CC=25)'\n description: 'code2llm reports `src.extractors.ast.typescript.visit` at `src/extractors/ast/typescript.ts:77`\n with cyclomatic complexity 25 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/ast/typescript.ts\n dedupe_key: code2llm:cc:src/extractors/ast/typescript.ts:src.extractors.ast.typescript.visit\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.communication.communicationFiles\n (CC=72)'\n description: 'code2llm reports `src.extractors.communication.communicationFiles`\n at `src/extractors/communication.ts:74` with cyclomatic complexity 72 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/communication.ts\n dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.communicationFiles\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.communication.extractCommunicationIntent\n (CC=76)'\n description: 'code2llm reports `src.extractors.communication.extractCommunicationIntent`\n at `src/extractors/communication.ts:54` with cyclomatic complexity 76 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/communication.ts\n dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.extractCommunicationIntent\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.communication.identityRegistry\n (CC=72)'\n description: 'code2llm reports `src.extractors.communication.identityRegistry` at\n `src/extractors/communication.ts:69` with cyclomatic complexity 72 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/communication.ts\n dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.identityRegistry\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.diagnoseGraph (CC=40)'\n description: 'code2llm reports `src.graph.diagnostics.diagnoseGraph` at `src/graph/diagnostics.ts:16`\n with cyclomatic complexity 40 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.diagnoseGraph\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.documentedPaths (CC=35)'\n description: 'code2llm reports `src.graph.diagnostics.documentedPaths` at `src/graph/diagnostics.ts:23`\n with cyclomatic complexity 35 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.documentedPaths\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.groundedImplementation\n (CC=35)'\n description: 'code2llm reports `src.graph.diagnostics.groundedImplementation` at\n `src/graph/diagnostics.ts:21` with cyclomatic complexity 35 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.groundedImplementation\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.implementedPaths (CC=35)'\n description: 'code2llm reports `src.graph.diagnostics.implementedPaths` at `src/graph/diagnostics.ts:22`\n with cyclomatic complexity 35 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.implementedPaths\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.neighbors (CC=35)'\n description: 'code2llm reports `src.graph.diagnostics.neighbors` at `src/graph/diagnostics.ts:19`\n with cyclomatic complexity 35 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.neighbors\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.recordsById (CC=35)'\n description: 'code2llm reports `src.graph.diagnostics.recordsById` at `src/graph/diagnostics.ts:20`\n with cyclomatic complexity 35 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.recordsById\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.diagnostics.symbolResolutionIndex\n (CC=35)'\n description: 'code2llm reports `src.graph.diagnostics.symbolResolutionIndex` at\n `src/graph/diagnostics.ts:24` with cyclomatic complexity 35 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/diagnostics.ts\n dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.symbolResolutionIndex\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.interfaces.a2a-message.parseCommand (CC=57)'\n description: 'code2llm reports `src.interfaces.a2a-message.parseCommand` at `src/interfaces/a2a-message.ts:41`\n with cyclomatic complexity 57 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/interfaces/a2a-message.ts\n dedupe_key: code2llm:cc:src/interfaces/a2a-message.ts:src.interfaces.a2a-message.parseCommand\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.llm.openrouter.OpenRouterClient.request\n (CC=31)'\n description: 'code2llm reports `src.llm.openrouter.OpenRouterClient.request` at\n `src/llm/openrouter.ts:171` with cyclomatic complexity 31 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/llm/openrouter.ts\n dedupe_key: code2llm:cc:src/llm/openrouter.ts:src.llm.openrouter.OpenRouterClient.request\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.llm.openrouter.OpenRouterClient.timeout\n (CC=26)'\n description: 'code2llm reports `src.llm.openrouter.OpenRouterClient.timeout` at\n `src/llm/openrouter.ts:179` with cyclomatic complexity 26 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/llm/openrouter.ts\n dedupe_key: code2llm:cc:src/llm/openrouter.ts:src.llm.openrouter.OpenRouterClient.timeout\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.assertOperationPlan\n (CC=84)'\n description: 'code2llm reports `src.operations.validation.assertOperationPlan` at\n `src/operations/validation.ts:153` with cyclomatic complexity 84 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertOperationPlan\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.founderDecisionRequired\n (CC=44)'\n description: 'code2llm reports `src.operations.validation.founderDecisionRequired`\n at `src/operations/validation.ts:184` with cyclomatic complexity 44 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.founderDecisionRequired\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.stepIds (CC=44)'\n description: 'code2llm reports `src.operations.validation.stepIds` at `src/operations/validation.ts:183`\n with cyclomatic complexity 44 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.stepIds\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.steps (CC=44)'\n description: 'code2llm reports `src.operations.validation.steps` at `src/operations/validation.ts:182`\n with cyclomatic complexity 44 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.steps\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.variableById (CC=44)'\n description: 'code2llm reports `src.operations.validation.variableById` at `src/operations/validation.ts:180`\n with cyclomatic complexity 44 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.variableById\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.variables (CC=44)'\n description: 'code2llm reports `src.operations.validation.variables` at `src/operations/validation.ts:177`\n with cyclomatic complexity 44 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.variables\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.pipeline.run.runPipeline (CC=53)'\n description: 'code2llm reports `src.pipeline.run.runPipeline` at `src/pipeline/run.ts:55`\n with cyclomatic complexity 53 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/pipeline/run.ts\n dedupe_key: code2llm:cc:src/pipeline/run.ts:src.pipeline.run.runPipeline\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates\n (CC=25)'\n description: 'code2llm reports `src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates`\n at `src/semantic/reranker-llm.ts:38` with cyclomatic complexity 25 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/semantic/reranker-llm.ts\n dedupe_key: code2llm:cc:src/semantic/reranker-llm.ts:src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.semantic.reranker.assertSemanticCandidateSet\n (CC=27)'\n description: 'code2llm reports `src.semantic.reranker.assertSemanticCandidateSet`\n at `src/semantic/reranker.ts:184` with cyclomatic complexity 27 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/semantic/reranker.ts\n dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.assertSemanticCandidateSet\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.services.actions.executeAction (CC=83)'\n description: 'code2llm reports `src.services.actions.executeAction` at `src/services/actions.ts:72`\n with cyclomatic complexity 83 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/services/actions.ts\n dedupe_key: code2llm:cc:src/services/actions.ts:src.services.actions.executeAction\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.services.actions.root (CC=83)'\n description: 'code2llm reports `src.services.actions.root` at `src/services/actions.ts:73`\n with cyclomatic complexity 83 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/services/actions.ts\n dedupe_key: code2llm:cc:src/services/actions.ts:src.services.actions.root\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.BINARY_EXTENSIONS\n (CC=38)'\n description: 'code2llm reports `src.synthesis.code-change-path.BINARY_EXTENSIONS`\n at `src/synthesis/code-change-path.ts:44` with cyclomatic complexity 38 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-path.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.BINARY_EXTENSIONS\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.EXTENSIONLESS_SOURCE_BASENAMES\n (CC=38)'\n description: 'code2llm reports `src.synthesis.code-change-path.EXTENSIONLESS_SOURCE_BASENAMES`\n at `src/synthesis/code-change-path.ts:127` with cyclomatic complexity 38 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-path.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.EXTENSIONLESS_SOURCE_BASENAMES\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.GENERATED_ANALYSIS_BASENAMES\n (CC=38)'\n description: 'code2llm reports `src.synthesis.code-change-path.GENERATED_ANALYSIS_BASENAMES`\n at `src/synthesis/code-change-path.ts:79` with cyclomatic complexity 38 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-path.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.GENERATED_ANALYSIS_BASENAMES\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.NON_SOURCE_DIR_SEGMENTS\n (CC=38)'\n description: 'code2llm reports `src.synthesis.code-change-path.NON_SOURCE_DIR_SEGMENTS`\n at `src/synthesis/code-change-path.ts:15` with cyclomatic complexity 38 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-path.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.NON_SOURCE_DIR_SEGMENTS\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.T2C_ARTIFACT_BASENAMES\n (CC=38)'\n description: 'code2llm reports `src.synthesis.code-change-path.T2C_ARTIFACT_BASENAMES`\n at `src/synthesis/code-change-path.ts:110` with cyclomatic complexity 38 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-path.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.T2C_ARTIFACT_BASENAMES\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.isPlannablePath\n (CC=38)'\n description: 'code2llm reports `src.synthesis.code-change-path.isPlannablePath`\n at `src/synthesis/code-change-path.ts:138` with cyclomatic complexity 38 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-path.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.isPlannablePath\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.applyCodeChangeSourcePatch\n (CC=41)'\n description: 'code2llm reports `src.synthesis.code-change-plan.applyCodeChangeSourcePatch`\n at `src/synthesis/code-change-plan.ts:1031` with cyclomatic complexity 41 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.applyCodeChangeSourcePatch\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.applyUnifiedDiffToText\n (CC=47)'\n description: 'code2llm reports `src.synthesis.code-change-plan.applyUnifiedDiffToText`\n at `src/synthesis/code-change-plan.ts:1222` with cyclomatic complexity 47 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.applyUnifiedDiffToText\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.assertCodeChangeSourcePatch\n (CC=47)'\n description: 'code2llm reports `src.synthesis.code-change-plan.assertCodeChangeSourcePatch`\n at `src/synthesis/code-change-plan.ts:790` with cyclomatic complexity 47 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.assertCodeChangeSourcePatch\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.cursor (CC=25)'\n description: 'code2llm reports `src.synthesis.code-change-plan.cursor` at `src/synthesis/code-change-plan.ts:1256`\n with cyclomatic complexity 25 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.cursor\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.web.diff-ui.diffUiHtml (CC=52)'\n description: 'code2llm reports `src.web.diff-ui.diffUiHtml` at `src/web/diff-ui.ts:1`\n with cyclomatic complexity 52 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/web/diff-ui.ts\n dedupe_key: code2llm:cc:src/web/diff-ui.ts:src.web.diff-ui.diffUiHtml\n- signal: code2llm_god\n title: 'Split god module: src/communication/llm.ts'\n description: 'code2llm reports `src/communication/llm.ts` as a large module (514\n lines, 8 classes).\n\n\n Split it by responsibility, keep public imports stable, and add focused tests\n around the moved behavior.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - god-module\n - refactor\n files:\n - src/communication/llm.ts\n dedupe_key: code2llm:god:src/communication/llm.ts\n- signal: code2llm_god\n title: 'Split god module: src/core/schema.ts'\n description: 'code2llm reports `src/core/schema.ts` as a large module (922 lines,\n 4 classes).\n\n\n Split it by responsibility, keep public imports stable, and add focused tests\n around the moved behavior.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - god-module\n - refactor\n files:\n - src/core/schema.ts\n dedupe_key: code2llm:god:src/core/schema.ts\n- signal: code2llm_god\n title: 'Split god module: src/core/types.ts'\n description: 'code2llm reports `src/core/types.ts` as a large module (673 lines,\n 41 classes).\n\n\n Split it by responsibility, keep public imports stable, and add focused tests\n around the moved behavior.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - god-module\n - refactor\n files:\n - src/core/types.ts\n dedupe_key: code2llm:god:src/core/types.ts\n- signal: code2llm_god\n title: 'Split god module: src/semantic/reranker.ts'\n description: 'code2llm reports `src/semantic/reranker.ts` as a large module (509\n lines, 11 classes).\n\n\n Split it by responsibility, keep public imports stable, and add focused tests\n around the moved behavior.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - god-module\n - refactor\n files:\n - src/semantic/reranker.ts\n dedupe_key: code2llm:god:src/semantic/reranker.ts\n- signal: code2llm_god\n title: 'Split god module: src/synthesis/code-change-plan.ts'\n description: 'code2llm reports `src/synthesis/code-change-plan.ts` as a large module\n (1310 lines, 10 classes).\n\n\n Split it by responsibility, keep public imports stable, and add focused tests\n around the moved behavior.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - god-module\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:god:src/synthesis/code-change-plan.ts\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `sdk/python/examples/basic.py:22`.\n\n\n Function ''main'' is oversized: CC=11, fan-out=31, mutations=18.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - sdk/python/examples/basic.py\n dedupe_key: 'code2llm:smell:god_function:sdk/python/examples/basic.py:22:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `scripts/research/evaluate-embedding-pairs.py:26`.\n\n\n Function ''main'' is oversized: CC=9, fan-out=21, mutations=18.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/research/evaluate-embedding-pairs.py\n dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:26:God\n Function: main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Module: src.cli'\n description: 'code2llm reports `God Module: src.cli` in `src/cli.ts:1`.\n\n\n Module ''src.cli'' is too large (152 functions, 1 classes). Consider splitting\n into sub-modules.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:1:God Module: src.cli'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Module: src.core.schema'\n description: 'code2llm reports `God Module: src.core.schema` in `src/core/schema.ts:1`.\n\n\n Module ''src.core.schema'' is too large (151 functions, 4 classes). Consider splitting\n into sub-modules.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:1:God Module: src.core.schema'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Module: src.core.types'\n description: 'code2llm reports `God Module: src.core.types` in `src/core/types.ts:1`.\n\n\n Module ''src.core.types'' is too large (0 functions, 41 classes). Consider splitting\n into sub-modules.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/types.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/types.ts:1:God Module: src.core.types'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Module: src.synthesis.code-change-plan'\n description: 'code2llm reports `God Module: src.synthesis.code-change-plan` in `src/synthesis/code-change-plan.ts:1`.\n\n\n Module ''src.synthesis.code-change-plan'' is too large (148 functions, 10 classes).\n Consider splitting into sub-modules.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:1:God\n Module: src.synthesis.code-change-plan'\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: examples.backend.src.server.handleRequest\n (CC=16)'\n description: 'code2llm reports `examples.backend.src.server.handleRequest` at `examples/backend/src/server.ts:28`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - examples/backend/src/server.ts\n dedupe_key: code2llm:cc:examples/backend/src/server.ts:examples.backend.src.server.handleRequest\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: python.ast_extract.iter_python_files (CC=16)'\n description: 'code2llm reports `python.ast_extract.iter_python_files` at `python/ast_extract.py:168`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - python/ast_extract.py\n dedupe_key: code2llm:cc:python/ast_extract.py:python.ast_extract.iter_python_files\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visit (CC=15)'\n description: 'code2llm reports `scripts.verify-no-llm-imports.visit` at `scripts/verify-no-llm-imports.mjs:27`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/verify-no-llm-imports.mjs\n dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visit\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visited (CC=15)'\n description: 'code2llm reports `scripts.verify-no-llm-imports.visited` at `scripts/verify-no-llm-imports.mjs:22`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/verify-no-llm-imports.mjs\n dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visited\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.rust.examples.basic.run (CC=20)'\n description: 'code2llm reports `sdk.rust.examples.basic.run` at `sdk/rust/examples/basic.rs:27`\n with cyclomatic complexity 20 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/rust/examples/basic.rs\n dedupe_key: code2llm:cc:sdk/rust/examples/basic.rs:sdk.rust.examples.basic.run\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.rust.src.client.parse_http_response (CC=18)'\n description: 'code2llm reports `sdk.rust.src.client.parse_http_response` at `sdk/rust/src/client.rs:152`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/rust/src/client.rs\n dedupe_key: code2llm:cc:sdk/rust/src/client.rs:sdk.rust.src.client.parse_http_response\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.baseUrl (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.baseUrl` at `sdk/typescript/examples/basic.ts:13`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.baseUrl\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.main (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.main` at `sdk/typescript/examples/basic.ts:17`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.main\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.root (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.root` at `sdk/typescript/examples/basic.ts:15`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.root\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.token (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.token` at `sdk/typescript/examples/basic.ts:14`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.token\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.cli.handleDiff (CC=24)'\n description: 'code2llm reports `src.cli.handleDiff` at `src/cli.ts:428` with cyclomatic\n complexity 24 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/cli.ts\n dedupe_key: code2llm:cc:src/cli.ts:src.cli.handleDiff\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.cli.handleExtract (CC=16)'\n description: 'code2llm reports `src.cli.handleExtract` at `src/cli.ts:518` with\n cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/cli.ts\n dedupe_key: code2llm:cc:src/cli.ts:src.cli.handleExtract\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.io.walkFiles (CC=15)'\n description: 'code2llm reports `src.core.io.walkFiles` at `src/core/io.ts:87` with\n cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/io.ts\n dedupe_key: code2llm:cc:src/core/io.ts:src.core.io.walkFiles\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.record.buildRecord (CC=18)'\n description: 'code2llm reports `src.core.record.buildRecord` at `src/core/record.ts:57`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/record.ts\n dedupe_key: code2llm:cc:src/core/record.ts:src.core.record.buildRecord\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.record.generationMetadata (CC=15)'\n description: 'code2llm reports `src.core.record.generationMetadata` at `src/core/record.ts:125`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/record.ts\n dedupe_key: code2llm:cc:src/core/record.ts:src.core.record.generationMetadata\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.schema.assertGroundedGenerationMetadata\n (CC=23)'\n description: 'code2llm reports `src.core.schema.assertGroundedGenerationMetadata`\n at `src/core/schema.ts:533` with cyclomatic complexity 23 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/schema.ts\n dedupe_key: code2llm:cc:src/core/schema.ts:src.core.schema.assertGroundedGenerationMetadata\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.schema.assertIntentRecord (CC=23)'\n description: 'code2llm reports `src.core.schema.assertIntentRecord` at `src/core/schema.ts:74`\n with cyclomatic complexity 23 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/schema.ts\n dedupe_key: code2llm:cc:src/core/schema.ts:src.core.schema.assertIntentRecord\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.text.STOP_WORDS (CC=17)'\n description: 'code2llm reports `src.core.text.STOP_WORDS` at `src/core/text.ts:30`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/text.ts\n dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.STOP_WORDS\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.text.classifyActionHeuristically\n (CC=17)'\n description: 'code2llm reports `src.core.text.classifyActionHeuristically` at `src/core/text.ts:40`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/text.ts\n dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.classifyActionHeuristically\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.git.BINARY_EXTENSIONS (CC=22)'\n description: 'code2llm reports `src.diff.git.BINARY_EXTENSIONS` at `src/diff/git.ts:41`\n with cyclomatic complexity 22 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/git.ts\n dedupe_key: code2llm:cc:src/diff/git.ts:src.diff.git.BINARY_EXTENSIONS\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.git.collectGitDiff (CC=22)'\n description: 'code2llm reports `src.diff.git.collectGitDiff` at `src/diff/git.ts:46`\n with cyclomatic complexity 22 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/git.ts\n dedupe_key: code2llm:cc:src/diff/git.ts:src.diff.git.collectGitDiff\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.reality.renderRealitySvg (CC=15)'\n description: 'code2llm reports `src.diff.reality.renderRealitySvg` at `src/diff/reality.ts:493`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/reality.ts\n dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.renderRealitySvg\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.reality.resolveStatus (CC=15)'\n description: 'code2llm reports `src.diff.reality.resolveStatus` at `src/diff/reality.ts:439`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/reality.ts\n dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.resolveStatus\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.backtrack (CC=18)'\n description: 'code2llm reports `src.diff.text.backtrack` at `src/diff/text.ts:172`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.backtrack\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.m (CC=15)'\n description: 'code2llm reports `src.diff.text.m` at `src/diff/text.ts:142` with\n cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.m\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.max (CC=15)'\n description: 'code2llm reports `src.diff.text.max` at `src/diff/text.ts:145` with\n cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.max\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.myers (CC=19)'\n description: 'code2llm reports `src.diff.text.myers` at `src/diff/text.ts:140` with\n cyclomatic complexity 19 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.myers\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.n (CC=15)'\n description: 'code2llm reports `src.diff.text.n` at `src/diff/text.ts:141` with\n cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.n\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.offset (CC=15)'\n description: 'code2llm reports `src.diff.text.offset` at `src/diff/text.ts:146`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.offset\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.x (CC=15)'\n description: 'code2llm reports `src.diff.text.x` at `src/diff/text.ts:180` with\n cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.x\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.text.y (CC=15)'\n description: 'code2llm reports `src.diff.text.y` at `src/diff/text.ts:181` with\n cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/text.ts\n dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.y\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.buildFixtureRecords\n (CC=18)'\n description: 'code2llm reports `src.evaluation.gold-cases.buildFixtureRecords` at\n `src/evaluation/gold-cases.ts:315` with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.buildFixtureRecords\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.evaluateRerankingCase\n (CC=17)'\n description: 'code2llm reports `src.evaluation.gold-cases.evaluateRerankingCase`\n at `src/evaluation/gold-cases.ts:71` with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.evaluateRerankingCase\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.labels (CC=18)'\n description: 'code2llm reports `src.evaluation.gold-cases.labels` at `src/evaluation/gold-cases.ts:319`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.labels\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.record (CC=17)'\n description: 'code2llm reports `src.evaluation.gold-cases.record` at `src/evaluation/gold-cases.ts:321`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.record\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.records (CC=18)'\n description: 'code2llm reports `src.evaluation.gold-cases.records` at `src/evaluation/gold-cases.ts:320`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.records\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.labels (CC=18)'\n description: 'code2llm reports `src.evaluation.gold-types.labels` at `src/evaluation/gold-types.ts:358`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-types.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.labels\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.modules (CC=18)'\n description: 'code2llm reports `src.evaluation.gold-types.modules` at `src/evaluation/gold-types.ts:359`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-types.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.modules\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.communication.inferIdentity\n (CC=15)'\n description: 'code2llm reports `src.extractors.communication.inferIdentity` at `src/extractors/communication.ts:244`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/communication.ts\n dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.inferIdentity\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.docs-deterministic.convertDocument\n (CC=18)'\n description: 'code2llm reports `src.extractors.docs-deterministic.convertDocument`\n at `src/extractors/docs-deterministic.ts:100` with cyclomatic complexity 18 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/docs-deterministic.ts\n dedupe_key: code2llm:cc:src/extractors/docs-deterministic.ts:src.extractors.docs-deterministic.convertDocument\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.docs-deterministic.lines (CC=17)'\n description: 'code2llm reports `src.extractors.docs-deterministic.lines` at `src/extractors/docs-deterministic.ts:102`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/docs-deterministic.ts\n dedupe_key: code2llm:cc:src/extractors/docs-deterministic.ts:src.extractors.docs-deterministic.lines\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.docs-deterministic.relative\n (CC=17)'\n description: 'code2llm reports `src.extractors.docs-deterministic.relative` at `src/extractors/docs-deterministic.ts:101`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/docs-deterministic.ts\n dedupe_key: code2llm:cc:src/extractors/docs-deterministic.ts:src.extractors.docs-deterministic.relative\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited\n (CC=19)'\n description: 'code2llm reports `src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited`\n at `src/extractors/markdown-llm.ts:55` with cyclomatic complexity 19 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/markdown-llm.ts\n dedupe_key: code2llm:cc:src/extractors/markdown-llm.ts:src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.base (CC=16)'\n description: 'code2llm reports `src.extractors.markdown-paths.base` at `src/extractors/markdown-paths.ts:86`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.base\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.buildBasenameIndex\n (CC=17)'\n description: 'code2llm reports `src.extractors.markdown-paths.buildBasenameIndex`\n at `src/extractors/markdown-paths.ts:84` with cyclomatic complexity 17 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.buildBasenameIndex\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.index (CC=16)'\n description: 'code2llm reports `src.extractors.markdown-paths.index` at `src/extractors/markdown-paths.ts:85`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.index\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.seen (CC=16)'\n description: 'code2llm reports `src.extractors.markdown-paths.seen` at `src/extractors/markdown-paths.ts:88`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.seen\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.extractors.nl-llm.NlAttemptError.toIntentRecord\n (CC=18)'\n description: 'code2llm reports `src.extractors.nl-llm.NlAttemptError.toIntentRecord`\n at `src/extractors/nl-llm.ts:175` with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/extractors/nl-llm.ts\n dedupe_key: code2llm:cc:src/extractors/nl-llm.ts:src.extractors.nl-llm.NlAttemptError.toIntentRecord\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.linker.scorePair (CC=18)'\n description: 'code2llm reports `src.graph.linker.scorePair` at `src/graph/linker.ts:342`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/linker.ts\n dedupe_key: code2llm:cc:src/graph/linker.ts:src.graph.linker.scorePair\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.graph.symbol-resolution.buildSymbolResolutionIndex\n (CC=15)'\n description: 'code2llm reports `src.graph.symbol-resolution.buildSymbolResolutionIndex`\n at `src/graph/symbol-resolution.ts:22` with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/graph/symbol-resolution.ts\n dedupe_key: code2llm:cc:src/graph/symbol-resolution.ts:src.graph.symbol-resolution.buildSymbolResolutionIndex\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.interfaces.a2a-history.runListItem (CC=18)'\n description: 'code2llm reports `src.interfaces.a2a-history.runListItem` at `src/interfaces/a2a-history.ts:107`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/interfaces/a2a-history.ts\n dedupe_key: code2llm:cc:src/interfaces/a2a-history.ts:src.interfaces.a2a-history.runListItem\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.assertGeneration\n (CC=16)'\n description: 'code2llm reports `src.operations.validation.assertGeneration` at `src/operations/validation.ts:110`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertGeneration\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.assertVariableContract\n (CC=20)'\n description: 'code2llm reports `src.operations.validation.assertVariableContract`\n at `src/operations/validation.ts:62` with cyclomatic complexity 20 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertVariableContract\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.pipeline.run.persistFailedRun (CC=19)'\n description: 'code2llm reports `src.pipeline.run.persistFailedRun` at `src/pipeline/run.ts:497`\n with cyclomatic complexity 19 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/pipeline/run.ts\n dedupe_key: code2llm:cc:src/pipeline/run.ts:src.pipeline.run.persistFailedRun\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.semantic.reranker.acceptedDeclarations\n (CC=16)'\n description: 'code2llm reports `src.semantic.reranker.acceptedDeclarations` at `src/semantic/reranker.ts:328`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/semantic/reranker.ts\n dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.acceptedDeclarations\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.semantic.reranker.assertSemanticRerankResult\n (CC=21)'\n description: 'code2llm reports `src.semantic.reranker.assertSemanticRerankResult`\n at `src/semantic/reranker.ts:311` with cyclomatic complexity 21 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/semantic/reranker.ts\n dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.assertSemanticRerankResult\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.semantic.reranker.records (CC=16)'\n description: 'code2llm reports `src.semantic.reranker.records` at `src/semantic/reranker.ts:326`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/semantic/reranker.ts\n dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.records\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.semantic.reranker.seenDecisions (CC=16)'\n description: 'code2llm reports `src.semantic.reranker.seenDecisions` at `src/semantic/reranker.ts:327`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/semantic/reranker.ts\n dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.seenDecisions\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.services.actions.filterCommunicationGraph\n (CC=17)'\n description: 'code2llm reports `src.services.actions.filterCommunicationGraph` at\n `src/services/actions.ts:511` with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/services/actions.ts\n dedupe_key: code2llm:cc:src/services/actions.ts:src.services.actions.filterCommunicationGraph\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.assertCodeChangeReviewPatch\n (CC=23)'\n description: 'code2llm reports `src.synthesis.code-change-plan.assertCodeChangeReviewPatch`\n at `src/synthesis/code-change-plan.ts:626` with cyclomatic complexity 23 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.assertCodeChangeReviewPatch\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet\n (CC=18)'\n description: 'code2llm reports `src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet`\n at `src/synthesis/code-change-plan.ts:896` with cyclomatic complexity 18 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.normalizeUnifiedDiff\n (CC=17)'\n description: 'code2llm reports `src.synthesis.code-change-plan.normalizeUnifiedDiff`\n at `src/synthesis/code-change-plan.ts:983` with cyclomatic complexity 17 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.normalizeUnifiedDiff\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.paths (CC=16)'\n description: 'code2llm reports `src.synthesis.code-change-plan.paths` at `src/synthesis/code-change-plan.ts:830`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.paths\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.proposeCodeChangePlans\n (CC=17)'\n description: 'code2llm reports `src.synthesis.code-change-plan.proposeCodeChangePlans`\n at `src/synthesis/code-change-plan.ts:109` with cyclomatic complexity 17 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.proposeCodeChangePlans\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.tf.classifier.classifyAction (CC=17)'\n description: 'code2llm reports `src.tf.classifier.classifyAction` at `src/tf/classifier.ts:69`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/tf/classifier.ts\n dedupe_key: code2llm:cc:src/tf/classifier.ts:src.tf.classifier.classifyAction\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n (CC=19)'\n description: 'code2llm reports `src.watch.watcher.DEFAULT_MIN_INTERVAL_MS` at `src/watch/watcher.ts:144`\n with cyclomatic complexity 19 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/watch/watcher.ts\n dedupe_key: code2llm:cc:src/watch/watcher.ts:src.watch.watcher.DEFAULT_MIN_INTERVAL_MS\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n (CC=19)'\n description: 'code2llm reports `src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS` at `src/watch/watcher.ts:145`\n with cyclomatic complexity 19 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/watch/watcher.ts\n dedupe_key: code2llm:cc:src/watch/watcher.ts:src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.watch.watcher.watchRepository (CC=19)'\n description: 'code2llm reports `src.watch.watcher.watchRepository` at `src/watch/watcher.ts:147`\n with cyclomatic complexity 19 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/watch/watcher.ts\n dedupe_key: code2llm:cc:src/watch/watcher.ts:src.watch.watcher.watchRepository\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.web.diff-ui.compareGraphs (CC=15)'\n description: 'code2llm reports `src.web.diff-ui.compareGraphs` at `src/web/diff-ui.ts:45`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/web/diff-ui.ts\n dedupe_key: code2llm:cc:src/web/diff-ui.ts:src.web.diff-ui.compareGraphs\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: root, markdown_mode, changelog, self, todo'\n description: 'code2llm reports `Data Clump: root, markdown_mode, changelog, self,\n todo` in `sdk/python/todo2code/client.py:332`.\n\n\n Arguments (root, markdown_mode, changelog, self, todo) are used together in multiple\n functions: sdk.python.todo2code.client.T2CClient.extract_markdown, sdk.python.todo2code.client.T2CClient.extract_markdown_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:332:Data Clump:\n root, markdown_mode, changelog, self, todo'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: root, markdown_mode, changelog, self, todo'\n description: 'code2llm reports `Data Clump: root, markdown_mode, changelog, self,\n todo` in `sdk/python/todo2code/client.py:341`.\n\n\n Arguments (root, markdown_mode, changelog, self, todo) are used together in multiple\n functions: sdk.python.todo2code.client.T2CClient.extract_markdown, sdk.python.todo2code.client.T2CClient.extract_markdown_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:341:Data Clump:\n root, markdown_mode, changelog, self, todo'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, action, payload'\n description: 'code2llm reports `Data Clump: self, action, payload` in `sdk/python/todo2code/client.py:249`.\n\n\n Arguments (self, action, payload) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send,\n sdk.python.todo2code.client.T2CClient.call.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:249:Data Clump:\n self, action, payload'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, action, payload'\n description: 'code2llm reports `Data Clump: self, action, payload` in `sdk/python/todo2code/client.py:261`.\n\n\n Arguments (self, action, payload) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send,\n sdk.python.todo2code.client.T2CClient.call.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:261:Data Clump:\n self, action, payload'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, root, excludes, patterns'\n description: 'code2llm reports `Data Clump: self, root, excludes, patterns` in `sdk/python/todo2code/client.py:354`.\n\n\n Arguments (self, root, excludes, patterns) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_docs, sdk.python.todo2code.client.T2CClient.extract_docs_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:354:Data Clump:\n self, root, excludes, patterns'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, root, excludes, patterns'\n description: 'code2llm reports `Data Clump: self, root, excludes, patterns` in `sdk/python/todo2code/client.py:362`.\n\n\n Arguments (self, root, excludes, patterns) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_docs, sdk.python.todo2code.client.T2CClient.extract_docs_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:362:Data Clump:\n self, root, excludes, patterns'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, root, nl_mode, file'\n description: 'code2llm reports `Data Clump: self, root, nl_mode, file` in `sdk/python/todo2code/client.py:307`.\n\n\n Arguments (self, root, nl_mode, file) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:307:Data Clump:\n self, root, nl_mode, file'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, root, nl_mode, file'\n description: 'code2llm reports `Data Clump: self, root, nl_mode, file` in `sdk/python/todo2code/client.py:312`.\n\n\n Arguments (self, root, nl_mode, file) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:312:Data Clump:\n self, root, nl_mode, file'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: MAX_INDEXED_FILES'\n description: 'code2llm reports `God Function: MAX_INDEXED_FILES` in `src/extractors/markdown-paths.ts:31`.\n\n\n Function ''MAX_INDEXED_FILES'' is oversized: CC=12, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:31:God\n Function: MAX_INDEXED_FILES'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: OBJECT_PLACEHOLDERS'\n description: 'code2llm reports `God Function: OBJECT_PLACEHOLDERS` in `src/extractors/docs-record.ts:21`.\n\n\n Function ''OBJECT_PLACEHOLDERS'' is oversized: CC=14, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/docs-record.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/docs-record.ts:21:God Function:\n OBJECT_PLACEHOLDERS'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: PATH_ROOTS'\n description: 'code2llm reports `God Function: PATH_ROOTS` in `src/core/text.ts:343`.\n\n\n Function ''PATH_ROOTS'' is oversized: CC=13, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/text.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:343:God Function: PATH_ROOTS'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: PATH_SEARCH_EXCLUDES'\n description: 'code2llm reports `God Function: PATH_SEARCH_EXCLUDES` in `src/extractors/markdown-paths.ts:25`.\n\n\n Function ''PATH_SEARCH_EXCLUDES'' is oversized: CC=12, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:25:God\n Function: PATH_SEARCH_EXCLUDES'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: RPC'\n description: 'code2llm reports `God Function: RPC` in `sdk/go/client.go:70`.\n\n\n Function ''RPC'' is oversized: CC=8, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - sdk/go/client.go\n dedupe_key: 'code2llm:smell:god_function:sdk/go/client.go:70:God Function: RPC'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: absolute'\n description: 'code2llm reports `God Function: absolute` in `src/extractors/nl.ts:40`.\n\n\n Function ''absolute'' is oversized: CC=2, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/nl.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:40:God Function: absolute'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: absoluteRoot'\n description: 'code2llm reports `God Function: absoluteRoot` in `src/watch/watcher.ts:40`.\n\n\n Function ''absoluteRoot'' is oversized: CC=11, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/watch/watcher.ts\n dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:40:God Function: absoluteRoot'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: action'\n description: 'code2llm reports `God Function: action` in `src/extractors/todo.ts:50`.\n\n\n Function ''action'' is oversized: CC=2, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:50:God Function:\n action'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: add'\n description: 'code2llm reports `God Function: add` in `src/extractors/ast/typescript.ts:29`.\n\n\n Function ''add'' is oversized: CC=14, fan-out=7, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/ast/typescript.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/typescript.ts:29:God\n Function: add'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: addCommunicationIssuesToDiagnostics'\n description: 'code2llm reports `God Function: addCommunicationIssuesToDiagnostics`\n in `src/communication/analyzer.ts:251`.\n\n\n Function ''addCommunicationIssuesToDiagnostics'' is oversized: CC=7, fan-out=12,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/analyzer.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:251:God Function:\n addCommunicationIssuesToDiagnostics'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: applyAcceptedSemanticRelations'\n description: 'code2llm reports `God Function: applyAcceptedSemanticRelations` in\n `src/semantic/reranker.ts:372`.\n\n\n Function ''applyAcceptedSemanticRelations'' is oversized: CC=2, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/semantic/reranker.ts\n dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:372:God Function:\n applyAcceptedSemanticRelations'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: applyTodoPatch'\n description: 'code2llm reports `God Function: applyTodoPatch` in `src/synthesis/todo-patch.ts:160`.\n\n\n Function ''applyTodoPatch'' is oversized: CC=12, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:160:God Function:\n applyTodoPatch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertAcyclicProposalDependencies'\n description: 'code2llm reports `God Function: assertAcyclicProposalDependencies`\n in `src/core/schema.ts:853`.\n\n\n Function ''assertAcyclicProposalDependencies'' is oversized: CC=7, fan-out=11,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:853:God Function: assertAcyclicProposalDependencies'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertCodeChangeAcceptance'\n description: 'code2llm reports `God Function: assertCodeChangeAcceptance` in `src/core/schema.ts:408`.\n\n\n Function ''assertCodeChangeAcceptance'' is oversized: CC=11, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:408:God Function: assertCodeChangeAcceptance'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertConclusionValue'\n description: 'code2llm reports `God Function: assertConclusionValue` in `src/core/schema.ts:462`.\n\n\n Function ''assertConclusionValue'' is oversized: CC=5, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:462:God Function: assertConclusionValue'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertIntentGraph'\n description: 'code2llm reports `God Function: assertIntentGraph` in `src/core/schema.ts:194`.\n\n\n Function ''assertIntentGraph'' is oversized: CC=7, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:194:God Function: assertIntentGraph'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertIntentGraphDiff'\n description: 'code2llm reports `God Function: assertIntentGraphDiff` in `src/core/schema.ts:223`.\n\n\n Function ''assertIntentGraphDiff'' is oversized: CC=7, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:223:God Function: assertIntentGraphDiff'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertSourceApplyReceipt'\n description: 'code2llm reports `God Function: assertSourceApplyReceipt` in `src/synthesis/code-change-plan.ts:1180`.\n\n\n Function ''assertSourceApplyReceipt'' is oversized: CC=11, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/code-change-plan.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:1180:God\n Function: assertSourceApplyReceipt'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertTodoPatchArtifact'\n description: 'code2llm reports `God Function: assertTodoPatchArtifact` in `src/synthesis/todo-patch.ts:221`.\n\n\n Function ''assertTodoPatchArtifact'' is oversized: CC=11, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:221:God Function:\n assertTodoPatchArtifact'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertTodoProposalValue'\n description: 'code2llm reports `God Function: assertTodoProposalValue` in `src/core/schema.ts:489`.\n\n\n Function ''assertTodoProposalValue'' is oversized: CC=9, fan-out=17, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:489:God Function: assertTodoProposalValue'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: atomicWrite'\n description: 'code2llm reports `God Function: atomicWrite` in `src/synthesis/todo-patch.ts:274`.\n\n\n Function ''atomicWrite'' is oversized: CC=5, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:274:God Function:\n atomicWrite'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: base'\n description: 'code2llm reports `God Function: base` in `src/core/io.ts:92`.\n\n\n Function ''base'' is oversized: CC=11, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local t\n\n... [truncated - file too large]", "is_subdir": false}, {"name": "project.toon.yaml", "rel_path": "project.toon.yaml", "path": "project.toon.yaml", "size": "2.3KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# todo2code | 3285 func | 152f | 45160L | typescript | 2026-08-01\n# generated in 0.00s\n\nHEALTH:\n CCΜ„=4.0 critical=276 (limit:10) dup=28 cycles=0\n\nALERTS[20]:\n !!! cc_exceeded main = 95 (limit:15)\n !!! cc_exceeded assertOperationPlan = 84 (limit:15)\n !!! cc_exceeded executeAction = 83 (limit:15)\n !!! cc_exceeded root = 83 (limit:15)\n !!! cc_exceeded extractCommunicationIntent = 76 (limit:15)\n !!! cc_exceeded identityRegistry = 72 (limit:15)\n !!! cc_exceeded communicationFiles = 72 (limit:15)\n !!! high_fan_out executeAction = 65 (limit:10)\n !!! high_fan_out root = 64 (limit:10)\n !!! cc_exceeded parseCommand = 57 (limit:15)\n\nMODULES[262] (top by size):\n M[evaluation/gold/v2/dataset.json] 2410L C:0 F:0 CC↑0 D:0 (json)\n M[src/synthesis/code-change-plan.ts] 1310L C:10 F:127 CC↑47 D:6 (typescript)\n M[src/core/schema.ts] 922L C:4 F:124 CC↑23 D:0 (typescript)\n M[docs/SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md] 872L C:0 F:0 CC↑0 D:0 (md)\n M[docs/reference/original-monitoring-design.md] 872L C:0 F:0 CC↑0 D:0 (md)\n M[README.md] 871L C:0 F:0 CC↑0 D:0 (md)\n M[src/cli.ts] 827L C:1 F:83 CC↑95 D:0 (typescript)\n M[evaluation/gold/v1/dataset.json] 761L C:0 F:0 CC↑0 D:0 (json)\n M[src/services/actions.ts] 700L C:0 F:74 CC↑83 D:0 (typescript)\n M[src/core/types.ts] 673L C:41 F:0 CC↑0 D:0 (typescript)\n M[CHANGELOG.md] 670L C:0 F:0 CC↑0 D:0 (md)\n M[src/diff/reality.ts] 609L C:3 F:73 CC↑26 D:0 (typescript)\n M[src/pipeline/run.ts] 602L C:1 F:64 CC↑53 D:0 (typescript)\n M[docs/TEST_REPORT.md] 587L C:0 F:0 CC↑0 D:0 (md)\n M[schemas/gold-dataset.schema.json] 585L C:0 F:0 CC↑0 D:0 (json)\n LANGS: typescript:117/md:52/json:32/javascript:15/python:15/rust:7/go:6/shell:6/php:4/other:2/yml:2/toml:2/java:1/txt:1\n\nHOTSPOTS[10]:\n β˜… executeAction fan=65 // Orchestrates 65 calls\n β˜… root fan=64 // Orchestrates 64 calls\n β˜… runPipeline fan=54 // Orchestrates 54 calls\n β˜… main fan=44 // Orchestrates 44 calls\n β˜… extractTypeScriptFile fan=44 // Orchestrates 44 calls\n\nREFACTOR[15]:\n [1] H/L Split main (CC=95)\n [2] H/L Split diffUiHtml (CC=52)\n [3] H/L Split assertCodeChangeSourcePatch (CC=47)\n [4] H/L Split applyCodeChangeSourcePatch (CC=41)\n [5] H/L Split applyUnifiedDiffToText (CC=47)\n\nEVOLUTION:\n 2026-08-01 CCΜ„=4.0 crit=276 45160L // Automated analysis\n", "is_subdir": false}, {"name": "validation.toon.yaml", "rel_path": "validation.toon.yaml", "path": "validation.toon.yaml", "size": "6.4KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# vallm batch | 474f | 227βœ“ 34⚠ 0βœ— | 2026-08-01\n\nSUMMARY:\n scanned: 474 passed: 227 (47.9%) warnings: 34 errors: 0 unsupported: 0\n\nWARNINGS[34]{path,score}:\n src/operations/validation.ts,0.80\n issues[4]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertVariableContract: CC=19 exceeds limit 15,62\n complexity.lizard_cc,warning,assertGeneration: CC=16 exceeds limit 15,110\n complexity.lizard_cc,warning,assertOperationPlan: CC=82 exceeds limit 15,153\n complexity.lizard_length,warning,assertOperationPlan: 129 lines exceeds limit 100,153\n scripts/research/rank-intent-graph-embeddings.py,0.90\n issues[3]{rule,severity,message,line}:\n complexity.cyclomatic,warning,main has cyclomatic complexity 27 (max: 15),35\n complexity.lizard_cc,warning,main: CC=27 exceeds limit 15,35\n complexity.lizard_length,warning,main: 133 lines exceeds limit 100,35\n src/core/ignore.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,translateGlob: CC=29 exceeds limit 15,77\n complexity.lizard_length,warning,translateGlob: 107 lines exceeds limit 100,77\n src/core/schema.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertIntentRecord: CC=23 exceeds limit 15,74\n complexity.lizard_cc,warning,assertGroundedGenerationMetadata: CC=22 exceeds limit 15,533\n src/diff/text.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,myers: CC=21 exceeds limit 15,140\n complexity.lizard_cc,warning,backtrack: CC=25 exceeds limit 15,172\n src/extractors/communication.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,extractCommunicationIntent: CC=78 exceeds limit 15,54\n complexity.lizard_length,warning,extractCommunicationIntent: 151 lines exceeds limit 100,54\n src/interfaces/a2a-task-store.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,listTasks: CC=41 exceeds limit 15,397\n complexity.lizard_length,warning,listTasks: 107 lines exceeds limit 100,397\n src/pipeline/run.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,runPipeline: CC=63 exceeds limit 15,55\n complexity.lizard_length,warning,runPipeline: 358 lines exceeds limit 100,55\n src/semantic/reranker.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertSemanticCandidateSet: CC=22 exceeds limit 15,184\n complexity.lizard_cc,warning,assertSemanticRerankResult: CC=18 exceeds limit 15,311\n src/services/actions.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,executeAction: CC=82 exceeds limit 15,72\n complexity.lizard_length,warning,executeAction: 434 lines exceeds limit 100,72\n examples/backend/src/server.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,handleRequest: CC=18 exceeds limit 15,28\n php/ast_extract.php,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,parseFile: CC=40 exceeds limit 15,77\n python/ast_extract.py,0.95\n issues[2]{rule,severity,message,line}:\n complexity.cyclomatic,warning,iter_python_files has cyclomatic complexity 16 (max: 15),168\n complexity.lizard_cc,warning,iter_python_files: CC=16 exceeds limit 15,168\n sdk/go/examples/basic/main.go,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,run: CC=19 exceeds limit 15,29\n sdk/php/src/Client.php,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,Client::call: CC=21 exceeds limit 15,106\n sdk/rust/examples/basic.rs,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,run: CC=20 exceeds limit 15,27\n src/cli.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,handleExtract: CC=20 exceeds limit 15,518\n src/communication/identity.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertParticipantIdentityRegistry: CC=29 exceeds limit 15,51\n src/comparison/workspace.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,commonPipelineOptions: CC=19 exceeds limit 15,192\n src/core/record.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,buildRecord: CC=33 exceeds limit 15,57\n src/core/text.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,inferObject: CC=31 exceeds limit 15,440\n src/evaluation/gold-types.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertLinkingCohorts: CC=25 exceeds limit 15,341\n src/extractors/ast/typescript.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,visit: CC=26 exceeds limit 15,77\n src/extractors/docs-record.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,toDocumentIntentRecord: CC=19 exceeds limit 15,25\n src/extractors/nl-llm.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,toIntentRecord: CC=24 exceeds limit 15,175\n src/graph/linker.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,scorePair: CC=18 exceeds limit 15,342\n src/interfaces/a2a-card.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_length,warning,skills: 103 lines exceeds limit 100,55\n src/interfaces/a2a-message.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_length,warning,parseKeyValues: 119 lines exceeds limit 100,67\n src/live/contract-check.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,measureStage: CC=17 exceeds limit 15,115\n src/llm/openrouter.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,request: CC=26 exceeds limit 15,171\n src/synthesis/code-change-path.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,isPlannablePath: CC=40 exceeds limit 15,138\n src/synthesis/code-change-plan.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,proposeCodeChangePlans: CC=22 exceeds limit 15,109\n src/tf/classifier.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,classifyAction: CC=18 exceeds limit 15,69\n src/watch/watcher.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,watchRepository: CC=21 exceeds limit 15,147\n\n", "is_subdir": false}, {"name": "baseline.json", "rel_path": "ticket-002/baseline.json", "path": "ticket-002 / baseline.json", "size": "7.4KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.external-benchmark/v1",\n "runtime": {\n "name": "todo2code",\n "version": "0.5.0",\n "commit": "5f5ae5938ab77dcce474ba7abbd23686072776ec"\n },\n "policy": {\n "checkout": "detached tracked-only worktree",\n "task": "tracked TASK.md when present; otherwise disabled",\n "todo": "tracked TODO.md when present; otherwise disabled",\n "changelog": "tracked CHANGELOG.md when present; otherwise disabled",\n "documents": [\n "README.md",\n "docs/**/*.md"\n ],\n "nlMode": "deterministic",\n "markdownMode": "deterministic",\n "communication": "disabled",\n "summaryLlm": false,\n "taskSynthesis": "disabled"\n },\n "repositories": [\n {\n "repository": "semcod/code2llm",\n "commit": "b297d600ae7d923ce22730bc90c6cd330ec7e243",\n "status": "succeeded",\n "runId": "20260731T065730Z-ca7a9a28",\n "elapsedSeconds": 18,\n "graphFingerprint": "2e57056bf75fc5ef5dead16dd990f56082a6e184f86ed4995f5607a48bd9e732",\n "records": 16899,\n "relations": 41747,\n "topics": 628,\n "alignedTopics": 107,\n "declaredRecords": 752,\n "observedRecords": 14017,\n "implementationCoveragePercent": 59.4,\n "plannedCodePercent": 43.7,\n "documentedCodePercent": 31.4,\n "warnings": 9,\n "diagnostics": {\n "total": 4700,\n "info": 912,\n "warning": 2377,\n "review_required": 1411,\n "blocking": 0,\n "byCode": {\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 1411,\n "UNLINKED_RECORD": 1332,\n "IMPLEMENTED_NOT_PLANNED": 1044,\n "IMPLEMENTED_NOT_DOCUMENTED": 912,\n "PLANNED_NOT_IMPLEMENTED": 1\n }\n }\n },\n {\n "repository": "semcod/domd",\n "commit": "b6c5ad24f2f2da386a2e3e5bad05433184f54c58",\n "status": "succeeded",\n "runId": "20260731T065753Z-a3fde5a3",\n "elapsedSeconds": 5,\n "graphFingerprint": "9df7e187f82b4ce8028c22938642bf2746ba0fe123ddc26386efa1a6916e6f68",\n "records": 10611,\n "relations": 7470,\n "topics": 241,\n "alignedTopics": 9,\n "declaredRecords": 588,\n "observedRecords": 9914,\n "implementationCoveragePercent": 11.8,\n "plannedCodePercent": 5.4,\n "documentedCodePercent": 5.4,\n "warnings": 0,\n "diagnostics": {\n "total": 2109,\n "info": 616,\n "warning": 1388,\n "review_required": 105,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 779,\n "IMPLEMENTED_NOT_DOCUMENTED": 616,\n "IMPLEMENTED_NOT_PLANNED": 609,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 105\n }\n }\n },\n {\n "repository": "semcod/pactfix",\n "commit": "daf301a9e23d65cd341ffa2d6c0a6cfe728e651d",\n "status": "succeeded",\n "runId": "20260731T065802Z-48dc0b12",\n "elapsedSeconds": 5,\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "records": 5161,\n "relations": 3917,\n "topics": 153,\n "alignedTopics": 2,\n "declaredRecords": 118,\n "observedRecords": 4992,\n "implementationCoveragePercent": 5.0,\n "plannedCodePercent": 1.8,\n "documentedCodePercent": 1.8,\n "warnings": 5,\n "diagnostics": {\n "total": 664,\n "info": 197,\n "warning": 419,\n "review_required": 48,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 217,\n "IMPLEMENTED_NOT_DOCUMENTED": 197,\n "IMPLEMENTED_NOT_PLANNED": 190,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 48,\n "PLANNED_NOT_IMPLEMENTED": 12\n }\n }\n },\n {\n "repository": "semcod/code2logic",\n "commit": "ba93489b56f51af31206671a1f55ab860bb725c2",\n "status": "succeeded",\n "runId": "20260731T065808Z-a52c2716",\n "elapsedSeconds": 12,\n "graphFingerprint": "722f90e806be667f271eb393b523f771cae18cc61912416c5f4d88c9125f01e7",\n "records": 21423,\n "relations": 16927,\n "topics": 359,\n "alignedTopics": 27,\n "declaredRecords": 864,\n "observedRecords": 20413,\n "implementationCoveragePercent": 17.7,\n "plannedCodePercent": 14.1,\n "documentedCodePercent": 14.1,\n "warnings": 3,\n "diagnostics": {\n "total": 4680,\n "info": 1474,\n "warning": 3081,\n "review_required": 121,\n "blocking": 4,\n "byCode": {\n "IMPLEMENTED_NOT_PLANNED": 1574,\n "UNLINKED_RECORD": 1504,\n "IMPLEMENTED_NOT_DOCUMENTED": 1474,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 121,\n "CONFLICTING_INTENT": 4,\n "PLANNED_NOT_IMPLEMENTED": 3\n }\n }\n },\n {\n "repository": "semcod/code2docs",\n "commit": "c738aff7bd51670104e144ae19b657fd3915565d",\n "status": "succeeded",\n "runId": "20260731T065827Z-9f042652",\n "elapsedSeconds": 9,\n "graphFingerprint": "4598fbe9eec85d61f1290a4db5c672bc3923df29d7e9db80923671b7fb3fb36f",\n "records": 6717,\n "relations": 35447,\n "topics": 265,\n "alignedTopics": 57,\n "declaredRecords": 1487,\n "observedRecords": 4556,\n "implementationCoveragePercent": 47.1,\n "plannedCodePercent": 77.0,\n "documentedCodePercent": 47.3,\n "warnings": 0,\n "diagnostics": {\n "total": 1555,\n "info": 283,\n "warning": 876,\n "review_required": 396,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 463,\n "IMPLEMENTED_NOT_PLANNED": 413,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 396,\n "IMPLEMENTED_NOT_DOCUMENTED": 283\n }\n }\n },\n {\n "repository": "semcod/redup",\n "commit": "a175fb0a80b54fcda4bf5cd34c8b087fe9472608",\n "status": "succeeded",\n "runId": "20260731T065840Z-61c33c16",\n "elapsedSeconds": 6,\n "graphFingerprint": "ed0359f98ed4e18f103a3751543f3e08a4accecc1be730633446fc63f4db3087",\n "records": 7204,\n "relations": 19173,\n "topics": 277,\n "alignedTopics": 62,\n "declaredRecords": 563,\n "observedRecords": 5820,\n "implementationCoveragePercent": 49.2,\n "plannedCodePercent": 55.9,\n "documentedCodePercent": 10.8,\n "warnings": 0,\n "diagnostics": {\n "total": 2384,\n "info": 476,\n "warning": 1205,\n "review_required": 703,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 708,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 703,\n "IMPLEMENTED_NOT_PLANNED": 493,\n "IMPLEMENTED_NOT_DOCUMENTED": 476,\n "PLANNED_NOT_IMPLEMENTED": 4\n }\n }\n },\n {\n "repository": "subactor/platform",\n "commit": "3e96573d587cb664741849ceba205bf303b9f418",\n "status": "succeeded",\n "runId": "20260731T065848Z-3863e97d",\n "elapsedSeconds": 6,\n "graphFingerprint": "1c4166dd1b7b7789d06693a224b5d816963c4bdee5b026a5e1145861c60f786d",\n "records": 10628,\n "relations": 11002,\n "topics": 688,\n "alignedTopics": 25,\n "declaredRecords": 1177,\n "observedRecords": 9309,\n "implementationCoveragePercent": 5.9,\n "plannedCodePercent": 9.3,\n "documentedCodePercent": 8.9,\n "warnings": 1,\n "diagnostics": {\n "total": 1271,\n "info": 185,\n "warning": 993,\n "review_required": 93,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 780,\n "IMPLEMENTED_NOT_DOCUMENTED": 185,\n "IMPLEMENTED_NOT_PLANNED": 177,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 93,\n "PLANNED_NOT_IMPLEMENTED": 36\n }\n }\n }\n ]\n}\n", "is_subdir": true}, {"name": "benchmark.json", "rel_path": "ticket-004/benchmark.json", "path": "ticket-004 / benchmark.json", "size": "3.3KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.cross-language-benchmark/v1",\n "description": "Cross-language intent-to-module pairs outside the current hand-written Polish topic dictionary.",\n "pairs": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false\n }\n ]\n}\n", "is_subdir": true}, {"name": "e5-prefixed-results.json", "rel_path": "ticket-004/e5-prefixed-results.json", "path": "ticket-004 / e5-prefixed-results.json", "size": "3.8KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-experiment/v1",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "dimensions": 384,\n "pairCount": 12,\n "positiveCount": 6,\n "negativeCount": 6,\n "minimumPositive": 0.759374,\n "maximumNegative": 0.835202,\n "separation": -0.075828,\n "loadSeconds": 4.041,\n "totalSeconds": 4.228,\n "results": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true,\n "score": 0.759374\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false,\n "score": 0.752184\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true,\n "score": 0.837574\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false,\n "score": 0.8046\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true,\n "score": 0.86764\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false,\n "score": 0.824159\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true,\n "score": 0.830392\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false,\n "score": 0.815187\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true,\n "score": 0.779611\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false,\n "score": 0.768394\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true,\n "score": 0.847803\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false,\n "score": 0.835202\n }\n ]\n}\n", "is_subdir": true}, {"name": "e5-results.json", "rel_path": "ticket-004/e5-results.json", "path": "ticket-004 / e5-results.json", "size": "3.8KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-experiment/v1",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "dimensions": 384,\n "pairCount": 12,\n "positiveCount": 6,\n "negativeCount": 6,\n "minimumPositive": 0.774453,\n "maximumNegative": 0.847799,\n "separation": -0.07334600000000002,\n "loadSeconds": 53.587,\n "totalSeconds": 53.817,\n "results": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true,\n "score": 0.774453\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false,\n "score": 0.772987\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true,\n "score": 0.854882\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false,\n "score": 0.827473\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true,\n "score": 0.885202\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false,\n "score": 0.837666\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true,\n "score": 0.840172\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false,\n "score": 0.828043\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true,\n "score": 0.785471\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false,\n "score": 0.781325\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true,\n "score": 0.867364\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false,\n "score": 0.847799\n }\n ]\n}\n", "is_subdir": true}, {"name": "iteration-01.json", "rel_path": "ticket-004/iteration-01.json", "path": "ticket-004 / iteration-01.json", "size": "1.7KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.language-matching-iteration/v1",\n "iteration": 1,\n "decision": "reject-production-matcher-retain-benchmark",\n "synthetic": {\n "languages": [\n "pl",\n "de",\n "es",\n "fr"\n ],\n "positivePairs": 6,\n "negativePairs": 6,\n "models": {\n "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2@86741b4e3f5cb7765a600d3a3d55a0f6a6cb443d": {\n "minimumPositive": 0.673289,\n "maximumNegative": 0.732568,\n "separation": -0.059279,\n "pairwiseCorrect": 5\n },\n "intfloat/multilingual-e5-small@f470c6a1a906014160ece1968c484b275f0396de": {\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "minimumPositive": 0.759374,\n "maximumNegative": 0.835202,\n "separation": -0.075828,\n "pairwiseCorrect": 6,\n "minimumPairwiseMargin": 0.00719\n }\n }\n },\n "platform": {\n "commit": "3e96573d587cb664741849ceba205bf303b9f418",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "moduleAggregates": 133,\n "actionableTargetlessDeclarations": 66,\n "forwardThreshold": {\n "minimumScore": 0.75,\n "minimumMargin": 0.01,\n "selected": 6,\n "newCandidates": 2,\n "acceptedNewCandidates": 0\n },\n "reciprocalThreshold": {\n "minimumScore": 0.75,\n "minimumForwardMargin": 0.01,\n "minimumReverseMargin": 0.01,\n "selected": 1,\n "newCandidates": 0\n }\n },\n "goldV2": {\n "crossLanguageCases": 7,\n "expectedRelations": 6,\n "satisfiedRelations": 0,\n "forbiddenPairs": 6,\n "forbiddenViolations": 0,\n "gatedPrecision": 1,\n "gatedRecall": 1\n }\n}\n", "is_subdir": true}, {"name": "iteration-01.json", "rel_path": "ticket-003/iteration-01.json", "path": "ticket-003 / iteration-01.json", "size": "4.0KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.external-benchmark-iteration/v1",\n "iteration": 1,\n "target": "exact Update <file> changelog bookkeeping",\n "runtimeBaseCommit": "18cc21b",\n "invariants": {\n "graphFingerprintsUnchanged": true,\n "goldV2Precision": 1,\n "goldV2Recall": 1,\n "goldV2ForbiddenViolations": 0\n },\n "totals": {\n "beforeDiagnostics": 16280,\n "afterDiagnostics": 15545,\n "removedDiagnostics": 735,\n "beforeChangelogWithoutImplementation": 1853,\n "afterChangelogWithoutImplementation": 1306,\n "removedChangelogWithoutImplementation": 547,\n "beforeUnlinkedRecord": 5728,\n "afterUnlinkedRecord": 5540,\n "removedUnlinkedRecord": 188\n },\n "repositories": [\n {\n "repository": "semcod/code2llm",\n "beforeRunId": "20260731T072152Z-fb1ab530",\n "afterRunId": "20260731T072927Z-898d6edc",\n "graphFingerprint": "bd57f05a14c3abca5ebcbb95a6ad9b3fbb47ff40f656846c5b4857fd5ecde407",\n "beforeDiagnostics": 4224,\n "afterDiagnostics": 3826,\n "beforeChangelogWithoutImplementation": 955,\n "afterChangelogWithoutImplementation": 650,\n "beforeUnlinkedRecord": 1312,\n "afterUnlinkedRecord": 1219\n },\n {\n "repository": "semcod/domd",\n "beforeRunId": "20260731T072221Z-f577ffe7",\n "afterRunId": "20260731T072950Z-828d57a8",\n "graphFingerprint": "a9d2d5eb1287b7cb69ce7cdd3aa1a77078c6e7860e96be2a602a1c0858d6e0bd",\n "beforeDiagnostics": 2096,\n "afterDiagnostics": 2096,\n "beforeChangelogWithoutImplementation": 99,\n "afterChangelogWithoutImplementation": 99,\n "beforeUnlinkedRecord": 772,\n "afterUnlinkedRecord": 772\n },\n {\n "repository": "semcod/pactfix",\n "beforeRunId": "20260731T072226Z-0fb2f8b8",\n "afterRunId": "20260731T072955Z-557f34ae",\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "beforeDiagnostics": 664,\n "afterDiagnostics": 664,\n "beforeChangelogWithoutImplementation": 48,\n "afterChangelogWithoutImplementation": 48,\n "beforeUnlinkedRecord": 217,\n "afterUnlinkedRecord": 217\n },\n {\n "repository": "semcod/code2logic",\n "beforeRunId": "20260731T072209Z-30215e36",\n "afterRunId": "20260731T072939Z-9b5cf1f2",\n "graphFingerprint": "c6e9f7a0671dc9b4e0c0f3fad5c5dcf1319ba674ba55bbafcc22b0caa908e6af",\n "beforeDiagnostics": 4678,\n "afterDiagnostics": 4656,\n "beforeChangelogWithoutImplementation": 120,\n "afterChangelogWithoutImplementation": 109,\n "beforeUnlinkedRecord": 1503,\n "afterUnlinkedRecord": 1492\n },\n {\n "repository": "semcod/code2docs",\n "beforeRunId": "20260731T072143Z-a3208b84",\n "afterRunId": "20260731T072918Z-da0094d2",\n "graphFingerprint": "83dcfa7a5b21ca7714b9546bef4baead7ef197e936a0b61088bde2cb1c275643",\n "beforeDiagnostics": 1420,\n "afterDiagnostics": 1241,\n "beforeChangelogWithoutImplementation": 269,\n "afterChangelogWithoutImplementation": 127,\n "beforeUnlinkedRecord": 455,\n "afterUnlinkedRecord": 418\n },\n {\n "repository": "semcod/redup",\n "beforeRunId": "20260731T072230Z-6a2d832d",\n "afterRunId": "20260731T073000Z-92d5870f",\n "graphFingerprint": "b3a582ffa178ee307157461e348b51757f4e726eadd809cbfa3dc8e8b143442f",\n "beforeDiagnostics": 1945,\n "afterDiagnostics": 1818,\n "beforeChangelogWithoutImplementation": 269,\n "afterChangelogWithoutImplementation": 184,\n "beforeUnlinkedRecord": 703,\n "afterUnlinkedRecord": 661\n },\n {\n "repository": "subactor/platform",\n "beforeRunId": "20260731T072237Z-6cab0835",\n "afterRunId": "20260731T073006Z-1a2ec448",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "beforeDiagnostics": 1253,\n "afterDiagnostics": 1244,\n "beforeChangelogWithoutImplementation": 93,\n "afterChangelogWithoutImplementation": 89,\n "beforeUnlinkedRecord": 766,\n "afterUnlinkedRecord": 761\n }\n ]\n}\n", "is_subdir": true}, {"name": "iteration-01.json", "rel_path": "ticket-002/iteration-01.json", "path": "ticket-002 / iteration-01.json", "size": "4.1KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.external-benchmark-iteration/v1",\n "iteration": 1,\n "target": "non-actionable changelog mechanics",\n "changedFiles": [\n "src/graph/changelog-signal.ts",\n "src/graph/diagnostics.ts",\n "test/graph.test.ts"\n ],\n "invariants": {\n "graphFingerprintsUnchanged": true,\n "goldV2Precision": 1,\n "goldV2Recall": 1,\n "goldV2ForbiddenViolations": 0\n },\n "totals": {\n "beforeDiagnostics": 17363,\n "afterDiagnostics": 16300,\n "removedDiagnostics": 1063,\n "beforeChangelogWithoutImplementation": 2877,\n "afterChangelogWithoutImplementation": 1853,\n "removedChangelogWithoutImplementation": 1024,\n "beforeUnlinkedRecord": 5783,\n "afterUnlinkedRecord": 5744,\n "removedUnlinkedRecord": 39\n },\n "repositories": [\n {\n "repository": "semcod/code2llm",\n "runId": "20260731T070702Z-9c821450",\n "graphFingerprint": "2e57056bf75fc5ef5dead16dd990f56082a6e184f86ed4995f5607a48bd9e732",\n "beforeDiagnostics": 4700,\n "afterDiagnostics": 4225,\n "beforeReviewRequired": 1411,\n "afterReviewRequired": 955,\n "beforeChangelogWithoutImplementation": 1411,\n "afterChangelogWithoutImplementation": 955,\n "beforeUnlinkedRecord": 1332,\n "afterUnlinkedRecord": 1313\n },\n {\n "repository": "semcod/domd",\n "runId": "20260731T070725Z-26c1f092",\n "graphFingerprint": "9df7e187f82b4ce8028c22938642bf2746ba0fe123ddc26386efa1a6916e6f68",\n "beforeDiagnostics": 2109,\n "afterDiagnostics": 2097,\n "beforeReviewRequired": 105,\n "afterReviewRequired": 99,\n "beforeChangelogWithoutImplementation": 105,\n "afterChangelogWithoutImplementation": 99,\n "beforeUnlinkedRecord": 779,\n "afterUnlinkedRecord": 773\n },\n {\n "repository": "semcod/pactfix",\n "runId": "20260731T070731Z-ab868903",\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "beforeDiagnostics": 664,\n "afterDiagnostics": 664,\n "beforeReviewRequired": 48,\n "afterReviewRequired": 48,\n "beforeChangelogWithoutImplementation": 48,\n "afterChangelogWithoutImplementation": 48,\n "beforeUnlinkedRecord": 217,\n "afterUnlinkedRecord": 217\n },\n {\n "repository": "semcod/code2logic",\n "runId": "20260731T070714Z-9a108669",\n "graphFingerprint": "722f90e806be667f271eb393b523f771cae18cc61912416c5f4d88c9125f01e7",\n "beforeDiagnostics": 4680,\n "afterDiagnostics": 4678,\n "beforeReviewRequired": 121,\n "afterReviewRequired": 120,\n "beforeChangelogWithoutImplementation": 121,\n "afterChangelogWithoutImplementation": 120,\n "beforeUnlinkedRecord": 1504,\n "afterUnlinkedRecord": 1503\n },\n {\n "repository": "semcod/code2docs",\n "runId": "20260731T070652Z-c9867ada",\n "graphFingerprint": "4598fbe9eec85d61f1290a4db5c672bc3923df29d7e9db80923671b7fb3fb36f",\n "beforeDiagnostics": 1555,\n "afterDiagnostics": 1420,\n "beforeReviewRequired": 396,\n "afterReviewRequired": 269,\n "beforeChangelogWithoutImplementation": 396,\n "afterChangelogWithoutImplementation": 269,\n "beforeUnlinkedRecord": 463,\n "afterUnlinkedRecord": 455\n },\n {\n "repository": "semcod/redup",\n "runId": "20260731T070735Z-58dcf97a",\n "graphFingerprint": "ed0359f98ed4e18f103a3751543f3e08a4accecc1be730633446fc63f4db3087",\n "beforeDiagnostics": 2384,\n "afterDiagnostics": 1945,\n "beforeReviewRequired": 703,\n "afterReviewRequired": 269,\n "beforeChangelogWithoutImplementation": 703,\n "afterChangelogWithoutImplementation": 269,\n "beforeUnlinkedRecord": 708,\n "afterUnlinkedRecord": 703\n },\n {\n "repository": "subactor/platform",\n "runId": "20260731T070740Z-e130d916",\n "graphFingerprint": "1c4166dd1b7b7789d06693a224b5d816963c4bdee5b026a5e1145861c60f786d",\n "beforeDiagnostics": 1271,\n "afterDiagnostics": 1271,\n "beforeReviewRequired": 93,\n "afterReviewRequired": 93,\n "beforeChangelogWithoutImplementation": 93,\n "afterChangelogWithoutImplementation": 93,\n "beforeUnlinkedRecord": 780,\n "afterUnlinkedRecord": 780\n }\n ]\n}\n", "is_subdir": true}, {"name": "minilm-results.json", "rel_path": "ticket-004/minilm-results.json", "path": "ticket-004 / minilm-results.json", "size": "3.8KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-experiment/v1",\n "model": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",\n "revision": "86741b4e3f5cb7765a600d3a3d55a0f6a6cb443d",\n "dimensions": 384,\n "pairCount": 12,\n "positiveCount": 6,\n "negativeCount": 6,\n "minimumPositive": 0.673289,\n "maximumNegative": 0.732568,\n "separation": -0.05927899999999997,\n "loadSeconds": 76.031,\n "totalSeconds": 76.38,\n "results": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true,\n "score": 0.824391\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false,\n "score": 0.732568\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true,\n "score": 0.673289\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false,\n "score": 0.595357\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true,\n "score": 0.675315\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false,\n "score": 0.687232\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true,\n "score": 0.674234\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false,\n "score": 0.640753\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true,\n "score": 0.744144\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false,\n "score": 0.656533\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true,\n "score": 0.757345\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false,\n "score": 0.601622\n }\n ]\n}\n", "is_subdir": true}, {"name": "platform-e5-ranking.json", "rel_path": "ticket-004/platform-e5-ranking.json", "path": "ticket-004 / platform-e5-ranking.json", "size": "75.5KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-ranking-experiment/v1",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "graphSha256": "a83609ffc91d13278b1bd9936e915d50b9dc349373e73c61d0c0a90315d9084a",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "minimumScore": 0.75,\n "minimumMargin": 0.01,\n "moduleCount": 133,\n "declarationCount": 66,\n "selectedCount": 6,\n "newCandidateCount": 2,\n "elapsedSeconds": 5.271,\n "rankings": [\n {\n "recordId": "INT-DOC-008eb31efc8f4dfca38b",\n "sourceKind": "document",\n "sourcePath": "docs/API_ORG_CORE.md",\n "modality": "required",\n "text": "KaΕΌde wywoΕ‚anie wymaga `idempotency_key`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.84097\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.83026\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.828326\n }\n ],\n "margin": 0.01071,\n "selected": true,\n "addsNewCandidate": true\n },\n {\n "recordId": "INT-DOC-019b1be685d528779c3f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "`communication.founder.reply` wiΔ…ΕΌe ΕΊrΓ³dΕ‚owy `PLF-NNN`, status i correlation z autoryzowanym wΔ…tkiem. Odbiorca musi byΔ‡ rΓ³wny `FOUNDER_EMAIL`; prΓ³ba podmiany koΕ„czy siΔ™ `founder_reply_recipient_mismatch` przed wysyΕ‚kΔ…. `In-Reply-To` i `References` pochodzΔ… wyΕ‚Δ…cznie z zachowanej korelacji, a nagΕ‚Γ³wki sΔ… czyszczone ze znakΓ³w sterujΔ…cych.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.841888\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841289\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840961\n }\n ],\n "margin": 0.000599,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-025e3568780cbedcfa6d",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Principal maszyny musi wczeΕ›niej istnieΔ‡ w rejestrze dostΔ™pu z kontraktem `aql:contract/v1`. Rejestr i kompilator AQL obsΕ‚ugujΔ… `machine`, `service` oraz `provider`; token moΕΌe byΔ‡ wydany dopiero dla aktywnego, zarejestrowanego principal. Pozwala to rotowaΔ‡ lub uniewaΕΌniaΔ‡ credential niezaleΕΌnie od authority zapisanej w ticketach.",\n "currentModuleIds": [\n "INT-AST-932d9e7b7fc499ee5051"\n ],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.833554\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.832712\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83265\n }\n ],\n "margin": 0.000842,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-13c1c72b5787468a471c",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECTS_AND_IMPORTS.md",\n "modality": "required",\n "text": "Katalog musi znajdowaΔ‡ siΔ™ wewnΔ…trz `PROJECT_IMPORT_ROOT`. Importer stosuje:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.840472\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.839076\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.838046\n }\n ],\n "margin": 0.001396,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fd58d53d2745e829d14",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "3. Link pilnej decyzji wymaga HTTPS, hosta `SUBACTOR_PUBLIC_HOST`, dokΕ‚adnej Ε›cieΕΌki `/founder/action`, portu domyΕ›lnego oraz braku query/hash przed dodaniem jednorazowego tokenu.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.861952\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.853653\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.85238\n }\n ],\n "margin": 0.008299,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fe25da1a7826ae30433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`resume` automatycznie deleguje ticket do aktora zapisanego w kontrakcie i ustawia stan `ready`. `defer` zachowuje `waiting_input`. `cancel` zamyka ticket jako `canceled`, bez tworzenia faΕ‚szywego completion receipt. KaΕΌda opcja musi mieΔ‡ dokΕ‚adnie jeden skutek; wartoΕ›ci formularza i tabela skutkΓ³w sΔ… walidowane jako zbiory rΓ³wnowaΕΌne.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-22f285d9ae741064ff39",\n "path": "scripts/normalize-active-ticket-routes.mjs",\n "score": 0.82912\n },\n {\n "recordId": "INT-AST-b8788dcd3e0b418d0ac5",\n "path": "scripts/audit-ticket-definition-of-done.mjs",\n "score": 0.828759\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.828404\n }\n ],\n "margin": 0.000361,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-21bec78de30ca0dfa826",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Wynik LLM zawsze zaczyna jako `proposed`. Model nie moΕΌe sam podnieΕ›Δ‡ go do `accepted`, `ready`, `verified` ani `done`. Awaria, timeout, brak modelu lub niepoprawny JSON nie uruchamia deterministycznego parsera NL. Powstaje jawny stan `waiting_input`/`llm_interpretation_unavailable`, bez decyzji i bez mutacji.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.843129\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.840151\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.838721\n }\n ],\n "margin": 0.002978,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-25eabc74e38b81737c1f",\n "sourceKind": "document",\n "sourcePath": "docs/TESTQL_PROJECT_GATES.md",\n "modality": "required",\n "text": "Wersja developerska przechowuje podstawowe rekordy `evidence`, `test_suites`, `test_runs`, `outcomes` i hash OQL. W produkcji naleΕΌy dodaΔ‡ podpisy, trwaΕ‚Δ… bazΔ™ i retencjΔ™.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.833963\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.826495\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.826081\n }\n ],\n "margin": 0.007468,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2994619a281ce0c038fe",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_OBSERVABILITY.md",\n "modality": "required",\n "text": "Endpoint tworzenia klucza jest konfigurowany przez `PLESK_API_KEY_CREATE_PATH`. JeΕΌeli dana wersja Pleska wymaga MFA, CAPTCHA albo jednorazowej zgody, browser agent utworzy ticket `waiting_input`; mechanizmy bezpieczeΕ„stwa nie sΔ… obchodzone.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.860015\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.859964\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.856131\n }\n ],\n "margin": 5.1e-05,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2ca381a36c715ea44bac",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "System nie moΕΌe wywnioskowaΔ‡ tych danych z nazwy `Subactor` ani domeny Foundera. SΔ… to decyzje biznesowe/prawne. Adres i marka `prototypowanie.pl` mogΔ… byΔ‡ uΕΌyte jako kontekst, ale nie zastΔ™pujΔ… prawnej nazwy strony umowy.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.829453\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.827468\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.826652\n }\n ],\n "margin": 0.001985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2dbfe16e760f4d35c9e0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder jest korzeniem odpowiedzialnoΕ›ci. Kontrakt bez pola `principal` naleΕΌy do `human:founder`, a praca bez pokrycia trafia do kolejki foundera i jest notyfikowana na `founder@localhost`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.851962\n },\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.851016\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.848556\n }\n ],\n "margin": 0.000946,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-326545ec5f8d681ae88a",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Ticket publikacji z blockerem `mutation_gate_disabled` albo `founder_publish_approval_required` nie moΕΌe przerzucaΔ‡ na Foundera technicznego polecenia β€žwykonaj dry-run i oceΕ„ plan_hash”. Przed utworzeniem e-maila Control wybiera wyΕ‚Δ…cznie zadeklarowany proces URI o identyfikatorze `dry-run`, `human_approval=false` i `payload.apply=false`, wykonuje go jako `project-operator-bot` i zapisuje ograniczony receipt:",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.848469\n },\n {\n "recordId": "INT-AST-6df68049deb2ff430a49",\n "path": "scripts/create-inbound-email-secret-link.mjs",\n "score": 0.846583\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.843954\n }\n ],\n "margin": 0.001886,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-35c3fec8a2fa4ed7790b",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "| Docker BuildKit nie moΕΌe kopiowaΔ‡ plikΓ³w przez symlink wychodzΔ…cy poza kontekst buildu | obrazy po spΕ‚aszczeniu nie budowaΕ‚yby siΔ™ mimo poprawnych Ε›cieΕΌek na hoΕ›cie | Compose uΕΌywa kanonicznych repozytoriΓ³w jako kontekstΓ³w oraz jawnych `additional_contexts`; Dockerfile assembly naleΕΌΔ… do `platform/docker` |",\n "currentModuleIds": [\n "INT-AST-07bc79de0391fa296e7a",\n "INT-AST-1c6bb4bfd86ba09512b5",\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-29de31f162b50811f891",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-bf0bfd7598586ad009c9",\n "INT-AST-c9ad46e56a172df67338",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-f2588e9e2e79005e6e0e",\n "INT-AST-f40c7cca2b0be0281cb8",\n "INT-AST-f7460573b485ef9218bf",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.85972\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.845449\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.844077\n }\n ],\n "margin": 0.014271,\n "selected": true,\n "addsNewCandidate": true\n },\n {\n "recordId": "INT-DOC-36a129beb520f95c6b3a",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontroler nie przechowuje sekretΓ³w, nie zmienia DNS/TLS i nie wΕ‚Δ…cza mutation gates. Produkcyjny apply nadal wymaga podpisanego grantu zwiΔ…zanego z dry-run `plan_hash` i jawnej operacji Foundera.",\n "currentModuleIds": [\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-ad4c73e93b22f06e0fc4"\n ],\n "top": [\n {\n "recordId": "INT-AST-ad4c73e93b22f06e0fc4",\n "path": "packages/founder-cli/src/apply-grant.mjs",\n "score": 0.856689\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.842309\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.8423\n }\n ],\n "margin": 0.01438,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3a0e329ea4f412cd49f1",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "3. UtwΓ³rz indywidualne konto Basic Auth. Plik haseΕ‚ musi znajdowaΔ‡ siΔ™ poza `httpdocs`:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.842441\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.841794\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.837173\n }\n ],\n "margin": 0.000647,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3b67ff4d3d16f1c25ea7",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "recommended",\n "text": "`hr-bridge` nadal ma lokalne implementacje `plesk.*`, `email.send`, `slack.send`, `teams.send`, `calendar.ics.create` i `task.create`. Migracja powinna przebiegaΔ‡ nastΔ™pujΔ…co:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.847169\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.846942\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.845283\n }\n ],\n "margin": 0.000227,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-48df7879b921b8bcf5e4",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_TEST_PLAN.md",\n "modality": "required",\n "text": "rzeczywisty apply wymaga osobnego ticketu URI Process i grantu zwiΔ…zanego z `plan_hash`.",\n "currentModuleIds": [\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.854757\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.853594\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.853075\n }\n ],\n "margin": 0.001163,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4c3be8c6dc220976cc53",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`domain` musi byΔ‡ peΕ‚nΔ… publicznΔ… nazwΔ… DNS, nie `localhost` ani adresem IP;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.839013\n },\n {\n "recordId": "INT-AST-c51776bea8cc5bf2583c",\n "path": "test/deploy-public-pages.test.mjs",\n "score": 0.836738\n },\n {\n "recordId": "INT-AST-bdaf4f7c21b3a3912ef3",\n "path": "scripts/find-free-network.mjs",\n "score": 0.834026\n }\n ],\n "margin": 0.002275,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4f9db52d56bd0026823b",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "required",\n "text": "`urirun-connector-subactor` udostΔ™pnia obecnie wiele schematΓ³w przez ogΓ³lny `process/command/dispatch`. Najpierw naleΕΌy rozdzieliΔ‡ go wewnΔ™trznie na pakiety `organization`, `contractor/recruitment`, `site-generator` i `testql`. Osobne publiczne repozytorium ma sens dopiero wtedy, gdy moduΕ‚ ma wΕ‚asny kontrakt URI, schematy wejΕ›cia/wyjΕ›cia, testy, wersjonowanie i moΕΌe byΔ‡ wdraΕΌany niezaleΕΌnie.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-792da796f1b4b26b12da",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.849456\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.846713\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.840765\n }\n ],\n "margin": 0.002743,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5149d3861e55a958b08e",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`run_preflight` β€” musi wskazywaΔ‡ konkretny `process_id`; wykonawca nadal weryfikuje, ΕΌe jest to niezmieniajΔ…cy produkcji proces `dry-run`,",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.855529\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.852303\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.846205\n }\n ],\n "margin": 0.003226,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5224f52434cd4e13e790",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_EMAIL_ONE_CLICK_ACTIONS.md",\n "modality": "required",\n "text": "Powiadomienie `email_action_required` nie wymaga juΕΌ rΔ™cznego kopiowania numeru ticketu. KaΕΌdy e-mail zawiera:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.851227\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.847184\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.842789\n }\n ],\n "margin": 0.004043,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-598734e7c12787b3e6ad",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "`FOUNDER_ACCESS_SCOPES` musi zawieraΔ‡ `vault:reveal`",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.860331\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.845534\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.84493\n }\n ],\n "margin": 0.014797,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5bfd8fc288d0e3e3e3d9",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "Rejestr wybiera najnowszΔ… zgodnΔ… wersjΔ™ `process.vN`; nie naleΕΌy kodowaΔ‡ wersji w kontrolerze domenowym. KaΕΌda Ε›cieΕΌka najpierw tworzy dedykowany ticket Planfile z AQL/EQL/OQL/URI. Dopiero pΓ³ΕΊniej wykonuje `email.send`.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-12cf897f5148c62cb27c",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-b8788dcd3e0b418d0ac5"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.861178\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.850183\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.850166\n }\n ],\n "margin": 0.010995,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-6f640680ab497d1d553f",\n "sourceKind": "document",\n "sourcePath": "docs/INTEGRATION_ADAPTERS.md",\n "modality": "required",\n "text": "Nie trzeba zmieniaΔ‡ istniejΔ…cych modeli AQL, jeΕ›li korzystajΔ… z ogΓ³lnego `notification.send`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.826191\n },\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.824924\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.823401\n }\n ],\n "margin": 0.001267,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-718b7f44fe9f4539da66",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Interpretacji NL, wyboru intencji, klasyfikacji decyzji ani uzupeΕ‚niania brakujΔ…cych pΓ³l nie wolno realizowaΔ‡ regexami, tablicΔ… sΕ‚Γ³w kluczowych, punktacjΔ… lub innΔ… heurystykΔ…. JeΕΌeli LLM nie zwrΓ³ci poprawnego structured output, system zatrzymuje operacjΔ™ jako `llm_interpretation_unavailable`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.83227\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.830631\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.828476\n }\n ],\n "margin": 0.001639,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73621239e97df9af3e7a",\n "sourceKind": "document",\n "sourcePath": "docs/CONNECTOR_LAN_ARCHITECTURE.md",\n "modality": "required",\n "text": "DomyΕ›lny executor ma tylko dedykowany wolumen `/workspace`; nie montuje `/`, `/var/run/docker.sock` ani trybu `privileged`. Konektory wymagajΔ…ce sprzΔ™tu naleΕΌy wΕ‚Δ…czaΔ‡ osobno:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.844471\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.843603\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.843361\n }\n ],\n "margin": 0.000868,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73a881368c3a9fe2b0f4",\n "sourceKind": "document",\n "sourcePath": "docs/SESSION_RECOVERY_AND_MODULARIZATION_2026-07-21.md",\n "modality": "required",\n "text": "2. `platform/components/*` sΔ… osobnymi checkoutami tych samych repozytoriΓ³w, lecz katalog nadrzΔ™dny je ignoruje. ZwykΕ‚y `git status` w `platform` ukrywa ich zmiany. Publikacja musi traktowaΔ‡ checkout uruchomieniowy jako kanoniczny, rebase'owaΔ‡ go na `origin/main`, a dopiero potem synchronizowaΔ‡ dodatkowe klony.",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-429740c646b555806b8b",\n "INT-AST-8ed40f8ed8b18102cb3d",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-f7460573b485ef9218bf"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.859558\n },\n {\n "recordId": "INT-AST-28ecc726b3af01b6d912",\n "path": "scripts/link-flat-workspace.mjs",\n "score": 0.851344\n },\n {\n "recordId": "INT-AST-f7460573b485ef9218bf",\n "path": "scripts/check-component-drift.mjs",\n "score": 0.848807\n }\n ],\n "margin": 0.008214,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-767dd0d952dd7f6c09c1",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "certyfikat `founder.subactor.com` musi odpowiadaΔ‡ domenie, zanim moΕΌna uΕΌyΔ‡ go jako bezpiecznego wejΕ›cia. Odczyt z 2026-07-21 pokazuje CNAME `founder.subactor.com -> subactor.github.io` oraz certyfikat GitHub `*.github.io`, ktΓ³ry nie obejmuje nazwy Foundera. Dlatego sama zmiana certyfikatu nr 311 w Plesk nie naprawi obecnego ruchu: najpierw trzeba wybraΔ‡ docelowy hosting. Dla Pleska naleΕΌy zmieniΔ‡ DNS na jego serwer, utworzyΔ‡ host/subdomenΔ™ i wydaΔ‡ lub przypisaΔ‡ certyfikat obejmujΔ…cy `founder.subactor.com`. Dla GitHub Pages naleΕΌy skonfigurowaΔ‡ tΔ™ nazwΔ™ jako custom domain i poczekaΔ‡ na wΕ‚aΕ›ciwy certyfikat. Dopiero potem wykonuje siΔ™ niezaleΕΌnΔ… weryfikacjΔ™ strict TLS.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.846098\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.838802\n },\n {\n "recordId": "INT-AST-34dd3d4f9ce437b8da87",\n "path": "packages/capability-preflight/src/preflight.mjs",\n "score": 0.838685\n }\n ],\n "margin": 0.007296,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7da4ea8c34d708aa977d",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "recommended",\n "text": "RΔ™czny cykl kontrolera wykonaΕ‚ dwa gotowe tickety, ale etap `queue_execution` trwaΕ‚ okoΕ‚o 70 s. NiezaleΕΌne kroki jednego ticketu sΔ… nadal wykonywane sekwencyjnie. Bezpieczna rΓ³wnolegΕ‚oΕ›Δ‡ powinna byΔ‡ wyliczana z DAG `depends_on` i ograniczana budΕΌetem connectora.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.83197\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.827962\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.826695\n }\n ],\n "margin": 0.004008,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7e6497c757ff8d20f249",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Dla pytaΕ„ typu `ticket.decision` e-mail umieszcza po kaΕΌdej odpowiedzi osobny link `#token=…&answer=…`. Fragment nie jest wysyΕ‚any w ΕΌΔ…daniu HTTP ani zapisywany w logach serwera. Link wybiera wyΕ‚Δ…cznie wartoΕ›Δ‡ istniejΔ…cΔ… w zamkniΔ™tym katalogu formularza i zmienia etykietΔ™ przycisku na β€žPotwierdΕΊ tΔ™ decyzję”. Wymagane pozostaje Ε›wiadome potwierdzenie na stronie: zwykΕ‚y skaner linkΓ³w pocztowych nie moΕΌe zuΕΌyΔ‡ tokenu ani zmieniΔ‡ lifecycle ticketu przez GET.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.848592\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.846701\n },\n {\n "recordId": "INT-AST-0e3f72c26d8f6ea35f80",\n "path": "scripts/backfill-ticket-definition-of-done.mjs",\n "score": 0.845006\n }\n ],\n "margin": 0.001891,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-814fd7b2a90e4fd7f349",\n "sourceKind": "document",\n "sourcePath": "docs/SUBACTOR_MULTI_REPO_MIGRATION.md",\n "modality": "required",\n "text": "After component repositories are published, `platform` records them as external source checkouts. Verification must include:",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.87058\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.86265\n },\n {\n "recordId": "INT-AST-f54cfcb46e60ea2daf22",\n "path": "test/platform.test.js",\n "score": 0.861889\n }\n ],\n "margin": 0.00793,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-81f213d607d4a9e6d773",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder moΕΌe delegowaΔ‡ bez kontraktu nadrzΔ™dnego. Inna osoba moΕΌe tworzyΔ‡ dalsze delegacje tylko wtedy, gdy poda `parent_contract_id`, jest podmiotem aktywnego kontraktu nadrzΔ™dnego, a ten kontrakt dopuszcza operacjΔ™ `autonomy.contract.delegate`. Bot nie moΕΌe sam rozszerzaΔ‡ swoich uprawnieΕ„.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.82498\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.820146\n },\n {\n "recordId": "INT-AST-9c6e38ddf867cc10a0c0",\n "path": "packages/founder-cli/tests/founder.test.mjs",\n "score": 0.818133\n }\n ],\n "margin": 0.004834,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-874b23309a57fba88bb0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_BROWSER_VAULT.md",\n "modality": "required",\n "text": "API wymaga `Authorization: Bearer ...`. DomyΕ›lnie tokenem wewnΔ™trznym jest `BRIDGE_INTROSPECTION_SECRET`; moΕΌna ustawiΔ‡ osobny `BROWSER_AGENT_SERVICE_TOKEN`. Klucz szyfrowania domyΕ›lnie korzysta z `INTEGRATION_SECRET_KEY`; produkcyjnie zalecany jest osobny `BROWSER_AGENT_VAULT_KEY` przechowywany poza repozytorium.",\n "currentModuleIds": [\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.837148\n },\n {\n "recordId": "INT-AST-0a117640892c43195f42",\n "path": "scripts/init-secrets.mjs",\n "score": 0.835999\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.835911\n }\n ],\n "margin": 0.001149,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88df94ec3f62b969e433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "To nie jest przeglΔ…darka caΕ‚ego sejfu. Ticket musi z gΓ³ry wskazywaΔ‡ wpis, origin i pole (`password`, `username` albo `api_key`). Ani sekret, ani token linku nie sΔ… zapisywane w tickecie, audycie Control lub wyniku CLI.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.856613\n },\n {\n "recordId": "INT-AST-9e7b169cb0dcf86f226a",\n "path": "scripts/create-cloudflare-secret-link.mjs",\n "score": 0.855406\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.850217\n }\n ],\n "margin": 0.001207,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88ebbac4e76e7fa6acc6",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`id` musi byΔ‡ unikalnym identyfikatorem kebab-case;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.835302\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.834452\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.833188\n }\n ],\n "margin": 0.00085,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b209aa7dc2e722b4dd7",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_DAILY_DIGEST.md",\n "modality": "recommended",\n "text": "Awaria nie uruchamia lokalnego fallbacku SMTP. Ponowienie nastΔ™puje po `FOUNDER_DAILY_DIGEST_RETRY_MS` i uΕΌywa tego samego ticketa oraz klucza idempotencji, wiΔ™c nie powinno wysΕ‚aΔ‡ drugiej wiadomoΕ›ci po czΔ™Ε›ciowej awarii.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.834571\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.829515\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829102\n }\n ],\n "margin": 0.005056,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b7042e2696ff6f23051",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Token wymaga `plans:approve`. Control nie przyjmuje principal w body β€” odczytuje go z uwierzytelnionej toΕΌsamoΕ›ci, a nastΔ™pnie sprawdza osobne przypisanie authority w tickecie. DziΔ™ki temu scope tokenu nie staje siΔ™ globalnym prawem zatwierdzania. Dozwolone decyzje to `approve`, `defer` i `reject`; kaΕΌda jest zapisywana w audycie wraz z principal i metodΔ… uwierzytelnienia.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.834053\n },\n {\n "recordId": "INT-AST-d79aa26ea931af33f0d6",\n "path": "scripts/configure-remediation-planner.mjs",\n "score": 0.832855\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829247\n }\n ],\n "margin": 0.001198,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8d7022906b9a1e65b9ec",\n "sourceKind": "document",\n "sourcePath": "docs/DEVELOPMENT_OPENROUTER.md",\n "modality": "required",\n "text": "Gateway jest domyΕ›lnie publikowany tylko na `127.0.0.1` i wymaga lokalnego `LLM_GATEWAY_SERVICE_TOKEN`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.840702\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.839761\n },\n {\n "recordId": "INT-AST-ebdfa3628e9c4e8432e6",\n "path": "scripts/llm-status.mjs",\n "score": 0.839585\n }\n ],\n "margin": 0.000941,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-958ddb1db2512381cc5f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "recommended",\n "text": "Founder nie powinien znaΔ‡ stanΓ³w kolejki, wybieraΔ‡ `reassign` ani wpisywaΔ‡ komend lifecycle. Planfile pozostaje wewnΔ™trznym ΕΊrΓ³dΕ‚em stanu i dowodΓ³w, a interakcjΔ™ czΕ‚owieka obsΕ‚uguje deklaratywny kontrakt `subactor.interactive-form.v1` lub jego zgodne rozszerzenie `subactor.interactive-form.v2`. Control interpretuje skutek odpowiedzi, a bezstanowe repozytorium `views/` renderuje wyΕ‚Δ…cznie projekcjΔ™ HTML.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.852536\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.849854\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.848442\n }\n ],\n "margin": 0.002682,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-9c3fc3cb3825c7092c7f",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_LIVE.md",\n "modality": "required",\n "text": "Mock Plesk implementuje endpoint publikacji bez dodatkowych zmian. W trybie live Ε›cieΕΌka `PLESK_SITE_PUBLISH_PATH` musi wskazywaΔ‡ endpoint udostΔ™pniony przez konkretnΔ… instalacjΔ™ Plesk, rozszerzenie panelu albo kontrolowany adapter CLI. Nie naleΕΌy zakΕ‚adaΔ‡, ΕΌe niestandardowa Ε›cieΕΌka `/api/v2/sites/publish` istnieje w kaΕΌdej instalacji.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-f2c14a1e840818e82b47"\n ],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.846759\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.844142\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.839924\n }\n ],\n "margin": 0.002617,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-acc70bcd3285163c8a83",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "Nazwa uΕΌytkownika musi byΔ‡ identyczna z `worker.http_basic_user` w JSON. Runtime odrzuca rΓ³wnieΕΌ poprawnie uwierzytelnione konto przypisane do innego pracownika.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841455\n },\n {\n "recordId": "INT-AST-cbabaecd2615f3b68a2c",\n "path": "test/recruitment-workflow.test.mjs",\n "score": 0.837079\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.836195\n }\n ],\n "margin": 0.004376,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-b966966b4a3a222cdab4",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Control ponownie waliduje wynik, sprawdza scope, wykonuje wskazane odczyty i przekazuje do drugiej fazy LLM wyΕ‚Δ…cznie krΓ³tkie, zatwierdzone fakty. OdpowiedΕΊ ma kontrakt `subactor.founder-grounded-answer/v1` i musi wskazaΔ‡ `fact_refs`. Model nie otrzymuje authority, dowolnego filtra, URI ani surowych obiektΓ³w.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-33ed799f815097a2ebcb",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-27cef449f964a294ffcd",\n "path": "scripts/lib/json-schema-subset.mjs",\n "score": 0.83752\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.837417\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837069\n }\n ],\n "margin": 0.000103,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ba509d6ee6ec15b626b8",\n "sourceKind": "document",\n "sourcePath": "docs/ORGANIZATION_OS_ARCHITECTURE.md",\n "modality": "required",\n "text": "Claim jest ponownie walidowany przed zmianΔ… stanu. ZakoΕ„czenie wymaga receiptΓ³w krokΓ³w i completion receipt z `verified_by`; sam HTTP 2xx nie wystarcza.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.863786\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.863029\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.85533\n }\n ],\n "margin": 0.000757,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c0464135791a8ed38c66",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "ŚcieΕΌka hosta jest montowana do kontenera tylko do odczytu. Zmiana `SUBACTOR_PROJECTS_PATH` wymaga zgodnoΕ›ci wartoΕ›ci w `.env` z bind-mountem Compose.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2e5029d3b3ab1ba50c91",\n "INT-AST-48dfdd4791e461e90b73",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-76fb17f792a499e351d3",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-b7fda5399edec3c1acb1",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-ebdfa3628e9c4e8432e6"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.872004\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.867679\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.862333\n }\n ],\n "margin": 0.004325,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c515505dcb1f9e834ef1",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "**Dopasowanie reguΕ‚ to AND, nie OR.** `ruleMatchesTicket` wymaga speΕ‚nienia **wszystkich** wypeΕ‚nionych kryteriΓ³w. Dodanie `uri_prefixes_any` do reguΕ‚y, ktΓ³ra ma juΕΌ `labels_any`, **zawΔ™ΕΌa** jΔ… β€” ticket musi mieΔ‡ etykietΔ™ *oraz* URI. ReguΕ‚y URI muszΔ… byΔ‡ osobnymi wpisami z pustymi pozostaΕ‚ymi kryteriami.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.856836\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.854146\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.853856\n }\n ],\n "margin": 0.00269,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c72a940082e5281fdd16",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_EMAIL.md",\n "modality": "required",\n "text": "`REAL_SYSTEM_EMAIL` okreΕ›la prawdziwΔ… skrzynkΔ™ systemu, a `DEMO_SYSTEM_EMAIL` nadawcΔ™ uΕΌywanego wyΕ‚Δ…cznie przez Mailpit i testy. `SYSTEM_EMAIL` wskazuje aktywnΔ… toΕΌsamoΕ›Δ‡ foundera, administratora i supervisora. `EMAIL_IDENTITY_MODE=real` wymaga zgodnoΕ›ci `SYSTEM_EMAIL` z `REAL_SYSTEM_EMAIL`; tryb `demo` przeΕ‚Δ…cza jΔ… na `DEMO_SYSTEM_EMAIL`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.843144\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840485\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.838475\n }\n ],\n "margin": 0.002659,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ce10b816225eeeea1aef",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "JeΕΌeli node wymaga auth, `lenovo.token_file` ma wskazywaΔ‡ lokalny plik zawierajΔ…cy token; token nie jest wersjonowany ani zapisywany w artefakcie. Automat wykonuje readiness i otwiera formularz tylko na istniejΔ…cej, uwierzytelnionej powierzchni browser/CDP. Founder weryfikuje pola i publikuje.",\n "currentModuleIds": [\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dd4ad46cd453fe2ef337",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.843646\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.842754\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.842372\n }\n ],\n "margin": 0.000892,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-cf53c018b86f82f3967f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "`principal` wskazuje osobΔ™ albo bota, np. `{\\"kind\\":\\"bot\\",\\"id\\":\\"it-provisioner-bot\\"}`. Ticket utworzony w ramach takiego kontraktu otrzymuje tego samego wykonawcΔ™ i kolejkΔ™. Sam routing nie udaje wykonania: bot musi mieΔ‡ rzeczywisty adapter lub proces URIrun, ktΓ³ry odbierze ticket i zapisze dowΓ³d rezultatu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.85194\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.847934\n }\n ],\n "margin": 0.000246,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d0f2d64cdf114aecb081",\n "sourceKind": "document",\n "sourcePath": "docs/RELCom_INTEGRATION.md",\n "modality": "required",\n "text": "Nie kopiuj tokenΓ³w, danych testowych ani mock Pleska. Produkcyjny `plan-registry` powinien pozostaΔ‡ ΕΊrΓ³dΕ‚em prawdy i wymagaΔ‡ `SUBACTOR_ADMIN_TOKEN`.",\n "currentModuleIds": [\n "INT-AST-7fa98cd51c5167b57fa2"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.852756\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.85208\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.848715\n }\n ],\n "margin": 0.000676,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d8cc038eab8108dffbd7",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontrola dokumentΓ³w prawnych jest jakoΕ›ciowa, nie tylko nazwowa. Akceptowane sΔ… pliki `.md`, `.html`, `.htm`, `.txt` i `.pdf`. KaΕΌdy wymagany dokument musi mieΔ‡ co najmniej 200 bajtΓ³w/znakΓ³w, a pliki tekstowe zawierajΔ…ce `TODO`, `do uzupeΕ‚nienia` albo `placeholder` sΔ… traktowane jako niekompletne. Wymagane kategorie to: polityka prywatnoΕ›ci, cookies, dane administratora, zasady formularza kontaktowego i informacja o statusie pilotaΕΌu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.827941\n },\n {\n "recordId": "INT-AST-167bbd84e4e4afe736e9",\n "path": "test/capability-preflight.test.mjs",\n "score": 0.823662\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.822936\n }\n ],\n "margin": 0.004279,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d9088f27e0bd7ac5d51b",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "Jaki publiczny adres IP lub nazwa hosta ingressu ma obsΕ‚ugiwaΔ‡ `founder.subactor.com`? Bez tej informacji nie naleΕΌy zmieniaΔ‡ rekordu DNS ani deklarowaΔ‡, ΕΌe publiczny link dziaΕ‚a. Po uzyskaniu odpowiedzi trzeba rΓ³wnieΕΌ potwierdziΔ‡, czy kolejka Planfile ma byΔ‡ publikowana na tej samej domenie, czy pod osobnym, uwierzytelnionym adresem.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.844263\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837775\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.832502\n }\n ],\n "margin": 0.006488,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-dce58b4c336ad1c53826",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "required",\n "text": "W rejestrze lifecycle `digital_twin_profile` ma status `partial` i `autonomy.enabled=false`. Portret moΕΌe byΔ‡ uΕΌywany do decyzji routingowej, ale nie moΕΌe autonomicznie migrowaΔ‡ siebie ani modyfikowaΔ‡ praw, dopΓ³ki luki taksonomii specjalizacji i jakoΕ›ci wynikΓ³w nie zostanΔ… domkniΔ™te.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.8306\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.825245\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.821944\n }\n ],\n "margin": 0.005355,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e5d909b9cb997225241b",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`schema` musi mieΔ‡ wartoΕ›Δ‡ `subactor.projects/v1`;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.865702\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.861173\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.856483\n }\n ],\n "margin": 0.004529,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e907e7c7a7d55704ca51",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_QUEUE_CONTROLLER.md",\n "modality": "required",\n "text": "KaΕΌdy cykl ponownie bada ticket, jeΕΌeli ma Process Envelope v2, naleΕΌy do wΕ‚Δ…czonego bota i trafiΕ‚ do `waiting_input` z bΕ‚Δ™dem `readiness_preflight:*`. Kontroler nie promuje ticketΓ³w ludzkich, legacy, z aktywnym `blocked-by:*` ani z zadeklarowanym blockerem. Kandydat przechodzi ponownie przez aktualne rejestry aktorΓ³w i exact URI. Dopiero zielony wynik zmienia stan na `ready`.",\n "currentModuleIds": [\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.834894\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.834087\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.832743\n }\n ],\n "margin": 0.000807,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ef47ae9fb56681714214",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "OdpowiedΕΊ e-mail moΕΌe zawieraΔ‡ wyΕ‚Δ…cznie `TAK`, `NIE`, `ODROCZ` lub `PΓ“ΕΉNIEJ`, jeΕΌeli temat zachowuje znacznik `[URGENT:PLF-N]` wygenerowany przez system. Nadal akceptowane sΔ… jawne formy `APPROVE PLF-N`, `REJECT PLF-N` i `DEFER PLF-N`. Nadawca przechodzi istniejΔ…cΔ… autoryzacjΔ™ kontaktu i kontraktu AQL. Klasa principal nie nadaje globalnego wyjΔ…tku: rΓ³wnieΕΌ `human:founder` musi byΔ‡ zwiΔ…zany z ticketem przez `assigned_to`, etykietΔ™ `authority:`, `approver:`, `principal:` albo jawnΔ… capability decyzyjnΔ… AQL.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-2f146f1cc195dd96c6f4",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dc1dcce0faf40419b64e",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.836239\n },\n {\n "recordId": "INT-AST-2ad0a72220a446c0fe88",\n "path": "packages/founder-cli/src/ask.mjs",\n "score": 0.836008\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.834528\n }\n ],\n "margin": 0.000231,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-efe140f5619e37a96d82",\n "sourceKind": "document",\n "sourcePath": "docs/SECRET_INTAKE_PROCESS_PACKS.md",\n "modality": "required",\n "text": "KaΕΌdy ticket zawiera komplet AQL/EQL/OQL/URI. LLM moΕΌe wybraΔ‡ proces i wypeΕ‚niΔ‡ ograniczony slot `provider`, ale nie moΕΌe wybraΔ‡ transportu, wpisu sejfu ani wygenerowaΔ‡ URI.",\n "currentModuleIds": [\n "INT-AST-5d19be2a9b2f6eb9c00c"\n ],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.840829\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.839737\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.839105\n }\n ],\n "margin": 0.001092,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-f48ad72c3cd1e900e80f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_CONTROLLER_CONTINUATION_PLAN.md",\n "modality": "required",\n "text": "Kontroler nie moΕΌe promowaΔ‡, wykonywaΔ‡ ani zamykaΔ‡ ticketu bez wspieranej wersji kontraktu, kompletnego envelope v2, aktywnego aktora, live exact URI, uprawnieΕ„ AQL, oczekiwaΕ„ EQL i braku aktualnego blockera. Brak bezpiecznej Ε›cieΕΌki pozostaje widocznym `waiting_input`; przypomnienie nie nadaje authority i nie odnawia tokenu czΔ™Ε›ciej niΕΌ pozwala lifecycle artefaktu.",\n "currentModuleIds": [\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.833423\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.830379\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.830257\n }\n ],\n "margin": 0.003044,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fb082dd22afc2a7434e5",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "PowΓ³d jest strukturalny, nie awaryjny: kolejka autonomiczna wykonuje wyΕ‚Δ…cznie tickety w stanie wykonywalnym, a praktycznie caΕ‚y backlog stoi na `waiting_input`. Licznik `executable` opisuje tΔ™ kolejkΔ™, a nie Ε›cieΕΌkΔ™ delegowania β€” dlatego oba wskaΕΊniki mogΔ… siΔ™ rozjeΕΌdΕΌaΔ‡ i **nie naleΕΌy czytaΔ‡ `executable: 0` jako awarii kontrolera**.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.857835\n },\n {\n "recordId": "INT-AST-c74d93ff12a626f5e8df",\n "path": "test/ticket-auditor-audit-window.test.mjs",\n "score": 0.849431\n },\n {\n "recordId": "INT-AST-419698c412dc2105ea07",\n "path": "test/ticket-auditor-selection.test.mjs",\n "score": 0.845601\n }\n ],\n "margin": 0.008404,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fdb89ea01f0b0eaa5628",\n "sourceKind": "document",\n "sourcePath": "docs/ENV_CONFIGURATION.md",\n "modality": "required",\n "text": "4. Kod serwisΓ³w nie moΕΌe uΕΌywaΔ‡ bezpoΕ›rednio `process.env.VAR`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.854812\n },\n {\n "recordId": "INT-AST-0ccec610937016ed5ee4",\n "path": "scripts/migrate-env.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.851052\n }\n ],\n "margin": 0.003118,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fea4537ba7aa1ca8a381",\n "sourceKind": "document",\n "sourcePath": "docs/INBOUND_EMAIL_AUTHORIZATION.md",\n "modality": "required",\n "text": "The default authentication policy is `strict`. `contract-only` exists solely for isolated local tests and must not be used for a real mailbox.",\n "currentModuleIds": [\n "INT-AST-167bbd84e4e4afe736e9",\n "INT-AST-576fc1c342f93d1fcef2",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-bcd8179169d840bc205e"\n ],\n "top": [\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83973\n },\n {\n "recordId": "INT-AST-42da0c70f37348edd281",\n "path": "test/active-ticket-route-normalization.test.mjs",\n "score": 0.837595\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.836975\n }\n ],\n "margin": 0.002135,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-180a8388572a6ea7a824",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Resolve Plesk `subscription_domain_limit_unknown`, DNS and TLS before production apply.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.869481\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.859953\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.859809\n }\n ],\n "margin": 0.009528,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-5c003c3825645e675e46",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision `urirun-connector-twilio-voice`: vault credentials, caller number, destination/consent policy and signed status callback.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a00b21088f556fc59477",\n "path": "scripts/validate-urirun-connectors-audit.mjs",\n "score": 0.878721\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.873161\n },\n {\n "recordId": "INT-AST-170732522e9a08fc4777",\n "path": "scripts/configure-system-email-vault.mjs",\n "score": 0.858164\n }\n ],\n "margin": 0.00556,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-9b79f780a672f6add271",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Deploy one authenticated portal for `contracts.subactor.com` and `chat.subactor.com`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-9868e7332a3017885a0f",\n "path": "config/connector-capabilities/preflight.mjs",\n "score": 0.866502\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.864586\n },\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.86286\n }\n ],\n "margin": 0.001916,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-b7058854b8ae3d810e17",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Rotate the scoped autonomy-chat control token before 2026-08-18.",\n "currentModuleIds": [\n "INT-AST-edc170e805da7985926b"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.866802\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.84412\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.843419\n }\n ],\n "margin": 0.022682,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-d00584ed9e9dbbb233b5",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Remove duplicate urirun connector discovery and repair optional connector dependencies.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.871638\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.86949\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.867432\n }\n ],\n "margin": 0.002148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-db792516a8944c2e7692",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision live SMTP/IMAP vault entries and verify founder e-mail round trip.",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.86519\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.864205\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.861663\n }\n ],\n "margin": 0.000985,\n "selected": false,\n "addsNewCandidate": false\n }\n ]\n}\n", "is_subdir": true}, {"name": "platform-e5-reciprocal-ranking.json", "rel_path": "ticket-004/platform-e5-reciprocal-ranking.json", "path": "ticket-004 / platform-e5-reciprocal-ranking.json", "size": "79.7KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-ranking-experiment/v1",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "graphSha256": "a83609ffc91d13278b1bd9936e915d50b9dc349373e73c61d0c0a90315d9084a",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "minimumScore": 0.75,\n "minimumMargin": 0.01,\n "moduleCount": 133,\n "declarationCount": 66,\n "selectedCount": 1,\n "newCandidateCount": 0,\n "elapsedSeconds": 4.453,\n "rankings": [\n {\n "recordId": "INT-DOC-008eb31efc8f4dfca38b",\n "sourceKind": "document",\n "sourcePath": "docs/API_ORG_CORE.md",\n "modality": "required",\n "text": "KaΕΌde wywoΕ‚anie wymaga `idempotency_key`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.84097\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.83026\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.828326\n }\n ],\n "margin": 0.01071,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-019b1be685d528779c3f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "`communication.founder.reply` wiΔ…ΕΌe ΕΊrΓ³dΕ‚owy `PLF-NNN`, status i correlation z autoryzowanym wΔ…tkiem. Odbiorca musi byΔ‡ rΓ³wny `FOUNDER_EMAIL`; prΓ³ba podmiany koΕ„czy siΔ™ `founder_reply_recipient_mismatch` przed wysyΕ‚kΔ…. `In-Reply-To` i `References` pochodzΔ… wyΕ‚Δ…cznie z zachowanej korelacji, a nagΕ‚Γ³wki sΔ… czyszczone ze znakΓ³w sterujΔ…cych.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.841888\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841289\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840961\n }\n ],\n "margin": 0.000599,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002108,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-025e3568780cbedcfa6d",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Principal maszyny musi wczeΕ›niej istnieΔ‡ w rejestrze dostΔ™pu z kontraktem `aql:contract/v1`. Rejestr i kompilator AQL obsΕ‚ugujΔ… `machine`, `service` oraz `provider`; token moΕΌe byΔ‡ wydany dopiero dla aktywnego, zarejestrowanego principal. Pozwala to rotowaΔ‡ lub uniewaΕΌniaΔ‡ credential niezaleΕΌnie od authority zapisanej w ticketach.",\n "currentModuleIds": [\n "INT-AST-932d9e7b7fc499ee5051"\n ],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.833554\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.832712\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83265\n }\n ],\n "margin": 0.000842,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003979,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-13c1c72b5787468a471c",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECTS_AND_IMPORTS.md",\n "modality": "required",\n "text": "Katalog musi znajdowaΔ‡ siΔ™ wewnΔ…trz `PROJECT_IMPORT_ROOT`. Importer stosuje:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.840472\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.839076\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.838046\n }\n ],\n "margin": 0.001396,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003483,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fd58d53d2745e829d14",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "3. Link pilnej decyzji wymaga HTTPS, hosta `SUBACTOR_PUBLIC_HOST`, dokΕ‚adnej Ε›cieΕΌki `/founder/action`, portu domyΕ›lnego oraz braku query/hash przed dodaniem jednorazowego tokenu.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.861952\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.853653\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.85238\n }\n ],\n "margin": 0.008299,\n "reciprocalTopOne": true,\n "reverseMargin": 0.007306,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fe25da1a7826ae30433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`resume` automatycznie deleguje ticket do aktora zapisanego w kontrakcie i ustawia stan `ready`. `defer` zachowuje `waiting_input`. `cancel` zamyka ticket jako `canceled`, bez tworzenia faΕ‚szywego completion receipt. KaΕΌda opcja musi mieΔ‡ dokΕ‚adnie jeden skutek; wartoΕ›ci formularza i tabela skutkΓ³w sΔ… walidowane jako zbiory rΓ³wnowaΕΌne.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-22f285d9ae741064ff39",\n "path": "scripts/normalize-active-ticket-routes.mjs",\n "score": 0.82912\n },\n {\n "recordId": "INT-AST-b8788dcd3e0b418d0ac5",\n "path": "scripts/audit-ticket-definition-of-done.mjs",\n "score": 0.828759\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.828404\n }\n ],\n "margin": 0.000361,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006642,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-21bec78de30ca0dfa826",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Wynik LLM zawsze zaczyna jako `proposed`. Model nie moΕΌe sam podnieΕ›Δ‡ go do `accepted`, `ready`, `verified` ani `done`. Awaria, timeout, brak modelu lub niepoprawny JSON nie uruchamia deterministycznego parsera NL. Powstaje jawny stan `waiting_input`/`llm_interpretation_unavailable`, bez decyzji i bez mutacji.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.843129\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.840151\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.838721\n }\n ],\n "margin": 0.002978,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-25eabc74e38b81737c1f",\n "sourceKind": "document",\n "sourcePath": "docs/TESTQL_PROJECT_GATES.md",\n "modality": "required",\n "text": "Wersja developerska przechowuje podstawowe rekordy `evidence`, `test_suites`, `test_runs`, `outcomes` i hash OQL. W produkcji naleΕΌy dodaΔ‡ podpisy, trwaΕ‚Δ… bazΔ™ i retencjΔ™.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.833963\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.826495\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.826081\n }\n ],\n "margin": 0.007468,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2994619a281ce0c038fe",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_OBSERVABILITY.md",\n "modality": "required",\n "text": "Endpoint tworzenia klucza jest konfigurowany przez `PLESK_API_KEY_CREATE_PATH`. JeΕΌeli dana wersja Pleska wymaga MFA, CAPTCHA albo jednorazowej zgody, browser agent utworzy ticket `waiting_input`; mechanizmy bezpieczeΕ„stwa nie sΔ… obchodzone.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.860015\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.859964\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.856131\n }\n ],\n "margin": 5.1e-05,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002844,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2ca381a36c715ea44bac",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "System nie moΕΌe wywnioskowaΔ‡ tych danych z nazwy `Subactor` ani domeny Foundera. SΔ… to decyzje biznesowe/prawne. Adres i marka `prototypowanie.pl` mogΔ… byΔ‡ uΕΌyte jako kontekst, ale nie zastΔ™pujΔ… prawnej nazwy strony umowy.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.829453\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.827468\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.826652\n }\n ],\n "margin": 0.001985,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2dbfe16e760f4d35c9e0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder jest korzeniem odpowiedzialnoΕ›ci. Kontrakt bez pola `principal` naleΕΌy do `human:founder`, a praca bez pokrycia trafia do kolejki foundera i jest notyfikowana na `founder@localhost`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.851962\n },\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.851016\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.848556\n }\n ],\n "margin": 0.000946,\n "reciprocalTopOne": true,\n "reverseMargin": 0.002108,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-326545ec5f8d681ae88a",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Ticket publikacji z blockerem `mutation_gate_disabled` albo `founder_publish_approval_required` nie moΕΌe przerzucaΔ‡ na Foundera technicznego polecenia β€žwykonaj dry-run i oceΕ„ plan_hash”. Przed utworzeniem e-maila Control wybiera wyΕ‚Δ…cznie zadeklarowany proces URI o identyfikatorze `dry-run`, `human_approval=false` i `payload.apply=false`, wykonuje go jako `project-operator-bot` i zapisuje ograniczony receipt:",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.848469\n },\n {\n "recordId": "INT-AST-6df68049deb2ff430a49",\n "path": "scripts/create-inbound-email-secret-link.mjs",\n "score": 0.846583\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.843954\n }\n ],\n "margin": 0.001886,\n "reciprocalTopOne": false,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-35c3fec8a2fa4ed7790b",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "| Docker BuildKit nie moΕΌe kopiowaΔ‡ plikΓ³w przez symlink wychodzΔ…cy poza kontekst buildu | obrazy po spΕ‚aszczeniu nie budowaΕ‚yby siΔ™ mimo poprawnych Ε›cieΕΌek na hoΕ›cie | Compose uΕΌywa kanonicznych repozytoriΓ³w jako kontekstΓ³w oraz jawnych `additional_contexts`; Dockerfile assembly naleΕΌΔ… do `platform/docker` |",\n "currentModuleIds": [\n "INT-AST-07bc79de0391fa296e7a",\n "INT-AST-1c6bb4bfd86ba09512b5",\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-29de31f162b50811f891",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-bf0bfd7598586ad009c9",\n "INT-AST-c9ad46e56a172df67338",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-f2588e9e2e79005e6e0e",\n "INT-AST-f40c7cca2b0be0281cb8",\n "INT-AST-f7460573b485ef9218bf",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.85972\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.845449\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.844077\n }\n ],\n "margin": 0.014271,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-36a129beb520f95c6b3a",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontroler nie przechowuje sekretΓ³w, nie zmienia DNS/TLS i nie wΕ‚Δ…cza mutation gates. Produkcyjny apply nadal wymaga podpisanego grantu zwiΔ…zanego z dry-run `plan_hash` i jawnej operacji Foundera.",\n "currentModuleIds": [\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-ad4c73e93b22f06e0fc4"\n ],\n "top": [\n {\n "recordId": "INT-AST-ad4c73e93b22f06e0fc4",\n "path": "packages/founder-cli/src/apply-grant.mjs",\n "score": 0.856689\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.842309\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.8423\n }\n ],\n "margin": 0.01438,\n "reciprocalTopOne": true,\n "reverseMargin": 0.008705,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3a0e329ea4f412cd49f1",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "3. UtwΓ³rz indywidualne konto Basic Auth. Plik haseΕ‚ musi znajdowaΔ‡ siΔ™ poza `httpdocs`:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.842441\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.841794\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.837173\n }\n ],\n "margin": 0.000647,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006114,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3b67ff4d3d16f1c25ea7",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "recommended",\n "text": "`hr-bridge` nadal ma lokalne implementacje `plesk.*`, `email.send`, `slack.send`, `teams.send`, `calendar.ics.create` i `task.create`. Migracja powinna przebiegaΔ‡ nastΔ™pujΔ…co:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.847169\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.846942\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.845283\n }\n ],\n "margin": 0.000227,\n "reciprocalTopOne": true,\n "reverseMargin": 0.003968,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-48df7879b921b8bcf5e4",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_TEST_PLAN.md",\n "modality": "required",\n "text": "rzeczywisty apply wymaga osobnego ticketu URI Process i grantu zwiΔ…zanego z `plan_hash`.",\n "currentModuleIds": [\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.854757\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.853594\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.853075\n }\n ],\n "margin": 0.001163,\n "reciprocalTopOne": false,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4c3be8c6dc220976cc53",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`domain` musi byΔ‡ peΕ‚nΔ… publicznΔ… nazwΔ… DNS, nie `localhost` ani adresem IP;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.839013\n },\n {\n "recordId": "INT-AST-c51776bea8cc5bf2583c",\n "path": "test/deploy-public-pages.test.mjs",\n "score": 0.836738\n },\n {\n "recordId": "INT-AST-bdaf4f7c21b3a3912ef3",\n "path": "scripts/find-free-network.mjs",\n "score": 0.834026\n }\n ],\n "margin": 0.002275,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005475,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4f9db52d56bd0026823b",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "required",\n "text": "`urirun-connector-subactor` udostΔ™pnia obecnie wiele schematΓ³w przez ogΓ³lny `process/command/dispatch`. Najpierw naleΕΌy rozdzieliΔ‡ go wewnΔ™trznie na pakiety `organization`, `contractor/recruitment`, `site-generator` i `testql`. Osobne publiczne repozytorium ma sens dopiero wtedy, gdy moduΕ‚ ma wΕ‚asny kontrakt URI, schematy wejΕ›cia/wyjΕ›cia, testy, wersjonowanie i moΕΌe byΔ‡ wdraΕΌany niezaleΕΌnie.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-792da796f1b4b26b12da",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.849456\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.846713\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.840765\n }\n ],\n "margin": 0.002743,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001523,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5149d3861e55a958b08e",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`run_preflight` β€” musi wskazywaΔ‡ konkretny `process_id`; wykonawca nadal weryfikuje, ΕΌe jest to niezmieniajΔ…cy produkcji proces `dry-run`,",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.855529\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.852303\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.846205\n }\n ],\n "margin": 0.003226,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5224f52434cd4e13e790",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_EMAIL_ONE_CLICK_ACTIONS.md",\n "modality": "required",\n "text": "Powiadomienie `email_action_required` nie wymaga juΕΌ rΔ™cznego kopiowania numeru ticketu. KaΕΌdy e-mail zawiera:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.851227\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.847184\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.842789\n }\n ],\n "margin": 0.004043,\n "reciprocalTopOne": false,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-598734e7c12787b3e6ad",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "`FOUNDER_ACCESS_SCOPES` musi zawieraΔ‡ `vault:reveal`",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.860331\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.845534\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.84493\n }\n ],\n "margin": 0.014797,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003874,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5bfd8fc288d0e3e3e3d9",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "Rejestr wybiera najnowszΔ… zgodnΔ… wersjΔ™ `process.vN`; nie naleΕΌy kodowaΔ‡ wersji w kontrolerze domenowym. KaΕΌda Ε›cieΕΌka najpierw tworzy dedykowany ticket Planfile z AQL/EQL/OQL/URI. Dopiero pΓ³ΕΊniej wykonuje `email.send`.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-12cf897f5148c62cb27c",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-b8788dcd3e0b418d0ac5"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.861178\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.850183\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.850166\n }\n ],\n "margin": 0.010995,\n "reciprocalTopOne": true,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-6f640680ab497d1d553f",\n "sourceKind": "document",\n "sourcePath": "docs/INTEGRATION_ADAPTERS.md",\n "modality": "required",\n "text": "Nie trzeba zmieniaΔ‡ istniejΔ…cych modeli AQL, jeΕ›li korzystajΔ… z ogΓ³lnego `notification.send`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.826191\n },\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.824924\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.823401\n }\n ],\n "margin": 0.001267,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-718b7f44fe9f4539da66",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Interpretacji NL, wyboru intencji, klasyfikacji decyzji ani uzupeΕ‚niania brakujΔ…cych pΓ³l nie wolno realizowaΔ‡ regexami, tablicΔ… sΕ‚Γ³w kluczowych, punktacjΔ… lub innΔ… heurystykΔ…. JeΕΌeli LLM nie zwrΓ³ci poprawnego structured output, system zatrzymuje operacjΔ™ jako `llm_interpretation_unavailable`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.83227\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.830631\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.828476\n }\n ],\n "margin": 0.001639,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003979,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73621239e97df9af3e7a",\n "sourceKind": "document",\n "sourcePath": "docs/CONNECTOR_LAN_ARCHITECTURE.md",\n "modality": "required",\n "text": "DomyΕ›lny executor ma tylko dedykowany wolumen `/workspace`; nie montuje `/`, `/var/run/docker.sock` ani trybu `privileged`. Konektory wymagajΔ…ce sprzΔ™tu naleΕΌy wΕ‚Δ…czaΔ‡ osobno:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.844471\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.843603\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.843361\n }\n ],\n "margin": 0.000868,\n "reciprocalTopOne": true,\n "reverseMargin": 0.001157,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73a881368c3a9fe2b0f4",\n "sourceKind": "document",\n "sourcePath": "docs/SESSION_RECOVERY_AND_MODULARIZATION_2026-07-21.md",\n "modality": "required",\n "text": "2. `platform/components/*` sΔ… osobnymi checkoutami tych samych repozytoriΓ³w, lecz katalog nadrzΔ™dny je ignoruje. ZwykΕ‚y `git status` w `platform` ukrywa ich zmiany. Publikacja musi traktowaΔ‡ checkout uruchomieniowy jako kanoniczny, rebase'owaΔ‡ go na `origin/main`, a dopiero potem synchronizowaΔ‡ dodatkowe klony.",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-429740c646b555806b8b",\n "INT-AST-8ed40f8ed8b18102cb3d",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-f7460573b485ef9218bf"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.859558\n },\n {\n "recordId": "INT-AST-28ecc726b3af01b6d912",\n "path": "scripts/link-flat-workspace.mjs",\n "score": 0.851344\n },\n {\n "recordId": "INT-AST-f7460573b485ef9218bf",\n "path": "scripts/check-component-drift.mjs",\n "score": 0.848807\n }\n ],\n "margin": 0.008214,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-767dd0d952dd7f6c09c1",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "certyfikat `founder.subactor.com` musi odpowiadaΔ‡ domenie, zanim moΕΌna uΕΌyΔ‡ go jako bezpiecznego wejΕ›cia. Odczyt z 2026-07-21 pokazuje CNAME `founder.subactor.com -> subactor.github.io` oraz certyfikat GitHub `*.github.io`, ktΓ³ry nie obejmuje nazwy Foundera. Dlatego sama zmiana certyfikatu nr 311 w Plesk nie naprawi obecnego ruchu: najpierw trzeba wybraΔ‡ docelowy hosting. Dla Pleska naleΕΌy zmieniΔ‡ DNS na jego serwer, utworzyΔ‡ host/subdomenΔ™ i wydaΔ‡ lub przypisaΔ‡ certyfikat obejmujΔ…cy `founder.subactor.com`. Dla GitHub Pages naleΕΌy skonfigurowaΔ‡ tΔ™ nazwΔ™ jako custom domain i poczekaΔ‡ na wΕ‚aΕ›ciwy certyfikat. Dopiero potem wykonuje siΔ™ niezaleΕΌnΔ… weryfikacjΔ™ strict TLS.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.846098\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.838802\n },\n {\n "recordId": "INT-AST-34dd3d4f9ce437b8da87",\n "path": "packages/capability-preflight/src/preflight.mjs",\n "score": 0.838685\n }\n ],\n "margin": 0.007296,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7da4ea8c34d708aa977d",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "recommended",\n "text": "RΔ™czny cykl kontrolera wykonaΕ‚ dwa gotowe tickety, ale etap `queue_execution` trwaΕ‚ okoΕ‚o 70 s. NiezaleΕΌne kroki jednego ticketu sΔ… nadal wykonywane sekwencyjnie. Bezpieczna rΓ³wnolegΕ‚oΕ›Δ‡ powinna byΔ‡ wyliczana z DAG `depends_on` i ograniczana budΕΌetem connectora.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.83197\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.827962\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.826695\n }\n ],\n "margin": 0.004008,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001157,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7e6497c757ff8d20f249",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Dla pytaΕ„ typu `ticket.decision` e-mail umieszcza po kaΕΌdej odpowiedzi osobny link `#token=…&answer=…`. Fragment nie jest wysyΕ‚any w ΕΌΔ…daniu HTTP ani zapisywany w logach serwera. Link wybiera wyΕ‚Δ…cznie wartoΕ›Δ‡ istniejΔ…cΔ… w zamkniΔ™tym katalogu formularza i zmienia etykietΔ™ przycisku na β€žPotwierdΕΊ tΔ™ decyzję”. Wymagane pozostaje Ε›wiadome potwierdzenie na stronie: zwykΕ‚y skaner linkΓ³w pocztowych nie moΕΌe zuΕΌyΔ‡ tokenu ani zmieniΔ‡ lifecycle ticketu przez GET.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.848592\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.846701\n },\n {\n "recordId": "INT-AST-0e3f72c26d8f6ea35f80",\n "path": "scripts/backfill-ticket-definition-of-done.mjs",\n "score": 0.845006\n }\n ],\n "margin": 0.001891,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005594,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-814fd7b2a90e4fd7f349",\n "sourceKind": "document",\n "sourcePath": "docs/SUBACTOR_MULTI_REPO_MIGRATION.md",\n "modality": "required",\n "text": "After component repositories are published, `platform` records them as external source checkouts. Verification must include:",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.87058\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.86265\n },\n {\n "recordId": "INT-AST-f54cfcb46e60ea2daf22",\n "path": "test/platform.test.js",\n "score": 0.861889\n }\n ],\n "margin": 0.00793,\n "reciprocalTopOne": true,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-81f213d607d4a9e6d773",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder moΕΌe delegowaΔ‡ bez kontraktu nadrzΔ™dnego. Inna osoba moΕΌe tworzyΔ‡ dalsze delegacje tylko wtedy, gdy poda `parent_contract_id`, jest podmiotem aktywnego kontraktu nadrzΔ™dnego, a ten kontrakt dopuszcza operacjΔ™ `autonomy.contract.delegate`. Bot nie moΕΌe sam rozszerzaΔ‡ swoich uprawnieΕ„.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.82498\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.820146\n },\n {\n "recordId": "INT-AST-9c6e38ddf867cc10a0c0",\n "path": "packages/founder-cli/tests/founder.test.mjs",\n "score": 0.818133\n }\n ],\n "margin": 0.004834,\n "reciprocalTopOne": false,\n "reverseMargin": 0.013658,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-874b23309a57fba88bb0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_BROWSER_VAULT.md",\n "modality": "required",\n "text": "API wymaga `Authorization: Bearer ...`. DomyΕ›lnie tokenem wewnΔ™trznym jest `BRIDGE_INTROSPECTION_SECRET`; moΕΌna ustawiΔ‡ osobny `BROWSER_AGENT_SERVICE_TOKEN`. Klucz szyfrowania domyΕ›lnie korzysta z `INTEGRATION_SECRET_KEY`; produkcyjnie zalecany jest osobny `BROWSER_AGENT_VAULT_KEY` przechowywany poza repozytorium.",\n "currentModuleIds": [\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.837148\n },\n {\n "recordId": "INT-AST-0a117640892c43195f42",\n "path": "scripts/init-secrets.mjs",\n "score": 0.835999\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.835911\n }\n ],\n "margin": 0.001149,\n "reciprocalTopOne": false,\n "reverseMargin": 0.013658,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88df94ec3f62b969e433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "To nie jest przeglΔ…darka caΕ‚ego sejfu. Ticket musi z gΓ³ry wskazywaΔ‡ wpis, origin i pole (`password`, `username` albo `api_key`). Ani sekret, ani token linku nie sΔ… zapisywane w tickecie, audycie Control lub wyniku CLI.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.856613\n },\n {\n "recordId": "INT-AST-9e7b169cb0dcf86f226a",\n "path": "scripts/create-cloudflare-secret-link.mjs",\n "score": 0.855406\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.850217\n }\n ],\n "margin": 0.001207,\n "reciprocalTopOne": false,\n "reverseMargin": 0.009517,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88ebbac4e76e7fa6acc6",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`id` musi byΔ‡ unikalnym identyfikatorem kebab-case;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.835302\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.834452\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.833188\n }\n ],\n "margin": 0.00085,\n "reciprocalTopOne": false,\n "reverseMargin": 0.000352,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b209aa7dc2e722b4dd7",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_DAILY_DIGEST.md",\n "modality": "recommended",\n "text": "Awaria nie uruchamia lokalnego fallbacku SMTP. Ponowienie nastΔ™puje po `FOUNDER_DAILY_DIGEST_RETRY_MS` i uΕΌywa tego samego ticketa oraz klucza idempotencji, wiΔ™c nie powinno wysΕ‚aΔ‡ drugiej wiadomoΕ›ci po czΔ™Ε›ciowej awarii.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.834571\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.829515\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829102\n }\n ],\n "margin": 0.005056,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b7042e2696ff6f23051",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Token wymaga `plans:approve`. Control nie przyjmuje principal w body β€” odczytuje go z uwierzytelnionej toΕΌsamoΕ›ci, a nastΔ™pnie sprawdza osobne przypisanie authority w tickecie. DziΔ™ki temu scope tokenu nie staje siΔ™ globalnym prawem zatwierdzania. Dozwolone decyzje to `approve`, `defer` i `reject`; kaΕΌda jest zapisywana w audycie wraz z principal i metodΔ… uwierzytelnienia.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.834053\n },\n {\n "recordId": "INT-AST-d79aa26ea931af33f0d6",\n "path": "scripts/configure-remediation-planner.mjs",\n "score": 0.832855\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829247\n }\n ],\n "margin": 0.001198,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006114,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8d7022906b9a1e65b9ec",\n "sourceKind": "document",\n "sourcePath": "docs/DEVELOPMENT_OPENROUTER.md",\n "modality": "required",\n "text": "Gateway jest domyΕ›lnie publikowany tylko na `127.0.0.1` i wymaga lokalnego `LLM_GATEWAY_SERVICE_TOKEN`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.840702\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.839761\n },\n {\n "recordId": "INT-AST-ebdfa3628e9c4e8432e6",\n "path": "scripts/llm-status.mjs",\n "score": 0.839585\n }\n ],\n "margin": 0.000941,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-958ddb1db2512381cc5f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "recommended",\n "text": "Founder nie powinien znaΔ‡ stanΓ³w kolejki, wybieraΔ‡ `reassign` ani wpisywaΔ‡ komend lifecycle. Planfile pozostaje wewnΔ™trznym ΕΊrΓ³dΕ‚em stanu i dowodΓ³w, a interakcjΔ™ czΕ‚owieka obsΕ‚uguje deklaratywny kontrakt `subactor.interactive-form.v1` lub jego zgodne rozszerzenie `subactor.interactive-form.v2`. Control interpretuje skutek odpowiedzi, a bezstanowe repozytorium `views/` renderuje wyΕ‚Δ…cznie projekcjΔ™ HTML.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.852536\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.849854\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.848442\n }\n ],\n "margin": 0.002682,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-9c3fc3cb3825c7092c7f",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_LIVE.md",\n "modality": "required",\n "text": "Mock Plesk implementuje endpoint publikacji bez dodatkowych zmian. W trybie live Ε›cieΕΌka `PLESK_SITE_PUBLISH_PATH` musi wskazywaΔ‡ endpoint udostΔ™pniony przez konkretnΔ… instalacjΔ™ Plesk, rozszerzenie panelu albo kontrolowany adapter CLI. Nie naleΕΌy zakΕ‚adaΔ‡, ΕΌe niestandardowa Ε›cieΕΌka `/api/v2/sites/publish` istnieje w kaΕΌdej instalacji.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-f2c14a1e840818e82b47"\n ],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.846759\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.844142\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.839924\n }\n ],\n "margin": 0.002617,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005475,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-acc70bcd3285163c8a83",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "Nazwa uΕΌytkownika musi byΔ‡ identyczna z `worker.http_basic_user` w JSON. Runtime odrzuca rΓ³wnieΕΌ poprawnie uwierzytelnione konto przypisane do innego pracownika.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841455\n },\n {\n "recordId": "INT-AST-cbabaecd2615f3b68a2c",\n "path": "test/recruitment-workflow.test.mjs",\n "score": 0.837079\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.836195\n }\n ],\n "margin": 0.004376,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-b966966b4a3a222cdab4",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Control ponownie waliduje wynik, sprawdza scope, wykonuje wskazane odczyty i przekazuje do drugiej fazy LLM wyΕ‚Δ…cznie krΓ³tkie, zatwierdzone fakty. OdpowiedΕΊ ma kontrakt `subactor.founder-grounded-answer/v1` i musi wskazaΔ‡ `fact_refs`. Model nie otrzymuje authority, dowolnego filtra, URI ani surowych obiektΓ³w.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-33ed799f815097a2ebcb",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-27cef449f964a294ffcd",\n "path": "scripts/lib/json-schema-subset.mjs",\n "score": 0.83752\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.837417\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837069\n }\n ],\n "margin": 0.000103,\n "reciprocalTopOne": false,\n "reverseMargin": 0.00486,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ba509d6ee6ec15b626b8",\n "sourceKind": "document",\n "sourcePath": "docs/ORGANIZATION_OS_ARCHITECTURE.md",\n "modality": "required",\n "text": "Claim jest ponownie walidowany przed zmianΔ… stanu. ZakoΕ„czenie wymaga receiptΓ³w krokΓ³w i completion receipt z `verified_by`; sam HTTP 2xx nie wystarcza.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.863786\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.863029\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.85533\n }\n ],\n "margin": 0.000757,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c0464135791a8ed38c66",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "ŚcieΕΌka hosta jest montowana do kontenera tylko do odczytu. Zmiana `SUBACTOR_PROJECTS_PATH` wymaga zgodnoΕ›ci wartoΕ›ci w `.env` z bind-mountem Compose.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2e5029d3b3ab1ba50c91",\n "INT-AST-48dfdd4791e461e90b73",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-76fb17f792a499e351d3",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-b7fda5399edec3c1acb1",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-ebdfa3628e9c4e8432e6"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.872004\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.867679\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.862333\n }\n ],\n "margin": 0.004325,\n "reciprocalTopOne": true,\n "reverseMargin": 0.006814,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c515505dcb1f9e834ef1",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "**Dopasowanie reguΕ‚ to AND, nie OR.** `ruleMatchesTicket` wymaga speΕ‚nienia **wszystkich** wypeΕ‚nionych kryteriΓ³w. Dodanie `uri_prefixes_any` do reguΕ‚y, ktΓ³ra ma juΕΌ `labels_any`, **zawΔ™ΕΌa** jΔ… β€” ticket musi mieΔ‡ etykietΔ™ *oraz* URI. ReguΕ‚y URI muszΔ… byΔ‡ osobnymi wpisami z pustymi pozostaΕ‚ymi kryteriami.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.856836\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.854146\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.853856\n }\n ],\n "margin": 0.00269,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c72a940082e5281fdd16",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_EMAIL.md",\n "modality": "required",\n "text": "`REAL_SYSTEM_EMAIL` okreΕ›la prawdziwΔ… skrzynkΔ™ systemu, a `DEMO_SYSTEM_EMAIL` nadawcΔ™ uΕΌywanego wyΕ‚Δ…cznie przez Mailpit i testy. `SYSTEM_EMAIL` wskazuje aktywnΔ… toΕΌsamoΕ›Δ‡ foundera, administratora i supervisora. `EMAIL_IDENTITY_MODE=real` wymaga zgodnoΕ›ci `SYSTEM_EMAIL` z `REAL_SYSTEM_EMAIL`; tryb `demo` przeΕ‚Δ…cza jΔ… na `DEMO_SYSTEM_EMAIL`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.843144\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840485\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.838475\n }\n ],\n "margin": 0.002659,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006823,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ce10b816225eeeea1aef",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "JeΕΌeli node wymaga auth, `lenovo.token_file` ma wskazywaΔ‡ lokalny plik zawierajΔ…cy token; token nie jest wersjonowany ani zapisywany w artefakcie. Automat wykonuje readiness i otwiera formularz tylko na istniejΔ…cej, uwierzytelnionej powierzchni browser/CDP. Founder weryfikuje pola i publikuje.",\n "currentModuleIds": [\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dd4ad46cd453fe2ef337",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.843646\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.842754\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.842372\n }\n ],\n "margin": 0.000892,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003483,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-cf53c018b86f82f3967f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "`principal` wskazuje osobΔ™ albo bota, np. `{\\"kind\\":\\"bot\\",\\"id\\":\\"it-provisioner-bot\\"}`. Ticket utworzony w ramach takiego kontraktu otrzymuje tego samego wykonawcΔ™ i kolejkΔ™. Sam routing nie udaje wykonania: bot musi mieΔ‡ rzeczywisty adapter lub proces URIrun, ktΓ³ry odbierze ticket i zapisze dowΓ³d rezultatu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.85194\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.847934\n }\n ],\n "margin": 0.000246,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001135,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d0f2d64cdf114aecb081",\n "sourceKind": "document",\n "sourcePath": "docs/RELCom_INTEGRATION.md",\n "modality": "required",\n "text": "Nie kopiuj tokenΓ³w, danych testowych ani mock Pleska. Produkcyjny `plan-registry` powinien pozostaΔ‡ ΕΊrΓ³dΕ‚em prawdy i wymagaΔ‡ `SUBACTOR_ADMIN_TOKEN`.",\n "currentModuleIds": [\n "INT-AST-7fa98cd51c5167b57fa2"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.852756\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.85208\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.848715\n }\n ],\n "margin": 0.000676,\n "reciprocalTopOne": false,\n "reverseMargin": 0.009517,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d8cc038eab8108dffbd7",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontrola dokumentΓ³w prawnych jest jakoΕ›ciowa, nie tylko nazwowa. Akceptowane sΔ… pliki `.md`, `.html`, `.htm`, `.txt` i `.pdf`. KaΕΌdy wymagany dokument musi mieΔ‡ co najmniej 200 bajtΓ³w/znakΓ³w, a pliki tekstowe zawierajΔ…ce `TODO`, `do uzupeΕ‚nienia` albo `placeholder` sΔ… traktowane jako niekompletne. Wymagane kategorie to: polityka prywatnoΕ›ci, cookies, dane administratora, zasady formularza kontaktowego i informacja o statusie pilotaΕΌu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.827941\n },\n {\n "recordId": "INT-AST-167bbd84e4e4afe736e9",\n "path": "test/capability-preflight.test.mjs",\n "score": 0.823662\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.822936\n }\n ],\n "margin": 0.004279,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006114,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d9088f27e0bd7ac5d51b",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "Jaki publiczny adres IP lub nazwa hosta ingressu ma obsΕ‚ugiwaΔ‡ `founder.subactor.com`? Bez tej informacji nie naleΕΌy zmieniaΔ‡ rekordu DNS ani deklarowaΔ‡, ΕΌe publiczny link dziaΕ‚a. Po uzyskaniu odpowiedzi trzeba rΓ³wnieΕΌ potwierdziΔ‡, czy kolejka Planfile ma byΔ‡ publikowana na tej samej domenie, czy pod osobnym, uwierzytelnionym adresem.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.844263\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837775\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.832502\n }\n ],\n "margin": 0.006488,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-dce58b4c336ad1c53826",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "required",\n "text": "W rejestrze lifecycle `digital_twin_profile` ma status `partial` i `autonomy.enabled=false`. Portret moΕΌe byΔ‡ uΕΌywany do decyzji routingowej, ale nie moΕΌe autonomicznie migrowaΔ‡ siebie ani modyfikowaΔ‡ praw, dopΓ³ki luki taksonomii specjalizacji i jakoΕ›ci wynikΓ³w nie zostanΔ… domkniΔ™te.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.8306\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.825245\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.821944\n }\n ],\n "margin": 0.005355,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e5d909b9cb997225241b",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`schema` musi mieΔ‡ wartoΕ›Δ‡ `subactor.projects/v1`;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.865702\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.861173\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.856483\n }\n ],\n "margin": 0.004529,\n "reciprocalTopOne": true,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e907e7c7a7d55704ca51",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_QUEUE_CONTROLLER.md",\n "modality": "required",\n "text": "KaΕΌdy cykl ponownie bada ticket, jeΕΌeli ma Process Envelope v2, naleΕΌy do wΕ‚Δ…czonego bota i trafiΕ‚ do `waiting_input` z bΕ‚Δ™dem `readiness_preflight:*`. Kontroler nie promuje ticketΓ³w ludzkich, legacy, z aktywnym `blocked-by:*` ani z zadeklarowanym blockerem. Kandydat przechodzi ponownie przez aktualne rejestry aktorΓ³w i exact URI. Dopiero zielony wynik zmienia stan na `ready`.",\n "currentModuleIds": [\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.834894\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.834087\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.832743\n }\n ],\n "margin": 0.000807,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001362,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ef47ae9fb56681714214",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "OdpowiedΕΊ e-mail moΕΌe zawieraΔ‡ wyΕ‚Δ…cznie `TAK`, `NIE`, `ODROCZ` lub `PΓ“ΕΉNIEJ`, jeΕΌeli temat zachowuje znacznik `[URGENT:PLF-N]` wygenerowany przez system. Nadal akceptowane sΔ… jawne formy `APPROVE PLF-N`, `REJECT PLF-N` i `DEFER PLF-N`. Nadawca przechodzi istniejΔ…cΔ… autoryzacjΔ™ kontaktu i kontraktu AQL. Klasa principal nie nadaje globalnego wyjΔ…tku: rΓ³wnieΕΌ `human:founder` musi byΔ‡ zwiΔ…zany z ticketem przez `assigned_to`, etykietΔ™ `authority:`, `approver:`, `principal:` albo jawnΔ… capability decyzyjnΔ… AQL.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-2f146f1cc195dd96c6f4",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dc1dcce0faf40419b64e",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.836239\n },\n {\n "recordId": "INT-AST-2ad0a72220a446c0fe88",\n "path": "packages/founder-cli/src/ask.mjs",\n "score": 0.836008\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.834528\n }\n ],\n "margin": 0.000231,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002108,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-efe140f5619e37a96d82",\n "sourceKind": "document",\n "sourcePath": "docs/SECRET_INTAKE_PROCESS_PACKS.md",\n "modality": "required",\n "text": "KaΕΌdy ticket zawiera komplet AQL/EQL/OQL/URI. LLM moΕΌe wybraΔ‡ proces i wypeΕ‚niΔ‡ ograniczony slot `provider`, ale nie moΕΌe wybraΔ‡ transportu, wpisu sejfu ani wygenerowaΔ‡ URI.",\n "currentModuleIds": [\n "INT-AST-5d19be2a9b2f6eb9c00c"\n ],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.840829\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.839737\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.839105\n }\n ],\n "margin": 0.001092,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005594,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-f48ad72c3cd1e900e80f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_CONTROLLER_CONTINUATION_PLAN.md",\n "modality": "required",\n "text": "Kontroler nie moΕΌe promowaΔ‡, wykonywaΔ‡ ani zamykaΔ‡ ticketu bez wspieranej wersji kontraktu, kompletnego envelope v2, aktywnego aktora, live exact URI, uprawnieΕ„ AQL, oczekiwaΕ„ EQL i braku aktualnego blockera. Brak bezpiecznej Ε›cieΕΌki pozostaje widocznym `waiting_input`; przypomnienie nie nadaje authority i nie odnawia tokenu czΔ™Ε›ciej niΕΌ pozwala lifecycle artefaktu.",\n "currentModuleIds": [\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.833423\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.830379\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.830257\n }\n ],\n "margin": 0.003044,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001135,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fb082dd22afc2a7434e5",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "PowΓ³d jest strukturalny, nie awaryjny: kolejka autonomiczna wykonuje wyΕ‚Δ…cznie tickety w stanie wykonywalnym, a praktycznie caΕ‚y backlog stoi na `waiting_input`. Licznik `executable` opisuje tΔ™ kolejkΔ™, a nie Ε›cieΕΌkΔ™ delegowania β€” dlatego oba wskaΕΊniki mogΔ… siΔ™ rozjeΕΌdΕΌaΔ‡ i **nie naleΕΌy czytaΔ‡ `executable: 0` jako awarii kontrolera**.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.857835\n },\n {\n "recordId": "INT-AST-c74d93ff12a626f5e8df",\n "path": "test/ticket-auditor-audit-window.test.mjs",\n "score": 0.849431\n },\n {\n "recordId": "INT-AST-419698c412dc2105ea07",\n "path": "test/ticket-auditor-selection.test.mjs",\n "score": 0.845601\n }\n ],\n "margin": 0.008404,\n "reciprocalTopOne": true,\n "reverseMargin": 0.005594,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fdb89ea01f0b0eaa5628",\n "sourceKind": "document",\n "sourcePath": "docs/ENV_CONFIGURATION.md",\n "modality": "required",\n "text": "4. Kod serwisΓ³w nie moΕΌe uΕΌywaΔ‡ bezpoΕ›rednio `process.env.VAR`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.854812\n },\n {\n "recordId": "INT-AST-0ccec610937016ed5ee4",\n "path": "scripts/migrate-env.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.851052\n }\n ],\n "margin": 0.003118,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006814,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fea4537ba7aa1ca8a381",\n "sourceKind": "document",\n "sourcePath": "docs/INBOUND_EMAIL_AUTHORIZATION.md",\n "modality": "required",\n "text": "The default authentication policy is `strict`. `contract-only` exists solely for isolated local tests and must not be used for a real mailbox.",\n "currentModuleIds": [\n "INT-AST-167bbd84e4e4afe736e9",\n "INT-AST-576fc1c342f93d1fcef2",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-bcd8179169d840bc205e"\n ],\n "top": [\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83973\n },\n {\n "recordId": "INT-AST-42da0c70f37348edd281",\n "path": "test/active-ticket-route-normalization.test.mjs",\n "score": 0.837595\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.836975\n }\n ],\n "margin": 0.002135,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005786,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-180a8388572a6ea7a824",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Resolve Plesk `subscription_domain_limit_unknown`, DNS and TLS before production apply.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.869481\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.859953\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.859809\n }\n ],\n "margin": 0.009528,\n "reciprocalTopOne": true,\n "reverseMargin": 0.009517,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-5c003c3825645e675e46",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision `urirun-connector-twilio-voice`: vault credentials, caller number, destination/consent policy and signed status callback.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a00b21088f556fc59477",\n "path": "scripts/validate-urirun-connectors-audit.mjs",\n "score": 0.878721\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.873161\n },\n {\n "recordId": "INT-AST-170732522e9a08fc4777",\n "path": "scripts/configure-system-email-vault.mjs",\n "score": 0.858164\n }\n ],\n "margin": 0.00556,\n "reciprocalTopOne": true,\n "reverseMargin": 0.018359,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-9b79f780a672f6add271",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Deploy one authenticated portal for `contracts.subactor.com` and `chat.subactor.com`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-9868e7332a3017885a0f",\n "path": "config/connector-capabilities/preflight.mjs",\n "score": 0.866502\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.864586\n },\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.86286\n }\n ],\n "margin": 0.001916,\n "reciprocalTopOne": true,\n "reverseMargin": 0.015824,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-b7058854b8ae3d810e17",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Rotate the scoped autonomy-chat control token before 2026-08-18.",\n "currentModuleIds": [\n "INT-AST-edc170e805da7985926b"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.866802\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.84412\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.843419\n }\n ],\n "margin": 0.022682,\n "reciprocalTopOne": true,\n "reverseMargin": 0.013658,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-d00584ed9e9dbbb233b5",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Remove duplicate urirun connector discovery and repair optional connector dependencies.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.871638\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.86949\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.867432\n }\n ],\n "margin": 0.002148,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001523,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-db792516a8944c2e7692",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision live SMTP/IMAP vault entries and verify founder e-mail round trip.",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.86519\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.864205\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.861663\n }\n ],\n "margin": 0.000985,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006814,\n "selected": false,\n "addsNewCandidate": false\n }\n ]\n}\n", "is_subdir": true}, {"name": "sample.json", "rel_path": "ticket-003/sample.json", "path": "ticket-003 / sample.json", "size": "144.3KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.changelog-audit/v1",\n "generatedAt": "2026-07-31T00:00:00.000Z",\n "selectionPolicy": {\n "description": "Round-robin over lexical target-class:action strata, then stable record ID.",\n "perRepositoryLimit": 24,\n "targetClassPrecedence": [\n "ticket",\n "path",\n "symbol",\n "none"\n ]\n },\n "classificationPolicy": {\n "version": 1,\n "labels": {\n "non_actionable_file_update": "Exact Update <file> bookkeeping with no behavioral statement.",\n "non_actionable_file_summary": "Opaque chore summary naming only a file count.",\n "roadmap_not_release": "Unchecked Markdown task embedded in a changelog.",\n "substantive_or_unverified": "Behavioral, compatibility, test or documentation claim that still needs evidence."\n }\n },\n "repositories": [\n {\n "repository": "semcod__code2docs",\n "commit": "c738aff7bd51670104e144ae19b657fd3915565d",\n "runId": "20260731T072143Z-a3208b84",\n "graphFingerprint": "83dcfa7a5b21ca7714b9546bef4baead7ef197e936a0b61088bde2cb1c275643",\n "records": 6717,\n "relations": 35468,\n "residualFindings": 269,\n "residualLabelCounts": {\n "non_actionable_file_update": 142,\n "substantive_or_unverified": 127\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__code2llm",\n "commit": "b297d600ae7d923ce22730bc90c6cd330ec7e243",\n "runId": "20260731T072152Z-fb1ab530",\n "graphFingerprint": "bd57f05a14c3abca5ebcbb95a6ad9b3fbb47ff40f656846c5b4857fd5ecde407",\n "records": 16899,\n "relations": 41758,\n "residualFindings": 955,\n "residualLabelCounts": {\n "non_actionable_file_update": 305,\n "roadmap_not_release": 15,\n "substantive_or_unverified": 635\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__code2logic",\n "commit": "ba93489b56f51af31206671a1f55ab860bb725c2",\n "runId": "20260731T072209Z-30215e36",\n "graphFingerprint": "c6e9f7a0671dc9b4e0c0f3fad5c5dcf1319ba674ba55bbafcc22b0caa908e6af",\n "records": 21423,\n "relations": 16933,\n "residualFindings": 120,\n "residualLabelCounts": {\n "non_actionable_file_update": 11,\n "roadmap_not_release": 15,\n "substantive_or_unverified": 94\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__domd",\n "commit": "b6c5ad24f2f2da386a2e3e5bad05433184f54c58",\n "runId": "20260731T072221Z-f577ffe7",\n "graphFingerprint": "a9d2d5eb1287b7cb69ce7cdd3aa1a77078c6e7860e96be2a602a1c0858d6e0bd",\n "records": 10611,\n "relations": 7484,\n "residualFindings": 99,\n "residualLabelCounts": {\n "substantive_or_unverified": 99\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__pactfix",\n "commit": "daf301a9e23d65cd341ffa2d6c0a6cfe728e651d",\n "runId": "20260731T072226Z-0fb2f8b8",\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "records": 5161,\n "relations": 3917,\n "residualFindings": 48,\n "residualLabelCounts": {\n "non_actionable_file_summary": 1,\n "substantive_or_unverified": 47\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__redup",\n "commit": "a175fb0a80b54fcda4bf5cd34c8b087fe9472608",\n "runId": "20260731T072230Z-6a2d832d",\n "graphFingerprint": "b3a582ffa178ee307157461e348b51757f4e726eadd809cbfa3dc8e8b143442f",\n "records": 7204,\n "relations": 19259,\n "residualFindings": 269,\n "residualLabelCounts": {\n "non_actionable_file_update": 85,\n "substantive_or_unverified": 184\n },\n "sampledFindings": 24\n },\n {\n "repository": "subactor__platform",\n "commit": "3e96573d587cb664741849ceba205bf303b9f418",\n "runId": "20260731T072237Z-6cab0835",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "records": 10628,\n "relations": 11424,\n "residualFindings": 93,\n "residualLabelCounts": {\n "non_actionable_file_update": 4,\n "substantive_or_unverified": 89\n },\n "sampledFindings": 24\n }\n ],\n "summary": {\n "residualFindings": 1853,\n "residualLabelCounts": {\n "non_actionable_file_summary": 1,\n "non_actionable_file_update": 547,\n "roadmap_not_release": 30,\n "substantive_or_unverified": 1275\n },\n "residualLabelRepositories": {\n "non_actionable_file_summary": [\n "semcod__pactfix"\n ],\n "non_actionable_file_update": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__redup",\n "subactor__platform"\n ],\n "roadmap_not_release": [\n "semcod__code2llm",\n "semcod__code2logic"\n ],\n "substantive_or_unverified": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__domd",\n "semcod__pactfix",\n "semcod__redup",\n "subactor__platform"\n ]\n },\n "sampledFindings": 168,\n "labelCounts": {\n "non_actionable_file_summary": 1,\n "non_actionable_file_update": 28,\n "roadmap_not_release": 6,\n "substantive_or_unverified": 133\n },\n "labelRepositories": {\n "non_actionable_file_summary": [\n "semcod__pactfix"\n ],\n "non_actionable_file_update": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__redup",\n "subactor__platform"\n ],\n "roadmap_not_release": [\n "semcod__code2logic"\n ],\n "substantive_or_unverified": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__domd",\n "semcod__pactfix",\n "semcod__redup",\n "subactor__platform"\n ]\n }\n },\n "sample": [\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-007a432c09e33ae77b31",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "feat(tests): add tests for code analysis engine",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 12,\n "end": 12\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-041d83cf1bb5dc3b899d",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix string-concat issues (ticket-cdf62d0c)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 152,\n "end": 152\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-07b36978a72254ca951c",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.pyqual/pipeline.db); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .pyqual/pipeline.db",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n ".pyqual/pipeline.db"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 312,\n "end": 312\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-00590852c29ac35cfe4e",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (code2docs/project/dashboard.html); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update code2docs/project/dashboard.html",\n "target": {\n "paths": [\n "code2docs/project/dashboard.html"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "code2docs/project/dashboard.html"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 372,\n "end": 372\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-023fcbd1900e940d5196",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (tests/project/analysis.json); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update tests/project/analysis.json",\n "target": {\n "paths": [\n "tests/project/analysis.json"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "tests/project/analysis.json"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 678,\n "end": 678\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-32b6196132311a07042d",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Update TICKET",\n "target": {\n "paths": [],\n "symbols": [\n "TICKET"\n ],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 915,\n "end": 915\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0480b5421d7c5547f189",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix ai-boilerplate issues (ticket-7de2f0bc)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-7"\n ],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 226,\n "end": 226\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-18b8460f056f069bcc61",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "fix: repair syntax errors and module-level definitions",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 11,\n "end": 11\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-1517319ed93be089166f",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix wildcard-imports issues (ticket-c9e8e515)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 126,\n "end": 126\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-122bda82ce2140c4257f",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.gitignore); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .gitignore",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.30"\n ]\n },\n "trackedPathOwners": [\n ".gitignore"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 76,\n "end": 76\n }\n },\n "metadata": {\n "version": "3.0.30",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-047a98d95499e06a933b",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (project/project.yaml); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update project/project.yaml",\n "target": {\n "paths": [\n "project/project.yaml"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "project/project.yaml"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 538,\n "end": 538\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-037289616a91154777a0",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (tests/project/project.yaml); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update tests/project/project.yaml",\n "target": {\n "paths": [\n "tests/project/project.yaml"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "tests/project/project.yaml"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 411,\n "end": 411\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-3f10ab6e2d79275e2202",\n "stratum": "symbol:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (TODO.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update TODO.md",\n "target": {\n "paths": [],\n "symbols": [\n "TODO"\n ],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "TODO.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 305,\n "end": 305\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0c50ef140dfdcaec5137",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix llm-generated-code issues (ticket-3dd60300)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-3"\n ],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 244,\n "end": 244\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-aa77ec5c1a453d43e224",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "docs: regenerate documentation",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 8,\n "end": 8\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-153a9eedc9a3badc2543",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix relative-imports issues (ticket-b5156dbd)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 143,\n "end": 143\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-12327418fe16f96aa3e8",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.gitignore); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .gitignore",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n ".gitignore"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 808,\n "end": 808\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0683d30858be70c27880",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (code2docs/project/context.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update code2docs/project/context.md",\n "target": {\n "paths": [\n "code2docs/project/context.md"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "code2docs/project/context.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 586,\n "end": 586\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0398d74e08f68b09acfe",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (tests/project/dashboard.html); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update tests/project/dashboard.html",\n "target": {\n "paths": [\n "tests/project/dashboard.html"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "tests/project/dashboard.html"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 430,\n "end": 430\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-913277007c6044bb88bf",\n "stratum": "symbol:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (CHANGELOG.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update CHANGELOG.md",\n "target": {\n "paths": [],\n "symbols": [\n "CHANGELOG"\n ],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "CHANGELOG.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 303,\n "end": 303\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-1356c7ab3e3a12a78f1d",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix relative-imports issues (ticket-80fa29e7)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-80"\n ],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 145,\n "end": 145\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-dd5e1cd15a4dea921111",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "docs(docs): add markdown output",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 6,\n "end": 6\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-1907d230d65dd07b5ba5",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix unused-imports issues (ticket-e0f2ff98)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 148,\n "end": 148\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-14ec3463be6026cb6c61",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (code2docs/templates/readme.md.j2); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update code2docs/templates/readme.md.j2",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.31"\n ]\n },\n "trackedPathOwners": [\n "code2docs/templates/readme.md.j2"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 64,\n "end": 64\n }\n },\n "metadata": {\n "version": "3.0.31",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0d270ce5476cbd971d60",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Initial project structure",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3334,\n "end": 3334\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0738cc3774b9ec8ddfb6",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "**Setup**: Updated setup.py and pyproject.toml with new name",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2935,\n "end": 2935\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-04f9cc09cd33d1d0811e",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix relative-imports issues (ticket-f36da736)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 1376,\n "end": 1376\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-033e144a42ed113b5de4",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (debug/.code2flow_cache/__init___563e1960e3f8fe02.pkl); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "update debug/.code2flow_cache/__init___563e1960e3f8fe02.pkl",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3223,\n "end": 3223\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-25c546008701d419870f",\n "stratum": "none:remove",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "remove",\n "text": "**`optimization/`** (1590L dead code) β€” 4 files, zero external imports",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2915,\n "end": 2915\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Removed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0362f0aa535e6aa4d408",\n "stratum": "none:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (test_prompt/root/analysis.toon); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update test_prompt/root/analysis.toon",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [\n "test_prompt/root/analysis.toon"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2342,\n "end": 2342\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-1326ad7579fd87e571b4",\n "stratum": "path:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "`examples/litellm/` β€” code2llm + LiteLLM Python automation",\n "target": {\n "paths": [\n "examples/litellm"\n ],\n "symbols": [\n "LiteLLM"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2863,\n "end": 2863\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-5a7c0208748441b0ed4b",\n "stratum": "path:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "LLMPromptExporter now outputs `context.md` by default",\n "target": {\n "paths": [\n "context.md"\n ],\n "symbols": [\n "context.md",\n "LLMPromptExporter"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3071,\n "end": 3071\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-69fccb36d67f6aa41e3d",\n "stratum": "path:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "`_SKIP_DIR_NAMES` blanket-excluded any directory named exactly `lib`, `lib64`, `include`, `bin`, or `share` from analysis, regardless of location. These are common legitimate source directory names (Ruby gems keep all source in `lib/`, PlatformIO/Arduino firmware projects keep custom libraries in `lib/`, C/C++ projects keep headers in `include/`, Node packages ship CLI entrypoints in `bin/`), so real code was silently dropped from the analysis. The entries were also redundant: virtualenv directories are already fully pruned via the `venv`/`.venv`/`env`/`.env` entries, and `site-packages` remains excluded directly.",\n "target": {\n "paths": [\n "bin",\n "lib"\n ],\n "symbols": [\n "_SKIP_DIR_NAMES",\n "bin",\n "CLI",\n "env",\n "include",\n "lib",\n "lib64",\n "PlatformIO",\n "share",\n "venv"\n ],\n "tickets": [],\n "versions": [\n "0.5.170"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 104,\n "end": 110\n }\n },\n "metadata": {\n "version": "0.5.170",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0190963b4ae7a6521047",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.planfile/.koru/nfo-events.jsonl); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .planfile/.koru/nfo-events.jsonl",\n "target": {\n "paths": [\n ".planfile/.koru/nfo-events.jsonl"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.154"\n ]\n },\n "trackedPathOwners": [\n ".planfile/.koru/nfo-events.jsonl"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 324,\n "end": 324\n }\n },\n "metadata": {\n "version": "0.5.154",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-1b64c0434baadae69464",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (test_dynamic/root/context.md); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update test_dynamic/root/context.md",\n "target": {\n "paths": [\n "test_dynamic/root/context.md"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [\n "test_dynamic/root/context.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2319,\n "end": 2319\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-04b8e5da810f6edf8f04",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "`--format context` β€” generate context.md (LLM narrative)",\n "target": {\n "paths": [],\n "symbols": [\n "LLM"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3065,\n "end": 3065\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-2271f83cd10dedcdb834",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "**Structural Refactoring** β€” 9 high-CC functions split into focused helpers:",\n "target": {\n "paths": [],\n "symbols": [\n "CC"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2846,\n "end": 2846\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0e20ed711e7a07b20012",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Human-readable node IDs (e.g. `core__ProjectAnalyzer_analyze`) instead of hashes",\n "target": {\n "paths": [],\n "symbols": [\n "core__ProjectAnalyzer_analyze",\n "IDs"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2887,\n "end": 2887\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-004e32ce7a04dd631cc0",\n "stratum": "symbol:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (SUMR.json); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update SUMR.json",\n "target": {\n "paths": [],\n "symbols": [\n "SUMR"\n ],\n "tickets": [],\n "versions": [\n "0.5.121"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 998,\n "end": 998\n }\n },\n "metadata": {\n "version": "0.5.121",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-80fca22b9324bf837b62",\n "stratum": "symbol:remove",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "remove",\n "text": "**`visualizers/`** (150L dead code) β€” never imported from CLI or other modules",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2916,\n "end": 2916\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Removed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-018dece31f6435cdc31f",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix unused-imports issues (ticket-660b3f81)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-660"\n ],\n "versions": [\n "0.1.10"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 578,\n "end": 578\n }\n },\n "metadata": {\n "version": "0.1.10",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0f4c94d2db19355291f2",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Modules, imports, signatures, type information",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3050,\n "end": 3050\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-18617cda6e84a813b11f",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Purpose: \\"understand the system to rebuild it\\"",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3072,\n "end": 3072\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-052def3dac8407406f1d",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix string-concat issues (ticket-e62394c5)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 1450,\n "end": 1450\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-03809423828c9bd21d76",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (context.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update context.md",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [\n "calls_output/context.md",\n "context.md",\n "project/batch_1/context.md",\n "project/context.md",\n "project/root/context.md",\n "project/test_python_only_examples/context.md",\n "project_calls_test/context.md",\n "test_dynamic/batch_1/context.md",\n "test_dynamic/context.md",\n "test_dynamic/root/context.md",\n "test_dynamic2/batch_1/context.md",\n "test_dynamic2/context.md",\n "test_dynamic2/root/context.md",\n "test_metrics/batch_1/context.md",\n "test_metrics/context.md",\n "test_metrics/root/context.md",\n "test_prompt/batch_1/context.md",\n "test_prompt/context.md",\n "test_prompt/root/context.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2242,\n "end": 2242\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0fa67f02b2b3bc99ea0c",\n "stratum": "none:test",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "test",\n "text": "all tests passing (17/17)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3122,\n "end": 3122\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-1cdb3440bf24066341af",\n "stratum": "path:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "`examples/shell-llm/` β€” code2llm + aider / llm / sgpt integration",\n "target": {\n "paths": [\n "examples/shell-llm"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2862,\n "end": 2862\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-6bc960ae574072f22679",\n "stratum": "path:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "**Renamed `llm_prompt.md` β†’ `context.md`** β€” LLM narrative context",\n "target": {\n "paths": [\n "context.md",\n "llm_prompt.md"\n ],\n "symbols": [\n "context.md",\n "LLM",\n "llm_prompt.md"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3070,\n "end": 3070\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-040ee3f3a2db29a5ebac",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Keyword matching with weighted scoring",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 122,\n "end": 122\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-002748ad2ef518479544",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "refactor(goal): code analysis engine",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 13,\n "end": 13\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-9b3f62f06c9e4d937f81",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Parallel processing pickle compatibility issues",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 189,\n "end": 189\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-0d8aef8cc675a876443d",\n "stratum": "none:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Integration with Git for diff analysis",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 217,\n "end": 217\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.4.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-04fd361ca057623214db",\n "stratum": "symbol:add",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "add",\n "text": "[ ] Support for additional languages (JavaScript, TypeScript)",\n "target": {\n "paths": [],\n "symbols": [\n "JavaScript",\n "TypeScript"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 213,\n "end": 213\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.3.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-08f42da84f60807ed95c",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "refactor(goal): CLI interface improvements",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 14,\n "end": 14\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-234fb71d07ff9a0ef1a0",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Import errors in CLI module",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 187,\n "end": 187\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-061661c552d47775aa89",\n "stratum": "symbol:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Custom pattern definition via YAML",\n "target": {\n "paths": [],\n "symbols": [\n "YAML"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 218,\n "end": 218\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.4.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-06bbe4e218e0fc383199",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Configurable include/exclude patterns",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 104,\n "end": 104\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-079941d830c0897d4138",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "feat(goal): deep code analysis engine with 7 supporting modules",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 5,\n "end": 5\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-fe53dd76398239df8c40",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Attribute mismatches between models and exporters",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 188,\n "end": 188\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-1823c8f942da75202a99",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (debug/.code2flow_cache/__init___092c164e1ea3ed2a.pkl); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "update debug/.code2flow_cache/__init___092c164e1ea3ed2a.pkl",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.1"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 72,\n "end": 72\n }\n },\n "metadata": {\n "version": "0.2.1",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-1acd7ec0e5b03bd166f3",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Complete API documentation",\n "target": {\n "paths": [],\n "symbols": [\n "API"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 174,\n "end": 174\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-11b35738afd546050d83",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Enhanced type hints for better IDE support",\n "target": {\n "paths": [],\n "symbols": [\n "IDE"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 183,\n "end": 183\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-402ce8711ede42fa1de2",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "FlowEdge attribute access (condition -> conditions)",\n "target": {\n "paths": [],\n "symbols": [\n "FlowEdge"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 190,\n "end": 190\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-198fdb6a3f363a257f3b",\n "stratum": "symbol:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] VS Code extension",\n "target": {\n "paths": [],\n "symbols": [\n "VS"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 212,\n "end": 212\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.3.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-0ba858ac3aa35d64a4df",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "**Pipeline Integration (4a-4e)**",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 133,\n "end": 133\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-1b2f48d6897f60cd0567",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Refactored monolithic flow.py into modular package structure",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 181,\n "end": 181\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-259a2416825cfdf8df5a",\n "stratum": "none:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Advanced pattern detection (factory, singleton, observer)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 210,\n "end": 210\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.3.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-218b12b8bfb2e02d90a4",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Automatic PNG generation from Mermaid files",\n "target": {\n "paths": [],\n "symbols": [\n "PNG"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 154,\n "end": 154\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-45ba4613581ef189a617",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated setup.py for PyPI publication readiness",\n "target": {\n "paths": [],\n "symbols": [\n "PyPI"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 184,\n "end": 184\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-436b19b2fdc1c36f80e4",\n "stratum": "symbol:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Performance optimizations for 100k+ LOC projects",\n "target": {\n "paths": [],\n "symbols": [\n "LOC"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 226,\n "end": 226\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 1.0.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-0d784351fc177548b285",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Cross-language fuzzy matching",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 141,\n "end": 141\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-2b6233f63df1c1d90ce8",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "feat(config): deep code analysis engine with 6 supporting modules",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 4,\n "end": 4\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-03c6c12104e1588e73c9",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Pattern-based file inclusion/exclusion",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 82,\n "end": 82\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-006c4c43eb21d009b3f5",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Improved error handling in command detection",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.41"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 55,\n "end": 55\n }\n },\n "metadata": {\n "version": "2.2.41",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-1f28ff4213e6819e9c67",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Resolved build issues with package versioning",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.50"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 42,\n "end": 42\n }\n },\n "metadata": {\n "version": "2.2.50",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-06ea63574a858804df0a",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "**Bundler**: Ruby gem management",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 120,\n "end": 120\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Supported Parsers"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-dcdf05e948c6d085ad37",\n "stratum": "path:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for JavaScript/Node.js projects (package.json, npm scripts)",\n "target": {\n "paths": [\n "JavaScript/Node.js"\n ],\n "symbols": [\n "JavaScript"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 70,\n "end": 70\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-56dbf101a0a6cd4eede1",\n "stratum": "path:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Configuration file support (`.domd.yaml`)",\n "target": {\n "paths": [\n ".domd.yaml"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Roadmap"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 209,\n "end": 209\n }\n },\n "metadata": {\n "version": "Roadmap",\n "category": "Upcoming Features (v0.2.0)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-22e184819c81a9506b1e",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Comprehensive CLI interface with dry-run mode",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 80,\n "end": 80\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-9ca67cc23d78bc49f158",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated version to 2.2.41 for PyPI publication",\n "target": {\n "paths": [],\n "symbols": [\n "PyPI"\n ],\n "tickets": [],\n "versions": [\n "2.2.41"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 54,\n "end": 54\n }\n },\n "metadata": {\n "version": "2.2.41",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-346e0c2677e96bb808a5",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "**JavaScript**: package.json scripts, npm/yarn/pnpm installations",\n "target": {\n "paths": [],\n "symbols": [\n "JavaScript"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 112,\n "end": 112\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Supported Parsers"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-083e44ba3563c8ccdd84",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for Docker (Dockerfile, docker-compose.yml)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 73,\n "end": 73\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-7d67b9be120a51f35315",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Enhanced documentation structure and readability",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.41"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 56,\n "end": 56\n }\n },\n "metadata": {\n "version": "2.2.41",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-22fe6e6bf391de6da44d",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Interactive fix mode",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Roadmap"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 212,\n "end": 212\n }\n },\n "metadata": {\n "version": "Roadmap",\n "category": "Upcoming Features (v0.2.0)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-087c77659da9ca4f8510",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Discussions: https://github.com/wronai/domd/discussions",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Support"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 243,\n "end": 243\n }\n },\n "metadata": {\n "version": "Support",\n "category": "Long-term Goals (v1.0.0+)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-303bf9b297fc5636d210",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for build systems (Makefile, CMakeLists.txt, Gradle, Maven)",\n "target": {\n "paths": [],\n "symbols": [\n "CMakeLists"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 72,\n "end": 72\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-9702895f07211c45762c",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Stable API",\n "target": {\n "paths": [],\n "symbols": [\n "API"\n ],\n "tickets": [],\n "versions": [\n "Roadmap"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 226,\n "end": 226\n }\n },\n "metadata": {\n "version": "Roadmap",\n "category": "Long-term Goals (v1.0.0+)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-2d3bb5683e287b5653b2",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "**0.0.1** - Project setup and structure",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.0.1",\n "Version"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 159,\n "end": 159\n }\n },\n "metadata": {\n "version": "Version",\n "category": "Added in 0.0.1"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-24715491b42e23c0333b",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Suggested fix actions for common issues",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 128,\n "end": 128\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Output Features"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-157440dc7139fcbb686d",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Type hints throughout codebase",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 95,\n "end": 95\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Technical Details"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-39c81dc2ec39b325b244",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for other languages (PHP, Ruby, Rust, Go)",\n "target": {\n "paths": [],\n "symbols": [\n "PHP"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 75,\n "end": 75\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-bac803460974b381a72c",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "`domd --format json` - JSON output",\n "target": {\n "paths": [],\n "symbols": [\n "JSON"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 106,\n "end": 106\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Example Commands"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-419965defb31b2acbbd5",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "**2.2.41** - Web interface and documentation improvements",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.41",\n "Version"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 157,\n "end": 157\n }\n },\n "metadata": {\n "version": "Version",\n "category": "Added in 0.0.1"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-4b2d992b057d695b58be",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fixed version inconsistency across the codebase",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.50"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 41,\n "end": 41\n }\n },\n "metadata": {\n "version": "2.2.50",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-23bc61d3c447b474697e",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Code formatting with Black",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 138,\n "end": 138\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Quality Assurance"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-45f150ec71926e19fc4b",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "CI/CD pipeline configuration",\n "target": {\n "paths": [],\n "symbols": [\n "CD",\n "CI"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 86,\n "end": 86\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-06b81bb57751459895c4",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Multi-language support for 20+ formats",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 50,\n "end": 50\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-138ace557665dca1b887",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated git commit helper",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 62,\n "end": 62\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-0d452579f528cb0ab62a",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Missing fix comments for bash analysis",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 31,\n "end": 31\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-03b4de2c7477f55e32f4",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Docker sandbox testing documentation",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 42,\n "end": 42\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Improved"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-1d0f0c2527f1fa778a7d",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Share via URL feature",\n "target": {\n "paths": [],\n "symbols": [\n "URL"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 48,\n "end": 48\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-4fecb38757995b6a40c3",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated PYPI.md documentation",\n "target": {\n "paths": [],\n "symbols": [\n "PYPI"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 12,\n "end": 12\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-72529c9f2e1377fcbaac",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "E2E test stability improvements",\n "target": {\n "paths": [],\n "symbols": [\n "E2E"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 33,\n "end": 33\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-6d99ee5393b0a775d452",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "API documentation with all endpoints (`/api/analyze`, `/api/health`, `/api/snippet`)",\n "target": {\n "paths": [],\n "symbols": [\n "API"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 39,\n "end": 39\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Improved"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-06bfbedc79c4aa6604e8",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "History tracking for all fixes",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 46,\n "end": 46\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-1953c1c87e68cf630253",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Refactored Docker Compose and Kubernetes analyzers",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 11,\n "end": 11\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-35808c1e9b8eb40dc3d3",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Basic syntax highlighting",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 56,\n "end": 56\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-0f187af78faebbbbf9b9",\n "stratum": "none:release",\n "label": "non_actionable_file_summary",\n "rationale": "Opaque file-count bookkeeping provides no behavior to ground.",\n "action": "release",\n "text": "chore: update 6 files",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 93,\n "end": 93\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "From Source"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-53b2e841c946a1b0148c",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "refactor: introduce new DSL (refactoring with new DSL)",\n "target": {\n "paths": [],\n "symbols": [\n "DSL"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 90,\n "end": 90\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "From Source"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-f4076a9818a0c35fb0fe",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated Playwright E2E test configuration",\n "target": {\n "paths": [],\n "symbols": [\n "E2E"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 17,\n "end": 17\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-a6ab4708788d7fc9c56b",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Initial UI responsiveness issues",\n "target": {\n "paths": [],\n "symbols": [\n "UI"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 55,\n "end": 55\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-0d1456c0762fb6678aae",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Jenkinsfile support for pipeline analysis",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 21,\n "end": 21\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-2a5ac33f3fed647982db",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated sandbox test scripts",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 61,\n "end": 61\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-477dbb5b08683c4e4342",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Clear input functionality",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unr\n\n... [truncated - file too large]", "is_subdir": true}, {"name": "AI-Codex.md", "rel_path": "ticket-001/AI-Codex.md", "path": "ticket-001 / AI-Codex.md", "size": "797B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI Agent)\n\n- **Ticket**: ticket-001\n- **Status**: DONE\n\n## Assigned Instructions\n\nPrzygotowaΔ‡ repozytorium w organizacji `semcod`, tworzΔ…c wyΕ‚Δ…cznie obowiΔ…zkowy bootstrap z `wellmanifest/new-project` oraz katalog `docs/`.\n\n## Implementation Plan\n\n1. ZweryfikowaΔ‡ zasady i wymagane pliki.\n2. UtworzyΔ‡ minimalny bootstrap w repozytorium docelowym.\n3. ZweryfikowaΔ‡ strukturΔ™, stan GitHub i Docker.\n4. ZatrzymaΔ‡ pracΔ™ przed tworzeniem kodu i oczekiwaΔ‡ na akceptacjΔ™ uΕΌytkownika.\n\n## Actual Changes Made\n\n- Utworzono wymagane dokumenty projektu i ticketu.\n- Dodano wymagane pliki Docker, skrypty projektowe i szablony.\n- Utworzono pusty katalog `docs/`.\n\n## Blockers & Open Items\n\n- Silnik Docker musi zostaΔ‡ uruchomiony przed walidacjΔ… konfiguracji kontenerowej.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-017/README.md", "path": "ticket-017 / README.md", "size": "3.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 017: Audit and repair confirmed todo2code errors\n\n- **ID**: ticket-017\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-08-01\n\n## Goal and scope\n\nAudit the current `todo2code` workspace, reproduce concrete failures and repair\nonly defects confirmed by tests or deterministic before/after evidence. Preserve\nthe concurrent baseline and keep implementation outside this ticket.\n\nInitial confirmed candidates are:\n\n- `t2c pipeline --help` executes a pipeline and writes artifacts instead of\n displaying help or returning a non-mutating usage result;\n- Polish prohibition wording such as `Agentowi zabrania siΔ™ ...` can be assigned\n positive polarity by documentation extraction and create a false\n `CONFLICTING_INTENT` against an equivalent TODO prohibition;\n- commit `1ebad96` (published concurrently while this plan was being prepared)\n implements shared Markdown path resolution and `create` versus `modify`\n planning; it needs independent validation for correctness, bounds and\n regressions before this ticket relies on it.\n- the repository needs reproducible Docker E2E environments: a fast core suite\n and a full language-toolchain suite with stable `T2C-E2E-*` failure codes.\n\nThe untracked `nlp2uri.yaml` and all unrelated worktree changes remain outside\nthis ticket unless a test proves they are required for one of the defects above.\n\n## Acceptance criteria\n\n- [x] AC-01: A human approves this understanding and checklist before source edits.\n- [x] AC-02: Concurrent baseline commit `1ebad96` is reviewed and not overwritten\n or attributed to this ticket.\n- [x] AC-03: Every repaired failure has a focused regression test and a stable,\n actionable error or diagnostic code/message where applicable.\n- [x] AC-04: `pipeline --help` is demonstrably non-mutating.\n- [x] AC-05: Equivalent Polish prohibitions no longer create a false\n `CONFLICTING_INTENT`, without weakening genuine conflict detection.\n- [x] AC-06: Shared Markdown path resolution and `create`/`modify` plans are\n deterministic, repository-bounded and correct for existing, missing,\n ambiguous and escaping paths.\n- [x] AC-07: Full offline verification, gold evaluation and relevant examples\n pass in the project Docker environment.\n- [x] AC-08: A deterministic before/after run on the Governance Hub clears the\n identified false conflict and records any remaining diagnostics honestly.\n- [x] AC-09: Documentation, changelog and error-code references match the final\n behavior; no auto-apply, commit or push occurs without a separate request.\n\n- [x] AC-10: `make e2e-core` runs the deterministic core E2E gate in an isolated\n Docker image whose workspace agrees with `T2C_ROOT`.\n- [x] AC-11: `make e2e-full` adds Go, JDK 17, Rust and PHP, exercises all five SDK\n examples and does not silently skip the required Java adapter test.\n- [x] AC-12: E2E failures emit a documented stable code, failing step and\n remediation while preserving the underlying command output.\n\nBoth E2E suites passed on 2026-08-01. The full suite ran 318 tests with zero\nfailures and zero skips, both versioned gold benchmarks, all protocol smoke\nchecks and all five SDK examples.\n\n## Participants\n\n- Human participant: unresolved; no user-* file was created by this script.\n- Agent participant: [ai-codex.md](ai-codex.md)\n\n## Risks\n\n- The branch changed concurrently during planning; validation must pin and report\n the exact reviewed HEAD.\n- Generated `dist/` may not match source until an approved build is completed.\n- Large-repository path scans can introduce performance or ignore-scope\n regressions if their bounds are not tested.\n- A polarity fix that is too broad could hide real contradictions.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-016/README.md", "path": "ticket-016 / README.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 016: First-class PHP syntax evidence\n\n- **ID**: ticket-016\n- **Owner**: agent:codex\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nReplace the explicit PHP unsupported-language warning with deterministic,\nsource-grounded syntax facts without adding a Composer dependency to the core.\n\nRuntime implementation belongs under `src/` and `php/`; this directory holds\nonly the ticket contract and redacted evidence.\n\n## Acceptance criteria\n\n- [x] PHP namespace, imports, types, functions, methods and calls become facts.\n- [x] Source selection uses the repository ignore matcher and manifest cache.\n- [x] No matching files avoid starting PHP; missing PHP and parse errors fail open.\n- [x] The adapter is visible in config, manifests, `doctor` and the public API.\n- [x] A controlled external-repository A/B demonstrates the semantic effect.\n- [x] Full verification, both gold datasets and all examples pass.\n\n## Participants\n\n- Technical evidence and implementation: [`ai-codex.md`](ai-codex.md).\n- No human semantic decision is required; this ticket adds observed evidence.\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-015/README.md", "path": "ticket-015 / README.md", "size": "1.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 015: Preserve compound intent in code-change titles\n\n- **ID**: ticket-015\n- **Owner**: agent:codex\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nPrevent a secondary verb in a compound TODO from producing lossy and duplicated\ncode-change titles such as `Implement Implement ... and it ...`.\n\nRuntime implementation belongs under `src/`; this directory contains only the\nticket contract and redacted evidence.\n\n## Acceptance criteria\n\n- [x] A regression test reproduces the title emitted by the Koru PLF-003 flow.\n- [x] The title preserves both the leading action and the secondary clause.\n- [x] Ordinary concise object titles remain unchanged.\n- [x] Focused tests, the real deterministic fixture and all repository gates pass.\n\n## Participants\n\n- Technical evidence/fix owner: [`ai-codex.md`](ai-codex.md).\n- No human response is required; the source intent is unambiguous and unchanged.\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-014/README.md", "path": "ticket-014 / README.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 014: Distinguish path presence from implemented intent\n\n- **ID**: ticket-014\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nPrevent a TODO capability from becoming `aligned` merely because its declared\ntarget file already contains unrelated AST facts. Compare the semantic intent\n(action/object/topics/symbol) with evidence inside the target before claiming\nimplementation, then expose unresolved ambiguity to the appropriate human or\nagent instead of silently choosing.\n\nRuntime implementation belongs under `src/`; this directory contains only the\nticket contract and redacted evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: A real fixture reproduces the false alignment: retry/backoff aimed\n at an existing queue file produces no `PLANNED_NOT_IMPLEMENTED` plan.\n- [x] AC-02: Gold contains the existing-path/unrelated-capability case and a\n positive existing-path/implemented-capability control.\n- [x] AC-03: Path evidence alone cannot close a capability-bearing declaration;\n a symbol or sufficiently specific topic match is also required.\n- [x] AC-04: Ambiguous evidence abstains and names who must answer; runtime never\n edits a human-owned `user-*` record to manufacture consent.\n- [x] AC-05: Koru discovery creates tickets only for remaining grounded gaps,\n and re-analysis closes the targeted diagnostic after a verified patch.\n- [x] AC-06: Gold, full verification and cross-repository regression pass.\n\n## Participants\n\n- Human policy owner: `unresolved:human` only when ambiguity or autonomous-risk\n policy needs a decision.\n- Technical evidence/fix owner: [`ai-codex.md`](ai-codex.md).\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-013/README.md", "path": "ticket-013 / README.md", "size": "1.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 013: Compare qualified Live LLM models\n\n- **ID**: ticket-013\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nRun the same six-stage `require-llm` contract check against benchmark-qualified\nOpenRouter models and determine whether any is a better todo2code default than\nthe measured `google/gemini-3.6-flash` baseline.\n\nThis directory contains governance and redacted evidence only. Runtime code\nbelongs under `src/` and operational scripts under `scripts/` if a measured\nfailure requires an implementation change.\n\n## Acceptance criteria\n\n- [x] AC-01: Every candidate is currently available and advertises\n `structured_outputs`.\n- [x] AC-02: Gemini 3 Flash Preview receives a complete six-stage live attempt.\n- [x] AC-03: Codestral 2508 receives a complete six-stage live attempt.\n- [x] AC-04: DeepSeek V4 Pro receives a bounded live attempt; crossing the\n 900-second run budget is recorded as a failed candidate, not retried away.\n- [x] AC-05: Results compare stage success, fallback/degradation, latency,\n tokens and cost against Gemini 3.6 Flash.\n- [x] AC-06: The selected default or retained baseline is justified by measured\n evidence; no model is promoted from catalog metadata alone.\n- [x] AC-07: Documentation and validation gates pass before push to `main`.\n- [x] AC-08: Unrelated `nlp2uri.yaml` remains uncommitted.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-012/README.md", "path": "ticket-012 / README.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 012: Reliable live structured-output model\n\n- **ID**: ticket-012\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nReplace the opaque `openrouter/auto-beta` default with an explicit model that\nadvertises structured-output support, retain rejected-response metadata in\nstage audits, and make the live history include the run just recorded.\n\nExecutable implementation belongs under `src/` and `scripts/`; tests under\n`test/`. This directory contains governance and evidence only.\n\n## Acceptance criteria\n\n- [x] AC-01: The selected model is present in the current OpenRouter model API\n and advertises `structured_outputs`.\n- [x] AC-02: Invalid JSON or runtime-contract responses retain response ID,\n resolved model, provider, tokens and cost when OpenRouter supplied them.\n- [x] AC-03: NL, Markdown, documentation and communication stage failures\n propagate rejected-response metadata into their audits.\n- [x] AC-04: The persisted and rendered live history includes the current run\n without double-counting rewrites.\n- [x] AC-05: Offline tests cover invalid response metadata and current-history\n accounting.\n- [x] AC-06: Full verify, gold v1/v2 and SDK examples pass.\n- [x] AC-07: A paid six-stage `require-llm` run is attempted with the explicit\n model and its exact outcome is documented.\n- [x] AC-08: Documentation is updated and changes are pushed to `main` without\n committing unrelated `nlp2uri.yaml`.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-011/README.md", "path": "ticket-011 / README.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 011: AST-grounded NL symbol resolution\n\n- **ID**: ticket-011\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nResolve explicit NL symbol targets against observed AST declarations without\nguessing between modules. Make `AMBIGUOUS_REQUIREMENT` prescribe the exact field\nand candidate path that a human must add or correct.\n\nExecutable implementation belongs under `src/` and tests under `test/`. This\nticket directory contains only governance and evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: AST symbol declarations are indexed by normalized qualified and\n leaf aliases with their observed source paths.\n- [x] AC-02: A short symbol owned by one source path remains exact evidence.\n- [x] AC-03: A short symbol owned by several paths does not select all of them.\n- [x] AC-04: An explicit path or qualified symbol selects exactly one matching\n owner; a conflicting path does not create symbol evidence.\n- [x] AC-05: A not-yet-implemented symbol stays unresolved without being called\n ambiguous.\n- [x] AC-06: Ambiguity diagnostics list candidate paths and prescribe\n `target.path`; known `missingFields` prescribe concrete edits.\n- [x] AC-07: File names and all-caps prose are not emitted as implicit code\n symbols, while explicit backticked/qualified symbols remain supported.\n- [x] AC-08: Gold v2 includes unique, ambiguous-hard-negative and explicit-path\n symbol cases with separate exact-target accounting.\n- [x] AC-09: Full verification, gold v1/v2 and all SDK examples pass.\n- [x] AC-10: Documentation is updated and the completed change is pushed to\n `main` without committing unrelated `nlp2uri.yaml`.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n\n## Result\n\nNL↔AST symbol evidence is now limited to a unique observed owner or an\nexplicitly selected path. Ambiguous and conflicting symbols abstain and produce\nan actionable diagnostic with candidate paths. The implementation was\ncommitted and published to `main` as `25df74a`.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-010/README.md", "path": "ticket-010 / README.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 010: Incremental extraction cache\n\n- **ID**: ticket-010\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nCache deterministic AST extraction and Markdown chunking by source content hash\nso repeated analysis of large repositories does not repeat unchanged work.\nProvider responses remain live and are never stored by this cache.\n\nExecutable implementation belongs under `src/` and tests under `test/`. This\nticket directory contains only governance and evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: TypeScript AST entries are cached per source path and content hash.\n- [x] AC-02: External AST adapters are cached per complete language manifest,\n executable selection and file-size limit.\n- [x] AC-03: Documentation chunks are cached per path, content hash, chunk size\n and algorithm version without caching LLM responses.\n- [x] AC-04: Cache entries have a versioned envelope, validated namespace/key\n and atomic same-directory writes.\n- [x] AC-05: Missing, corrupt, invalid and unwritable cache state fails open to\n authoritative extraction; warning-bearing external results are not retained.\n- [x] AC-06: Cold/warm output is identical and changing one input invalidates\n only its content-addressed entry.\n- [x] AC-07: Cache telemetry is returned outside Intent DSL and does not alter\n graph records or fingerprints.\n- [x] AC-08: Measurements cover todo2code and at least two other repositories.\n- [x] AC-09: Full repository verification and gold/example gates pass.\n- [x] AC-10: Documentation is updated and the completed change is pushed to\n `main` without unrelated worktree changes.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n\n## Result\n\nDeterministic extraction now reuses validated content-addressed entries while\nsource records remain authoritative. A warm run avoids unchanged TypeScript\nparsing and successful external-toolchain startup; Markdown reuse stops before\nthe provider boundary. The implementation was committed as `f1d9334`.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-009/README.md", "path": "ticket-009 / README.md", "size": "2.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 009: Canonical structured-response contracts\n\n- **ID**: ticket-009\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nGenerate the OpenRouter JSON Schema and the TypeScript runtime parser from one\ncanonical response contract at every production LLM boundary. Provider output\nmust fail closed instead of being silently coerced into a different intent.\n\nExecutable implementation belongs under `src/` and tests under `test/`. This\nticket directory contains only governance and evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: A reusable typed contract builder emits JSON Schema and parses the\n same supported constraints at runtime.\n- [x] AC-02: Every production structured OpenRouter response is parsed through\n its canonical contract before fields are read.\n- [x] AC-03: Unknown/missing properties, invalid enums, bounds, patterns and\n uniqueness constraints fail with a precise response path.\n- [x] AC-04: Grounding and cross-field semantic checks remain a separate,\n explicit validation stage.\n- [x] AC-05: Published document response schema is generated from and tested\n against its runtime contract.\n- [x] AC-06: Invalid provider output is retried or visibly degraded according\n to the stage policy; it is never silently normalized into another intent.\n- [x] AC-07: Full repository verification and gold/example gates pass.\n- [x] AC-08: Documentation records the contract boundary and measured drift.\n- [x] AC-09: The completed change is committed and pushed to `main`.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n\n## Result\n\nSeven production OpenRouter boundaries now use `chatStructuredWithMetadata`;\nthe repository gate found zero raw JSON calls outside the client. Provider\nschema and runtime parsing share one typed contract, while grounding remains a\nseparate evidence check. The implementation was published as `d0fc143`.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-008/README.md", "path": "ticket-008 / README.md", "size": "2.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 008: Cross-repository governance standard hardening\n\n- **ID**: ticket-008\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nUpstream the measured todo2code governance findings into\n`wellmanifest/new-project`: keep human and agent intent separately typed, make\nmissing ownership explicit, prevent executable code in ticket directories and\navoid collisions between ticket indexes and generated analysis artifacts.\n\nImplementation belongs to the governance hub's policies, templates, scripts\nand tests. This ticket directory contains only governance and captured evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: The target standard never auto-creates `user-*` for an agent.\n- [x] AC-02: Agent plans carry explicit participant ID, role, ticket and typed\n sections understood by todo2code.\n- [x] AC-03: Missing human ownership remains `unresolved:human` and produces a\n non-empty response route during communication analysis.\n- [x] AC-04: Ticket indexing uses `project/TICKETS.md` and preserves an\n analysis-owned `project/README.md`.\n- [x] AC-05: A second ticket is rejected while an unfinished ticket exists.\n- [x] AC-06: Traversal and malformed CLI arguments fail closed.\n- [x] AC-07: Ticket directories are documented as governance/evidence only.\n- [x] AC-08: Isolated shell tests and the todo2code integration check pass.\n- [x] AC-09: Changes are committed and pushed to both `main` branches.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- Upstream commit: `wellmanifest/new-project@72e5f6c`\n\n## Conclusion\n\nThe upstream 0.6.0 standard now matches the ownership behavior measured by\ntodo2code. Its generated agent plan is parsed as agent intent, it invents no\nhuman participant, and the missing approval owner is routed as\n`unresolved:human`. The hub itself remains free of task tickets.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-007/README.md", "path": "ticket-007 / README.md", "size": "2.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 007: Explicit unresolved response routing\n\n- **ID**: ticket-007\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nEnsure every communication divergence names a concrete respondent or an\nexplicit unresolved-role sentinel. The measured regression case is ticket-006:\nan agent-only ticket correctly requires a human response but currently emits\nan empty `responseRequiredFrom` array.\n\nExecutable implementation belongs in `src/`, regression coverage in `test/`\nand public behavior documentation in `docs/`. This directory contains only\ngovernance, decisions, logs and captured evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: `responseRequiredFrom` is never empty for a communication issue.\n- [x] AC-02: A missing human respondent is represented as\n `unresolved:human`; a missing agent respondent as `unresolved:agent`.\n- [x] AC-03: Known participant IDs retain priority and are never replaced by a\n sentinel.\n- [x] AC-04: Rendering and diagnostic projection expose the sentinel without\n converting it into an identity claim.\n- [x] AC-05: Tests reproduce an agent-only ticket and cover both resolved and\n unresolved routing.\n- [x] AC-06: No `user-*` file or participant registry entry is created by the\n agent.\n- [x] AC-07: Full offline verification and gold evaluation pass.\n- [x] AC-08: No executable source is stored under `project/ticket-007`.\n\n## Non-goals\n\n- Guessing a person from repository ownership, display names or Git history.\n- Dispatching an external notification.\n- Creating human-owned governance evidence from the agent process.\n- Changing communication severity or semantic conflict detection.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Approval\n\n- **Decision**: approved to continue subsequent todo2code tickets\n- **Evidence**: current user instruction\n- **Date**: 2026-07-31\n\nThe agent records the existence of the instruction but does not materialize it\nas human-authored participant content.\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Conclusion\n\nIssue construction now fills an otherwise empty route with a role-specific\nsentinel. The real ticket-006 audit changed three human-required issues from an\nempty list to `unresolved:human`; no participant was inferred. Offline tests,\nboth gold versions and all five SDK examples pass.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-006/README.md", "path": "ticket-006 / README.md", "size": "3.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 006: Canonical structured-output conformance\n\n- **ID**: ticket-006\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nMake structured LLM responses fail with precise, auditable contract diagnostics\nand remove drift between the response schema sent to a provider, the published\nJSON Schema and runtime validation. Start with the experimental semantic\nreranker because ticket-005 measured three different provider violations on a\ntracked repository.\n\nExecutable implementation belongs in `src/`, regression coverage in `test/`\nand optional live reproducers in `scripts/research/`. This ticket directory is\nlimited to governance, decisions, logs and captured evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: One canonical structural definition supplies or verifies the\n provider response schema, published JSON Schema and TypeScript-facing shape.\n- [x] AC-02: Runtime validation reports the exact failing property and response\n identity without persisting source payloads or secrets.\n- [x] AC-03: Wrong envelope names, missing decisions, string/percent confidence,\n unknown fields and invalid verdict/reason combinations fail closed.\n- [x] AC-04: No implicit coercion and no fallback to raw retrieval; any\n corrective retry is bounded, audited and retains both response identities.\n- [x] AC-05: Offline tests cover conforming and non-conforming providers without\n network access.\n- [x] AC-06: A clean tracked-repository live check compares at least two\n explicitly identified provider/model routes before any production retention.\n- [x] AC-07: The deterministic linker, CLI, MCP and A2A remain unchanged unless\n the quality and privacy gates pass.\n- [x] AC-08: Full verification, both gold versions, examples, dependency audit\n and smoke gates pass.\n- [x] AC-09: No executable source is stored under `project/ticket-006`.\n\n## Non-goals\n\n- Accepting provider output by renaming fields or coercing values.\n- Lowering evidence or citation requirements.\n- Enabling semantic reranking by default.\n- Editing a human-owned participant file from the agent process.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n- [`../ticket-005/audit.md`](../ticket-005/audit.md)\n\n## Approval\n\n- **Decision**: approved to investigate and continue subsequent todo2code\n tickets\n- **Evidence**: current user instruction\n- **Date**: 2026-07-31\n\nThe agent deliberately does not materialize that decision as a human-authored\nparticipant file. A human or trusted intake boundary must do so.\n\n## Conclusion\n\nThe conformance hardening is retained; semantic production enablement remains\nrejected. The provider schema, runtime validator and TypeScript shape now share\none internal definition, while full verification checks it against the\npublished result schema. Diagnostics identify the exact property plus provider,\nresolved model and response ID without retaining the raw response.\n\nNeither tested route met the contract. `qwen/qwen3.7-plus` produced three\ndifferent envelope/type violations in ticket-005.\n`qwen/qwen3.7-flash` added the forbidden property\n`response.decisions[0].decision`. Both failed before graph mutation. No\nreranker was exported or enabled.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-005/README.md", "path": "ticket-005 / README.md", "size": "4.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 005: Audited cross-language reranking\n\n- **ID**: ticket-005\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nEvaluate a two-stage cross-language linking path: semantic retrieval may create\nonly a bounded candidate list, while a separate structured reranker must cite\nrepository-owned evidence and may abstain. Retain a production change only when\nit closes the six current cross-language gold gaps, preserves every forbidden\npair and improves coverage on an additional tracked repository.\n\nExecutable implementation belongs in `src/` and regression coverage in\n`test/`. Optional experiment reproducers belong in `scripts/research/`.\nThis ticket directory is limited to governance, inputs, captured outputs,\ndecisions and logs.\n\nThe approved continuation adds a prerequisite communication audit: verify that\nthe governance-standard `user-*` and `ai-*` files are converted into distinct\nhuman/agent Intent DSL records, compare their intent, and identify the\nparticipant who must respond when scope, polarity or coverage diverges.\n\n## Acceptance criteria\n\n- [x] AC-01: Define a versioned candidate and reranker contract with explicit\n model/provider identity, score, cited record IDs and abstention reason.\n- [x] AC-02: Keep network/model calls outside the synchronous deterministic\n `linkIntentRecords` boundary and preserve the current offline default.\n- [x] AC-03: Candidate generation is bounded and cannot create a relation by\n itself.\n- [x] AC-04: The reranker accepts a candidate only with repository-owned\n evidence; unsupported, ambiguous and multi-module statements abstain.\n- [x] AC-05: Gold v2 cross-language recall rises from 0/6 to 6/6 while all six\n cross-language forbidden pairs and all existing hard negatives remain clean.\n- [ ] AC-06: A tracked repository outside the ticket-004 primary pair shows\n improved implementation coverage without a manually rejected new relation.\n- [ ] AC-07: Any dependency or provider is pinned, licensed, security-reviewed,\n cacheable and optional; no private or untracked source is transmitted.\n- [x] AC-08: Full verification, both gold versions, examples, dependency audit,\n CLI/MCP/A2A smoke and Docker validation pass.\n- [x] AC-09: If the quality boundary is not met, reject the candidate without a\n production semantic rule and preserve the measured failure.\n- [x] AC-10: No executable source is stored under `project/ticket-005`.\n- [x] AC-11: Governance-standard `user-*` and `ai-*` files are recognized\n without front matter, while ticket specifications and generated evidence are\n not misclassified as participant communication.\n- [x] AC-12: Communication analysis reports an explicit response owner for\n missing response, human-agent conflict and agent work outside the human\n request.\n\n## Non-goals\n\n- Growing the hand-written Polish dictionary.\n- Lowering the three-topic lexical floor.\n- Treating embedding similarity as implementation evidence.\n- Enabling provider-dependent behavior by default.\n- Choosing one module for a genuinely multi-module requirement.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user instruction to handle the next todo2code tickets and audit\n `user-*`/`ai-*` Intent DSL divergence\n- **Date**: 2026-07-31\n\n## Conclusion\n\nThe communication prerequisite is retained. Governance `user-*` and `ai-*`\nsections become distinct human/agent Intent DSL records, and each detected\ndivergence names the role and participant who must respond.\n\nThe semantic production candidate is rejected. Captured gold decisions satisfy\n6/6 expected cross-language pairs with zero forbidden pairs, but three live\nOpenRouter attempts on the clean tracked `subactor/platform` snapshot failed\nthe structured contract before any relation could be materialized. The\nprovider first omitted `decisions`, then returned `judgments`, and finally\nreturned an invalid non-numeric confidence. Consequently AC-06 and AC-07 were\nnot demonstrated. The deterministic linker remains unchanged, and the\nexperimental reranker is not exported from the package, CLI, MCP or A2A.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-004/README.md", "path": "ticket-004 / README.md", "size": "4.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 004: Language-independent topic matching\n\n- **ID**: ticket-004\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nReplace further growth of the hand-written Polish-to-English topic dictionary\nwith a reviewable language-independent matching path. Start from a multilingual\ngold benchmark, compare feasible strategies, and integrate only a strategy that\nimproves cross-language recall without weakening exact-target evidence or the\nprecision-oriented capability-topic boundary.\n\nThe primary measured repositories are `todo2code` and `subactor/platform`.\nThe unchanged seven-repository corpus from tickets 002 and 003 remains the\nregression corpus if a candidate implementation is retained.\n\n## Acceptance criteria\n\n- [x] AC-01: The existing known gap and at least five new cross-language cases\n cover multiple capabilities, inflections and hard negatives.\n- [x] AC-02: The benchmark reports cross-language positives separately from\n same-language capability-topic and exact-target quality.\n- [x] AC-03: At least two feasible strategies are evaluated for determinism,\n runtime/dependency cost, auditability, cacheability and offline behavior.\n- [x] AC-04: Any retained matcher carries explicit evidence in the relation\n basis and cannot silently masquerade as an exact token match.\n- [x] AC-05: A candidate is retained only if it closes the current known gap,\n preserves all hard negatives and leaves gold v1/v2 quality perfect.\n- [x] AC-06: The retained candidate improves aligned coverage on\n `subactor/platform` without reducing it on `todo2code`; otherwise the\n experiment closes without a production semantic change.\n- [x] AC-07: Full verification, SDK examples, smoke, dependency audit and\n Docker validation pass; the local Java skip is allowed only because required\n CI supplies JDK 17.\n- [x] AC-08: Commands, measurements, rejected approaches and remaining risks\n are preserved under this ticket and summarized in `docs/READINESS.md`.\n\n## Non-goals\n\n- Extending `POLISH_TOPIC_ALIASES` with another domain vocabulary batch.\n- Lowering the current three-topic floor merely to raise recall.\n- Sending source code or private/untracked repository content to a provider.\n- Making offline CI depend on a network model.\n- Treating semantic similarity as implementation evidence without recording\n its origin and score.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`audit.md`](audit.md)\n- [`benchmark.json`](benchmark.json)\n- [`scripts/research/evaluate-embedding-pairs.py`](../../scripts/research/evaluate-embedding-pairs.py)\n- [`minilm-results.json`](minilm-results.json)\n- [`e5-results.json`](e5-results.json)\n- [`e5-prefixed-results.json`](e5-prefixed-results.json)\n- [`scripts/research/rank-intent-graph-embeddings.py`](../../scripts/research/rank-intent-graph-embeddings.py)\n- [`platform-e5-ranking.json`](platform-e5-ranking.json)\n- [`platform-e5-reciprocal-ranking.json`](platform-e5-reciprocal-ranking.json)\n- [`iteration-01.md`](iteration-01.md)\n- [`iteration-01.json`](iteration-01.json)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user message `kontynuuj`, following the explicit recommendation\n to address matching beyond the hand-written dictionary\n- **Date**: 2026-07-31\n\n## Conclusion\n\nRaw multilingual embeddings are not safe enough to become graph evidence.\nMiniLM ranked 5/6 synthetic pairs correctly. E5 ranked 6/6, but its positive\nand negative score ranges overlap; on the tracked platform graph it proposed\ntwo new links and manual review rejected both. Reciprocal top-1 removed the\nfalse positives but added no coverage.\n\nNo production matcher was retained. The accepted library change is an explicit\ncross-language gold cohort with six known positive gaps and six gated nearby\nwrong modules. Full verification passed with 244 tests (243 pass, one local\nJDK skip), both gold versions, five SDKs, dependency audit, CLI/MCP/A2A and\nDocker smoke.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-003/README.md", "path": "ticket-003 / README.md", "size": "3.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 003: Residual changelog diagnostic audit\n\n- **ID**: ticket-003\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nAudit the `CHANGELOG_WITHOUT_IMPLEMENTATION` findings that remain after\nticket-002, classify a deterministic cross-repository sample, and change the\nlibrary only when the sample demonstrates one repeated false-positive class\nthat can be removed without treating unsupported release claims as evidence.\n\nThe unchanged corpus is:\n\n- `semcod/code2llm`\n- `semcod/domd`\n- `semcod/pactfix`\n- `semcod/code2logic`\n- `semcod/code2docs`\n- `semcod/redup`\n- `subactor/platform`\n\nExternal inputs remain detached tracked-only worktrees at the commits recorded\nby ticket-002.\n\n## Acceptance criteria\n\n- [x] AC-01: A current deterministic run is recorded for all seven repositories\n using tracked `18cc21b` plus the explicit ticket-002 diagnostic patch only.\n- [x] AC-02: A deterministic stratified sample covers every repository and at\n least 100 residual `CHANGELOG_WITHOUT_IMPLEMENTATION` findings.\n- [x] AC-03: Every sampled finding has a review label, rationale and enough\n source/target context to reproduce the classification.\n- [x] AC-04: A code change is attempted only for a false-positive class present\n in at least two repositories with at least 20 sampled examples; otherwise the\n hypothesis is rejected and the ticket closes without semantic changes.\n- [x] AC-05: A focused hard-negative regression is observed failing before any\n implementation change.\n- [x] AC-06: The unchanged corpus demonstrates an improvement in at least two\n repositories, with stable graph fingerprints and no loss in gold v2 quality.\n- [x] AC-07: Full verify, examples, smoke, dependency audit and Docker validation\n pass; the local Java skip remains allowed only because CI requires JDK.\n- [x] AC-08: Results, raw commands, changed files and the next ranked hypothesis\n are preserved under this ticket and summarized in `docs/READINESS.md`.\n\n## Non-goals\n\n- Broad capability-topic linking for changelog prose.\n- Suppressing old or unverifiable behavioral claims merely to lower counts.\n- Using an LLM to label the primary audit sample.\n- Mutating or reading untracked content from external repositories.\n- Combining unrelated semantic heuristics in one A/B result.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`audit.md`](audit.md)\n- [`sample.json`](sample.json)\n- [`scripts/research/audit-changelog-sample.mjs`](../../scripts/research/audit-changelog-sample.mjs)\n- [`iteration-01.md`](iteration-01.md)\n- [`iteration-01.json`](iteration-01.json)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user message `kontynuuj`, following the ticket-002 conclusion\n- **Date**: 2026-07-31\n\n## Conclusion\n\nThe evidence supports one narrow correction: exact `Update ` bookkeeping\nwithout behavioral wording is not an unsupported implementation claim. The\nchange removed 547 `CHANGELOG_WITHOUT_IMPLEMENTATION` findings and 188\nsecondary `UNLINKED_RECORD` warnings across five repositories. All seven graph\nfingerprints stayed identical, gold v2 stayed perfect and the full offline\nvalidation suite passed.\n\nThe 1,306 remaining findings are intentionally retained: 1,275 are substantive\nor unverified claims, 30 are roadmap entries and one is a file-summary entry.\nThe next ranked hypothesis is to model unchecked roadmap entries through\nexplicit lifecycle/extractor semantics in a separate ticket, rather than hide\nthem with another changelog text filter.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-002/README.md", "path": "ticket-002 / README.md", "size": "3.9KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 002: Cross-repository semantic hardening\n\n- **ID**: ticket-002\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nTest todo2code deterministically on a fixed, reviewable corpus of external\nrepositories, derive evidence-backed failure categories, and improve the\nlibrary one measured defect at a time.\n\nThe initial corpus is:\n\n- `semcod/code2llm`\n- `semcod/domd`\n- `semcod/pactfix`\n- `semcod/code2logic`\n- `semcod/code2docs`\n- `semcod/redup`\n- `subactor/platform`\n\nEvery repository run must use an isolated detached worktree at a recorded\ncommit. The benchmark must not modify an external repository or consume its\nprivate and untracked files.\n\n## Acceptance criteria\n\n- [x] AC-01: The baseline records repository commit, graph fingerprint, record\n and relation counts, topic status, implementation/documentation coverage,\n diagnostic counts, warnings and elapsed time for at least five external\n repositories.\n- [x] AC-02: Results use the same documented deterministic command and document\n selection policy, with repository-specific exceptions recorded explicitly.\n- [x] AC-03: At least one repeated semantic failure is demonstrated on external\n evidence and represented by a focused gold or unit regression test before\n its implementation changes.\n- [x] AC-04: Each library change is evaluated independently against gold v2 and\n the external corpus; improvements and regressions are both reported.\n- [x] AC-05: The selected improvement raises its target metric on at least two\n external repositories, or is rejected with a documented reason, without\n reducing gold precision/recall or introducing forbidden-pair violations.\n- [x] AC-06: `npm run verify`, relevant smoke tests and Docker validation pass;\n the Java test may only be skipped locally when the required CI job remains\n verified.\n- [x] AC-07: Conclusions, raw command output, changed files, remaining risks and\n follow-up candidates are preserved in this ticket.\n\n## Risks and mitigations\n\n- External worktrees may be dirty or contain secrets. Only detached tracked\n commits are analyzed; private and untracked files are excluded.\n- Repository sizes and document sets differ. Absolute counts are never\n compared without recording the input policy.\n- A broad synonym rule may raise recall by destroying precision. A hard\n negative is required before changing semantic matching.\n- Provider-dependent runs would make the baseline unstable and potentially\n costly. The primary corpus is offline; live LLM work is a separate result.\n- `project/README.md` is also generated by the current analysis workflow.\n Ticket indexing must be preserved or explicitly reconciled before running\n `project.sh`.\n- Parallel agents or builds can race on `dist/`. Validation must run from a\n stable worktree without another build writing the same output directory.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`baseline.md`](baseline.md)\n- [`baseline.json`](baseline.json)\n- [`iteration-01.md`](iteration-01.md)\n- [`iteration-01.json`](iteration-01.json)\n- [`iteration-02.md`](iteration-02.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user message `kontynuuj`\n- **Date**: 2026-07-31\n\n## Conclusion\n\nIteration 01 is accepted. It reduced false `review_required` findings on five\nexternal repositories without changing any graph fingerprint or gold metric.\nIteration 02 fixed a tracked-evidence false positive in the generated-analysis\nisolation gate while retaining the original untracked-input hard negative.\nThe next iteration should be a separate approved ticket: either broaden\ncross-language semantic evidence beyond the hand-written PLβ†’EN dictionary, or\nsample and classify the remaining 1,853 actionable changelog findings before\nchanging linker policy.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-001/README.md", "path": "ticket-001 / README.md", "size": "901B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 001: Bootstrap repozytorium todo2code\n\n- **ID**: ticket-001\n- **Owner**: semcod\n- **Status**: DONE\n- **Created**: 2026-07-29\n\n## Goal & Scope\n\nPrzygotowaΔ‡ repozytorium `semcod/todo2code` bez kodu aplikacji. Zakres obejmuje wyΕ‚Δ…cznie pliki wymagane przez `wellmanifest/new-project` oraz pusty katalog `docs/`.\n\n## Acceptance Criteria\n\n- [x] ObowiΔ…zkowe pliki bootstrapu znajdujΔ… siΔ™ w docelowym katalogu projektu.\n- [x] Istnieje katalog `docs/`.\n- [x] Nie utworzono kodu aplikacji ani plikΓ³w wykraczajΔ…cych poza wskazany zakres.\n- [x] UΕΌytkownik zaakceptowaΕ‚ opis intencji i `TODO.md`.\n- [x] Repozytorium `semcod/todo2code` istnieje na GitHubie.\n\n## Risks & Considerations\n\n- Walidacja Docker jest zablokowana, poniewaΕΌ silnik Docker nie dziaΕ‚a.\n- Zakres funkcjonalny i docelowa architektura nie sΔ… jeszcze okreΕ›lone; nie naleΕΌy ich zgadywaΔ‡.\n\n## Participants\n\n- `AI-Codex.md`\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-017/ai-codex.md", "path": "ticket-017 / ai-codex.md", "size": "3.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-017\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe user wants confirmed defects in `todo2code` repaired, not a speculative\nrewrite. Path-resolution and code-change planning work that was initially\nuncommitted was published concurrently as commit `1ebad96`; the first\nresponsibility is to review and validate that new baseline rather than duplicate\nor overwrite it. Three concrete defect candidates already have command or graph\nevidence: mutating `pipeline --help`, false Polish prohibition polarity, and\npotentially incomplete path/action planning behavior.\n\nSuccess means reproducible failing cases become passing regression tests while\nthe existing diagnostic schema stays stable and actionable. Pipeline success\nmust not be confused with zero blocking diagnostics.\n\n## Execution plan\n\n1. Wait for explicit human approval of this ticket and the root checklist.\n2. Run `project.sh` in safe workspace-analysis mode and inspect generated reports.\n3. Reproduce the three candidate defects with isolated fixtures and capture the\n baseline results.\n4. Review commit `1ebad96` and any subsequent branch movement, separating usable\n baseline behavior from defects without reverting unrelated work.\n5. Implement minimal fixes and focused tests for confirmed failures only.\n6. Audit the canonical diagnostic/error-code surface and make new failures\n machine-actionable without changing established codes unnecessarily.\n7. Run focused tests, full offline verification, gold datasets and examples in\n Docker.\n8. Re-run deterministic validation on the Governance Hub and compare diagnostics.\n9. Add isolated core/full Docker E2E images, Compose services, stable error codes\n and operator documentation; validate both environments.\n10. Update owned ticket evidence, TODO, docs and changelog with exact results.\n\n## Actual changes\n\n- Added the required missing governance bootstrap scripts copied verbatim from\n the Governance Hub.\n- Reviewed and preserved concurrent baseline `1ebad96`.\n- Made command-local help non-mutating before configuration and dispatch.\n- Extended deterministic Polish prohibition detection to active `zabrania`\n forms and covered both the text helper and documentation extraction.\n- Bounded the shared Markdown path resolver against absolute and parent escapes,\n including heading-derived scopes.\n- Verified focused tests, the full offline suite, gold v2/v1 and examples on the\n host and in the project Docker image.\n- Compared identical tracked Governance Hub snapshots before and after the fix:\n false `CONFLICTING_INTENT` 1 -> 0; total diagnostics remained 183 because the\n corrected requirement is now honestly reported as planned but unimplemented.\n- Refreshed the generated analysis from the current tracked-file overlay without\n consuming unrelated untracked `nlp2uri.yaml`.\n- Added and validated isolated Docker E2E `core` and full-toolchain suites with\n stable `T2C-E2E-*` failure codes. The full image includes the native linker\n needed by Cargo and finished with 318/318 tests, zero skips and five SDK\n examples.\n\n## Blockers\n\n- None. All ticket acceptance criteria are complete.\n\n## Concurrent baseline boundary\n\nThe following paths were modified before ticket-017 and published concurrently\nas commit `1ebad96`; they are baseline work, not changes made by this ticket:\n\n- `src/extractors/changelog.ts`\n- `src/extractors/markdown.ts`\n- `src/extractors/todo.ts`\n- `src/pipeline/run.ts`\n- `src/services/actions.ts`\n- `src/synthesis/code-change-plan.ts`\n- `test/code-change-plan.test.ts`\n- `test/markdown.test.ts`\n- `src/extractors/markdown-paths.ts`\n\nThe untracked `nlp2uri.yaml` remains unrelated and must not be edited.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-016/ai-codex.md", "path": "ticket-016 / ai-codex.md", "size": "585B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-016\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Add a dependency-free PHP helper and common-envelope adapter.\n2. Test positive facts, no-source skip, missing runtime and invalid syntax.\n3. Run an isolated before/after pipeline on a PHP-bearing semcod repository.\n4. Record exact evidence and run repository gates.\n\n## Responsibility boundary\n\nThe adapter records syntax observations only. It does not infer user intent or\nclaim that token parsing exposes every semantic property of a complete PHP AST.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-015/ai-codex.md", "path": "ticket-015 / ai-codex.md", "size": "595B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-015\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Pin the malformed compound-action title in a focused unit test.\n2. Preserve source text only when the inferred object visibly retains a leading\n imperative, signalling that a secondary verb was removed.\n3. Re-run the real retry/backoff fixture and validation gates.\n\n## Responsibility boundary\n\nThis is a deterministic rendering defect with an unchanged, explicit human\nintent. It is owned by the technical executor and requires no fabricated\n`user-*` response.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-014/ai-codex.md", "path": "ticket-014 / ai-codex.md", "size": "708B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-014\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Preserve the real retry/backoff reproduction as a gold negative.\n2. Separate file-location evidence from capability-implementation evidence.\n3. Require a semantic corroborator before an existing path closes a plan.\n4. Re-run Koru discovery and the cross-repository census.\n\n## Responsibility boundary\n\nThe agent can implement and test the fail-closed matcher. A human response is\nneeded only when two plausible implementations remain or when autonomous\nexecution policy would be broadened; the agent must not create or rewrite a\nhuman-owned declaration to resolve either case.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-013/ai-codex.md", "path": "ticket-013 / ai-codex.md", "size": "918B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-013\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Verify current structured-output support and prices.\n2. Run identical 6/6 Live checks for Gemini 3 Flash Preview, Codestral 2508\n and DeepSeek V4 Pro.\n3. Compare each result with the Gemini 3.6 Flash baseline.\n4. Retain or change the default only on complete measured evidence.\n\n## Outcome\n\nCodestral 2508 is the measured default. Gemini 3 Flash Preview is the fallback\ncandidate. DeepSeek V4 Pro is rejected for exceeding the complete-run budget.\nThe external-repository run additionally caused bounded Markdown batch\nconcurrency; no validation rule or schema was relaxed.\n\n## Safety\n\nThe user explicitly authorized live comparison. Each run keeps the existing\n$0.50 total cost ceiling and 15-minute total latency ceiling. Provider output\nremains fail-closed and redacted in reports.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-012/ai-codex.md", "path": "ticket-012 / ai-codex.md", "size": "1.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-012\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\n`openrouter/auto-beta` returned syntactically valid JSON with one incomplete NL\nrecord. Runtime rejection was correct, but failure handling discarded the\nresolved model and usage metadata. The live report also summarized history\nbefore appending the current run.\n\n## Execution plan\n\n1. Select an explicit model advertising `structured_outputs`.\n2. Preserve metadata across structured parse and stage failure boundaries.\n3. Record current-run history before rendering the audit summary.\n4. Add regression tests and pass all offline gates.\n5. Run the real six-stage check and publish the measured result.\n\n## Blockers\n\n- None; the user explicitly authorized trying another paid live model.\n\n## Result\n\nQwen and GPT-5.4 Mini were rejected after bounded correction. Gemini 3.6 Flash\npassed the complete six-stage `require-llm` pipeline. The default now names\nthat model explicitly; stage-specific overrides remain supported.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-011/ai-codex.md", "path": "ticket-011 / ai-codex.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-011\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe linker already compares symbol aliases, but it treats a shared leaf as\nproof even when several files declare it. This can turn an ambiguous request\ninto several implementation relations and hide the absence of a selected\ntarget. Resolution must use observed AST ownership and abstain on ties.\n\n## Execution plan\n\n1. Census symbol ownership and current NL extraction noise.\n2. Add an AST-backed symbol-resolution index used by linking and diagnostics.\n3. Preserve unique/qualified/path-selected matches and reject ambiguous or\n conflicting matches.\n4. Make missing-field actions concrete and reduce false symbol candidates.\n5. Add unit and gold hard-negative cases, verify and publish `main`.\n\n## Blockers\n\n- None for the deterministic scope.\n\n## Actual changes\n\n- Added a graph symbol-resolution index over AST declarations.\n- Gated NL↔AST shared-symbol evidence on unique ownership or explicit path.\n- Added candidate-aware ambiguity/conflict diagnostics.\n- Removed file names and all-caps prose from implicit symbol extraction.\n- Added six focused resolver tests and three gold linking cases.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-010/ai-codex.md", "path": "ticket-010 / ai-codex.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-010\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nAST parsing and Markdown chunking are deterministic but repeated for every run.\nTheir cache keys must bind every input that can change output, while cached data\nmust be treated as disposable acceleration rather than evidence.\n\n## Execution plan\n\n1. Map AST adapters, document chunking and output-directory boundaries.\n2. Add a shared versioned cache with atomic writes and fail-open recovery.\n3. Cache TypeScript per file, external adapters per source manifest and chunks\n per document.\n4. Prove cold/warm equivalence, invalidation, corruption recovery and provider\n isolation.\n5. Benchmark tracked snapshots, update repository evidence and publish `main`.\n\n## Blockers\n\n- Live provider calls are outside this ticket; documentation-cache tests use a\n local structured-response stub and explicitly verify calls are not cached.\n\n## Actual changes\n\n- Added the dependency-free `ContentCache` under `src/core/`.\n- Added cache telemetry to AST and documentation extraction results.\n- Added per-file TypeScript and Markdown keys plus per-manifest external AST\n keys.\n- Added cold/warm, invalidation, corruption, bypass and external-toolchain tests.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-009/ai-codex.md", "path": "ticket-009 / ai-codex.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-009\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe provider schema, TypeScript assumptions and runtime checks currently form\nseparate contracts. Their drift can either crash late or silently reinterpret\nthe provider response. One structural definition must govern both sides.\n\n## Execution plan\n\n1. Measure every production structured-response boundary and its current drift.\n2. Add a small dependency-free canonical schema/parser builder.\n3. Migrate all production OpenRouter response contracts.\n4. Preserve grounding and semantic invariants as explicit second-stage checks.\n5. Run all deterministic gates, document the result and publish `main`.\n\n## Blockers\n\n- None for the approved scope.\n\n## Actual changes\n\n- Added the dependency-free `StructuredSchema` builder and typed error with\n rejected-response metadata.\n- Migrated all seven production OpenRouter response boundaries.\n- Removed task/NL coercion of invalid provider enums, percentages and keys.\n- Added drift gates for production calls and the published document schema.\n- Updated the DSL, readiness, validation, test report, status and backlog.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-008/ai-codex.md", "path": "ticket-008 / ai-codex.md", "size": "749B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-008\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe governance hub must encode ownership and unresolved state in a form that\ntodo2code can audit without guessing identities or treating evidence as dialog.\n\n## Execution plan\n\n1. Validate the upstream ticket scope and ownership contract.\n2. Harden scripts and role-specific templates outside this ticket directory.\n3. Test active-ticket reuse, namespace isolation and todo2code interoperability.\n\n## Actual changes\n\n- Published `wellmanifest/new-project` 0.6.0 at commit `72e5f6c`.\n- Added the non-conflicting `project/TICKETS.md` index in todo2code.\n\n## Blockers\n\n- None for the completed deterministic scope.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-007/ai-codex.md", "path": "ticket-007 / ai-codex.md", "size": "776B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-007\n- **Role**: agent\n\n## Understanding\n\nCommunication analysis must not emit an empty response route when it knows the\nrequired role. Missing identity is a first-class unresolved state, not\npermission to infer or manufacture a person.\n\n## Execution plan\n\n1. Reproduce the agent-only ticket case in an offline test.\n2. Centralize fallback routing at communication-issue construction.\n3. Preserve known stable participant IDs.\n4. Document the sentinel contract and update readiness evidence.\n5. Run focused tests, gold evaluation and the full offline verification gate.\n\n## Ownership boundary\n\nDo not create or edit a human-owned `user-*` file. Do not create a participant\nregistry entry on behalf of the repository owner.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-006/ai-codex.md", "path": "ticket-006 / ai-codex.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-006\n- **Status**: DONE\n- **Workflow state**: DONE\n\n## Understanding\n\nTicket-005 proved that merely sending JSON Schema does not guarantee provider\nconformance. The next step is contract fidelity and diagnostics, not semantic\nthreshold tuning.\n\n## Plan\n\n1. Inventory duplicated provider, published and runtime response definitions.\n2. Add failing tests for every live violation observed in ticket-005.\n3. Introduce the smallest canonical structural source and precise validator.\n4. Keep semantic contracts internal and all network calls opt-in.\n5. Run offline gates before any additional paid live comparison.\n6. Compare two explicit provider/model routes only on a clean tracked snapshot.\n7. Retain no production path unless both protocol and quality boundaries pass.\n\n## Guardrails\n\n- No field renaming or numeric coercion.\n- No raw provider payload in logs.\n- No untracked repository content.\n- No executable file under this ticket.\n\n## Current state\n\n- Added one internal structural source for the TypeScript response shape,\n OpenRouter JSON Schema and exact runtime validation.\n- Added a full-verification drift test against the published reranker decision\n schema.\n- Added fail-closed diagnostics for the observed `judgments` envelope,\n non-numeric confidence and invalid verdict/reason combinations.\n- Error text includes provider, resolved model and response ID, but never the\n raw provider payload or API key.\n- Focused offline tests pass 5/5.\n- The tracked live comparison rejected both Plus and Flash; Flash added an\n unknown `decision` property to an otherwise structured decision.\n- All release gates pass. The hardening is retained, while semantic production\n enablement remains rejected.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-005/ai-codex.md", "path": "ticket-005 / ai-codex.md", "size": "5.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-005\n- **Status**: DONE\n- **Workflow state**: DONE\n\n## Understanding\n\nTicket-004 proved that multilingual similarity is useful for ordering\ncandidates but unsafe as relation evidence. The next candidate therefore\nseparates recall from acceptance: retrieval finds a small shortlist, while an\naudited reranker must explain an accepted module using repository-owned\nevidence or abstain.\n\nBefore introducing another semantic stage, the current communication boundary\nmust be measured. The governance standard names participants through\n`user-` and `ai-` files; those records must remain distinct\nfrom ticket specifications and must produce an actionable response owner when\nhuman and agent intent diverge.\n\n## Execution plan\n\n1. Audit `user-*`/`ai-*` extraction and communication analysis on current\n todo2code tickets.\n2. Add red regressions for participant filename recognition, evidence-file\n exclusion and response ownership.\n3. Implement the minimal deterministic communication correction.\n4. Re-run the corrected analysis on todo2code and external tracked projects.\n5. Specify the candidate, decision, provenance and abstention contracts.\n6. Add red contract tests and cross-language gold projection fixtures.\n7. Implement the optional orchestration boundary outside the deterministic\n linker.\n8. Evaluate a constrained reranker on the six gold positives and negatives.\n9. Run tracked A/B on `todo2code`, `subactor/platform` and one additional\n repository selected from the existing seven-repository corpus.\n10. Manually review every newly proposed relation.\n11. Retain the implementation only if every precision and coverage criterion\n passes; otherwise remove it and retain the evidence.\n12. Run the full release validation and update readiness documentation.\n\n## Planned code locations\n\n- `src/`: public contracts and optional orchestration.\n- `test/`: contract, hard-negative and integration tests.\n- `evaluation/gold/`: versioned evaluation fixtures if the schema requires it.\n- `scripts/research/`: optional manually invoked reproducer only.\n- `project/ticket-005/`: specifications, logs, captured results and decisions\n only.\n\n## Risks\n\n- A reranker may restate semantic similarity without adding evidence.\n- Candidate text may bias a model into selecting a module instead of\n abstaining.\n- Multi-module requirements may be incorrectly collapsed to one module.\n- Provider-dependent evaluation may be nondeterministic or unavailable.\n- Curated gold projections may overfit six examples without improving a real\n repository.\n\n## Guardrails\n\n- No relation from retrieval score alone.\n- No silent fallback from an unavailable reranker to raw embeddings.\n- No network-dependent default or offline-CI requirement.\n- No external untracked content.\n- No executable files under the ticket directory.\n\n## Actual changes\n\n- Initialized the reviewable plan only.\n- No linker behavior has changed.\n- Owner approved execution and added the `user-*`/`ai-*` divergence audit.\n- Added section-aware conversion in `src/extractors/communication.ts` for\n governance participant files and excluded ticket evidence plus raw\n `ai-*-logs.txt` from the participant channel.\n- Added explicit response ownership in `src/communication/analyzer.ts` to every\n communication issue and a separate issue for an agent claim about an\n unconfirmed human decision.\n- Added migration warnings for unstructured participant files in\n `src/extractors/communication.ts`, normalized filename identities, ignored\n numeric Markdown markers and recognized bare filenames as repository paths\n in `src/core/text.ts`.\n- Prevented opposite statements about two explicit, different files from\n becoming a false intent conflict.\n- Tested historical `wellmanifest/new-project` prompts and agent analyses in a\n read-only migration captured by `project/ticket-005/audit.md`. Correct\n `request`/`message` typing produced zero issues for Opus; GPT retained three\n unanswered prompt fragments and no false file conflict.\n- Focused communication, NL, pipeline and task-synthesis tests pass.\n- Added versioned, bounded candidate and reranker result contracts in\n `src/semantic/reranker.ts`. Retrieval alone cannot mutate a graph; an\n accepted result must cite exact repository-owned evidence, and ambiguity or\n multi-module scope abstains.\n- Added a strict tracked-snapshot network boundary and a research reproducer\n under `scripts/research/`; no executable source was added to the ticket.\n- Added captured gold reranking fixtures to\n `evaluation/gold/v2/dataset.json`: 6/6 expected cross-language relations,\n 0/6 forbidden violations and one hard-negative abstention.\n- Ran three live attempts on clean `subactor/platform` commit `3e96573`;\n provider output violated the structured contract each time, so no relation\n or coverage change was accepted.\n- Removed reranker exports from the public package in `src/index.ts`. The\n deterministic linker, CLI, MCP and A2A remain unchanged.\n\n## Blockers\n\n- The evaluated provider/model does not reliably honor the structured result\n contract, and no real-repository coverage improvement was demonstrated. This\n blocks production retention but does not block closing the rejected\n experiment.\n\n## Conclusion\n\nRetain the communication correction and offline evidence contracts. Reject the\nlive semantic production path until a provider-pinned candidate passes the\nsame real-repository boundary.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-004/ai-codex.md", "path": "ticket-004 / ai-codex.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-004\n- **Status**: COMPLETE\n- **Workflow state**: DONE\n\n## Understanding\n\nThe current known gap is not evidence that the three-topic threshold should be\nlowered. It demonstrates that lexical topic equality cannot bridge arbitrary\nlanguages. The experiment must separate semantic projection from graph scoring\nand preserve its provenance.\n\n## Execution plan\n\n1. Expand multilingual gold coverage and classify positive and negative pairs.\n2. Map the synchronous linker, public API, pipeline configuration and cache\n boundaries.\n3. Compare local embedding, provider translation/projection and injected\n precomputed-topic strategies.\n4. Add a red contract test for the selected architecture.\n5. Implement one bounded candidate only if it remains auditable and optional.\n6. Run gold and controlled repository A/B.\n7. Complete full validation and readiness documentation.\n\n## Guardrails\n\n- No additional domain dictionary as the principal solution.\n- No network call from `linkIntentRecords`.\n- No provider output accepted without runtime validation.\n- No private or untracked external inputs.\n- No unrelated generated-analysis rewrite.\n\n## Actual changes\n\n- Initialized the approved ticket.\n- Added a 12-pair, four-language embedding benchmark and evaluated two pinned\n local multilingual models.\n- Demonstrated overlapping positive/negative cosine ranges and two rejected\n false-positive candidates on the tracked platform graph.\n- Demonstrated that reciprocal top-1 restores precision in the sample but adds\n no coverage.\n- Rejected a production matcher and expanded gold v2 with a separately reported\n cross-language cohort: six known positives and six forbidden negatives.\n- Passed full verification (244 tests, 243 pass, one local JDK skip), gold\n v1/v2, five SDK examples, dependency audit, CLI/MCP/A2A and Docker smoke.\n- Updated readiness evidence and closed the ticket without adding an unsafe\n semantic relation rule.\n- After user review, moved both executable experiment reproducers out of the\n ticket directory into `scripts/research/`; benchmark inputs and captured\n results remain ticket evidence.\n\n## Blockers\n\n- None.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-003/ai-codex.md", "path": "ticket-003 / ai-codex.md", "size": "2.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-003\n- **Status**: COMPLETE\n- **Workflow state**: DONE\n\n## Understanding\n\nThe remaining changelog count is not itself a defect. It mixes old release\nclaims, unverifiable claims, extractor artifacts and potentially repeated false\npositives. This iteration must review a stable sample before selecting any\nbehavior change.\n\n## Execution plan\n\n1. Build a clean runtime from tracked `18cc21b`.\n2. Apply only the ticket-002 changelog diagnostic patch.\n3. Re-run the unchanged seven-repository corpus.\n4. Select a deterministic stratified sample from residual findings.\n5. Label the sample with explicit, reviewable rules.\n6. Rank false-positive classes by repository spread and count.\n7. Add one red regression and nearby hard negatives for the leading safe class.\n8. Implement and evaluate one correction, or reject the hypothesis.\n9. Run full validation and update readiness evidence.\n\n## Guardrails\n\n- A release claim is not implementation evidence merely because its words\n resemble a module.\n- Historical age alone does not make a diagnostic false.\n- Missing AST support is reported as incomplete evidence, not silently ignored.\n- Current unrelated and generated workspace changes are excluded from the A/B\n runtime.\n\n## Actual changes\n\n- Initialized and approved the ticket from the continuation message.\n- Re-ran the unchanged corpus successfully from tracked `18cc21b` plus only the\n ticket-002 diagnostic patch.\n- Built and reviewed a deterministic 168-record stratified sample.\n- Selected exact file-only update bookkeeping: 28 sampled and 547 total\n findings across five repositories.\n- Added a red/green regression with behavioral hard negatives.\n- Re-ran the corpus with only this correction: removed 547 review findings and\n 188 secondary unlinked warnings while every graph fingerprint stayed stable.\n- Passed full verification, five SDK examples, the production dependency\n audit, CLI/MCP/A2A smoke checks and Docker smoke. The suite reported 242\n tests: 241 passed, none failed and the local Java fixture was skipped because\n this environment has no JDK; required CI supplies JDK 17.\n- Updated readiness evidence and closed the ticket with 1,306 deliberately\n retained residual findings.\n- After user review, moved the executable audit reproducer out of the ticket\n directory into `scripts/research/`; the ticket now contains evidence only.\n\n## Blockers\n\n- None.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-002/ai-codex.md", "path": "ticket-002 / ai-codex.md", "size": "4.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-002\n- **Status**: COMPLETE\n- **Workflow state**: DONE\n\n## Understanding of the task\n\nThe objective is not merely to prove that todo2code completes on other\nrepositories. The work must establish whether its semantic conclusions remain\nuseful outside its own codebase, identify recurring causes of weak coverage or\nfalse diagnostics, and improve the library only where repeated measurements\njustify the change.\n\n## Included scope\n\n1. Create isolated detached worktrees for the recorded external commits.\n2. Run one normalized offline pipeline and reality report per repository.\n3. Persist a compact machine-readable baseline and a reviewed Markdown report\n under this ticket.\n4. Compare relation classes, diagnostics, unsupported languages, topic status\n and coverage rather than relying on record count alone.\n5. Review representative false positives and false negatives.\n6. Select the highest-impact shared defect that can be fixed without accepting\n ungrounded evidence.\n7. Add gold/unit coverage, implement one correction and rerun the same corpus.\n8. Record the delta and either retain or reject the correction.\n\n## Excluded scope\n\n- Mutating, committing or cleaning external repositories.\n- Reading private or untracked external inputs.\n- Tuning a threshold only to improve headline coverage.\n- Provider-dependent LLM calls in the primary baseline.\n- Adding a new dependency without a separate license and security review.\n- Implementing several semantic heuristics in one unmeasurable batch.\n\n## Execution plan\n\n### Phase 1 β€” reproducible baseline\n\n1. Verify stable todo2code and Docker validation commands.\n2. Define the shared document/task/communication policy and explicit\n repository exceptions.\n3. Analyze the seven verified repositories at recorded detached commits.\n4. Store per-repository JSON metrics, warnings and sampled diagnostic evidence.\n\n### Phase 2 β€” evidence review\n\n5. Rank recurring gaps by frequency, severity and affected repositories.\n6. Separate extractor, target-resolution, linker, diagnostics and\n unsupported-language failures.\n7. Choose one defect with evidence in at least two repositories.\n\n### Phase 3 β€” one controlled improvement\n\n8. Add a gold or focused unit regression, including a nearby negative.\n9. Implement the smallest deterministic correction.\n10. Run gold v2, focused tests and the unchanged external corpus.\n11. Keep the change only if the target metric improves without a measured\n precision regression.\n\n### Phase 4 β€” validation and conclusions\n\n12. Run the complete stable validation matrix and Docker checks.\n13. Update ticket evidence, changelog, acceptance criteria and readiness\n conclusions.\n14. Present the next ranked improvement as a separate continuation decision.\n\n## Candidate hypotheses, not decisions\n\n- PL documentation to EN identifiers is still a measured `knownGap`.\n- Changelog claims may lack implementation evidence because topic matching\n intentionally excludes changelog records.\n- Configuration-only evidence may overstate `aligned`.\n- Unsupported PHP and other languages may dominate reality gaps in some\n repositories.\n\nThe baseline decides which hypothesis is addressed first.\n\n## Approval gate\n\nApproved by the user's `kontynuuj` message on 2026-07-31 under `P-CORE-008`.\nExecution may proceed within the recorded scope.\n\n## Actual changes\n\n- Initialized the standard ticket structure and project-level TODO entry.\n- Verified Docker availability and the seven candidate repositories.\n- Verified ticket formatting, absence of local absolute paths and compatibility\n with the generated-analysis guard.\n- Ran the normalized deterministic pipeline successfully on all seven detached,\n tracked-only external worktrees.\n- Preserved the complete baseline in `baseline.json` and its reviewed summary\n in `baseline.md`.\n- Selected non-actionable changelog mechanics as the first controlled defect:\n it repeats across the corpus, but can be corrected without pretending that\n ungrounded release claims have implementation evidence.\n- Added a focused red/green regression and a narrow changelog-signal classifier.\n- Evaluated only this patch on the unchanged external corpus: graph fingerprints\n remained stable, gold v2 stayed perfect, and false review-required findings\n fell by 1,024 across five repositories.\n- Added an independent red/green correction for generated-analysis verification:\n tracked audit quotations no longer masquerade as private input consumption,\n while newly introduced untracked references remain blocked.\n\n## Unfinished items and blockers\n\n- No blocker inside ticket scope. Remaining library gaps are listed in\n `docs/READINESS.md`; they require separate controlled iterations.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-016/audit.md", "path": "ticket-016 / audit.md", "size": "1.5KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 016 audit\n\n## Boundary\n\nThe host has PHP 8.4 but no `ext-ast`. Pulling a Composer parser into the Node\ncore would add a second dependency graph. The adapter therefore uses PHP's\nbuilt-in `token_get_all` with `TOKEN_PARSE`: syntax errors are real parser\nerrors, while the emitted evidence is accurately named `php_syntax_tokens`,\nnot a full AST.\n\nIt emits bounded source facts for namespace, `use`, class/interface/trait/enum,\nnamed function, qualified method and call sites. Identical calls on the same\nsource line collapse to one semantic fact. Paths come from the same ignore\nmatcher as the other adapters and cross the helper boundary through a private\nmanifest.\n\n## External A/B\n\nBoth deterministic pipelines read the same current `semcod/redsl` worktree and\nwrote disposable artifacts outside that worktree. All non-PHP external adapters\nwere disabled.\n\n| Metric | PHP disabled | PHP enabled | Delta |\n|---|---:|---:|---:|\n| Tracked PHP files discovered | 40 unsupported | 40 parsed | β€” |\n| Graph records | 2,128 | 4,255 | +2,127 |\n| Graph relations | 3,436 | 3,516 | +80 |\n| Warning diagnostics | 730 | 712 | -18 |\n| Code-change plans | 1 | 1 | 0 |\n| Extraction warnings | 1 unsupported-language | 0 | -1 |\n\nThe stable plan count matters: adding implementation evidence reduced false\nwarnings without hiding the remaining actionable plan.\n\nThe repository gate passed with 304 tests (303 pass, 1 local JDK skip), both\ngold datasets stayed at 100%, and `examples:check` passed for all five SDKs.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-015/audit.md", "path": "ticket-015 / audit.md", "size": "1.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 015 audit\n\n## Cause\n\nThe compound source said `Implement ... and verify it ...`. The deterministic\naction classifier selected `validate` because `verify` has higher table\nprecedence than `implement`. `inferObject` then removed `verify` from the middle and\nleft `Implement ... and it ...`; `titleFor` unconditionally prepended another\n`Implement`.\n\n## Fix\n\n`titleFor` keeps its concise `Implement ` projection for normal records.\nWhen the inferred object still begins with an imperative, it instead uses the\nlossless source statement (without terminal punctuation). This is a narrow,\nauditable indication that object inference removed a different clause verb.\n\n## Evidence\n\nThe focused suite passed 18/18. The full repository gate passed with 300 tests\n(299 pass, 1 local JDK skip), both gold datasets remained at 100%, and\n`examples:check` passed with unchanged SDK fingerprints. Re-running the\noriginal existing-path fixture\nproduced:\n\n`Implement bounded exponential retry backoff in src/retry.py and verify it in tests/test_retry.py`\n\nThe underlying record text, targets and diagnostic remained unchanged.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-014/audit.md", "path": "ticket-014 / audit.md", "size": "2.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 014 audit\n\n## Reproduction\n\nFixture declaration:\n\n`Implement bounded exponential retry backoff in src/retry.py and verify it in tests/test_retry.py.`\n\n`src/retry.py` contained only an `enqueue` function. The pipeline emitted no\n`PLANNED_NOT_IMPLEMENTED` diagnostic and no code-change plan because the shared\npath was accepted as sufficient alignment. Changing only the target to the\nmissing `src/retry_backoff.py` immediately produced one grounded plan, which\nKoru converted to `PLF-001`.\n\n## Koru control\n\nThe isolated end-to-end control later produced `PLF-002`, Codestral returned a\nhash-bound unified diff, Koru verified it in a worktree and committed it on\n`koru/run-6e596247e153` (`1809ea5`). Re-running todo2code on that branch cleared\nthe targeted `PLANNED_NOT_IMPLEMENTED` diagnostic. This proves the transport;\nit does not excuse the original false alignment on an existing file.\n\n## Semantic gate and autonomous replay\n\nThe linker still records `shared_path + module_coverage` because the relation\nis useful for navigation, but diagnostics no longer treats it as implementation\nof a capability. Topics requested by the declaration are compared with the\naggregate's extracted `metadata.capabilities`; path-derived and structural edit\nwords do not count. A symbol, capability overlap, accepted semantic rerank or\ngrounded similarity to a concrete fact/commit can close the declaration. A\npure file-creation declaration remains compatible with exact path evidence.\n\nThe original existing-path fixture was replayed after the fix. todo2code raised\none `PLANNED_NOT_IMPLEMENTED`, generated one code-change plan and Koru created\n`PLF-003`. Koru required a unified diff, ran `PYTHONPATH=. pytest -q`, and\ncommitted the verified patch as `55a8b15` on\n`koru/run-35477cccef16`. Independent verification reported 6/6 tests and a\nsecond todo2code run produced zero plans for the target intent. The accepted\nrelations carried `capability_overlap:2`/`module_topic:4` for `src/retry.py`\nand `capability_overlap:1` for its test.\n\n## Cross-repository regression\n\nFresh deterministic runs succeeded on `weekly`, `nlp2uri` and `algitex`.\nThey reported respectively 1/10/3 `PLANNED_NOT_IMPLEMENTED`, 9/12/5 total\ncode-change plans, 58/152/139 capability-overlap relations and retained\n40/54/202 path-only module relations as navigation evidence. No repository\ncrashed and no generated artifact was written into its worktree.\n\nAmbiguous human intent continues through the existing communication contract:\n`responseRequiredRole` plus a known participant or `unresolved:human`. The\nruntime does not create or rewrite `user-*`. A missing implementation with a\nclear target is instead labelled for the technical executor in the diagnostic\naction, so it does not unnecessarily block on a human decision.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-013/audit.md", "path": "ticket-013 / audit.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 013 audit\n\n## Baseline\n\n`google/gemini-3.6-flash`: PASS 6/6, 125,486 ms, 177,953 tokens,\n$0.412363, no fallback or degradation.\n\n## Candidate screening\n\n| Model | Structured output | Prompt / completion per 1M | Context |\n|---|---|---:|---:|\n| `google/gemini-3-flash-preview` | yes | $0.50 / $3.00 | 1,048,576 |\n| `mistralai/codestral-2508` | yes | $0.30 / $0.90 | 256,000 |\n| `deepseek/deepseek-v4-pro` | yes | $0.435 / $0.87 | 1,048,576 |\n\n## Live results\n\n| Model | Result | Time | Tokens | Cost | Fallback |\n|---|---:|---:|---:|---:|---:|\n| `google/gemini-3.6-flash` (fresh baseline) | PASS 6/6 | 106,700 ms | not recorded in comparison summary | $0.342992 | no |\n| `google/gemini-3-flash-preview` | PASS 6/6 | 64,064 ms | 116,604 | $0.076411 | no |\n| `mistralai/codestral-2508` | PASS 6/6 | 57,129 ms | 118,920 | $0.037994 | no |\n| `deepseek/deepseek-v4-pro` | FAIL | >900,000 ms | no manifest | unmeasured | no result |\n\nCodestral was about 1.87Γ— faster and 9.0Γ— cheaper than the fresh Gemini 3.6\nbaseline. Gemini 3 Flash Preview was about 1.67Γ— faster and 4.49Γ— cheaper.\nDeepSeek was stopped at the declared run budget rather than allowed to hang.\n\n## Cross-repository result\n\nThe first real repository run exposed sequential Markdown batches. On\n`weekly`, Codestral enriched 161 records in six requests but needed 218,741 ms.\nBounded concurrency of three preserved response/record audit order and reduced\nthe same run to 53,362 ms (4.1Γ— faster), with no degradation. The previously\ntimeouting `nlp2uri` then completed 619 records in 20 requests in 194,750 ms,\n176,797 tokens and $0.08588244. A large deterministic `algitex` scan completed\n2,643 Markdown records and the full pipeline in 9.4 seconds.\n\n## Decision\n\nPromote `mistralai/codestral-2508` to the explicit default. Keep\n`google/gemini-3-flash-preview` as the first fallback/reference candidate.\nThe selection is operational: contract adherence, latency and cost are\nmeasured; semantic quality still remains bounded by runtime validators and the\noffline gold suite.\n\nThe live runner now enforces its total budget by aborting provider requests;\nit also refuses to reuse a failed manifest older than the current attempt.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-012/audit.md", "path": "ticket-012 / audit.md", "size": "2.8KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 012 audit\n\n## Initial live failure\n\nRun `20260731T141822Z-136712ee` failed after 48,865 ms in\n`naturalLanguageExtraction`. `openrouter/auto-beta` returned `records[5]`\nwithout `confidence`, `basis`, `target`, `sourceLines` and `text`.\n\nThe validator correctly failed closed. Two observability defects remained:\n\n1. `StructuredResponseError.responseMetadata` was discarded by NL and other\n direct extraction fallback boundaries, leaving model/token/cost as unknown.\n2. The audit summarized history before appending its own record, so rendered\n history lagged the persisted file by one run.\n\n## Model selection\n\nOpenRouter's model API was queried on 2026-07-31. Every candidate below\nadvertised `structured_outputs`.\n\n| Model | Result |\n|---|---|\n| `deepseek/deepseek-v4-flash` | no schema violation; request hit the old 120,000 ms client timeout |\n| `qwen/qwen3.7-plus` | NL and Markdown passed; documentation and communication violated their schemas twice |\n| `openai/gpt-5.4-mini` | violated NL schema twice, including after receiving the exact schema in the corrective prompt |\n| `google/gemini-3.6-flash` | **PASS 6/6**, 125,486 ms, 177,953 tokens, $0.412363 |\n\nThe DeepSeek attempt exposed a local configuration contradiction: live allowed\n300,000 ms per stage while the client aborted each request after 120,000 ms.\nThe live runner now raises its request/document timeout to at least the stage\nbudget without shortening a larger explicit override.\n\nThe first Qwen run also exposed inconsistent recovery: task synthesis and\nsummary had a bounded corrective attempt, while NL, Markdown, documentation\nand communication failed on their first contract miss. All four direct\nextractors now allow exactly one correction, quote the rejection and the exact\nJSON Schema, and validate the second response identically. Both attempts stay\nin the audit. A second invalid response still aborts `require-llm`.\n\n## Passing live run\n\n| Stage | Latency | Tokens | Cost |\n|---|---:|---:|---:|\n| natural language | 16,199 ms | 3,192 | $0.021540 |\n| Markdown | 13,529 ms | 3,048 | $0.018246 |\n| documentation | 32,080 ms | 14,759 | $0.064613 |\n| communication | 10,836 ms | 3,348 | $0.019662 |\n| task synthesis | 38,516 ms | 85,659 | $0.176686 |\n| summary | 14,326 ms | 61,947 | $0.111616 |\n\nResult: `PASS`, six of six stages, no fallback or degradation, total\n125,486 ms and $0.412363. Audit schema: `t2c.live-contract-check/v2`.\n\n## Verification\n\nFocused structured-output tests: 39/39 PASS. `npm run verify`: 286 tests,\n285 pass, one local JDK skip; 101 modules, 470 internal imports, no cycles;\n7 structured and 0 raw production calls. Gold v1/v2: 100% required metrics.\nFive SDK examples: PASS with shared fingerprint `1dacf2edc8d603a2`.\n\nImplementation and documentation were pushed to `main` in `11348c0`.\nUnrelated staged `nlp2uri.yaml` was explicitly excluded and remains user-owned.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-011/audit.md", "path": "ticket-011 / audit.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 011 audit\n\n## Before\n\n- `shared_symbol` compared aliases pairwise and did not count AST owners.\n- A short NL symbol declared in two modules could link to both modules.\n- `AMBIGUOUS_REQUIREMENT` repeated field names but gave no field-specific edit.\n- Backticked `manifest.json`/`latest.json` and plain `LLM`, `TODO`, `CHANGELOG`\n could enter `target.symbols`; `CHANGELOG` found an unrelated AST owner.\n\n## Repository census\n\n| Repository | AST records | Leaf aliases with multiple source owners |\n|---|---:|---:|\n| todo2code | 15,607 | 155 |\n| subactor-improvement | 865 | 2 (`spawn`, `summarize`) |\n| wellmanifest/new-project | 0 | 0 (documentation-only repository) |\n\nOn todo2code's tracked `TASK.md`, implicit symbol candidates fell from 7 to 2.\nThe five removed values were file names or all-caps prose; the remaining\n`TensorFlow` and `TypeScript` are unresolved product/code names and therefore\ncreate neither AST evidence nor an ambiguity claim.\n\n## Resolution contract\n\n| State | Link behavior | Diagnostic behavior |\n|---|---|---|\n| one AST path | allow exact `shared_symbol` evidence | no ambiguity |\n| several AST paths | abstain unless path/qualifier selects one | list candidates; request `target.path` |\n| explicit path conflicts | abstain | list observed locations; request path correction |\n| no AST declaration | no symbol evidence | ordinary planned-not-implemented, not ambiguity |\n\n## Verification\n\n| Gate | Result |\n|---|---|\n| `npm run verify` | PASS β€” 277 tests, 276 pass, 0 fail, 1 JDK skip |\n| Module boundary | PASS β€” 101 modules, 467 imports, 0 cycles |\n| No-LLM boundary | PASS β€” 9 entrypoints across 34 modules |\n| Resolver tests | PASS β€” 6/6 unique, ambiguous, path, qualified, conflict and missing-fields cases |\n| Gold v2 | PASS β€” extraction 21/21, linking 18/18 (10 exact-target, 8 capability-topic), diagnostics 11/11 |\n| Gold v1 | PASS β€” legacy dataset remains 100% |\n| Examples | PASS β€” 5 SDK, graph fingerprint `1dacf2edc8d603a2` |\n| Publication | implementation `25df74a` on `main`; unrelated `nlp2uri.yaml` excluded |\n\nThe examples graph fell from 101 to 91 relations while preserving 227 records.\nThe removed edges are the intended effect of abstaining from ambiguous NL↔AST\nsymbol ownership; all versioned gold expectations remain perfect.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-010/audit.md", "path": "ticket-010 / audit.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 010 audit\n\n## Cache contract\n\n| Property | Decision |\n|---|---|\n| Location | `/cache/v1//.json` |\n| Key | stable hash of namespace and output-relevant inputs |\n| TypeScript | source path + content hash + extractor identity |\n| External AST | ordered path/content manifest + executable + byte limit |\n| Documentation | source path + content hash + chunk size + algorithm identity |\n| Provider output | deliberately not cached |\n| Corruption/I/O | recompute; cache errors do not fail extraction |\n| Writes | same-directory temporary file followed by atomic rename |\n| Warning results | external adapter warnings are not cached |\n\n## Tracked-snapshot benchmark\n\nSingle local run on 2026-07-31; times are directional wall-clock measurements,\nnot a stable performance gate. External AST adapters were disabled to isolate\nthe per-file TypeScript/JavaScript cache. Documentation measured the production\nchunk algorithm and cache contract without making provider requests.\n\n| Repository | Workload | Cold | Warm | Warm hits | Output |\n|---|---:|---:|---:|---:|---|\n| semcod/todo2code | 15,062 AST records | 1398.4 ms | 442.1 ms | 169/169 | identical |\n| subactor-improvement | 751 AST records | 49.2 ms | 16.8 ms | 11/11 | identical |\n| wellmanifest/new-project | 26 Markdown files / 28 chunks | 10.1 ms | 7.2 ms | 26/26 | identical chunk count |\n| semcod/todo2code | 111 Markdown files / 161 chunks | 76.0 ms | 45.1 ms | 111/111 | identical chunk count |\n| subactor-improvement | 2 Markdown files / 2 chunks | 1.9 ms | 1.3 ms | 2/2 | identical chunk count |\n\nThe new-project result also shows the limit of this optimization: a small,\ndocumentation-only repository gains little absolute time. The cache matters\nmost for repositories with many AST inputs or repeated documentation analysis.\n\n## Verification\n\n| Gate | Result |\n|---|---|\n| Exact `f1d9334` snapshot | `npm run verify`: 261 tests, 260 pass, 1 JDK skip |\n| Module boundary | 99 modules, 462 imports, 0 cycles |\n| Cache tests | 5/5: cold/warm, invalidation, corruption, bypass, external adapter and provider isolation |\n| Gold v2 / v1 | 100% required gates / PASS |\n| Examples | 5 SDK, PASS |\n| Integrated local `main` | 270 tests, 269 pass, 1 JDK skip; includes the adjacent scheduled-live-check commit |\n| Publication | implementation `f1d9334` on `main` |\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-009/audit.md", "path": "ticket-009 / audit.md", "size": "1.8KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 009 audit\n\n## Before\n\n| Boundary | Provider schema | Runtime behavior |\n|---|---|---|\n| NL extraction | manual | unchecked generic followed by field coercion |\n| Document extraction | manual + separately published JSON | unchecked generic |\n| Markdown enrichment | manual | separate permissive type guard |\n| Communication enrichment | manual | separate permissive type guards |\n| Summary | manual | separate hand-written assertions |\n| Task synthesis | manual | coercion of enums, arrays and percentages |\n| Semantic reranker | manual | separate exact validator |\n\nGrounding checks are intentionally stronger than JSON Schema and remain a\nsecond stage: referenced record, diagnostic, candidate and response-local keys\nmust exist in the exact input context.\n\n## After\n\n| Gate | Result |\n|---|---|\n| Production structured calls | 7 canonical / 0 raw JSON |\n| Runtime constraints | exact keys, type, enum, bounds, pattern, array size, uniqueness |\n| Rejected-response provenance | provider/model/response ID retained |\n| Published document schema | generated, drift check PASS |\n| `npm run verify` | 256 tests: 255 pass, 0 fail, 1 JDK skip |\n| Module boundary | 98 modules, 453 imports, 0 cycles |\n| Gold v2 / v1 | 100% required gates / PASS |\n| Examples | 5 SDK, PASS |\n| Publication | `d0fc143` pushed to `origin/main` |\n\n## Intent boundary\n\nStructural invalidity is no longer interpreted. Values such as `\"90%\"`,\n`\"issue\"`, `\"high\"`, blank local keys and out-of-vocabulary actions are\nrejected and enter the stage's retry/fallback policy. Repository grounding is\nstill checked after parsing. A conflict between human-owned and agent-owned\ntyped intent remains routed to the owner of the required role; this contract\ndoes not authorize an agent to edit `user-*` on the human's behalf.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-008/audit.md", "path": "ticket-008 / audit.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 008 audit\n\n## Before\n\n- `new-ticket.sh` accepted `--users` but did not consistently materialize the\n documented structure.\n- Documentation claimed automatic `user-*` generation despite the rule that an\n agent must not write human-owned content.\n- `readme.sh` assumed ownership of `project/README.md`, colliding with the\n generated analysis namespace used by todo2code.\n- Participant templates mixed human instructions, agent plans and completion\n claims without explicit role metadata.\n- The index update silently depended on Python and reported success even if its\n replacement failed.\n\n## After\n\n| Gate | Result |\n|---|---|\n| Human files generated by scaffolder | 0 |\n| Generated agent identity | `agent:codex` / `agent` |\n| Missing human route in todo2code | `unresolved:human` |\n| Existing analysis `project/README.md` | byte-for-byte preserved |\n| Active second ticket without override | rejected, exit 3 |\n| Index traversal | rejected, exit 2 |\n| Repeated index generation | idempotent |\n| Machine-local `file:///` documentation links | 0 |\n\n## Publication\n\n- `wellmanifest/new-project@72e5f6c` on `main`.\n- Version `0.6.0` with policy DSL versions 7/5.\n- Existing unrelated staged `.gitignore` and `rompt.txt` were excluded from the\n upstream commit and remain owned by their original author.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-007/audit.md", "path": "ticket-007 / audit.md", "size": "1.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 007 audit\n\n## Measured case\n\nThe tracked `project/ticket-006` contains agent communication and deliberately\nhas no agent-authored human participant file or participant registry entry.\n\n| Measure | Before | After |\n|---|---:|---:|\n| Communication issues | 3 | 3 |\n| Required role `human` | 3 | 3 |\n| Empty `responseRequiredFrom` | 3 | 0 |\n| `unresolved:human` routes | 0 | 3 |\n| Invented human identities | 0 | 0 |\n\nThe issue count, severity and semantic classification did not change. Only the\npreviously empty routing state became explicit.\n\n## Regression coverage\n\n- Agent-only ticket: `AGENT_WORK_OUTSIDE_REQUEST` routes to\n `unresolved:human`.\n- Human-only ticket: `REQUEST_WITHOUT_AGENT_RESPONSE` routes to\n `unresolved:agent`.\n- Existing mixed-participant fixtures retain their actual participant IDs.\n- Markdown rendering and diagnostic projection retain the sentinel.\n\n## Gates\n\n- `npm run verify`: PASS β€” 253 tests, 252 pass, 1 JDK skip.\n- `npm run evaluate:gold`: PASS β€” gold v2 unchanged at required quality.\n- `npm run evaluate:gold:v1`: PASS.\n- `npm run examples:check`: PASS β€” five SDKs.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-006/audit.md", "path": "ticket-006 / audit.md", "size": "2.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 006 audit\n\n## Retained hardening\n\n- canonical internal response definition:\n `src/semantic/reranker-response.ts`;\n- shared verdict/reason values and compatibility rule:\n `src/semantic/reranker.ts`;\n- provider call uses that schema directly;\n- published decision schema is checked for drift in the full test suite;\n- runtime rejects unknown/missing properties, wrong scalar types, invalid IDs,\n blank strings and contradictory verdict/reason pairs without coercion;\n- error diagnostics contain only the failing path and\n provider/model/response ID.\n\n## Provider comparison\n\nBoth routes used the same six-candidate top-1 shortlist from the clean tracked\n`subactor/platform` commit\n`3e96573d587cb664741849ceba205bf303b9f418`.\n\n| Requested route | Result |\n|---|---|\n| `qwen/qwen3.7-plus` | rejected in ticket-005: missing `decisions`, renamed `judgments`, then invalid confidence |\n| `qwen/qwen3.7-flash` | rejected: `response.decisions[0] contains unknown properties: decision` |\n\nThe Flash response identity was\n`Alibaba/qwen/qwen3.7-flash/gen-1785490219-noOw2NdfoPMqC6dLf7x6`.\nNo raw provider response is stored. No relation was materialized by either\nroute.\n\n## Communication ownership follow-up\n\nThe final ticket has 13 agent records and deliberately no agent-authored human\nfile. Analysis raises three `AGENT_WORK_OUTSIDE_REQUEST` warnings with\n`responseRequiredRole=human`, but `responseRequiredFrom=[]` because no human\nparticipant record exists. The role is correct; the concrete routing target is\nunresolved.\n\nThis must not be \"fixed\" by having an agent create `user-*`. A later ticket\nshould either route through a trusted participant/owner registry or emit an\nexplicit unresolved-human sentinel and migration issue.\n\n## Gates\n\n- `npm run verify`: 252 tests, 251 pass, 0 fail, 1 local JDK skip;\n- gold v2 and v1: PASS;\n- gold v2: captured reranker 6/6, zero forbidden violations, one abstention;\n- examples: 227 records, 97 relations, five SDKs: PASS;\n- dependency audit: 0 vulnerabilities;\n- CLI, MCP, A2A and Docker smoke: PASS.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-005/audit.md", "path": "ticket-005 / audit.md", "size": "3.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 005 audit\n\n## Decision\n\nReject the live cross-language reranker as a production feature. Retain the\noffline contracts, schemas, tests, captured gold fixtures and research\nreproducer. Do not export or enable the reranker through the package, linker,\nCLI, MCP or A2A.\n\n## Communication audit\n\nThe final ticket produced 51 `codex` records and 4 `tom-sapletta-com` records\nafter section-aware conversion. There are no blocking polarity conflicts. The\nfinal issue ownership is:\n\n- 7 `AGENT_CLAIM_WITHOUT_EVIDENCE` findings require `codex` to attach commit or\n test evidence (the current implementation is intentionally uncommitted);\n- 1 `AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED` finding requires\n `tom-sapletta-com` to record or reject the approval in the human-owned file;\n- 8 `AGENT_WORK_OUTSIDE_REQUEST` warnings require `tom-sapletta-com` to record\n or reject the detailed scope that currently exists only in the conversation.\n\nThe agent may correct its seven evidence claims, but must not edit the\nhuman-owned participant file to silence the other nine findings.\n\nHistorical read-only material from `wellmanifest/new-project` commit\n`2b9e3c9` showed why a filename-only migration is unsafe:\n\n- plain rename to `user-*`/`ai-*`: zero records and owner-specific migration\n warnings;\n- typed Opus request/message sections: 9 human + 58 agent records, zero issues;\n- typed GPT56Luna request/message sections: 9 human + 72 agent records, three\n unmatched request fragments and no false conflict between different files.\n\n## Offline reranker result\n\nGold v2 uses captured, structured decisions through the same runtime\nvalidators:\n\n- expected cross-language relations: 6/6;\n- forbidden cross-language relations: 0/6 violations;\n- accepted: 6;\n- abstained hard-negative cases: 1;\n- deterministic linker remains 0/6 and unchanged.\n\n## Live tracked-repository result\n\n- repository: `subactor/platform`;\n- clean commit: `3e96573d587cb664741849ceba205bf303b9f418`;\n- current graph fingerprint:\n `250df4ff83f456fb371278d4a0c2cf17dd025582b6865a0cb2f01bd469fd1dd0`;\n- retrieval: the pinned multilingual E5 ranking captured by ticket 004;\n- bounded payload: six reciprocal selected declarations, initially top-3\n (18 candidates), then top-1 (6 candidates);\n- model: `qwen/qwen3.7-plus`;\n- declared evaluation revision: `qwen3.7-plus@2026-07-31`;\n- privacy boundary: clean HEAD required; every projected declaration and module\n path had to be tracked; generated graph and result paths stayed outside the\n worktree.\n\nThree live attempts failed closed:\n\n1. top-3 returned a JSON value without a `decisions` array;\n2. top-1 returned the top-level key `judgments` instead of `decisions`;\n3. top-1, after an explicit key instruction, returned at least one\n `confidence` outside the required numeric 0..1 contract.\n\nNo accepted result artifact exists because invalid provider output is not\npromoted into `t2c.semantic-rerank/v1`. No relation was created, no coverage\nmetric changed, and the two false embedding candidates from ticket 004 were\nnot silently accepted.\n\n## Validation\n\n- `npm run verify`: 251 tests, 250 pass, 0 fail, 1 local JDK skip;\n- isolated `CLI watch` retry: 3/3 pass after one full-suite timing failure;\n- gold v2 and v1: PASS;\n- examples: 227 records, 97 relations, five SDKs: PASS;\n- `npm audit --omit=dev`: 0 vulnerabilities;\n- CLI, MCP, A2A and Docker smoke: PASS.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-004/audit.md", "path": "ticket-004 / audit.md", "size": "5.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Language-independent topic matching audit\n\n## Baseline\n\nThe current linker creates capability-topic evidence from at least three\nshared normalized tokens. This is deterministic and precision-oriented, but a\nhand-written Polish-to-English alias table is the only cross-language bridge.\n\nThe existing gold known gap:\n\n- declaration: `Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem`\n- module: `src/queue/task-retry-backoff.ts`\n- expected: `evidenced_by`\n- current result: no relation\n\n## Decision questions\n\n1. Can a strategy bridge languages without repository-specific vocabulary?\n2. Can its evidence be distinguished from lexical and exact-target evidence?\n3. Can offline tests exercise the contract without a provider dependency?\n4. Can production use be bounded, cached and explicitly configured?\n5. Does repository-level coverage improve without hard-negative regressions?\n\n## Candidate strategies\n\n| Strategy | Quality hypothesis | Main risk | Initial status |\n| --- | --- | --- | --- |\n| Local multilingual embeddings | Semantic bridge without sending text away | model size, native/runtime cost | investigate |\n| Provider translation/topic projection | Reuses audited model boundary | network, cost, nondeterminism | investigate |\n| Injected precomputed topic projections | Clean deterministic linker contract | projection source still required | investigate as architecture |\n\n## Sources and constraints\n\n- Transformers.js supports server-side feature extraction, filesystem caching\n and disabling remote model loading after a model is installed:\n .\n- OpenRouter exposes a batch embeddings endpoint, but it is authenticated,\n network-bound provider behavior:\n .\n- `intfloat/multilingual-e5-small` supports 94 languages, has 384 dimensions,\n requires `query:`/`passage:` prefixes and warns that absolute cosine values\n cluster high:\n .\n- The pinned local E5 weights are about 471 MB before quantization. A compatible\n Transformers.js ONNX artifact offers an int8 file of about 118 MB:\n .\n\n## Synthetic benchmark\n\n[`benchmark.json`](benchmark.json) contains six positive and six nearby\nnegative pairs in Polish, German, Spanish and French. The model revisions are\npinned in the result artifacts.\n\n| Model | Positive minimum | Negative maximum | Global separation | Pairwise ranking |\n| --- | ---: | ---: | ---: | ---: |\n| multilingual MiniLM | 0.673289 | 0.732568 | -0.059279 | 5/6 |\n| multilingual E5, no role prefixes | 0.774453 | 0.847799 | -0.073346 | 6/6 |\n| multilingual E5, query/passage prefixes | 0.759374 | 0.835202 | -0.075828 | 6/6 |\n\nThere is no safe global cosine threshold. E5 ranks every paired positive above\nits nearby negative, but the smallest margin is only 0.007190 after applying\nthe model's required role prefixes.\n\n## Repository experiment\n\nThe tracked `subactor/platform` graph contains 133 module aggregates and 66\nactionable targetless declarations (`todo`, or documentation with\n`required`/`recommended` modality). The E5 prototype compared every declaration\nto every module.\n\nAt score 0.75 and forward margin 0.01:\n\n- 6 declarations passed;\n- 4 already had the selected module among current graph evidence;\n- 2 proposed new candidates;\n- both new candidates were rejected on review.\n\nOne rejected pair linked `KaΕΌde wywoΕ‚anie wymaga idempotency_key` to\n`scripts/build-urirun-registry.py`. The other picked a post-deploy check for a\nmulti-module Docker BuildKit statement that already touched thirteen modules.\n\nAdding reciprocal top-1 and a reverse 0.01 margin retained one existing,\ncorrect TODO link and proposed **zero** new candidates. This precision guard is\nuseful, but it cannot improve coverage on the measured repository.\n\n## Strategy decision\n\n| Strategy | Determinism/offline | Audit and cache | Measured decision |\n| --- | --- | --- | --- |\n| Raw local embedding threshold | pinned and offline after a 118–471 MB model download | model/revision and vector cache can be explicit | reject: no global separation and two platform false positives |\n| Reciprocal local top-1 | pinned and offline after download | explicit score, margins and model identity | reject for production: safe sample added no coverage |\n| OpenRouter embedding/translation | network and provider dependent | batchable and cacheable, but provider output needs a new audited stage | reject as default; no paid/live repository call in this ticket |\n| Injected precomputed projections | deterministic linker boundary | clean provenance contract | defer: plumbing alone does not solve projection quality |\n\nNo semantic matcher is retained. The library improvement in this ticket is a\nlarger, separately reported cross-language gold cohort: six known positive gaps\nand six gated hard negatives. Future candidates now have to improve that cohort\nwithout hiding behind same-language capability-topic quality.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-003/audit.md", "path": "ticket-003 / audit.md", "size": "2.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Residual changelog audit\n\n## Current corpus\n\nThe runtime is tracked `18cc21b` plus only the ticket-002 changelog diagnostic\npatch. All seven unchanged external commits completed with `succeeded`.\n\n| Repository | Records | Relations | Residual findings | Sample |\n| --- | ---: | ---: | ---: | ---: |\n| semcod/code2llm | 16,899 | 41,758 | 955 | 24 |\n| semcod/domd | 10,611 | 7,484 | 99 | 24 |\n| semcod/pactfix | 5,161 | 3,917 | 48 | 24 |\n| semcod/code2logic | 21,423 | 16,933 | 120 | 24 |\n| semcod/code2docs | 6,717 | 35,468 | 269 | 24 |\n| semcod/redup | 7,204 | 19,259 | 269 | 24 |\n| subactor/platform | 10,628 | 11,424 | 93 | 24 |\n\n## Sampling policy\n\nThe sample is deterministic: records are grouped by\n`target-class:action`, sorted by stable record ID inside each group, and\nselected round-robin over lexically sorted groups. The limit is 24 per\nrepository, producing 168 reviewed records.\n\nEvery sample row in [`sample.json`](sample.json) preserves repository, record\nID, stratum, text, targets, tracked path owners, source lines, label and\nrationale.\n[`scripts/research/audit-changelog-sample.mjs`](../../scripts/research/audit-changelog-sample.mjs)\nreproduces selection and classification from run artifacts.\n\n## Classification\n\n| Class | Sample | Full deterministic census | Repositories | Decision |\n| --- | ---: | ---: | ---: | --- |\n| Exact `Update ` bookkeeping | 28 | 547 | 5 | selected |\n| Opaque `chore: update N files` | 1 | 1 | 1 | reject: insufficient spread |\n| Unchecked roadmap item in changelog | 6 | 30 | 2 | defer: extractor lifecycle issue |\n| Substantive or still unverified claim | 133 | 1,275 | 7 | retain diagnostic |\n\nManual review of all 35 sampled non-substantive rows confirmed the labels.\nRepresentative selected examples include:\n\n- `Update README.md`\n- `Update scripts/run-testql-environment.sh`\n- `Update tests/project/analysis.json`\n- `Update uv.lock`\n- `update debug/.code2flow_cache/...pkl`\n\nThese rows assert only that a file changed. They do not state a behavior that\nan implementation-gap diagnostic can ground. By contrast, the following must\nremain actionable:\n\n- `Update src/runtime.ts to reject invalid tokens`\n- `Updated authentication in src/runtime.ts`\n- `Update support for Dockerfile parsing`\n- `Added Jenkinsfile support for deployment pipelines`\n\n## Selected correction\n\nTreat only an exact, single-token `Update ` entry as non-actionable\nrelease bookkeeping. A token must look like a path, dotfile, filename with an\nextension, or a conventional extensionless repository file. Any additional\nwords keep the claim actionable.\n\nThis is a diagnostics signal correction. It does not create evidence, alter the\ngraph, or broadly link changelog prose to modules.\n", "is_subdir": true}, {"name": "baseline.md", "rel_path": "ticket-002/baseline.md", "path": "ticket-002 / baseline.md", "size": "2.8KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# External corpus baseline\n\nRuntime: todo2code 0.5.0 at\n`5f5ae5938ab77dcce474ba7abbd23686072776ec`.\n\nEach source was checked out as a detached, tracked-only worktree at the commit\nrecorded below. Runs were offline and deterministic: tracked `TASK.md`,\n`TODO.md` and `CHANGELOG.md` were selected when present, documents were limited\nto `README.md` and `docs/**/*.md`, communication and task synthesis were\ndisabled, and neither extraction nor summary used an LLM.\n\n| Repository | Commit | Time | Records | Relations | Topics aligned/all | Impl. | Plan | Docs | Diagnostics (I/W/R/B) | Warnings |\n| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | ---: |\n| semcod/code2llm | `b297d60` | 18 s | 16,899 | 41,747 | 107/628 | 59.4% | 43.7% | 31.4% | 912/2,377/1,411/0 | 9 |\n| semcod/domd | `b6c5ad2` | 5 s | 10,611 | 7,470 | 9/241 | 11.8% | 5.4% | 5.4% | 616/1,388/105/0 | 0 |\n| semcod/pactfix | `daf301a` | 5 s | 5,161 | 3,917 | 2/153 | 5.0% | 1.8% | 1.8% | 197/419/48/0 | 5 |\n| semcod/code2logic | `ba93489` | 12 s | 21,423 | 16,927 | 27/359 | 17.7% | 14.1% | 14.1% | 1,474/3,081/121/4 | 3 |\n| semcod/code2docs | `c738aff` | 9 s | 6,717 | 35,447 | 57/265 | 47.1% | 77.0% | 47.3% | 283/876/396/0 | 0 |\n| semcod/redup | `a175fb0` | 6 s | 7,204 | 19,173 | 62/277 | 49.2% | 55.9% | 10.8% | 476/1,205/703/0 | 0 |\n| subactor/platform | `3e96573` | 6 s | 10,628 | 11,002 | 25/688 | 5.9% | 9.3% | 8.9% | 185/993/93/0 | 1 |\n\n`I/W/R/B` means `info/warning/review_required/blocking`. Full commit hashes,\ngraph fingerprints and diagnostic distributions are in\n[`baseline.json`](baseline.json).\n\n## Warnings and explicit exceptions\n\n- `code2llm`, `pactfix` and `code2logic` contain deliberately invalid parser\n fixtures and/or unsupported PHP, Ruby or C# inputs.\n- Java extraction could not run for repositories containing Java because the\n clean runtime had no JDK. This is an explicit local exception; Java remains a\n required CI job.\n- `subactor/platform` has one configuration file above the shared 524,288-byte\n limit.\n- No repository-specific semantic options or thresholds were introduced.\n\n## Repeated defect selected for the first iteration\n\n`CHANGELOG_WITHOUT_IMPLEMENTATION` occurs in all seven repositories (2,877\nfindings in total). Sampling separates two classes:\n\n- substantive claims such as adding Jenkinsfile support or structured HR\n intent; these must remain reviewable when no implementation evidence exists;\n- release-note mechanics such as `Update project/calls.mmd`, placeholder\n sections and summaries like `... and 12 more files`; these are not behavioral\n claims and currently inflate both `CHANGELOG_WITHOUT_IMPLEMENTATION` and\n `UNLINKED_RECORD`.\n\nBroadly linking changelog prose to module topics would manufacture evidence for\nthe first class. The controlled change will instead classify only proven\nnon-actionable release-note mechanics and leave substantive claims unchanged.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-017/changelog.md", "path": "ticket-017 / changelog.md", "size": "1.9KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-017)\n\n## [0.1.0] - 2026-08-01\n\n- Initial governance scaffold created.\n- No human participant identity or content was generated.\n- Recorded the audit scope, risks, pre-existing worktree boundary and acceptance\n criteria; implementation remains blocked on human approval.\n- User approved the plan and the ticket entered `IN_PROGRESS / TOOLS`.\n\n## [0.2.0] - 2026-08-01\n\n- Repaired non-mutating command help and Polish active-prohibition polarity with\n focused CLI, text and documentation regressions.\n- Audited concurrent path/action planning and bounded Markdown path resolution\n against absolute, Windows and parent traversal.\n- Passed 314 host tests (313 pass, one JDK skip) and 314 Docker tests (307 pass,\n seven optional-toolchain skips), gold v2/v1 at 100% gated precision/recall,\n and host plus Docker examples.\n- On `wellmanifest/new-project@72e5f6c`, removed the sole false\n `CONFLICTING_INTENT`; recorded all 183 remaining diagnostics rather than\n claiming a clean repository.\n- Refreshed `project/analysis.toon.yaml`; no commit, push or auto-apply occurred.\n- Continued the active ticket for the user-requested Docker E2E core/full\n environments; no new ticket or human-owned participant file was created.\n\n## [0.3.0] - 2026-08-01\n\n- Added isolated `e2e-core` and `e2e-full` Docker/Compose environments plus\n operator documentation and stable `T2C-E2E-*` failure codes.\n- Core E2E passed with 318 tests (311 pass, seven explicit optional-toolchain\n skips), both gold benchmarks, protocol smoke checks and core examples.\n- Full E2E passed with 318/318 tests and zero skips, both gold benchmarks,\n CLI/MCP/A2A smoke checks and shared fingerprints from all five SDK examples.\n- Added the native build toolchain required to link the Rust example after the\n first full run exposed the missing `cc` executable as `T2C-E2E-108`.\n- Marked ticket-017 `DONE`; no commit, push or auto-apply occurred.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-016/changelog.md", "path": "ticket-016 / changelog.md", "size": "347B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-016)\n\n## [Unreleased]\n\n- Added the PHP syntax helper and independently exported adapter.\n- Added environment, manifest and doctor visibility for the optional runtime.\n- Removed PHP from unsupported-language counts only while its adapter is enabled.\n- Verified the behavior with focused tests and a measured `redsl` A/B.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-015/changelog.md", "path": "ticket-015 / changelog.md", "size": "373B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-015)\n\n## [Unreleased]\n\n- Reproduced the lossy compound-action title from the autonomous Koru replay.\n- Preserved the source statement when inferred object text retains a leading\n imperative, without changing normal concise plan titles.\n- Kept all runtime code under `src/synthesis`; this folder contains governance\n and redacted evidence only.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-014/changelog.md", "path": "ticket-014 / changelog.md", "size": "672B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-014)\n\n## [Unreleased]\n\n- Recorded the existing-path/unrelated-capability false-alignment case found by\n the first autonomous Koru integration run.\n- Defined a fail-closed semantic corroboration requirement and response-owner\n boundary for the follow-up implementation.\n- Kept shared-path relations as navigation evidence while requiring a symbol,\n extracted capability, grounded concrete-fact similarity or accepted rerank\n before a capability-bearing declaration can become implemented.\n- Added gold negative/positive controls, fixed Intent-vs-Reality coverage, and\n completed the autonomous Koru replay through verified commit `55a8b15`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-013/changelog.md", "path": "ticket-013 / changelog.md", "size": "623B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-013)\n\n## [Unreleased]\n\n- Opened a controlled three-model Live LLM comparison against the Gemini 3.6\n Flash baseline.\n- Selected Codestral 2508 after a 6/6 run at 57,129 ms and $0.037994; Gemini 3\n Flash Preview also passed, while DeepSeek V4 Pro crossed the 900-second cap.\n- Added a real total-run cancellation signal and fresh-manifest guard.\n- Added bounded concurrent Markdown enrichment. The same `weekly` workload\n improved from 218,741 ms to 53,362 ms without changing audit order.\n- Verified Codestral on `weekly` and `nlp2uri`; kept all generated artifacts\n outside their worktrees.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-012/changelog.md", "path": "ticket-012 / changelog.md", "size": "509B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-012)\n\n## [Unreleased]\n\n- Replaced opaque live model routing with an explicit structured-output model.\n- Preserved provider metadata for rejected structured responses.\n- Included the current run in persisted and rendered live history.\n- Aligned live request timeout with the configured per-stage budget.\n- Added one strict, audited corrective attempt to NL, Markdown, documentation\n and communication extraction.\n- Selected `google/gemini-3.6-flash` after a measured 6/6 live pass.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-011/changelog.md", "path": "ticket-011 / changelog.md", "size": "523B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-011)\n\n## [0.1.0] - 2026-07-31\n\n- Added AST-grounded unique/ambiguous/conflicting symbol resolution for NL.\n- Replaced ambiguous multi-module symbol evidence with deterministic abstention.\n- Added field-specific fixes to `AMBIGUOUS_REQUIREMENT`.\n- Removed implicit file-name and all-caps prose symbols.\n- Extended gold v2 with exact-target symbol-resolution hard negatives.\n- Passed full verify, both gold datasets and all five SDK examples.\n- Published the implementation to `main` as `25df74a`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-010/changelog.md", "path": "ticket-010 / changelog.md", "size": "468B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-010)\n\n## [0.1.0] - 2026-07-31\n\n- Added content-addressed AST and documentation-chunk caches.\n- Added fail-open validation, atomic writes and cache telemetry.\n- Added cold/warm, invalidation, corruption and provider-isolation tests.\n- Measured tracked snapshots of todo2code, new-project and\n subactor-improvement.\n- Passed exact-commit verify, both gold datasets and all SDK examples.\n- Published the implementation to `main` as `f1d9334`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-009/changelog.md", "path": "ticket-009 / changelog.md", "size": "481B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-009)\n\n## [0.1.0] - 2026-07-31\n\n- Audited provider/runtime schema drift across all structured LLM stages.\n- Added one typed schema/parser source and migrated all seven production\n OpenRouter boundaries.\n- Replaced silent provider-value coercion with fail-closed retry/fallback.\n- Added production-call and published-schema drift gates.\n- Passed full verify, both gold datasets and all SDK examples.\n- Published the implementation to `main` as `d0fc143`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-008/changelog.md", "path": "ticket-008 / changelog.md", "size": "338B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-008)\n\n## [0.1.0] - 2026-07-31\n\n- Audited the governance hub against todo2code's communication contract.\n- Hardened upstream ticket scripts, templates, ownership rules and indexing.\n- Added an isolated cross-repository interoperability test.\n- Published upstream version 0.6.0 and recorded the evidence locally.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-007/changelog.md", "path": "ticket-007 / changelog.md", "size": "429B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-007)\n\n## [0.1.0] - 2026-07-31\n\n- Initial governance scaffold created.\n- Selected explicit unresolved-role sentinels as the fail-closed routing\n behavior.\n\n## [0.2.0] - 2026-07-31\n\n- Added role-specific fallback routes for otherwise empty respondent lists.\n- Covered agent-only and human-only tickets, rendering and diagnostics.\n- Closed the ticket after full offline verification and gold evaluation.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-006/changelog.md", "path": "ticket-006 / changelog.md", "size": "1.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-006)\n\n## [0.1.0] - 2026-07-31\n\n- Initialized the canonical structured-output conformance ticket.\n- Preserved human-file ownership instead of fabricating a `user-*` record.\n- Entered `PLAN`; no implementation change yet.\n\n## [0.2.0] - 2026-07-31\n\n- Added the canonical semantic-reranker provider response definition and exact\n fail-closed runtime validator.\n- Added a drift gate against the published result schema.\n- Added offline regressions for wrong envelopes, non-numeric confidence and\n contradictory verdict/reason pairs.\n- Transitioned from `PLAN` to `TOOLS`; live two-route comparison remains open.\n\n## [0.3.0] - 2026-07-31\n\n- Compared `qwen/qwen3.7-plus` and `qwen/qwen3.7-flash` on the same clean\n tracked platform shortlist.\n- Rejected both routes before graph mutation; the new Flash diagnostic named\n the exact unknown `decision` property and response identity.\n- Passed full verification, both gold datasets, examples, dependency audit and\n CLI/MCP/A2A/Docker smoke.\n- Retained only contract hardening and closed the ticket without production\n semantic enablement.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-005/changelog.md", "path": "ticket-005 / changelog.md", "size": "1.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-005)\n\n## [0.1.0] - 2026-07-31\n\n- Initialized the audited cross-language reranking plan.\n- Made the source/evidence directory boundary explicit.\n- Entered `PLAN` and stopped before implementation for owner review.\n\n## [0.2.0] - 2026-07-31\n\n- Recorded owner approval without modifying the human participant file.\n- Added the governance-standard participant extraction and response-owner audit\n as a prerequisite to semantic reranking.\n- Transitioned from `PLAN` to `TOOLS`.\n\n## [0.3.0] - 2026-07-31\n\n- Recognized section-owned intent in `user-*` and `ai-*`.\n- Excluded ticket specifications, iterations, audits and agent logs from the\n participant channel.\n- Added `responseRequiredRole` and `responseRequiredFrom` to every detected\n divergence.\n- Added unconfirmed-human-decision detection without allowing the agent to\n modify the human-owned record.\n- Validated migration behavior against historical Opus and GPT56Luna material\n from `wellmanifest/new-project`.\n\n## [0.4.0] - 2026-07-31\n\n- Added bounded semantic candidate and grounded accept/reject/abstain contracts,\n JSON Schemas and offline regression tests.\n- Added captured gold decisions that recover 6/6 cross-language positives with\n zero forbidden-pair violations and one hard-negative abstention.\n- Restricted live evaluation to a clean tracked snapshot and moved the\n reproducer to `scripts/research/`.\n- Rejected the production candidate after three live\n `qwen/qwen3.7-plus` responses violated the structured contract before a\n relation could be created.\n- Removed semantic reranker exports from the public package and closed the\n ticket through the explicit rejection branch.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-004/changelog.md", "path": "ticket-004 / changelog.md", "size": "1.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-004)\n\n## [0.1.0] - 2026-07-31\n\n- Created the separately scoped language-independent matching experiment.\n- Recorded user continuation as approval.\n- Entered `TOOLS` with precision, provenance and offline-CI guardrails.\n\n## [0.2.0] - 2026-07-31\n\n- Added a multilingual synthetic benchmark with six positive and six nearby\n negative pairs across Polish, German, Spanish and French.\n- Evaluated pinned MiniLM and E5 models locally.\n- Rejected a global cosine threshold because positive and negative score ranges\n overlap.\n\n## [0.3.0] - 2026-07-31\n\n- Ranked 66 actionable targetless platform declarations against 133 module\n aggregates.\n- Rejected two new forward-threshold candidates during manual review.\n- Confirmed reciprocal top-1 removes the false positives but adds no coverage;\n no production matcher was retained.\n- Added a separately reported cross-language gold cohort with six known\n positives and six gated hard negatives; transitioned to `VERIFY`.\n\n## [0.4.0] - 2026-07-31\n\n- Passed 244 tests (243 pass, zero fail, one allowed local Java skip), gold\n v1/v2, all five SDK examples, dependency audit, CLI/MCP/A2A and Docker smoke.\n- Updated `READINESS.md`, `TEST_REPORT.md`, `VALIDATION.md` and `TODO.md`.\n- Closed the rejected matcher experiment in `DONE` without a production\n semantic rule.\n\n## [0.4.1] - 2026-07-31\n\n- Corrected repository layout after review: moved both executable embedding\n experiment reproducers from the ticket evidence directory to\n `scripts/research/`.\n- Preserved benchmark inputs, captured outputs and decisions in the ticket.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-003/changelog.md", "path": "ticket-003 / changelog.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-003)\n\n## [0.1.0] - 2026-07-31\n\n- Created the separately scoped residual changelog audit.\n- Recorded user continuation as approval.\n- Entered `TOOLS` with a deterministic sampling and reject-unsafe-hypothesis\n policy.\n\n## [0.2.0] - 2026-07-31\n\n- Reproduced 1,853 residual findings on all seven current deterministic runs.\n- Added a reproducible 168-record stratified sample with labels and rationale.\n- Selected exact `Update ` bookkeeping: 28 sampled and 547 census records\n across five repositories.\n- Deferred roadmap checkboxes and retained 1,275 substantive or unverified\n claims; transitioned to `ANALYSIS`.\n\n## [0.3.0] - 2026-07-31\n\n- Added a red/green regression for exact file-only updates with behavioral hard\n negatives.\n- Added the minimal diagnostic-signal correction.\n- Removed 547 review-required findings and 188 secondary unlinked warnings\n across five repositories with 7/7 stable graph fingerprints.\n- Gold v2 remains perfect; transitioned to `VERIFY`.\n\n## [0.4.0] - 2026-07-31\n\n- Passed full verification: 242 tests, 241 passed, zero failed and one allowed\n local Java skip; module, LLM-boundary, environment, workflow and generated\n analysis checks also passed.\n- Passed all five SDK examples, the production dependency audit, CLI/MCP/A2A\n smoke checks and Docker smoke.\n- Updated `docs/READINESS.md`, recorded the next ranked roadmap-lifecycle\n hypothesis and transitioned from `VERIFY` to `DONE`.\n\n## [0.4.1] - 2026-07-31\n\n- Corrected repository layout after review: moved the executable audit\n reproducer from the ticket evidence directory to `scripts/research/`.\n- Preserved the ticket input, captured output and documentation in place.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-002/changelog.md", "path": "ticket-002 / changelog.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-002)\n\n## [0.1.0] - 2026-07-31\n\n- Initialized the ticket from the `wellmanifest/new-project` governance\n standard.\n- Recorded the human instruction, Codex execution plan, acceptance criteria,\n risks and initial environment evidence.\n- Entered `WAIT_FOR_APPROVAL`; no source-code or external benchmark execution\n has started.\n\n## [0.2.0] - 2026-07-31\n\n- Recorded user approval (`kontynuuj`) and transitioned from\n `WAIT_FOR_APPROVAL` to `TOOLS`.\n\n## [0.3.0] - 2026-07-31\n\n- Ran the normalized offline pipeline successfully against seven detached,\n tracked-only external repositories.\n- Added `baseline.json` with machine-readable commits, fingerprints, counts,\n diagnostics, coverage and timings, plus `baseline.md` with reviewed results.\n- Transitioned to `ANALYSIS` and selected non-actionable release-note mechanics\n as the first independently measurable diagnostic defect.\n\n## [0.4.0] - 2026-07-31\n\n- Added a red/green regression that separates changelog bookkeeping from\n substantive release claims.\n- Added a narrow deterministic classifier for placeholders, compact file\n summaries and known generated analysis targets under `project/`.\n- Re-ran the unchanged seven-repository corpus from a clean runtime containing\n only this patch: removed 1,024 false `review_required` findings across five\n repositories, retained substantive findings, and kept every graph fingerprint\n unchanged.\n- Gold v2 remains perfect; transitioned to `VERIFY`.\n\n## [0.5.0] - 2026-07-31\n\n- Passed `npm run verify` (241 tests: 240 pass, 1 local JDK skip), gold v2,\n examples for five SDKs, CLI/MCP/A2A smoke, npm production audit and Docker\n smoke.\n- Updated readiness and validation documentation with the seven-repository\n baseline and controlled iteration result.\n- Completed all acceptance criteria and transitioned `VERIFY -> DONE`.\n\n## [0.6.0] - 2026-07-31\n\n- Reproduced a `project.sh` false positive caused by generated HTML quoting a\n tracked audit log that named an untracked file.\n- Added a red/green regression and taught generated-analysis verification to\n accept only references already present in tracked, non-generated text.\n- Kept the original hard negative for newly introduced untracked references.\n- Re-ran tracked-only `project.sh`, full verify (242 tests: 241 pass, one Java\n skip) and Docker smoke successfully.\n", "is_subdir": true}, {"name": "iteration-01.md", "rel_path": "ticket-004/iteration-01.md", "path": "ticket-004 / iteration-01.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 01: multilingual embedding feasibility\n\n## Hypothesis\n\nA pinned multilingual sentence embedding can replace the hand-written\nPolish-to-English topic dictionary while preserving a precision-first boundary.\n\n## Evidence\n\n- Synthetic benchmark: 6 positives and 6 nearby hard negatives across four\n languages.\n- Local models: pinned multilingual MiniLM and multilingual E5.\n- Repository prototype: 66 actionable targetless declarations ranked against\n 133 module aggregates from the tracked `subactor/platform` graph\n `ae92ead72d35e88e`.\n\n## Result\n\nThe hypothesis is rejected in its raw form.\n\nMiniLM ranked one wrong module above the intended module. E5 ranked all six\nsynthetic positives correctly, but absolute positive and negative score ranges\noverlap. On the real repository, E5 with a 0.75 score and 0.01 margin proposed\ntwo new links; manual review rejected both. Reciprocal top-1 removed those\nfalse positives but also removed every new candidate, so coverage could not\nimprove.\n\n## Retained change\n\nNo production semantic relation rule is retained. Gold v2 now exposes\n`cross-language` as a separate cohort:\n\n- 6 positive relations remain measured known gaps;\n- 6 nearby wrong modules remain gated forbidden pairs;\n- same-language exact-target and capability-topic precision/recall stay\n independent.\n\nThis turns the language barrier from one Polish anecdote into a multi-language\nacceptance boundary without making offline CI provider-dependent.\n", "is_subdir": true}, {"name": "iteration-01.md", "rel_path": "ticket-003/iteration-01.md", "path": "ticket-003 / iteration-01.md", "size": "1.5KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 01: exact file-update bookkeeping\n\n## Result\n\nKeep the change. An exact `Update ` row no longer creates an\nimplementation-gap or unlinked-record diagnostic. Additional wording keeps the\nrecord actionable.\n\n| Repository | Graph | Changelog before β†’ after | Unlinked before β†’ after |\n| --- | --- | ---: | ---: |\n| semcod/code2llm | unchanged | 955 β†’ 650 | 1,312 β†’ 1,219 |\n| semcod/domd | unchanged | 99 β†’ 99 | 772 β†’ 772 |\n| semcod/pactfix | unchanged | 48 β†’ 48 | 217 β†’ 217 |\n| semcod/code2logic | unchanged | 120 β†’ 109 | 1,503 β†’ 1,492 |\n| semcod/code2docs | unchanged | 269 β†’ 127 | 455 β†’ 418 |\n| semcod/redup | unchanged | 269 β†’ 184 | 703 β†’ 661 |\n| subactor/platform | unchanged | 93 β†’ 89 | 766 β†’ 761 |\n\nAcross the corpus:\n\n- `CHANGELOG_WITHOUT_IMPLEMENTATION`: 1,853 β†’ 1,306 (`-547`);\n- `UNLINKED_RECORD`: 5,728 β†’ 5,540 (`-188`);\n- all diagnostics: 16,280 β†’ 15,545 (`-735`);\n- graph fingerprints: unchanged in 7/7 repositories.\n\n`domd` and `pactfix` contained no selected file-only rows and therefore remained\nunchanged. Gold v2 stayed perfect before the full validation phase.\n\n## Precision boundaries\n\nSuppressed:\n\n- `Update src/runtime.ts`\n- `Update README.md`\n- `update debug/.cache/state.pkl`\n\nRetained:\n\n- `Update src/runtime.ts to reject invalid tokens`\n- `Updated authentication in src/runtime.ts`\n- `Update support for Dockerfile parsing`\n- `Added Jenkinsfile support for deployment pipelines`\n\nMachine-readable run IDs, fingerprints and deltas are in\n[`iteration-01.json`](iteration-01.json).\n", "is_subdir": true}, {"name": "iteration-01.md", "rel_path": "ticket-002/iteration-01.md", "path": "ticket-002 / iteration-01.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 01: non-actionable changelog mechanics\n\n## Decision\n\nKeep the change. It removes release-note bookkeeping from implementation-gap\ndiagnostics without treating an unsupported release claim as implemented.\n\nThe new classifier ignores only:\n\n- explicit placeholder entries;\n- compact `... and N more files` continuation rows;\n- entries whose every target is a known generated analysis artifact under the\n reserved `project/` directory.\n\nOrdinary documentation updates, source updates, mixed target lists, unknown\nfiles under `project/`, and behavioral release statements remain actionable.\n\n## Controlled evaluation\n\nThe candidate was applied to a clean runtime based on the same\n`5f5ae5938ab77dcce474ba7abbd23686072776ec` commit as the baseline. No other\nworking-tree source changes were included. The external input policy and all\nseven detached commits remained unchanged.\n\n| Repository | Graph | CHANGELOG before β†’ after | Review before β†’ after | UNLINKED before β†’ after |\n| --- | --- | ---: | ---: | ---: |\n| semcod/code2llm | unchanged | 1,411 β†’ 955 | 1,411 β†’ 955 | 1,332 β†’ 1,313 |\n| semcod/domd | unchanged | 105 β†’ 99 | 105 β†’ 99 | 779 β†’ 773 |\n| semcod/pactfix | unchanged | 48 β†’ 48 | 48 β†’ 48 | 217 β†’ 217 |\n| semcod/code2logic | unchanged | 121 β†’ 120 | 121 β†’ 120 | 1,504 β†’ 1,503 |\n| semcod/code2docs | unchanged | 396 β†’ 269 | 396 β†’ 269 | 463 β†’ 455 |\n| semcod/redup | unchanged | 703 β†’ 269 | 703 β†’ 269 | 708 β†’ 703 |\n| subactor/platform | unchanged | 93 β†’ 93 | 93 β†’ 93 | 780 β†’ 780 |\n\nAcross the corpus, `CHANGELOG_WITHOUT_IMPLEMENTATION` fell by 1,024\n(2,877 β†’ 1,853) and the related unlinked warning fell by 39. The two\nrepositories dominated by substantive sampled claims (`pactfix` and\n`subactor/platform`) did not change. All graph fingerprints were identical.\n\n## Regression gates\n\n- The focused test was observed failing before the implementation and passing\n afterwards.\n- The nearby hard negatives preserve diagnostics for Jenkinsfile support,\n `docs/api.md`, and an unknown `project/custom-runtime.ts` source.\n- Gold v2 remains 100% precision and recall in every measured scope, with zero\n forbidden diagnostic violations and stable repeated runs.\n\nMachine-readable deltas and exact after-run IDs are in\n[`iteration-01.json`](iteration-01.json).\n", "is_subdir": true}, {"name": "iteration-02.md", "rel_path": "ticket-002/iteration-02.md", "path": "ticket-002 / iteration-02.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 02: tracked audit references in generated-analysis isolation\n\n## Trigger\n\nAfter `HEAD` advanced to `18cc21b`, a fresh tracked-only `project.sh` run\ngenerated `project/index.html` from the detached snapshot and then failed:\n\n```text\nproject/index.html references untracked input nlp2uri.yaml\n```\n\nThe generator had not read that private file. Its name was already present in\nthe committed ticket audit as captured `git status --short` output, and the\nHTML report quoted that tracked log.\n\n## Correction\n\nThe verifier now distinguishes:\n\n- a reference newly introduced by generated output β€” still rejected;\n- a filename already quoted by a tracked, non-generated source β€” accepted as\n tracked evidence, not proof that the untracked file was consumed.\n\nGenerated reports are excluded from the tracked-reference corpus so a stale\nreport cannot justify itself. Binary tracked files are also excluded.\n\n## Red/green evidence\n\nA focused regression first failed with 3/4 passing. After the correction all\n4/4 generated-analysis tests pass, including the original hard negative that\nrejects a newly introduced private input reference.\n\nThe complete tracked-only `project.sh` command then passed:\n\n```text\n{\"filesChecked\":18,\"untrackedInputsChecked\":6,\"status\":\"ok\"}\n```\n\nThe final `npm run verify` passed 242 tests (241 pass, one local Java skip) and\nDocker smoke passed after this change.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-017/preprompt.md", "path": "ticket-017 / preprompt.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-017\n- **Task title**: Audit and repair confirmed todo2code errors\n- **Created**: 2026-08-01T09:15:46Z\n\nKeep executable implementation outside this governance/evidence directory.\nRead a human-owned user-*.md file only when one exists.\n\n## Technical directives\n\n- Treat concurrent commit `1ebad96` and any later branch movement as external\n input; review HEAD and diffs again immediately before edits.\n- Do not touch `user-*`, `nlp2uri.yaml` or unrelated source changes.\n- After approval, run the repository analysis automation against the workspace\n without applying `prefact` and read its generated reports.\n- Reproduce each defect before changing source and add the smallest focused test.\n- Preserve deterministic/offline operation and the canonical `DiagnosticCode`\n contract; new operational errors must have stable codes and actionable text.\n- Use the project Docker environment for authoritative verification.\n- Re-run the Governance Hub analysis outside its worktree so validation does not\n create artifacts in the read-only policy repository.\n- Keep production `Dockerfile`/A2A Compose behavior unchanged; put test-only\n toolchains and commands in dedicated E2E files.\n- Bake the source into E2E images instead of bind-mounting mutable host state.\n- Set both `WORKDIR` and `T2C_ROOT` to `/workspace` so SDK/A2A relative roots are\n resolved consistently.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-016/preprompt.md", "path": "ticket-016 / preprompt.md", "size": "362B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-016\n- **Task title**: First-class PHP syntax evidence\n- **Owner**: agent:codex\n- **Repository**: todo2code\n\nAdd deterministic PHP evidence through the common adapter contract. Be exact\nabout the parser boundary: PHP syntax tokens are not presented as a full AST.\nKeep measurements outside analyzed repository worktrees.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-015/preprompt.md", "path": "ticket-015 / preprompt.md", "size": "332B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-015\n- **Task title**: Preserve compound intent in code-change titles\n- **Owner**: agent:codex\n- **Repository**: todo2code\n\nFix the deterministic code-change title projection observed during PLF-003.\nDo not change the source Intent DSL record or place runtime code in this ticket\ndirectory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-014/preprompt.md", "path": "ticket-014 / preprompt.md", "size": "382B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-014\n- **Task title**: Distinguish path presence from implemented intent\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nAdd a negative semantic control for a planned capability aimed at an existing\nfile whose AST does not implement that capability. Prefer abstention and an\nexplicit response owner over a false `aligned` result.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-013/preprompt.md", "path": "ticket-013 / preprompt.md", "size": "374B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-013\n- **Task title**: Compare qualified Live LLM models\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nUse the models that satisfy the OpenRouter and llm-code-benchmark screening\ncriteria, then measure whether they perform better in todo2code Live LLM.\nKeep the full `require-llm` contract and existing cost/time gates.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-012/preprompt.md", "path": "ticket-012 / preprompt.md", "size": "396B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-012\n- **Task title**: Reliable live structured-output model\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nMake live LLM usable with an explicit structured-output-capable model. Preserve\nmetadata for rejected responses, correct current-run history accounting, test\noffline, then verify against the real provider without weakening validation.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-011/preprompt.md", "path": "ticket-011 / preprompt.md", "size": "463B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-011\n- **Task title**: AST-grounded NL symbol resolution\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nResolve explicit NL symbols against AST declarations. Preserve exact symbol\nevidence only when one module owns the symbol or an explicit path/qualifier\nselects one owner. Report ambiguity with candidate paths and actionable missing\nfields. Keep all executable implementation outside this ticket directory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-010/preprompt.md", "path": "ticket-010 / preprompt.md", "size": "466B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-010\n- **Task title**: Incremental extraction cache\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nAdd a fail-open, content-addressed cache for deterministic AST extraction and\ndocumentation chunking. Preserve byte-for-byte-equivalent extraction output,\nnever cache provider responses, measure cold/warm behavior on real repository\nsnapshots, and keep all executable implementation outside this ticket directory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-009/preprompt.md", "path": "ticket-009 / preprompt.md", "size": "456B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-009\n- **Task title**: Canonical structured-response contracts\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nReplace manually duplicated OpenRouter schemas and runtime validation with one\ntyped canonical contract per response boundary. Reject provider drift without\ncoercing intent, preserve grounding as a second validation layer, and keep all\nexecutable implementation outside this ticket directory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-008/preprompt.md", "path": "ticket-008 / preprompt.md", "size": "436B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-008\n- **Task title**: Cross-repository governance standard hardening\n- **Owner**: unresolved:human\n- **Repository**: todo2code + wellmanifest/new-project\n\nApply the intent ownership, response routing and ticket-directory findings from\ntodo2code to the upstream governance templates. Keep executable implementation\noutside this ticket directory and do not create a human-owned participant file.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-007/preprompt.md", "path": "ticket-007 / preprompt.md", "size": "432B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-007\n- **Task title**: Explicit unresolved response routing\n- **Owner**: tom-sapletta-com\n- **Repository**: todo2code\n\nUse the governance layout established by `wellmanifest/new-project/project`.\nKeep implementation outside the ticket directory. Close the measured\nticket-006 routing gap without inventing a participant, creating a human-owned\nfile or guessing identity from a display name.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-006/preprompt.md", "path": "ticket-006 / preprompt.md", "size": "439B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-006\n- **Task title**: Canonical structured-output conformance\n- **Owner**: tom-sapletta-com\n- **Repository**: todo2code\n\nUse the governance layout established by `wellmanifest/new-project/project`.\nKeep implementation outside the ticket directory. Treat ticket-005's three\nlive schema violations as measured input, preserve fail-closed behavior and do\nnot weaken repository-evidence requirements.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-005/preprompt.md", "path": "ticket-005 / preprompt.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-005)\n\n- **Task title**: Audited cross-language reranking\n- **Created**: 2026-07-31\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements\n\n1. Use retrieval only to produce a bounded shortlist.\n2. Require a separate structured decision with explicit abstention.\n3. Ground every accepted decision in repository-owned records, paths, symbols\n or capability terms.\n4. Preserve exact-target precedence and the deterministic offline linker.\n5. Record provider/model/revision, input hashes, scores and cited evidence.\n6. Cache model-derived output by content and model identity.\n7. Evaluate tracked snapshots only; never transmit untracked or private data.\n8. Reject the approach unless it clears gold and real-repository precision\n gates.\n9. Store executable source outside `project/ticket-*`.\n\n## Referenced evidence\n\n- `project/ticket-004/iteration-01.md`\n- `project/ticket-004/audit.md`\n- `evaluation/gold/v2/dataset.json`\n- `src/graph/linker.ts`\n- `src/core/text.ts`\n- `docs/READINESS.md`\n\n## Approval boundary\n\nInitialization records the user's request to continue, but implementation waits\nfor review of `README.md` and `ai-codex.md` as required by `P-CORE-008`.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-004/preprompt.md", "path": "ticket-004 / preprompt.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-004)\n\n- **Task title**: Language-independent topic matching\n- **Created**: 2026-07-31\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements\n\n1. Preserve the precision-first exact-target and three-topic contracts.\n2. Measure multilingual behavior independently from same-language linking.\n3. Compare strategies before choosing an implementation.\n4. Keep the primary offline gates deterministic and provider-independent.\n5. Record model/provider identity and scores for any model-derived evidence.\n6. Cache expensive projections by content and model identity.\n7. Analyze only tracked snapshots of external repositories.\n8. Reject an approach that improves headline coverage by violating hard\n negatives or obscuring evidence origin.\n\n## Referenced evidence\n\n- `docs/READINESS.md`\n- `evaluation/gold/v2/dataset.json`\n- `project/ticket-002/iteration-02.md`\n- `project/ticket-003/iteration-01.md`\n- `src/core/text.ts`\n- `src/graph/linker.ts`\n- `src/diff/reality.ts`\n\n## Approval boundary\n\nThe user's `kontynuuj` message approves this separately recorded semantic\nexperiment. It does not approve provider-dependent default behavior, external\ndeployment, or changes to the governance repository.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-003/preprompt.md", "path": "ticket-003 / preprompt.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-003)\n\n- **Task title**: Residual changelog diagnostic audit\n- **Created**: 2026-07-31\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements\n\n1. Continue the iterative external-repository hardening from ticket-002.\n2. Reproduce the current residual changelog findings on the same seven commits.\n3. Select the review sample deterministically, without LLM labeling.\n4. Preserve sampled text, targets and source identity in a portable artifact.\n5. Distinguish real unsupported release claims from diagnostic false positives.\n6. Require cross-repository repetition and a hard negative before code changes.\n7. Measure each retained change independently and reject unsafe hypotheses.\n8. Keep external repositories and unrelated workspace changes untouched.\n\n## Referenced evidence\n\n- `project/ticket-002/baseline.json`\n- `project/ticket-002/iteration-01.json`\n- `project/ticket-002/iteration-01.md`\n- `docs/READINESS.md`\n- `evaluation/gold/v2/dataset.json`\n\n## Approval boundary\n\nThe user's `kontynuuj` message followed the explicit recommendation to place\nthe residual changelog audit in a separate ticket. It approves this recorded\nscope; unrelated `new-project` implementation remains outside the ticket.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-002/preprompt.md", "path": "ticket-002 / preprompt.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-002)\n\n- **Task title**: Cross-repository semantic hardening\n- **Created**: 2026-07-31T06:49:07Z\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements and constraints\n\n1. Test todo2code on real external repositories through deterministic,\n reproducible runs.\n2. Capture a comparable baseline before changing semantic behavior.\n3. Classify observed failures and select one shared, measurable defect.\n4. Add an independent regression case before implementing its fix.\n5. Apply one semantic change at a time and repeat gold plus corpus measurements.\n6. Reject an attempted improvement when it increases noise or lacks measurable\n external benefit.\n7. Preserve external repositories, secrets, untracked files and current user\n changes.\n8. Keep raw command output in the provider-specific ticket log.\n\n## Referenced specifications\n\n- `docs/READINESS.md`\n- `docs/TEST_REPORT.md`\n- `evaluation/gold/README.md`\n- `evaluation/gold/v2/dataset.json`\n- `TODO.md`\n- Governance policy: `wellmanifest/new-project/POLICY.md`\n- Governance procedure: `wellmanifest/new-project/CONTRIBUTING.md`\n\n## Execution boundary\n\nThe planning state is `WAIT_FOR_APPROVAL`. Under `P-CORE-008`, no source-code\nchange or external benchmark execution begins until the user approves\n`ai-codex.md` and the project-level ticket entry in `TODO.md`.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-005/user-tom-sapletta-com.md", "path": "ticket-005 / user-tom-sapletta-com.md", "size": "436B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com\n\n- **Ticket**: ticket-005\n- **Role**: owner and reviewer\n\n## Instructions\n\n- Continue improving and testing the library step by step on other projects.\n- Explain and correct executable code placed under ticket directories.\n- Use the ticket standard from `wellmanifest/new-project/project`.\n\n## Decisions\n\n- Ticket directories are governance and evidence folders, not implementation\n source directories.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-004/user-tom-sapletta-com.md", "path": "ticket-004 / user-tom-sapletta-com.md", "size": "400B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com (human)\n\n- **Ticket**: ticket-004\n- **Status**: ACTIVE\n\n## Assigned instruction\n\nContinue improving the library step by step after identifying that a\nhand-written Polish-to-English topic dictionary covers vocabulary rather than\nlanguage.\n\n## Ownership boundary\n\nThis file records the initiating human instruction. Agents must not modify it\nduring ticket continuation.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-003/user-tom-sapletta-com.md", "path": "ticket-003 / user-tom-sapletta-com.md", "size": "317B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com (human)\n\n- **Ticket**: ticket-003\n- **Status**: ACTIVE\n\n## Assigned instruction\n\nContinue the previously proposed step-by-step hardening after ticket-002.\n\n## Ownership boundary\n\nThis file records the initiating human instruction. Agents must not modify it\nduring ticket continuation.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-002/user-tom-sapletta-com.md", "path": "ticket-002 / user-tom-sapletta-com.md", "size": "447B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com (human)\n\n- **Ticket**: ticket-002\n- **Status**: ACTIVE\n\n## Assigned instruction\n\nTest todo2code on other projects, derive conclusions, improve the library\niteratively step by step, and use the `wellmanifest/new-project` ticket\nstandard in the target repository's `project/` directory.\n\n## Ownership boundary\n\nThis file records the initiating human instruction. Agents must not modify it\nduring ticket continuation.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-017/ai-codex-logs.txt", "path": "ticket-017 / ai-codex-logs.txt", "size": "93.1KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "[2026-08-01T09:15:46Z] [EXEC] [provider:codex] $ ./project/new-ticket.sh --title 'Audit and repair confirmed todo2code errors' --agent codex\n[2026-08-01T09:15:46Z] [STDOUT] Updated project/TICKETS.md ticket index successfully.\n[2026-08-01T09:15:46Z] [STDOUT] Successfully scaffolded project/ticket-017 for 'Audit and repair confirmed todo2code errors'.\n[2026-08-01T09:15:46Z] [EXIT] Command exited with code 0\n[2026-08-01T09:17:00Z] [OBSERVED] HEAD moved concurrently to 1ebad96beb2724d2b4296ad2b5a1b5c187f92139.\n[2026-08-01T09:17:00Z] [OBSERVED] Commit subject: fix: give Markdown paths one identity and plan create vs modify\n[2026-08-01T09:18:00Z] [DECISION] [provider:codex] User approved ticket-017 with: kontynuuj\n[2026-08-01T09:26:00Z] [DECISION] [provider:codex] User extended ticket-017: create Docker environments for E2E testing.\n[2026-08-01T09:18:54Z] [EXEC] [provider:codex] $ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\nPreparing worktree (detached HEAD 1ebad96)\nπŸ“– code2docs analyzing todo2code...\n\nAnalyzing: 0%| | 0/377 [00:00<?, ?it/s]\nAnalyzing: 28%|β–ˆβ–ˆβ–Š | 105/377 [00:00<00:00, 1012.29it/s]\nAnalyzing: 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 253/377 [00:00<00:00, 1282.43it/s]\nAnalyzing: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 377/377 [00:00<00:00, 421.61it/s]\n βœ… docs/README.md\n✨ Done!\n{"readme":"docs/README.md","version":"0.5.0","license":"Apache-2.0","nodeVersion":">=20","changed":true}\nπŸ” Scanning: \nπŸ“ Extensions: .py, .pyw, .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .php, .phtml, .go, .rs, .java, .c, .h, .cpp, .cc, .cxx, .hpp, .cs, .scala, .kt, .swift, .m, .mm, .lua, .rb, .rake, .gemspec, .sql, .sh, .bash, .zsh, .fish, .html, .htm, .xhtml, .css, .scss, .sass, .less, .svelte, .vue\nπŸ“ Min lines: 3\n🎯 Min similarity: 0.85\n\nDuplicate finding completed in 679.0ms\nπŸ“Š Scanned 168 files (30600 lines, 1207ms)\nFound 17 duplicate groups (44 fragments, 120 lines recoverable)\n\n β†’ project/duplication.toon.yaml\nUsing .gitignore from .\nExcluded 7 files by .gitignore\nβœ“ Results saved to project/validation.toon.yaml\n{"filesChecked":18,"filesChanged":8}\n{"filesChecked":19,"untrackedInputsChecked":8,"status":"ok"}\nSkipping source refactoring; set T2C_APPLY_PREFACT=1 to apply prefact changes.\n[2026-08-01T09:19:11Z] [EXIT] Command exited with code 0\n[2026-08-01T09:20:29Z] [EXEC] [provider:codex] $ docker build -t todo2code:ticket017-baseline .\n#0 building with "default" instance using docker driver\n\n#1 [internal] load build definition from Dockerfile\n#1 transferring dockerfile: 1.58kB done\n#1 DONE 0.0s\n\n#2 resolve image config for docker-image://docker.io/docker/dockerfile:1.7\n#2 DONE 1.0s\n\n#3 docker-image://docker.io/docker/dockerfile:1.7@sha256:a57df69d0ea827fb7266491f2813635de6f17269be881f696fbfdf2d83dda33e\n#3 CACHED\n\n#4 [internal] load metadata for docker.io/library/node:22-bookworm-slim\n#4 DONE 0.8s\n\n#5 [internal] load .dockerignore\n#5 transferring context: 121B done\n#5 DONE 0.0s\n\n#6 [runtime 1/14] FROM docker.io/library/node:22-bookworm-slim@sha256:f32b81066cde10a75dbac96646099533316d94bac4150c55da1636e1f0ffdc46\n#6 DONE 0.0s\n\n#7 [internal] load build context\n#7 transferring context: 850.88kB 0.3s done\n#7 DONE 0.3s\n\n#8 [build 2/15] WORKDIR /app\n#8 CACHED\n\n#9 [build 3/15] COPY package.json package-lock.json tsconfig.json .intentignore ./\n#9 DONE 0.1s\n\n#10 [build 4/15] RUN npm ci --include=dev\n#10 1.867\n#10 1.867 added 3 packages, and audited 4 packages in 1s\n#10 1.868\n#10 1.868 found 0 vulnerabilities\n#10 1.870 npm notice\n#10 1.870 npm notice New major version of npm available! 10.9.8 -> 12.0.2\n#10 1.870 npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2\n#10 1.870 npm notice To update run: npm install -g npm@12.0.2\n#10 1.870 npm notice\n#10 DONE 2.0s\n\n#11 [build 5/15] COPY src ./src\n#11 DONE 0.1s\n\n#12 [build 6/15] COPY sdk/typescript/src ./sdk/typescript/src\n#12 DONE 0.1s\n\n#13 [build 7/15] COPY test ./test\n#13 DONE 0.1s\n\n#14 [build 8/15] COPY python ./python\n#14 DONE 0.1s\n\n#15 [build 9/15] COPY golang ./golang\n#15 DONE 0.1s\n\n#16 [build 10/15] COPY java ./java\n#16 DONE 0.1s\n\n#17 [build 11/15] COPY rust-ast ./rust-ast\n#17 DONE 0.1s\n\n#18 [build 12/15] COPY prompts ./prompts\n#18 DONE 0.1s\n\n#19 [build 13/15] COPY schemas ./schemas\n#19 DONE 0.1s\n\n#20 [build 14/15] COPY scripts ./scripts\n#20 DONE 0.1s\n\n#21 [build 15/15] RUN npm run build && npm prune --omit=dev --omit=optional\n#21 0.382\n#21 0.382 > todo2code@0.5.0 build\n#21 0.382 > tsc -p tsconfig.json\n#21 0.382\n#21 6.644\n#21 6.644 up to date, audited 2 packages in 876ms\n#21 6.645\n#21 6.645 found 0 vulnerabilities\n#21 DONE 6.8s\n\n#22 [runtime 2/14] RUN apt-get update && apt-get install -y --no-install-recommends git python3 ca-certificates && rm -rf /var/lib/apt/lists/*\n#22 CACHED\n\n#23 [runtime 3/14] WORKDIR /app\n#23 CACHED\n\n#24 [runtime 4/14] COPY --from=build /app/node_modules ./node_modules\n#24 CACHED\n\n#25 [runtime 5/14] COPY --from=build /app/dist ./dist\n#25 DONE 0.1s\n\n#26 [runtime 6/14] COPY package.json LICENSE .env.example .intentignore ./\n#26 DONE 0.1s\n\n#27 [runtime 7/14] COPY python ./python\n#27 DONE 0.1s\n\n#28 [runtime 8/14] COPY golang ./golang\n#28 DONE 0.1s\n\n#29 [runtime 9/14] COPY java ./java\n#29 DONE 0.1s\n\n#30 [runtime 10/14] COPY rust-ast ./rust-ast\n#30 DONE 0.1s\n\n#31 [runtime 11/14] COPY adapters/tensorflow/package*.json ./adapters/tensorflow/\n#31 DONE 0.1s\n\n#32 [runtime 12/14] COPY prompts ./prompts\n#32 DONE 0.1s\n\n#33 [runtime 13/14] COPY schemas ./schemas\n#33 DONE 0.1s\n\n#34 [runtime 14/14] RUN mkdir -p /workspace && chown -R node:node /app /workspace\n#34 DONE 2.1s\n\n#35 exporting to image\n#35 exporting layers\n#35 exporting layers 0.2s done\n#35 writing image sha256:8afd8ad4b5b1b64f2929b94bd3f0aeb1b125c9ac191ee9483f88d555239ea0a3 done\n#35 naming to docker.io/library/todo2code:ticket017-baseline done\n#35 DONE 0.3s\n[2026-08-01T09:20:45Z] [EXIT] Command exited with code 0\n[2026-08-01T09:21:03Z] [EXEC] [provider:codex] baseline CLI help and polarity probes in Docker\nhelp_exit=0 artifact_files=1\nhelp_stdout_first={\nhelp_stderr_first=DEGRADED: one or more pipeline stages did not complete in the requested mode\n./.intent\n./.intent/latest.json\n./.intent/runs\n{"prohibition":"positive","explicitBan":"negative"}\n[2026-08-01T09:21:04Z] [EXIT] Baseline probes completed\n[2026-08-01T09:22:22Z] [EXEC] [provider:codex] $ docker build -t todo2code:ticket017-fix .\n#0 building with "default" instance using docker driver\n\n#1 [internal] load build definition from Dockerfile\n#1 transferring dockerfile: 1.58kB done\n#1 DONE 0.0s\n\n#2 resolve image config for docker-image://docker.io/docker/dockerfile:1.7\n#2 DONE 0.5s\n\n#3 docker-image://docker.io/docker/dockerfile:1.7@sha256:a57df69d0ea827fb7266491f2813635de6f17269be881f696fbfdf2d83dda33e\n#3 CACHED\n\n#4 [internal] load metadata for docker.io/library/node:22-bookworm-slim\n#4 DONE 0.5s\n\n#5 [internal] load .dockerignore\n#5 transferring context: 121B done\n#5 DONE 0.0s\n\n#6 [build 1/15] FROM docker.io/library/node:22-bookworm-slim@sha256:f32b81066cde10a75dbac96646099533316d94bac4150c55da1636e1f0ffdc46\n#6 DONE 0.0s\n\n#7 [internal] load build context\n#7 transferring context: 93.15kB 0.3s done\n#7 DONE 0.4s\n\n#8 [build 2/15] WORKDIR /app\n#8 CACHED\n\n#9 [build 3/15] COPY package.json package-lock.json tsconfig.json .intentignore ./\n#9 CACHED\n\n#10 [build 4/15] RUN npm ci --include=dev\n#10 CACHED\n\n#11 [build 5/15] COPY src ./src\n#11 DONE 0.1s\n\n#12 [build 6/15] COPY sdk/typescript/src ./sdk/typescript/src\n#12 DONE 0.1s\n\n#13 [build 7/15] COPY test ./test\n#13 DONE 0.1s\n\n#14 [build 8/15] COPY python ./python\n#14 DONE 0.1s\n\n#15 [build 9/15] COPY golang ./golang\n#15 DONE 0.1s\n\n#16 [build 10/15] COPY java ./java\n#16 DONE 0.1s\n\n#17 [build 11/15] COPY rust-ast ./rust-ast\n#17 DONE 0.1s\n\n#18 [build 12/15] COPY prompts ./prompts\n#18 DONE 0.1s\n\n#19 [build 13/15] COPY schemas ./schemas\n#19 DONE 0.1s\n\n#20 [build 14/15] COPY scripts ./scripts\n#20 DONE 0.1s\n\n#21 [build 15/15] RUN npm run build && npm prune --omit=dev --omit=optional\n#21 0.356\n#21 0.356 > todo2code@0.5.0 build\n#21 0.356 > tsc -p tsconfig.json\n#21 0.356\n#21 7.938\n#21 7.938 up to date, audited 2 packages in 2s\n#21 7.939\n#21 7.939 found 0 vulnerabilities\n#21 DONE 8.0s\n\n#22 [runtime 2/14] RUN apt-get update && apt-get install -y --no-install-recommends git python3 ca-certificates && rm -rf /var/lib/apt/lists/*\n#22 CACHED\n\n#23 [runtime 3/14] WORKDIR /app\n#23 CACHED\n\n#24 [runtime 4/14] COPY --from=build /app/node_modules ./node_modules\n#24 CACHED\n\n#25 [runtime 5/14] COPY --from=build /app/dist ./dist\n#25 DONE 0.1s\n\n#26 [runtime 6/14] COPY package.json LICENSE .env.example .intentignore ./\n#26 DONE 0.1s\n\n#27 [runtime 7/14] COPY python ./python\n#27 DONE 0.1s\n\n#28 [runtime 8/14] COPY golang ./golang\n#28 DONE 0.1s\n\n#29 [runtime 9/14] COPY java ./java\n#29 DONE 0.1s\n\n#30 [runtime 10/14] COPY rust-ast ./rust-ast\n#30 DONE 0.1s\n\n#31 [runtime 11/14] COPY adapters/tensorflow/package*.json ./adapters/tensorflow/\n#31 DONE 0.1s\n\n#32 [runtime 12/14] COPY prompts ./prompts\n#32 DONE 0.1s\n\n#33 [runtime 13/14] COPY schemas ./schemas\n#33 DONE 0.1s\n\n#34 [runtime 14/14] RUN mkdir -p /workspace && chown -R node:node /app /workspace\n#34 DONE 2.2s\n\n#35 exporting to image\n#35 exporting layers\n#35 exporting layers 0.3s done\n#35 writing image sha256:900c8aa442049887da73c9c97e296518be16e0649ea2b35394bbdc9074b51d62\n#35 writing image sha256:900c8aa442049887da73c9c97e296518be16e0649ea2b35394bbdc9074b51d62 0.2s done\n#35 naming to docker.io/library/todo2code:ticket017-fix\n#35 naming to docker.io/library/todo2code:ticket017-fix 0.0s done\n#35 DONE 0.6s\n[2026-08-01T09:22:37Z] [EXIT] Command exited with code 0\n[2026-08-01T09:22:52Z] [EXEC] [provider:codex] focused regression tests and fixed probes in Docker\nTAP version 13\n# Subtest: CLI command help is successful and non-mutating\nok 1 - CLI command help is successful and non-mutating\n ---\n duration_ms: 1522.092528\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\nok 2 - proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\n ---\n duration_ms: 17.777143\n type: 'test'\n ...\n# Subtest: code-change title preserves the leading action of a compound intent\nok 3 - code-change title preserves the leading action of a compound intent\n ---\n duration_ms: 2.356781\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans is deterministic for the same evidence\nok 4 - proposeCodeChangePlans is deterministic for the same evidence\n ---\n duration_ms: 3.081802\n type: 'test'\n ...\n# Subtest: a plan creates a missing file and modifies an existing one\nok 5 - a plan creates a missing file and modifies an existing one\n ---\n duration_ms: 10.365874\n type: 'test'\n ...\n# Subtest: the repository probe never proposes creating a file outside the root\nok 6 - the repository probe never proposes creating a file outside the root\n ---\n duration_ms: 0.822336\n type: 'test'\n ...\n# Subtest: bounded plan sets prefer explicit TODO work over historical changelog audit\nok 7 - bounded plan sets prefer explicit TODO work over historical changelog audit\n ---\n duration_ms: 3.202845\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance passes when targeted diagnostics clear\nok 8 - evaluateCodeChangeAcceptance passes when targeted diagnostics clear\n ---\n duration_ms: 5.012056\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance fails while the plan is still open\nok 9 - evaluateCodeChangeAcceptance fails while the plan is still open\n ---\n duration_ms: 1.637813\n type: 'test'\n ...\n# Subtest: Plans without repository paths are not invented\nok 10 - Plans without repository paths are not invented\n ---\n duration_ms: 0.823864\n type: 'test'\n ...\n# Subtest: Non-repository paths are ignored instead of aborting code-change planning\nok 11 - Non-repository paths are ignored instead of aborting code-change planning\n ---\n duration_ms: 1.077878\n type: 'test'\n ...\n# Subtest: Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\nok 12 - Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\n ---\n duration_ms: 3.925064\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatch is deterministic and path-bound\nok 13 - createCodeChangeSourcePatch is deterministic and path-bound\n ---\n duration_ms: 4.391045\n type: 'test'\n ...\n# Subtest: applyUnifiedDiffToText creates and modifies files from hunks\nok 14 - applyUnifiedDiffToText creates and modifies files from hunks\n ---\n duration_ms: 0.537999\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch requires approval and is idempotent\nok 15 - applyCodeChangeSourcePatch requires approval and is idempotent\n ---\n duration_ms: 14.567562\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\nok 16 - applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\n ---\n duration_ms: 3.806494\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatchSet covers every plan\nok 17 - createCodeChangeSourcePatchSet covers every plan\n ---\n duration_ms: 1.715203\n type: 'test'\n ...\n# Subtest: createCodeChangeReviewPatch is hash-stable and lists grounded paths\nok 18 - createCodeChangeReviewPatch is hash-stable and lists grounded paths\n ---\n duration_ms: 2.748772\n type: 'test'\n ...\n# Subtest: CLI proposes and evaluates a grounded code-change plan through persisted JSON\nok 19 - CLI proposes and evaluates a grounded code-change plan through persisted JSON\n ---\n duration_ms: 2076.856443\n type: 'test'\n ...\n# Subtest: isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\nok 20 - isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\n ---\n duration_ms: 0.467711\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans skips diagnostics that only name junk paths\nok 21 - proposeCodeChangePlans skips diagnostics that only name junk paths\n ---\n duration_ms: 0.860219\n type: 'test'\n ...\n# Subtest: Published code-change JSON schemas require provenance, risk and rollback\nok 22 - Published code-change JSON schemas require provenance, risk and rollback\n ---\n duration_ms: 2.900834\n type: 'test'\n ...\n# Subtest: deterministic documentation baseline records headings, code blocks and explicit references\nok 23 - deterministic documentation baseline records headings, code blocks and explicit references\n ---\n duration_ms: 14.42927\n type: 'test'\n ...\n# Subtest: deterministic documentation preserves Polish prohibition polarity\nok 24 - deterministic documentation preserves Polish prohibition polarity\n ---\n duration_ms: 4.785258\n type: 'test'\n ...\n# Subtest: Markdown extractor separates TODO plans and changelog claims\nok 25 - Markdown extractor separates TODO plans and changelog claims\n ---\n duration_ms: 18.528748\n type: 'test'\n ...\n# Subtest: Markdown extractor preserves indented continuation lines and their source range\nok 26 - Markdown extractor preserves indented continuation lines and their source range\n ---\n duration_ms: 4.696856\n type: 'test'\n ...\n# Subtest: TODO bare filenames inherit an existing directory from the heading scope\nok 27 - TODO bare filenames inherit an existing directory from the heading scope\n ---\n duration_ms: 2.14091\n type: 'test'\n ...\n# Subtest: TODO resolves a bare filename only when its repository basename is unique\nok 28 - TODO resolves a bare filename only when its repository basename is unique\n ---\n duration_ms: 2.393646\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG resolve the same bare filename to one repository path\nok 29 - TODO and CHANGELOG resolve the same bare filename to one repository path\n ---\n duration_ms: 4.282139\n type: 'test'\n ...\n# Subtest: CHANGELOG keeps an ambiguous bare filename unresolved\nok 30 - CHANGELOG keeps an ambiguous bare filename unresolved\n ---\n duration_ms: 2.17068\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\nok 31 - TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\n ---\n duration_ms: 25.588506\n type: 'test'\n ...\n# Subtest: Markdown enrichment corrects one rejected response and audits both attempts\nok 32 - Markdown enrichment corrects one rejected response and audits both attempts\n ---\n duration_ms: 3.690729\n type: 'test'\n ...\n# Subtest: large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\nok 33 - large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\n ---\n duration_ms: 51.711469\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG LLM fallback and require mode are explicit\nok 34 - TODO and CHANGELOG LLM fallback and require mode are explicit\n ---\n duration_ms: 2.852228\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG reject structurally invalid LLM enrichments\nok 35 - TODO and CHANGELOG reject structurally invalid LLM enrichments\n ---\n duration_ms: 3.356339\n type: 'test'\n ...\n# Subtest: a truncated batch is split and every record keeps its own response provenance\nok 36 - a truncated batch is split and every record keeps its own response provenance\n ---\n duration_ms: 5.015455\n type: 'test'\n ...\n# Subtest: a malformed batch response splits instead of failing the whole stage\nok 37 - a malformed batch response splits instead of failing the whole stage\n ---\n duration_ms: 4.885324\n type: 'test'\n ...\n# Subtest: NL extractor produces deterministic non-LLM records\nok 38 - NL extractor produces deterministic non-LLM records\n ---\n duration_ms: 9.446016\n type: 'test'\n ...\n# Subtest: NL public extraction boundary names a missing sourcePath before path resolution\nok 39 - NL public extraction boundary names a missing sourcePath before path resolution\n ---\n duration_ms: 0.804404\n type: 'test'\n ...\n# Subtest: deterministic NL fallback skips Markdown headings and recognizes comparison intent\nok 40 - deterministic NL fallback skips Markdown headings and recognizes comparison intent\n ---\n duration_ms: 3.112411\n type: 'test'\n ...\n# Subtest: path extraction rejects lowercase prose alternations without losing repository paths\nok 41 - path extraction rejects lowercase prose alternations without losing repository paths\n ---\n duration_ms: 1.005619\n type: 'test'\n ...\n# Subtest: path extraction rejects dotted DSL fields but keeps known file extensions\nok 42 - path extraction rejects dotted DSL fields but keeps known file extensions\n ---\n duration_ms: 0.803532\n type: 'test'\n ...\n# Subtest: detectModality ignores parenthetical labels and bare adjectives\nok 43 - detectModality ignores parenthetical labels and bare adjectives\n ---\n duration_ms: 0.429784\n type: 'test'\n ...\n# Subtest: detectModality reads prohibitions and periphrastic obligation as requirements\nok 44 - detectModality reads prohibitions and periphrastic obligation as requirements\n ---\n duration_ms: 0.675938\n type: 'test'\n ...\n# Subtest: detectPolarity does not treat without-complements as sentence negation\nok 45 - detectPolarity does not treat without-complements as sentence negation\n ---\n duration_ms: 0.18631\n type: 'test'\n ...\n# Subtest: path extraction rejects HTTP routes, host paths and parent traversal\nok 46 - path extraction rejects HTTP routes, host paths and parent traversal\n ---\n duration_ms: 0.388588\n type: 'test'\n ...\n# Subtest: symbol extraction rejects hostnames without losing qualified code symbols\nok 47 - symbol extraction rejects hostnames without losing qualified code symbols\n ---\n duration_ms: 0.468356\n type: 'test'\n ...\n# Subtest: symbol extraction separates repository files and all-caps prose from code identifiers\nok 48 - symbol extraction separates repository files and all-caps prose from code identifiers\n ---\n duration_ms: 0.284159\n type: 'test'\n ...\n# Subtest: topic keywords normalize paths, camelCase and documentation word forms\nok 49 - topic keywords normalize paths, camelCase and documentation word forms\n ---\n duration_ms: 0.332673\n type: 'test'\n ...\n# Subtest: NL LLM extraction emits audited provenance and bounded DSL records\nok 50 - NL LLM extraction emits audited provenance and bounded DSL records\n ---\n duration_ms: 31.179852\n type: 'test'\n ...\n# Subtest: NL LLM failure is explicit when deterministic fallback is used\nok 51 - NL LLM failure is explicit when deterministic fallback is used\n ---\n duration_ms: 2.915055\n type: 'test'\n ...\n# Subtest: require-llm rejects instead of silently falling back\nok 52 - require-llm rejects instead of silently falling back\n ---\n duration_ms: 0.369677\n type: 'test'\n ...\n1..52\n# tests 52\n# suites 0\n# pass 52\n# fail 0\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms 4198.632614\nhelp_exit=0 artifact_files=0 stderr_bytes=0\ntodo2code (t2c)\n\n{"prohibition":"negative","explicitBan":"negative"}\n[2026-08-01T09:22:58Z] [EXIT] Focused regression validation completed\n[2026-08-01T09:23:28Z] [EXEC] [provider:codex] full offline verification in isolated Docker workspace\n\nadded 3 packages, and audited 4 packages in 2s\n\nfound 0 vulnerabilities\nnpm notice\nnpm notice New major version of npm available! 10.9.8 -> 12.0.2\nnpm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2\nnpm notice To update run: npm install -g npm@12.0.2\nnpm notice\n\n> todo2code@0.5.0 verify\n> npm run check && npm run verify:no-llm && npm run verify:modules && npm run verify:env && npm run verify:workflows && npm run verify:generated-analysis && npm run verify:structured-responses && npm run build && npm run verify:schemas && npm test\n\n\n> todo2code@0.5.0 check\n> tsc -p tsconfig.json --noEmit\n\n\n> todo2code@0.5.0 verify:no-llm\n> node scripts/verify-no-llm-imports.mjs\n\nLLM boundary verified transitively from 9 deterministic entrypoints across 37 modules.\n\n> todo2code@0.5.0 verify:modules\n> node scripts/verify-module-boundaries.mjs\n\nModule boundaries verified: 105 modules, 488 internal imports, no cycles, core is independent.\n\n> todo2code@0.5.0 verify:env\n> node scripts/verify-env-contract.mjs\n\nEnvironment contract verified: 75 code/Docker variables, 75 documented keys, no duplicates.\n\n> todo2code@0.5.0 verify:workflows\n> node scripts/verify-workflow-yaml.mjs\n\nWorkflow YAML verified: 1 file(s), no duplicate top-level keys.\n\n> todo2code@0.5.0 verify:generated-analysis\n> node scripts/verify-generated-analysis.mjs\n\n{"filesChecked":19,"untrackedInputsChecked":9,"status":"ok"}\n\n> todo2code@0.5.0 verify:structured-responses\n> node scripts/verify-structured-responses.mjs\n\n{"structuredCalls":7,"rawCalls":0,"status":"ok"}\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\n\n> todo2code@0.5.0 verify:schemas\n> node scripts/generate-response-schemas.mjs --check\n\n{"schema":"schemas/document-extraction-response.schema.json","status":"ok"}\n\n> todo2code@0.5.0 test\n> node --test --test-concurrency=4 dist/test/*.test.js\n\nTAP version 13\n# [t2c:a2a] listening on 127.0.0.1:43811\n# Subtest: A2A v1.0 card, versioning, task methods and cursor pagination are coherent\nok 1 - A2A v1.0 card, versioning, task methods and cursor pagination are coherent\n ---\n duration_ms: 146.659601\n type: 'test'\n ...\n# [t2c:a2a] listening on 127.0.0.1:41107\n# Subtest: A2A bearer authentication is declared with v1 security objects and enforced\nok 2 - A2A bearer authentication is declared with v1 security objects and enforced\n ---\n duration_ms: 69.742017\n type: 'test'\n ...\n# [t2c:a2a] listening on 127.0.0.1:42861\n# [t2c:a2a] listening on 127.0.0.1:45907\n# [t2c:a2a] listening on 127.0.0.1:34193\n# Subtest: A2A file task store survives restart and preserves idempotency across replicas\nok 3 - A2A file task store survives restart and preserves idempotency across replicas\n ---\n duration_ms: 99.66827\n type: 'test'\n ...\n# Subtest: Go adapter records package, imports, types, functions and methods\nok 4 - Go adapter records package, imports, types, functions and methods # SKIP Go toolchain not installed\n ---\n duration_ms: 10.21674\n type: 'test'\n ...\n# Subtest: Go facts are deterministic observations, not inferences\nok 5 - Go facts are deterministic observations, not inferences # SKIP Go toolchain not installed\n ---\n duration_ms: 4.574502\n type: 'test'\n ...\n# Subtest: Go adapter marks exported symbols and reports calls in scope\nok 6 - Go adapter marks exported symbols and reports calls in scope # SKIP Go toolchain not installed\n ---\n duration_ms: 11.430686\n type: 'test'\n ...\n# Subtest: Go extraction is skipped without cost when a tree holds no Go sources\nok 7 - Go extraction is skipped without cost when a tree holds no Go sources\n ---\n duration_ms: 43.258221\n type: 'test'\n ...\n# Subtest: A missing Go toolchain degrades to a warning instead of failing the run\nok 8 - A missing Go toolchain degrades to a warning instead of failing the run\n ---\n duration_ms: 19.340262\n type: 'test'\n ...\n# Subtest: Rust adapter records uses, types, functions, methods, values and calls\nok 9 - Rust adapter records uses, types, functions, methods, values and calls # SKIP Rust toolchain not installed\n ---\n duration_ms: 9.306034\n type: 'test'\n ...\n# Subtest: Java adapter records packages, imports, types, fields, methods and calls\nok 10 - Java adapter records packages, imports, types, fields, methods and calls # SKIP JDK not installed\n ---\n duration_ms: 6.646334\n type: 'test'\n ...\n# Subtest: Java and Rust adapters skip toolchain startup when no matching sources exist\nok 11 - Java and Rust adapters skip toolchain startup when no matching sources exist\n ---\n duration_ms: 33.693113\n type: 'test'\n ...\n# Subtest: Missing Java and Rust toolchains degrade to explicit warnings\nok 12 - Missing Java and Rust toolchains degrade to explicit warnings\n ---\n duration_ms: 15.762286\n type: 'test'\n ...\n# Subtest: PHP syntax adapter records namespaces, imports, types, functions, methods and calls\nok 13 - PHP syntax adapter records namespaces, imports, types, functions, methods and calls # SKIP PHP runtime not installed\n ---\n duration_ms: 6.798455\n type: 'test'\n ...\n# Subtest: PHP adapter skips runtime startup when no PHP source exists\nok 14 - PHP adapter skips runtime startup when no PHP source exists\n ---\n duration_ms: 33.006487\n type: 'test'\n ...\n# Subtest: Missing PHP runtime degrades to an explicit warning\nok 15 - Missing PHP runtime degrades to an explicit warning\n ---\n duration_ms: 13.66148\n type: 'test'\n ...\n# Subtest: Invalid PHP syntax is reported without aborting extraction\nok 16 - Invalid PHP syntax is reported without aborting extraction # SKIP PHP runtime not installed\n ---\n duration_ms: 7.505501\n type: 'test'\n ...\n# Subtest: AST extractor reads TypeScript and Python facts\nok 17 - AST extractor reads TypeScript and Python facts\n ---\n duration_ms: 193.913571\n type: 'test'\n ...\n# Subtest: CLI command help is successful and non-mutating\nok 18 - CLI command help is successful and non-mutating\n ---\n duration_ms: 1871.346239\n type: 'test'\n ...\n# Subtest: CLI summarize exposes deterministic, prefer-llm and require-llm modes\nok 19 - CLI summarize exposes deterministic, prefer-llm and require-llm modes\n ---\n duration_ms: 2489.134911\n type: 'test'\n ...\n# Subtest: CLI propose-todo, render-todo and apply-todo return JSON and preserve a no-op TODO\nok 20 - CLI propose-todo, render-todo and apply-todo return JSON and preserve a no-op TODO\n ---\n duration_ms: 1923.685426\n type: 'test'\n ...\n# Subtest: CLI watch reads TASK.md by default, disables summary LLM and reacts to a live file change\nok 21 - CLI watch reads TASK.md by default, disables summary LLM and reacts to a live file change\n ---\n duration_ms: 1890.190181\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\nok 22 - proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\n ---\n duration_ms: 22.348339\n type: 'test'\n ...\n# Subtest: code-change title preserves the leading action of a compound intent\nok 23 - code-change title preserves the leading action of a compound intent\n ---\n duration_ms: 6.136311\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans is deterministic for the same evidence\nok 24 - proposeCodeChangePlans is deterministic for the same evidence\n ---\n duration_ms: 6.802655\n type: 'test'\n ...\n# Subtest: a plan creates a missing file and modifies an existing one\nok 25 - a plan creates a missing file and modifies an existing one\n ---\n duration_ms: 18.406348\n type: 'test'\n ...\n# Subtest: the repository probe never proposes creating a file outside the root\nok 26 - the repository probe never proposes creating a file outside the root\n ---\n duration_ms: 4.902866\n type: 'test'\n ...\n# Subtest: bounded plan sets prefer explicit TODO work over historical changelog audit\nok 27 - bounded plan sets prefer explicit TODO work over historical changelog audit\n ---\n duration_ms: 4.707445\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance passes when targeted diagnostics clear\nok 28 - evaluateCodeChangeAcceptance passes when targeted diagnostics clear\n ---\n duration_ms: 6.700415\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance fails while the plan is still open\nok 29 - evaluateCodeChangeAcceptance fails while the plan is still open\n ---\n duration_ms: 2.450987\n type: 'test'\n ...\n# Subtest: Plans without repository paths are not invented\nok 30 - Plans without repository paths are not invented\n ---\n duration_ms: 1.209589\n type: 'test'\n ...\n# Subtest: Non-repository paths are ignored instead of aborting code-change planning\nok 31 - Non-repository paths are ignored instead of aborting code-change planning\n ---\n duration_ms: 1.577214\n type: 'test'\n ...\n# Subtest: Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\nok 32 - Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\n ---\n duration_ms: 6.867752\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatch is deterministic and path-bound\nok 33 - createCodeChangeSourcePatch is deterministic and path-bound\n ---\n duration_ms: 6.525621\n type: 'test'\n ...\n# Subtest: applyUnifiedDiffToText creates and modifies files from hunks\nok 34 - applyUnifiedDiffToText creates and modifies files from hunks\n ---\n duration_ms: 0.785959\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch requires approval and is idempotent\nok 35 - applyCodeChangeSourcePatch requires approval and is idempotent\n ---\n duration_ms: 22.951774\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\nok 36 - applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\n ---\n duration_ms: 8.337881\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatchSet covers every plan\nok 37 - createCodeChangeSourcePatchSet covers every plan\n ---\n duration_ms: 1.828291\n type: 'test'\n ...\n# Subtest: createCodeChangeReviewPatch is hash-stable and lists grounded paths\nok 38 - createCodeChangeReviewPatch is hash-stable and lists grounded paths\n ---\n duration_ms: 4.22132\n type: 'test'\n ...\n# Subtest: CLI proposes and evaluates a grounded code-change plan through persisted JSON\nok 39 - CLI proposes and evaluates a grounded code-change plan through persisted JSON\n ---\n duration_ms: 2502.286629\n type: 'test'\n ...\n# Subtest: isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\nok 40 - isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\n ---\n duration_ms: 0.384323\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans skips diagnostics that only name junk paths\nok 41 - proposeCodeChangePlans skips diagnostics that only name junk paths\n ---\n duration_ms: 0.923391\n type: 'test'\n ...\n# Subtest: Published code-change JSON schemas require provenance, risk and rollback\nok 42 - Published code-change JSON schemas require provenance, risk and rollback\n ---\n duration_ms: 3.252129\n type: 'test'\n ...\n# Subtest: participant registry maps stable IDs to Git/A2A identifiers without display-name guessing\nok 43 - participant registry maps stable IDs to Git/A2A identifiers without display-name guessing\n ---\n duration_ms: 42.813306\n type: 'test'\n ...\n# Subtest: participant registry rejects ambiguous external identifiers\nok 44 - participant registry rejects ambiguous external identifiers\n ---\n duration_ms: 0.69938\n type: 'test'\n ...\n# Subtest: communication enrichment preserves runtime identity, source, ticket and epistemic class\nok 45 - communication enrichment preserves runtime identity, source, ticket and epistemic class\n ---\n duration_ms: 55.824642\n type: 'test'\n ...\n# Subtest: communication enrichment corrects one rejected structured response without weakening validation\nok 46 - communication enrichment corrects one rejected structured response without weakening validation\n ---\n duration_ms: 6.699169\n type: 'test'\n ...\n# Subtest: communication prefer-llm fallback is explicit and require-llm rejects\nok 47 - communication prefer-llm fallback is explicit and require-llm rejects\n ---\n duration_ms: 10.495437\n type: 'test'\n ...\n# Subtest: project/<ticket> communication is attributed per human and agent and checked against Git evidence\nok 48 - project/<ticket> communication is attributed per human and agent and checked against Git evidence\n ---\n duration_ms: 169.382039\n type: 'test'\n ...\n# Subtest: governance user-* and ai-* files become typed participant intent without ingesting ticket evidence\nok 49 - governance user-* and ai-* files become typed participant intent without ingesting ticket evidence\n ---\n duration_ms: 13.753574\n type: 'test'\n ...\n# Subtest: unstructured governance participant content is rejected with an owner-specific migration warning\nok 50 - unstructured governance participant content is rejected with an owner-specific migration warning\n ---\n duration_ms: 2.184966\n type: 'test'\n ...\n# Subtest: opposite wording about different explicit files is not treated as an intent conflict\nok 51 - opposite wording about different explicit files is not treated as an intent conflict\n ---\n duration_ms: 4.01347\n type: 'test'\n ...\n# Subtest: missing response owners use explicit role sentinels without inventing participants\nok 52 - missing response owners use explicit role sentinels without inventing participants\n ---\n duration_ms: 7.747825\n type: 'test'\n ...\n# Subtest: communication extractor reports unresolved identity instead of inventing an actor\nok 53 - communication extractor reports unresolved identity instead of inventing an actor\n ---\n duration_ms: 3.301451\n type: 'test'\n ...\n# Subtest: communication extractor ignores generic generated analysis under project/\nok 54 - communication extractor ignores generic generated analysis under project/\n ---\n duration_ms: 6.515334\n type: 'test'\n ...\n# Subtest: configuration converter covers JSON, TOML, Docker and CI workflow declarations\nok 55 - configuration converter covers JSON, TOML, Docker and CI workflow declarations\n ---\n duration_ms: 24.61101\n type: 'test'\n ...\n# Subtest: configuration converter emits a deterministic file aggregate for an empty configuration\nok 56 - configuration converter emits a deterministic file aggregate for an empty configuration\n ---\n duration_ms: 5.345404\n type: 'test'\n ...\n# Subtest: splitLines treats a trailing newline as a terminator, not an extra line\nok 57 - splitLines treats a trailing newline as a terminator, not an extra line\n ---\n duration_ms: 1.721202\n type: 'test'\n ...\n# Subtest: Identical inputs produce no hunks\nok 58 - Identical inputs produce no hunks\n ---\n duration_ms: 0.614422\n type: 'test'\n ...\n# Subtest: A modified line keeps both sides addressable by original line number\nok 59 - A modified line keeps both sides addressable by original line number\n ---\n duration_ms: 0.361535\n type: 'test'\n ...\n# Subtest: Pure insertion and pure deletion are not reported as replacements\nok 60 - Pure insertion and pure deletion are not reported as replacements\n ---\n duration_ms: 0.424901\n type: 'test'\n ...\n# Subtest: Empty-to-content and content-to-empty are handled as block changes\nok 61 - Empty-to-content and content-to-empty are handled as block changes\n ---\n duration_ms: 0.339297\n type: 'test'\n ...\n# Subtest: Context width controls hunk size\nok 62 - Context width controls hunk size\n ---\n duration_ms: 0.286648\n type: 'test'\n ...\n# Subtest: Nearby changes merge into a single hunk\nok 63 - Nearby changes merge into a single hunk\n ---\n duration_ms: 1.129351\n type: 'test'\n ...\n# Subtest: Distant changes stay in separate hunks\nok 64 - Distant changes stay in separate hunks\n ---\n duration_ms: 0.265357\n type: 'test'\n ...\n# Subtest: Oversized inputs fall back to a bounded block replace\nok 65 - Oversized inputs fall back to a bounded block replace\n ---\n duration_ms: 0.69384\n type: 'test'\n ...\n# Subtest: Unified output carries a well formed hunk header\nok 66 - Unified output carries a well formed hunk header\n ---\n duration_ms: 0.671622\n type: 'test'\n ...\n# Subtest: Side-by-side rows pair deletions with insertions\nok 67 - Side-by-side rows pair deletions with insertions\n ---\n duration_ms: 0.330858\n type: 'test'\n ...\n# Subtest: Unbalanced change runs leave one side empty rather than misaligning\nok 68 - Unbalanced change runs leave one side empty rather than misaligning\n ---\n duration_ms: 0.190374\n type: 'test'\n ...\n# Subtest: Renderers escape source markup\nok 69 - Renderers escape source markup\n ---\n duration_ms: 1.1167\n type: 'test'\n ...\n# Subtest: SVG rendering caps rows and reports the remainder\nok 70 - SVG rendering caps rows and reports the remainder\n ---\n duration_ms: 1.795926\n type: 'test'\n ...\n# Subtest: Reality view keys topics by target and records lane presence\nok 71 - Reality view keys topics by target and records lane presence\n ---\n duration_ms: 19.431233\n type: 'test'\n ...\n# Subtest: A topic holding declared and observed records is never reported as planned-only\nok 72 - A topic holding declared and observed records is never reported as planned-only\n ---\n duration_ms: 3.630486\n type: 'test'\n ...\n# Subtest: Reality coverage stays open when a shared path has unrelated capabilities\nok 73 - Reality coverage stays open when a shared path has unrelated capabilities\n ---\n duration_ms: 1.853836\n type: 'test'\n ...\n# Subtest: Shared-path relations do not collapse unrelated files into one topic\nok 74 - Shared-path relations do not collapse unrelated files into one topic\n ---\n duration_ms: 2.975218\n type: 'test'\n ...\n# Subtest: Reality view is deterministic for identical input\nok 75 - Reality view is deterministic for identical input\n ---\n duration_ms: 1.986556\n type: 'test'\n ...\n# Subtest: Reality SVG escapes topic labels\nok 76 - Reality SVG escapes topic labels\n ---\n duration_ms: 1.434425\n type: 'test'\n ...\n# Subtest: graph diff detects changed source identities, additions and SVG-safe labels\nok 77 - graph diff detects changed source identities, additions and SVG-safe labels\n ---\n duration_ms: 17.059667\n type: 'test'\n ...\n# Subtest: graph diff is empty for graphs with identical evidence\nok 78 - graph diff is empty for graphs with identical evidence\n ---\n duration_ms: 1.421934\n type: 'test'\n ...\n# Subtest: file diff emits deterministic unified, SVG and HTML views\nok 79 - file diff emits deterministic unified, SVG and HTML views\n ---\n duration_ms: 1.832308\n type: 'test'\n ...\n# Subtest: intent-vs-reality builds an explainable SVG and Markdown projection\nok 80 - intent-vs-reality builds an explainable SVG and Markdown projection\n ---\n duration_ms: 4.462089\n type: 'test'\n ...\n# Subtest: a targetless declaration is filed under the single module it links to\nok 81 - a targetless declaration is filed under the single module it links to\n ---\n duration_ms: 2.746545\n type: 'test'\n ...\n# Subtest: a declaration touching several modules keeps its own topic\nok 82 - a declaration touching several modules keeps its own topic\n ---\n duration_ms: 2.561579\n type: 'test'\n ...\n# Subtest: semantically aligned configuration topics retain their evidence grade\nok 83 - semantically aligned configuration topics retain their evidence grade\n ---\n duration_ms: 2.587257\n type: 'test'\n ...\n# Subtest: A record claiming line 1 is re-anchored to the line carrying its statement\nok 84 - A record claiming line 1 is re-anchored to the line carrying its statement\n ---\n duration_ms: 51.025911\n type: 'test'\n ...\n# Subtest: An already correct line is kept and not reported as re-anchored\nok 85 - An already correct line is kept and not reported as re-anchored\n ---\n duration_ms: 7.036979\n type: 'test'\n ...\n# Subtest: An empty target is backfilled from the statement text\nok 86 - An empty target is backfilled from the statement text\n ---\n duration_ms: 5.568668\n type: 'test'\n ...\n# Subtest: A target supplied by the model is never overwritten\nok 87 - A target supplied by the model is never overwritten\n ---\n duration_ms: 6.514116\n type: 'test'\n ...\n# Subtest: An unclassified action and modality are derived from the statement\nok 88 - An unclassified action and modality are derived from the statement\n ---\n duration_ms: 3.8372\n type: 'test'\n ...\n# Subtest: A classified action from the model wins over the heuristic\nok 89 - A classified action from the model wins over the heuristic\n ---\n duration_ms: 3.501148\n type: 'test'\n ...\n# Subtest: An action that stays unclassifiable is reported as a missing field\nok 90 - An action that stays unclassifiable is reported as a missing field\n ---\n duration_ms: 3.11411\n type: 'test'\n ...\n# Subtest: A placeholder object is treated as a gap, not as content\nok 91 - A placeholder object is treated as a gap, not as content\n ---\n duration_ms: 5.066897\n type: 'test'\n ...\n# Subtest: Every repair is attributable through epistemic.basis\nok 92 - Every repair is attributable through epistemic.basis\n ---\n duration_ms: 4.50343\n type: 'test'\n ...\n# Subtest: deterministic documentation baseline records headings, code blocks and explicit references\nok 93 - deterministic documentation baseline records headings, code blocks and explicit references\n ---\n duration_ms: 19.116796\n type: 'test'\n ...\n# Subtest: deterministic documentation preserves Polish prohibition polarity\nok 94 - deterministic documentation preserves Polish prohibition polarity\n ---\n duration_ms: 5.823547\n type: 'test'\n ...\n# Subtest: AST cache is incremental by path and source content hash\nok 95 - AST cache is incremental by path and source content hash\n ---\n duration_ms: 32.037932\n type: 'test'\n ...\n# Subtest: AST cache rejects corrupt entries and recomputes authoritative records\nok 96 - AST cache rejects corrupt entries and recomputes authoritative records\n ---\n duration_ms: 10.053204\n type: 'test'\n ...\n# Subtest: AST cache can be bypassed without changing extraction output\nok 97 - AST cache can be bypassed without changing extraction output\n ---\n duration_ms: 5.477589\n type: 'test'\n ...\n# Subtest: successful external AST adapter is skipped on a warm manifest hit\nok 98 - successful external AST adapter is skipped on a warm manifest hit\n ---\n duration_ms: 61.236136\n type: 'test'\n ...\n# Subtest: documentation chunks cache independently while provider calls remain live\nok 99 - documentation chunks cache independently while provider calls remain live\n ---\n duration_ms: 49.74158\n type: 'test'\n ...\n# Subtest: generated analysis replaces its source root with a stable token\nok 100 - generated analysis replaces its source root with a stable token\n ---\n duration_ms: 55.230582\n type: 'test'\n ...\n# Subtest: generated analysis root normalization refuses the filesystem root\nok 101 - generated analysis root normalization refuses the filesystem root\n ---\n duration_ms: 56.49376\n type: 'test'\n ...\n# Subtest: generated analysis rejects references to untracked input\nok 102 - generated analysis rejects references to untracked input\n ---\n duration_ms: 79.960895\n type: 'test'\n ...\n# Subtest: generated analysis accepts outputs independent of untracked input\nok 103 - generated analysis accepts outputs independent of untracked input\n ---\n duration_ms: 68.70097\n type: 'test'\n ...\n# Subtest: generated analysis accepts an untracked filename already quoted by tracked evidence\nok 104 - generated analysis accepts an untracked filename already quoted by tracked evidence\n ---\n duration_ms: 70.261314\n type: 'test'\n ...\n# Subtest: generated analysis rejects temporary paths and unavailable validators\nok 105 - generated analysis rejects temporary paths and unavailable validators\n ---\n duration_ms: 60.354863\n type: 'test'\n ...\n# Subtest: generated README metadata is synchronized from package.json and stays idempotent\nok 106 - generated README metadata is synchronized from package.json and stays idempotent\n ---\n duration_ms: 78.424858\n type: 'test'\n ...\n# Subtest: generated README synchronization fails closed when the template drifts\nok 107 - generated README synchronization fails closed when the template drifts\n ---\n duration_ms: 37.269712\n type: 'test'\n ...\n# Subtest: generated README synchronization rejects output outside the project root\nok 108 - generated README synchronization rejects output outside the project root\n ---\n duration_ms: 40.393568\n type: 'test'\n ...\n# Subtest: Git extractor emits one record per requested commit\nok 109 - Git extractor emits one record per requested commit\n ---\n duration_ms: 208.991485\n type: 'test'\n ...\n# Subtest: An empty repository degrades to a warning instead of failing the run\nok 110 - An empty repository degrades to a warning instead of failing the run\n ---\n duration_ms: 13.055836\n type: 'test'\n ...\n# Subtest: versioned gold dataset reports perfect offline quality and repeated-run stability\nok 111 - versioned gold dataset reports perfect offline quality and repeated-run stability\n ---\n duration_ms: 178.434202\n type: 'test'\n ...\n# Subtest: gold linking reports exact-target and capability-topic quality separately\nok 112 - gold linking reports exact-target and capability-topic quality separately\n ---\n duration_ms: 77.448091\n type: 'test'\n ...\n# Subtest: gold capability-topic support is large enough to detect a floor regression\nok 113 - gold capability-topic support is large enough to detect a floor regression\n ---\n duration_ms: 87.650775\n type: 'test'\n ...\n# Subtest: gold known gaps are measured and kept out of precision and recall\nok 114 - gold known gaps are measured and kept out of precision and recall\n ---\n duration_ms: 86.357938\n type: 'test'\n ...\n# Subtest: gold reports cross-language positives and hard negatives as a separate cohort\nok 115 - gold reports cross-language positives and hard negatives as a separate cohort\n ---\n duration_ms: 88.263761\n type: 'test'\n ...\n# Subtest: gold diagnostics separate a false DONE claim from an evidenced one\nok 116 - gold diagnostics separate a false DONE claim from an evidenced one\n ---\n duration_ms: 115.859524\n type: 'test'\n ...\n# Subtest: gold v1 stays evaluable after the v2 contract extension\nok 117 - gold v1 stays evaluable after the v2 contract extension\n ---\n duration_ms: 57.195328\n type: 'test'\n ...\n# Subtest: gold loader rejects unsupported dataset versions\nok 118 - gold loader rejects unsupported dataset versions\n ---\n duration_ms: 0.615741\n type: 'test'\n ...\n# Subtest: gold evaluator rejects unknown linking cohorts\nok 119 - gold evaluator rejects unknown linking cohorts\n ---\n duration_ms: 2.053517\n type: 'test'\n ...\n# Subtest: gold v2 must declare diagnostics coverage\nok 120 - gold v2 must declare diagnostics coverage\n ---\n duration_ms: 2.828194\n type: 'test'\n ...\n# Subtest: published gold schema matches the runtime contract\nok 121 - published gold schema matches the runtime contract\n ---\n duration_ms: 4.429943\n type: 'test'\n ...\n# Subtest: gold evaluator rejects fixture files outside its temporary workspace\nok 122 - gold evaluator rejects fixture files outside its temporary workspace\n ---\n duration_ms: 16.438552\n type: 'test'\n ...\n# Subtest: Linker connects plan, Git claim and AST fact\nok 123 - Linker connects plan, Git claim and AST fact\n ---\n duration_ms: 16.311255\n type: 'test'\n ...\n# Subtest: Linker connects prose intent to a module through three grounded capability topics\nok 124 - Linker connects prose intent to a module through three grounded capability topics\n ---\n duration_ms: 1.86707\n type: 'test'\n ...\n# Subtest: Linker does not connect a module on one generic topic alone\nok 125 - Linker does not connect a module on one generic topic alone\n ---\n duration_ms: 0.959537\n type: 'test'\n ...\n# Subtest: An existing target path does not prove an unrelated capability\nok 126 - An existing target path does not prove an unrelated capability\n ---\n duration_ms: 2.146738\n type: 'test'\n ...\n# Subtest: An existing target path plus an AST capability proves implementation\nok 127 - An existing target path plus an AST capability proves implementation\n ---\n duration_ms: 1.393026\n type: 'test'\n ...\n# Subtest: Diagnostics distinguish descriptive documentation from prescriptive requirements\nok 128 - Diagnostics distinguish descriptive documentation from prescriptive requirements\n ---\n duration_ms: 1.838234\n type: 'test'\n ...\n# Subtest: A changelog entry naming an extracted documentation file has release evidence\nok 129 - A changelog entry naming an extracted documentation file has release evidence\n ---\n duration_ms: 1.289025\n type: 'test'\n ...\n# Subtest: Diagnostics ignore non-actionable changelog mechanics but retain release claims\nok 130 - Diagnostics ignore non-actionable changelog mechanics but retain release claims\n ---\n duration_ms: 4.907215\n type: 'test'\n ...\n# Subtest: Grounded conclusion and TODO proposal contracts accept traceable values\nok 131 - Grounded conclusion and TODO proposal contracts accept traceable values\n ---\n duration_ms: 7.362316\n type: 'test'\n ...\n# Subtest: Stable IDs ignore ordering noise but change with semantic content\nok 132 - Stable IDs ignore ordering noise but change with semantic content\n ---\n duration_ms: 0.776994\n type: 'test'\n ...\n# Subtest: Validators reject ungrounded citations and stale semantic IDs\nok 133 - Validators reject ungrounded citations and stale semantic IDs\n ---\n duration_ms: 2.605247\n type: 'test'\n ...\n# Subtest: Generation metadata exposes LLM failures instead of silently masking them\nok 134 - Generation metadata exposes LLM failures instead of silently masking them\n ---\n duration_ms: 1.242535\n type: 'test'\n ...\n# Subtest: TODO proposal collections enforce dependency integrity\nok 135 - TODO proposal collections enforce dependency integrity\n ---\n duration_ms: 1.25968\n type: 'test'\n ...\n# Subtest: Published JSON schemas identify all grounded output contract versions\nok 136 - Published JSON schemas identify all grounded output contract versions\n ---\n duration_ms: 7.932424\n type: 'test'\n ...\n# Subtest: Blank lines and comments produce no rules\nok 137 - Blank lines and comments produce no rules\n ---\n duration_ms: 1.470632\n type: 'test'\n ...\n# Subtest: A pattern without a slash matches at any depth\nok 138 - A pattern without a slash matches at any depth\n ---\n duration_ms: 0.498243\n type: 'test'\n ...\n# Subtest: A leading slash anchors the pattern to the root\nok 139 - A leading slash anchors the pattern to the root\n ---\n duration_ms: 0.189613\n type: 'test'\n ...\n# Subtest: A trailing slash restricts the rule to directories\nok 140 - A trailing slash restricts the rule to directories\n ---\n duration_ms: 0.183035\n type: 'test'\n ...\n# Subtest: Wildcards respect path separators\nok 141 - Wildcards respect path separators\n ---\n duration_ms: 0.488332\n type: 'test'\n ...\n# Subtest: Every dot-directory is excluded by `.*/`\nok 142 - Every dot-directory is excluded by `.*/`\n ---\n duration_ms: 0.249175\n type: 'test'\n ...\n# Subtest: Negation re-includes a previously excluded path\nok 143 - Negation re-includes a previously excluded path\n ---\n duration_ms: 0.310822\n type: 'test'\n ...\n# Subtest: Negation cannot resurrect a file inside an excluded directory\nok 144 - Negation cannot resurrect a file inside an excluded directory\n ---\n duration_ms: 0.193751\n type: 'test'\n ...\n# Subtest: Last matching rule wins\nok 145 - Last matching rule wins\n ---\n duration_ms: 0.428899\n type: 'test'\n ...\n# Subtest: Character classes are supported\nok 146 - Character classes are supported\n ---\n duration_ms: 0.517494\n type: 'test'\n ...\n# Subtest: Paths are normalised before matching\nok 147 - Paths are normalised before matching\n ---\n duration_ms: 0.305464\n type: 'test'\n ...\n# Subtest: loadIgnoreMatcher merges the three ignore files and skips missing ones\nok 148 - loadIgnoreMatcher merges the three ignore files and skips missing ones\n ---\n duration_ms: 15.360004\n type: 'test'\n ...\n# Subtest: A repository without ignore files excludes nothing\nok 149 - A repository without ignore files excludes nothing\n ---\n duration_ms: 1.118205\n type: 'test'\n ...\n# Subtest: The shipped .intentignore excludes build output but keeps sources\nok 150 - The shipped .intentignore excludes build output but keeps sources\n ---\n duration_ms: 2.221497\n type: 'test'\n ...\n# Subtest: resolveGlobs permits one explicit .intent report without recursively scanning generated runs\nok 151 - resolveGlobs permits one explicit .intent report without recursively scanning generated runs\n ---\n duration_ms: 9.340646\n type: 'test'\n ...\n# Subtest: Two unrelated AST facts sharing only a file are not linked\nok 152 - Two unrelated AST facts sharing only a file are not linked\n ---\n duration_ms: 13.063091\n type: 'test'\n ...\n# Subtest: AST facts sharing a symbol are still linked despite the path rule\nok 153 - AST facts sharing a symbol are still linked despite the path rule\n ---\n duration_ms: 1.869002\n type: 'test'\n ...\n# Subtest: AST details sharing only a file and generic tokens do not create a quadratic subgraph\nok 154 - AST details sharing only a file and generic tokens do not create a quadratic subgraph\n ---\n duration_ms: 3.748139\n type: 'test'\n ...\n# Subtest: A file-level plan links once to the AST module aggregate instead of every detail\nok 155 - A file-level plan links once to the AST module aggregate instead of every detail\n ---\n duration_ms: 5.105415\n type: 'test'\n ...\n# Subtest: A shared path still links a plan to an AST fact\nok 156 - A shared path still links a plan to an AST fact\n ---\n duration_ms: 0.871933\n type: 'test'\n ...\n# Subtest: A bare filename links to a module only when its repository path is unique\nok 157 - A bare filename links to a module only when its repository path is unique\n ---\n duration_ms: 1.030049\n type: 'test'\n ...\n# Subtest: A bare filename refuses ambiguous module paths\nok 158 - A bare filename refuses ambiguous module paths\n ---\n duration_ms: 0.676256\n type: 'test'\n ...\n# Subtest: Relations that carry a conclusion survive alongside suppressed noise\nok 159 - Relations that carry a conclusion survive alongside suppressed noise\n ---\n duration_ms: 2.142349\n type: 'test'\n ...\n# Subtest: Pair ordering stays deterministic across rebuilds\nok 160 - Pair ordering stays deterministic across rebuilds\n ---\n duration_ms: 2.95758\n type: 'test'\n ...\n# Subtest: Two configuration declarations sharing only a key name are not linked\nok 161 - Two configuration declarations sharing only a key name are not linked\n ---\n duration_ms: 0.957038\n type: 'test'\n ...\n# Subtest: A shared ticket still connects two configuration declarations\nok 162 - A shared ticket still connects two configuration declarations\n ---\n duration_ms: 0.521796\n type: 'test'\n ...\n# Subtest: Configuration still links to documentation that describes it\nok 163 - Configuration still links to documentation that describes it\n ---\n duration_ms: 0.705998\n type: 'test'\n ...\n# Subtest: Configuration file aggregate is the file-level target for an explicit documentation path\nok 164 - Configuration file aggregate is the file-level target for an explicit documentation path\n ---\n duration_ms: 0.566322\n type: 'test'\n ...\n# Subtest: Configuration aggregates do not create broad capability-topic links\nok 165 - Configuration aggregates do not create broad capability-topic links\n ---\n duration_ms: 0.336685\n type: 'test'\n ...\n# Subtest: a full six-stage live run passes and reports every stage\nok 166 - a full six-stage live run passes and reports every stage\n ---\n duration_ms: 3.400207\n type: 'test'\n ...\n# Subtest: a stage that silently fell back to deterministic fails the check\nok 167 - a stage that silently fell back to deterministic fails the check\n ---\n duration_ms: 0.480476\n type: 'test'\n ...\n# Subtest: a missing stage cannot pass as covered\nok 168 - a missing stage cannot pass as covered\n ---\n duration_ms: 0.266115\n type: 'test'\n ...\n# Subtest: per-stage and total budgets are enforced separately\nok 169 - per-stage and total budgets are enforced separately\n ---\n duration_ms: 0.478901\n type: 'test'\n ...\n# Subtest: live request timeout reaches the stage budget without shortening a larger override\nok 170 - live request timeout reaches the stage budget without shortening a larger override\n ---\n duration_ms: 0.161498\n type: 'test'\n ...\n# Subtest: a stage reason is recorded with provider text redacted\nok 171 - a stage reason is recorded with provider text redacted\n ---\n duration_ms: 0.687637\n type: 'test'\n ...\n# Subtest: history records the trend without gating on it\nok 172 - history records the trend without gating on it\n ---\n duration_ms: 0.466782\n type: 'test'\n ...\n# Subtest: recorded audit history includes the current run exactly once\nok 173 - recorded audit history includes the current run exactly once\n ---\n duration_ms: 0.68664\n type: 'test'\n ...\n# Subtest: history stays chronological, bounded and free of duplicate runs\nok 174 - history stays chronological, bounded and free of duplicate runs\n ---\n duration_ms: 10.591798\n type: 'test'\n ...\n# Subtest: an audit converts to exactly the redacted fields history keeps\nok 175 - an audit converts to exactly the redacted fields history keeps\n ---\n duration_ms: 1.312886\n type: 'test'\n ...\n# Subtest: an empty history summarizes without pretending to have measured anything\nok 176 - an empty history summarizes without pretending to have measured anything\n ---\n duration_ms: 0.233883\n type: 'test'\n ...\n# Subtest: a batched run is measured per record, not per request\nok 177 - a batched run is measured per record, not per request\n ---\n duration_ms: 4.266202\n type: 'test'\n ...\n# Subtest: a model whose response the validator rejected is not counted as enriched\nok 178 - a model whose response the validator rejected is not counted as enriched\n ---\n duration_ms: 0.320007\n type: 'test'\n ...\n# Subtest: a failed model is a comparison result rather than a crash\nok 179 - a failed model is a comparison result rather than a crash\n ---\n duration_ms: 1.113558\n type: 'test'\n ...\n# Subtest: agreement compares only records both models enriched\nok 180 - agreement compares only records both models enriched\n ---\n duration_ms: 0.342102\n type: 'test'\n ...\n# Subtest: agreement is absent rather than perfect when nothing overlaps\nok 181 - agreement is absent rather than perfect when nothing overlaps\n ---\n duration_ms: 0.570713\n type: 'test'\n ...\n# Subtest: the rendered comparison names the cheapest and fastest passing model\nok 182 - the rendered comparison names the cheapest and fastest passing model\n ---\n duration_ms: 0.293888\n type: 'test'\n ...\n# Subtest: Markdown extractor separates TODO plans and changelog claims\nok 183 - Markdown extractor separates TODO plans and changelog claims\n ---\n duration_ms: 19.681114\n type: 'test'\n ...\n# Subtest: Markdown extractor preserves indented continuation lines and their source range\nok 184 - Markdown extractor preserves indented continuation lines and their source range\n ---\n duration_ms: 4.638224\n type: 'test'\n ...\n# Subtest: TODO bare filenames inherit an existing directory from the heading scope\nok 185 - TODO bare filenames inherit an existing directory from the heading scope\n ---\n duration_ms: 3.269558\n type: 'test'\n ...\n# Subtest: TODO resolves a bare filename only when its repository basename is unique\nok 186 - TODO resolves a bare filename only when its repository basename is unique\n ---\n duration_ms: 3.480799\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG resolve the same bare filename to one repository path\nok 187 - TODO and CHANGELOG resolve the same bare filename to one repository path\n ---\n duration_ms: 5.255302\n type: 'test'\n ...\n# Subtest: CHANGELOG keeps an ambiguous bare filename unresolved\nok 188 - CHANGELOG keeps an ambiguous bare filename unresolved\n ---\n duration_ms: 2.541252\n type: 'test'\n ...\n# Subtest: Markdown path resolution drops paths and heading scopes outside the repository\nok 189 - Markdown path resolution drops paths and heading scopes outside the repository\n ---\n duration_ms: 1.485173\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\nok 190 - TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\n ---\n duration_ms: 29.826445\n type: 'test'\n ...\n# Subtest: Markdown enrichment corrects one rejected response and audits both attempts\nok 191 - Markdown enrichment corrects one rejected response and audits both attempts\n ---\n duration_ms: 4.841234\n type: 'test'\n ...\n# Subtest: large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\nok 192 - large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\n ---\n duration_ms: 59.491613\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG LLM fallback and require mode are explicit\nok 193 - TODO and CHANGELOG LLM fallback and require mode are explicit\n ---\n duration_ms: 5.765547\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG reject structurally invalid LLM enrichments\nok 194 - TODO and CHANGELOG reject structurally invalid LLM enrichments\n ---\n duration_ms: 4.748193\n type: 'test'\n ...\n# Subtest: a truncated batch is split and every record keeps its own response provenance\nok 195 - a truncated batch is split and every record keeps its own response provenance\n ---\n duration_ms: 5.712745\n type: 'test'\n ...\n# Subtest: a malformed batch response splits instead of failing the whole stage\nok 196 - a malformed batch response splits instead of failing the whole stage\n ---\n duration_ms: 4.76502\n type: 'test'\n ...\n# Subtest: MCP 2026 profile is stateless and exposes discovery plus complete results\nok 197 - MCP 2026 profile is stateless and exposes discovery plus complete results\n ---\n duration_ms: 1.863859\n type: 'test'\n ...\n# Subtest: MCP 2026 rejects missing metadata and unsupported versions with protocol errors\nok 198 - MCP 2026 rejects missing metadata and unsupported versions with protocol errors\n ---\n duration_ms: 0.668179\n type: 'test'\n ...\n# Subtest: MCP legacy profile negotiates 2025-11-25 and requires initialize\nok 199 - MCP legacy profile negotiates 2025-11-25 and requires initialize\n ---\n duration_ms: 0.392681\n type: 'test'\n ...\n# Subtest: An LLM record is marked as inference and keeps runtime-owned provenance\nok 200 - An LLM record is marked as inference and keeps runtime-owned provenance\n ---\n duration_ms: 51.091491\n type: 'test'\n ...\n# Subtest: NL extraction corrects one rejected structured response and audits both attempts\nok 201 - NL extraction corrects one rejected structured response and audits both attempts\n ---\n duration_ms: 8.587963\n type: 'test'\n ...\n# Subtest: Confidence must satisfy the provider schema instead of being silently clamped\nok 202 - Confidence must satisfy the provider schema instead of being silently clamped\n ---\n duration_ms: 16.121062\n type: 'test'\n ...\n# Subtest: Source lines are clamped to the real file\nok 203 - Source lines are clamped to the real file\n ---\n duration_ms: 6.09681\n type: 'test'\n ...\n# Subtest: A placeholder object is recorded as a missing field, not as content\nok 204 - A placeholder object is recorded as a missing field, not as content\n ---\n duration_ms: 31.306295\n type: 'test'\n ...\n# Subtest: A real object is kept verbatim and reports no missing field\nok 205 - A real object is kept verbatim and reports no missing field\n ---\n duration_ms: 7.577851\n type: 'test'\n ...\n# Subtest: The explicit unknown action is reported as a missing field\nok 206 - The explicit unknown action is reported as a missing field\n ---\n duration_ms: 6.952579\n type: 'test'\n ...\n# Subtest: Both gaps are reported together\nok 207 - Both gaps are reported together\n ---\n duration_ms: 2.763589\n type: 'test'\n ...\n# Subtest: Out-of-vocabulary enums are rejected instead of changing the provider intent\nok 208 - Out-of-vocabulary enums are rejected instead of changing the provider intent\n ---\n duration_ms: 16.185404\n type: 'test'\n ...\n# Subtest: Rejected NL output keeps provider metadata in the failed audit\nok 209 - Rejected NL output keeps provider metadata in the failed audit\n ---\n duration_ms: 8.156053\n type: 'test'\n ...\n# Subtest: The documented confidence hierarchy holds across LLM extractors\nok 210 - The documented confidence hierarchy holds across LLM extractors\n ---\n duration_ms: 7.207435\n type: 'test'\n ...\n# Subtest: NL extractor produces deterministic non-LLM records\nok 211 - NL extractor produces deterministic non-LLM records\n ---\n duration_ms: 10.390925\n type: 'test'\n ...\n# Subtest: NL public extraction boundary names a missing sourcePath before path resolution\nok 212 - NL public extraction boundary names a missing sourcePath before path resolution\n ---\n duration_ms: 0.807538\n type: 'test'\n ...\n# Subtest: deterministic NL fallback skips Markdown headings and recognizes comparison intent\nok 213 - deterministic NL fallback skips Markdown headings and recognizes comparison intent\n ---\n duration_ms: 2.695106\n type: 'test'\n ...\n# Subtest: path extraction rejects lowercase prose alternations without losing repository paths\nok 214 - path extraction rejects lowercase prose alternations without losing repository paths\n ---\n duration_ms: 0.860091\n type: 'test'\n ...\n# Subtest: path extraction rejects dotted DSL fields but keeps known file extensions\nok 215 - path extraction rejects dotted DSL fields but keeps known file extensions\n ---\n duration_ms: 0.221942\n type: 'test'\n ...\n# Subtest: detectModality ignores parenthetical labels and bare adjectives\nok 216 - detectModality ignores parenthetical labels and bare adjectives\n ---\n duration_ms: 0.371034\n type: 'test'\n ...\n# Subtest: detectModality reads prohibitions and periphrastic obligation as requirements\nok 217 - detectModality reads prohibitions and periphrastic obligation as requirements\n ---\n duration_ms: 0.824303\n type: 'test'\n ...\n# Subtest: detectPolarity does not treat without-complements as sentence negation\nok 218 - detectPolarity does not treat without-complements as sentence negation\n ---\n duration_ms: 0.17564\n type: 'test'\n ...\n# Subtest: path extraction rejects HTTP routes, host paths and parent traversal\nok 219 - path extraction rejects HTTP routes, host paths and parent traversal\n ---\n duration_ms: 0.371191\n type: 'test'\n ...\n# Subtest: symbol extraction rejects hostnames without losing qualified code symbols\nok 220 - symbol extraction rejects hostnames without losing qualified code symbols\n ---\n duration_ms: 0.717701\n type: 'test'\n ...\n# Subtest: symbol extraction separates repository files and all-caps prose from code identifiers\nok 221 - symbol extraction separates repository files and all-caps prose from code identifiers\n ---\n duration_ms: 0.531449\n type: 'test'\n ...\n# Subtest: topic keywords normalize paths, camelCase and documentation word forms\nok 222 - topic keywords normalize paths, camelCase and documentation word forms\n ---\n duration_ms: 0.557194\n type: 'test'\n ...\n# Subtest: NL LLM extraction emits audited provenance and bounded DSL records\nok 223 - NL LLM extraction emits audited provenance and bounded DSL records\n ---\n duration_ms: 55.760113\n type: 'test'\n ...\n# Subtest: NL LLM failure is explicit when deterministic fallback is used\nok 224 - NL LLM failure is explicit when deterministic fallback is used\n ---\n duration_ms: 4.75006\n type: 'test'\n ...\n# Subtest: require-llm rejects instead of silently falling back\nok 225 - require-llm rejects instead of silently falling back\n ---\n duration_ms: 0.401417\n type: 'test'\n ...\n# Subtest: OpenRouter client parses structured JSON without exposing key\nok 226 - OpenRouter client parses structured JSON without exposing key\n ---\n duration_ms: 31.088675\n type: 'test'\n ...\n# Subtest: OpenRouter client preserves metadata when runtime rejects structured output\nok 227 - OpenRouter client preserves metadata when runtime rejects structured output\n ---\n duration_ms: 4.977532\n type: 'test'\n ...\n# Subtest: OpenRouter client lists available models after an invalid model ID\nok 228 - OpenRouter client lists available models after an invalid model ID\n ---\n duration_ms: 17.693243\n type: 'test'\n ...\n# Subtest: OpenRouter JSON timeout is not repeated as a schema fallback request\nok 229 - OpenRouter JSON timeout is not repeated as a schema fallback request\n ---\n duration_ms: 0.77187\n type: 'test'\n ...\n# Subtest: OpenRouter request obeys a shared pipeline deadline without retrying\nok 230 - OpenRouter request obeys a shared pipeline deadline without retrying\n ---\n duration_ms: 0.999307\n type: 'test'\n ...\n# Subtest: Documentation extractor converts OpenRouter structured output to bounded LLM records\nok 231 - Documentation extractor converts OpenRouter structured output to bounded LLM records\n ---\n duration_ms: 29.455286\n type: 'test'\n ...\n# Subtest: Documentation extractor reports and enforces its chunk budget\nok 232 - Documentation extractor reports and enforces its chunk budget\n ---\n duration_ms: 10.600139\n type: 'test'\n ...\n# Subtest: Documentation extractor corrects one rejected chunk and audits both responses\nok 233 - Documentation extractor corrects one rejected chunk and audits both responses\n ---\n duration_ms: 5.462681\n type: 'test'\n ...\n# Subtest: Documentation extractor does not spend its correction retry on a timeout\nok 234 - Documentation extractor does not spend its correction retry on a timeout\n ---\n duration_ms: 4.769507\n type: 'test'\n ...\n# Subtest: Documentation extractor exposes an audited configuration failure\nok 235 - Documentation extractor exposes an audited configuration failure\n ---\n duration_ms: 1.008426\n type: 'test'\n ...\n# Subtest: Documentation extractor uses bounded concurrent OpenRouter requests\nok 236 - Documentation extractor uses bounded concurrent OpenRouter requests\n ---\n duration_ms: 43.640863\n type: 'test'\n ...\n# Subtest: LLM summarizer receives graph data and preserves grounded record citations\nok 237 - LLM summarizer receives graph data and preserves grounded record citations\n ---\n duration_ms: 9.249042\n type: 'test'\n ...\n# Subtest: LLM summarizer validates provider fields before creating semantic IDs\nok 238 - LLM summarizer validates provider fields before creating semantic IDs\n ---\n duration_ms: 8.000478\n type: 'test'\n ...\n# Subtest: LLM summarizer diagnoses a provider that ignores the response envelope\nok 239 - LLM summarizer diagnoses a provider that ignores the response envelope\n ---\n duration_ms: 4.953126\n type: 'test'\n ...\n# Subtest: LLM summarizer rejects diagnostic citations outside the supplied graph\nok 240 - LLM summarizer rejects diagnostic citations outside the supplied graph\n ---\n duration_ms: 6.537866\n type: 'test'\n ...\n# Subtest: LLM summarizer prioritizes documentation over the AST payload budget\nok 241 - LLM summarizer prioritizes documentation over the AST payload budget\n ---\n duration_ms: 212.231366\n type: 'test'\n ...\n# Subtest: deterministic summary presents AST module aggregates instead of low-level calls\nok 242 - deterministic summary presents AST module aggregates instead of low-level calls\n ---\n duration_ms: 3.568471\n type: 'test'\n ...\n# Subtest: The summarizer grounds a fabricated record citation from its diagnostic\nok 243 - The summarizer grounds a fabricated record citation from its diagnostic\n ---\n duration_ms: 3.322774\n type: 'test'\n ...\n# Subtest: The summarizer still fails when the retry fabricates a diagnostic again\nok 244 - The summarizer still fails when the retry fabricates a diagnostic again\n ---\n duration_ms: 4.212772\n type: 'test'\n ...\n# Subtest: variable contracts and operation plans have deterministic content-bound IDs\nok 245 - variable contracts and operation plans have deterministic content-bound IDs\n ---\n duration_ms: 8.536635\n type: 'test'\n ...\n# Subtest: every variable grants Founder read/write authority and immutable variables reject other writers\nok 246 - every variable grants Founder read/write authority and immutable variables reject other writers\n ---\n duration_ms: 1.166723\n type: 'test'\n ...\n# Subtest: plans reject undeclared parameters, actor visibility gaps and payload secrets\nok 247 - plans reject undeclared parameters, actor visibility gaps and payload secrets\n ---\n duration_ms: 1.95067\n type: 'test'\n ...\n# Subtest: safety-sensitive commands require a Founder decision, a human boundary and verification\nok 248 - safety-sensitive commands require a Founder decision, a human boundary and verification\n ---\n duration_ms: 1.434\n type: 'test'\n ...\n# Subtest: plan hash detects semantic tampering\nok 249 - plan hash detects semantic tampering\n ---\n duration_ms: 1.926311\n type: 'test'\n ...\n# Subtest: compiler emits the exact governed envelope without an execution surface\nok 250 - compiler emits the exact governed envelope without an execution surface\n ---\n duration_ms: 1.668421\n type: 'test'\n ...\n# Subtest: runtime draft boundaries ignore lifecycle and identity fields injected by untyped callers\nok 251 - runtime draft boundaries ignore lifecycle and identity fields injected by untyped callers\n ---\n duration_ms: 0.831727\n type: 'test'\n ...\n# Subtest: compiler fails closed on extra, stale, wrong-source and wrong-type bindings\nok 252 - compiler fails closed on extra, stale, wrong-source and wrong-type bindings\n ---\n duration_ms: 1.831983\n type: 'test'\n ...\n# Subtest: file boundary writes one private envelope atomically and refuses overwrite\nok 253 - file boundary writes one private envelope atomically and refuses overwrite\n ---\n duration_ms: 20.535351\n type: 'test'\n ...\n# Subtest: Offline pipeline writes a complete run\nok 254 - Offline pipeline writes a complete run\n ---\n duration_ms: 246.331443\n type: 'test'\n ...\n# Subtest: Pipeline persists synthesis, validation and review patch, then registers approval receipt\nok 255 - Pipeline persists synthesis, validation and review patch, then registers approval receipt\n ---\n duration_ms: 67.202194\n type: 'test'\n ...\n# Subtest: Pipeline integrates multi-participant communication into graph, diagnostics, reality and run artifacts\nok 256 - Pipeline integrates multi-participant communication into graph, diagnostics, reality and run artifacts\n ---\n duration_ms: 59.453988\n type: 'test'\n ...\n# Subtest: Pipeline require-llm task synthesis failure is audited and never publishes latest\nok 257 - Pipeline require-llm task synthesis failure is audited and never publishes latest\n ---\n duration_ms: 16.283976\n type: 'test'\n ...\n# Subtest: Pipeline persists an audited failure when communication require-llm cannot run\nok 258 - Pipeline persists an audited failure when communication require-llm cannot run\n ---\n duration_ms: 20.47493\n type: 'test'\n ...\n# Subtest: Pipeline persists communication stage failure and does not publish latest\nok 259 - Pipeline persists communication stage failure and does not publish latest\n ---\n duration_ms: 14.665912\n type: 'test'\n ...\n# Subtest: Pipeline persists a failed manifest when NL require-llm aborts\nok 260 - Pipeline persists a failed manifest when NL require-llm aborts\n ---\n duration_ms: 10.440662\n type: 'test'\n ...\n# Subtest: Pipeline persists a failed manifest when Markdown require-llm aborts\nok 261 - Pipeline persists a failed manifest when Markdown require-llm aborts\n ---\n duration_ms: 17.297888\n type: 'test'\n ...\n# Subtest: Pipeline persists a failed manifest for an unexpected summary failure\nok 262 - Pipeline persists a failed manifest for an unexpected summary failure\n ---\n duration_ms: 17.350083\n type: 'test'\n ...\n# Subtest: Proposal validation reports existing TODO duplicates and orders dependencies before priority\nok 263 - Proposal validation reports existing TODO duplicates and orders dependencies before priority\n ---\n duration_ms: 26.224678\n type: 'test'\n ...\n# Subtest: Proposal validation rejects dependency cycles and whitespace-only criterion duplicates\nok 264 - Proposal validation rejects dependency cycles and whitespace-only criterion duplicates\n ---\n duration_ms: 3.465658\n type: 'test'\n ...\n# Subtest: Python package executes the local TypeScript reality runtime without a server\nok 265 - Python package executes the local TypeScript reality runtime without a server\n ---\n duration_ms: 2253.194748\n type: 'test'\n ...\n# Subtest: Runtime validator enforces the complete Intent DSL enum and object contract\nok 266 - Runtime validator enforces the complete Intent DSL enum and object contract\n ---\n duration_ms: 8.202176\n type: 'test'\n ...\n# Subtest: Linker and remote action boundary reject malformed records before graph construction\nok 267 - Linker and remote action boundary reject malformed records before graph construction\n ---\n duration_ms: 24.226056\n type: 'test'\n ...\n# Subtest: Graph validator rejects invalid relations and inconsistent statistics\nok 268 - Graph validator rejects invalid relations and inconsistent statistics\n ---\n duration_ms: 5.197137\n type: 'test'\n ...\n# [t2c:a2a] listening on 127.0.0.1:33391\n# Subtest: diff UI and TypeScript/Python SDKs use the live backend runtime\nok 269 - diff UI and TypeScript/Python SDKs use the live backend runtime\n ---\n duration_ms: 261.606224\n type: 'test'\n ...\n# Subtest: MCP/A2A action boundary rejects traversal and symlink escapes\nok 270 - MCP/A2A action boundary rejects traversal and symlink escapes\n ---\n duration_ms: 34.084228\n type: 'test'\n ...\n# Subtest: bounded retrieval cannot create a relation until a grounded reranker accepts it\nok 271 - bounded retrieval cannot create a relation until a grounded reranker accepts it\n ---\n duration_ms: 23.585772\n type: 'test'\n ...\n# Subtest: reranker fails closed on ungrounded quotes and more than one accepted module\nok 272 - reranker fails closed on ungrounded quotes and more than one accepted module\n ---\n duration_ms: 7.570661\n type: 'test'\n ...\n# Subtest: OpenRouter reranking is required, structured and reusable only through an identity-bound cache\nok 273 - OpenRouter reranking is required, structured and reusable only through an identity-bound cache\n ---\n duration_ms: 91.892511\n type: 'test'\n ...\n# Subtest: published semantic reranker schemas expose the versioned bounded contracts\nok 274 - published semantic reranker schemas expose the versioned bounded contracts\n ---\n duration_ms: 2.010945\n type: 'test'\n ...\n# Subtest: provider response validation diagnoses the exact property without coercion\nok 275 - provider response validation diagnoses the exact property without coercion\n ---\n duration_ms: 0.661055\n type: 'test'\n ...\n# Subtest: one structured contract emits the provider schema and parses the same value\nok 276 - one structured contract emits the provider schema and parses the same value\n ---\n duration_ms: 2.255355\n type: 'test'\n ...\n# Subtest: structured parsing fails closed with the exact response path\nok 277 - structured parsing fails closed with the exact response path\n ---\n duration_ms: 0.867795\n type: 'test'\n ...\n# Subtest: object uniqueness uses canonical JSON identity rather than property order\nok 278 - object uniqueness uses canonical JSON identity rather than property order\n ---\n duration_ms: 0.371224\n type: 'test'\n ...\n# Subtest: a short NL symbol resolves to its only AST owner\nok 279 - a short NL symbol resolves to its only AST owner\n ---\n duration_ms: 15.377856\n type: 'test'\n ...\n# Subtest: an ambiguous short NL symbol does not pretend that either AST owner is selected\nok 280 - an ambiguous short NL symbol does not pretend that either AST owner is selected\n ---\n duration_ms: 4.471802\n type: 'test'\n ...\n# Subtest: an explicit path selects one owner of an otherwise ambiguous symbol\nok 281 - an explicit path selects one owner of an otherwise ambiguous symbol\n ---\n duration_ms: 1.499082\n type: 'test'\n ...\n# Subtest: a qualified symbol selects its exact AST declaration without a path\nok 282 - a qualified symbol selects its exact AST declaration without a path\n ---\n duration_ms: 1.084444\n type: 'test'\n ...\n# Subtest: a symbol and explicit path conflict reports the observed AST location\nok 283 - a symbol and explicit path conflict reports the observed AST location\n ---\n duration_ms: 0.996764\n type: 'test'\n ...\n# Subtest: missingFields diagnostics prescribe a concrete edit for every known gap\nok 284 - missingFields diagnostics prescribe a concrete edit for every known gap\n ---\n duration_ms: 0.72931\n type: 'test'\n ...\n# Subtest: Target normalization canonicalizes paths, symbols and cross-language separators\nok 285 - Target normalization canonicalizes paths, symbols and cross-language separators\n ---\n duration_ms: 2.888074\n type: 'test'\n ...\n# Subtest: Qualified AST symbols align with short plan and documentation targets\nok 286 - Qualified AST symbols align with short plan and documentation targets\n ---\n duration_ms: 26.630405\n type: 'test'\n ...\n# Subtest: Structured task synthesis materializes stable, grounded contracts with a complete audit\nok 287 - Structured task synthesis materializes stable, grounded contracts with a complete audit\n ---\n duration_ms: 65.587885\n type: 'test'\n ...\n# Subtest: blank response-local proposal keys are rejected instead of invented by the runtime\nok 288 - blank response-local proposal keys are rejected instead of invented by the runtime\n ---\n duration_ms: 9.129888\n type: 'test'\n ...\n# Subtest: prefer-llm exposes raw diagnostic actions without claiming semantic task generation\nok 289 - prefer-llm exposes raw diagnostic actions without claiming semantic task generation\n ---\n duration_ms: 1.883861\n type: 'test'\n ...\n# Subtest: communication divergence is grounded in task synthesis without treating agent claims as facts\nok 290 - communication divergence is grounded in task synthesis without treating agent claims as facts\n ---\n duration_ms: 9.879268\n type: 'test'\n ...\n# Subtest: require-llm fails explicitly when task synthesis cannot call the provider\nok 291 - require-llm fails explicitly when task synthesis cannot call the provider\n ---\n duration_ms: 1.012865\n type: 'test'\n ...\n# Subtest: invalid structured LLM citations are rejected or visibly degraded according to mode\nok 292 - invalid structured LLM citations are rejected or visibly degraded according to mode\n ---\n duration_ms: 10.101037\n type: 'test'\n ...\n# Subtest: task synthesis timeout is audited and never retried as a format fallback\nok 293 - task synthesis timeout is audited and never retried as a format fallback\n ---\n duration_ms: 16.120688\n type: 'test'\n ...\n# Subtest: A fabricated record citation is grounded from its cited diagnostic without a retry\nok 294 - A fabricated record citation is grounded from its cited diagnostic without a retry\n ---\n duration_ms: 5.084101\n type: 'test'\n ...\n# Subtest: A fabricated diagnostic still fails after the corrective retry\nok 295 - A fabricated diagnostic still fails after the corrective retry\n ---\n duration_ms: 4.725713\n type: 'test'\n ...\n# Subtest: TensorFlow remains an explicit fallback when the isolated adapter is not installed\nok 296 - TensorFlow remains an explicit fallback when the isolated adapter is not installed\n ---\n duration_ms: 6.864405\n type: 'test'\n ...\n# Subtest: TODO patch rendering is stable, dependency-first and excludes classified duplicates\nok 297 - TODO patch rendering is stable, dependency-first and excludes classified duplicates\n ---\n duration_ms: 22.998463\n type: 'test'\n ...\n# Subtest: empty and duplicate-only results render an explicit no-op patch\nok 298 - empty and duplicate-only results render an explicit no-op patch\n ---\n duration_ms: 2.704325\n type: 'test'\n ...\n# Subtest: apply rejects missing or wrong approval, stale TODO and a tampered patch\nok 299 - apply rejects missing or wrong approval, stale TODO and a tampered patch\n ---\n duration_ms: 19.546566\n type: 'test'\n ...\n# Subtest: approved apply is atomic, receipt-backed and idempotent\nok 300 - approved apply is atomic, receipt-backed and idempotent\n ---\n duration_ms: 30.289843\n type: 'test'\n ...\n# Subtest: service actions execute LLM propose -> render -> approved apply with scoped artifacts\nok 301 - service actions execute LLM propose -> render -> approved apply with scoped artifacts\n ---\n duration_ms: 58.741418\n type: 'test'\n ...\n# Subtest: scanTree prunes ignored directories and records file signatures\nok 302 - scanTree prunes ignored directories and records file signatures\n ---\n duration_ms: 19.888131\n type: 'test'\n ...\n# Subtest: diffSnapshots classifies additions, modifications and removals\nok 303 - diffSnapshots classifies additions, modifications and removals\n ---\n duration_ms: 0.498634\n type: 'test'\n ...\n# Subtest: describeDelta truncates long change lists\nok 304 - describeDelta truncates long change lists\n ---\n duration_ms: 0.168912\n type: 'test'\n ...\n# Subtest: An unchanged tree produces exactly one report and then stays quiet\nok 305 - An unchanged tree produces exactly one report and then stays quiet\n ---\n duration_ms: 5.425216\n type: 'test'\n ...\n# Subtest: Reports are rate limited to one per interval no matter how often files change\nok 306 - Reports are rate limited to one per interval no matter how often files change\n ---\n duration_ms: 73.367872\n type: 'test'\n ...\n# Subtest: A change is reported once the interval has elapsed\nok 307 - A change is reported once the interval has elapsed\n ---\n duration_ms: 5.445187\n type: 'test'\n ...\n# Subtest: Ignored files never trigger a report\nok 308 - Ignored files never trigger a report\n ---\n duration_ms: 5.75999\n type: 'test'\n ...\n# Subtest: A failing report is surfaced and does not stop the watcher\nok 309 - A failing report is surfaced and does not stop the watcher\n ---\n duration_ms: 2.468465\n type: 'test'\n ...\n# Subtest: --no-initial-report waits for a real change\nok 310 - --no-initial-report waits for a real change\n ---\n duration_ms: 3.497512\n type: 'test'\n ...\n# Subtest: Communication changes trigger watch and coalesce under the existing report rate limit\nok 311 - Communication changes trigger watch and coalesce under the existing report rate limit\n ---\n duration_ms: 8.331281\n type: 'test'\n ...\n# Subtest: workflow verifier rejects duplicate top-level YAML keys\nok 312 - workflow verifier rejects duplicate top-level YAML keys\n ---\n duration_ms: 108.911482\n type: 'test'\n ...\n# Subtest: workspace headline trend ignores AST-only topic and source churn\nok 313 - workspace headline trend ignores AST-only topic and source churn\n ---\n duration_ms: 0.948171\n type: 'test'\n ...\n# Subtest: workspace comparison measures origin/main against uncommitted filesystem intent\nok 314 - workspace comparison measures origin/main against uncommitted filesystem intent\n ---\n duration_ms: 246.81654\n type: 'test'\n ...\n1..314\n# tests 314\n# suites 0\n# pass 307\n# fail 0\n# cancelled 0\n# skipped 7\n# todo 0\n# duration_ms 8133.098817\n\n> todo2code@0.5.0 evaluate:gold\n> npm run build && node dist/src/evaluation/gold-cli.js evaluation/gold/v2/dataset.json --require-perfect\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\n# Gold evaluation: todo2code core semantic benchmark v2\n\nDataset: `t2c.gold-dataset/v2` Β· `61191fe8717db205`\n\n| Scope | Precision | Recall | TP / FP / FN |\n|---|---:|---:|---:|\n| Extraction: nl | 100.0% | 100.0% | 8 / 0 / 0 |\n| Extraction: documentation | 100.0% | 100.0% | 2 / 0 / 0 |\n| Extraction: documentation-deterministic | 100.0% | 100.0% | 8 / 0 / 0 |\n| Extraction: markdown | 100.0% | 100.0% | 3 / 0 / 0 |\n| Extraction: overall | 100.0% | 100.0% | 21 / 0 / 0 |\n| Linking: overall | 100.0% | 100.0% | 18 / 0 / 0 |\n| Linking: exact target | 100.0% | 100.0% | 10 / 0 / 0 |\n| Linking: capability topic | 100.0% | 100.0% | 8 / 0 / 0 |\n| DSL2TODO deduplication | 100.0% | 100.0% | 1 / 0 / 0 |\n| Diagnostics: codes | 100.0% | 100.0% | 14 / 0 / 0 |\n\nDiagnostics cases: **7** (forbidden codes raised: 0).\n\nKnown linking gaps: **0/6** relations reached across 6 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/6** expected relations and **0/6** forbidden violations across 7 case(s).\n\nCross-language reranking: **6/6** expected relations and **0/6** forbidden violations across 7 captured case(s); accepted 6, abstained 1.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5e6c88e139a88705 / 5e6c88e139a88705).\n\n> todo2code@0.5.0 evaluate:gold:v1\n> npm run build && node dist/src/evaluation/gold-cli.js evaluation/gold/v1/dataset.json --require-perfect\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\n# Gold evaluation: todo2code core semantic benchmark v1\n\nDataset: `t2c.gold-dataset/v1` Β· `ff2d9908f374da48`\n\n| Scope | Precision | Recall | TP / FP / FN |\n|---|---:|---:|---:|\n| Extraction: nl | 100.0% | 100.0% | 4 / 0 / 0 |\n| Extraction: documentation | 100.0% | 100.0% | 2 / 0 / 0 |\n| Extraction: documentation-deterministic | 100.0% | 100.0% | 0 / 0 / 0 |\n| Extraction: markdown | 100.0% | 100.0% | 3 / 0 / 0 |\n| Extraction: overall | 100.0% | 100.0% | 9 / 0 / 0 |\n| Linking: overall | 100.0% | 100.0% | 7 / 0 / 0 |\n| Linking: exact target | 100.0% | 100.0% | 6 / 0 / 0 |\n| Linking: capability topic | 100.0% | 100.0% | 1 / 0 / 0 |\n| DSL2TODO deduplication | 100.0% | 100.0% | 1 / 0 / 0 |\n| Diagnostics: codes | 100.0% | 100.0% | 0 / 0 / 0 |\n\nDiagnostics cases: **0** (forbidden codes raised: 0).\n\nKnown linking gaps: **0/0** relations reached across 0 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/0** expected relations and **0/0** forbidden violations across 0 case(s).\n\nCross-language reranking: **0/0** expected relations and **0/0** forbidden violations across 0 captured case(s); accepted 0, abstained 0.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5f928c74d5a6c8e3 / 5f928c74d5a6c8e3).\n\n> todo2code@0.5.0 examples:check\n> npm run build && bash scripts/examples-check.sh\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\ndemo: 227 records, 92 relations; communication: 3 blocking, 1 warning\nrejected event: agent is required\nbackend/frontend: strict compilation and HTTP integration passed\nexample failed: Task 9cb29036-f81b-4d7d-97ec-efe9812a1699 ended in TASK_STATE_FAILED: Configured T2C_ROOT does not exist: /workspace/examples/backend\n[2026-08-01T09:24:25Z] [EXIT] Full Docker verification exited with code 1\n[2026-08-01T09:24:41Z] [EXEC] [provider:codex] compact authoritative Docker gates\nnpm_ci=PASS\nverify=PASS\n duration_ms: 212.620174\n type: 'test'\n ...\n1..314\n# tests 314\n# suites 0\n# pass 307\n# fail 0\n# cancelled 0\n# skipped 7\n# todo 0\n# duration_ms 7286.318175\ngold_v2=PASS\n\nKnown linking gaps: **0/6** relations reached across 6 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/6** expected relations and **0/6** forbidden violations across 7 case(s).\n\nCross-language reranking: **6/6** expected relations and **0/6** forbidden violations across 7 captured case(s); accepted 6, abstained 1.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5e6c88e139a88705 / 5e6c88e139a88705).\ngold_v1=PASS\n\nKnown linking gaps: **0/0** relations reached across 0 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/0** expected relations and **0/0** forbidden violations across 0 case(s).\n\nCross-language reranking: **0/0** expected relations and **0/0** forbidden violations across 0 captured case(s); accepted 0, abstained 0.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5f928c74d5a6c8e3 / 5f928c74d5a6c8e3).\nexamples=FAIL:1\n\n> todo2code@0.5.0 examples:check\n> npm run build && bash scripts/examples-check.sh\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\ndemo: 227 records, 92 relations; communication: 3 blocking, 1 warning\nrejected event: agent is required\nbackend/frontend: strict compilation and HTTP integration passed\nexample failed: Task c842f452-1bb5-4837-b133-c1f2f3ce9eb8 ended in TASK_STATE_FAILED: Configured T2C_ROOT does not exist: /workspace/examples/backend\n[2026-08-01T09:25:28Z] [EXIT] Compact Docker gates exited with code 1\n[2026-08-01T09:30:00Z] [RESULT] [provider:codex] final host and Docker gates\nhost_verify=PASS tests=314 pass=313 skip=1 fail=0\ndocker_verify=PASS tests=314 pass=307 skip=7 fail=0\ngold_v2=PASS gold_v1=PASS gated_precision_recall=100%\nhost_examples=PASS docker_examples=PASS\n[2026-08-01T09:31:00Z] [RESULT] [provider:codex] Governance Hub tracked A/B\nrepository=wellmanifest/new-project commit=72e5f6c9cf91998615e2342f02b2af650be81cea\nbefore_graph=322d2d1ca075a3cdd7060e88dcf3c7e5621f987ba0a5a8b4c3a43824c1e4d4c0\nafter_graph=6ac01af718a3a32c18a98d44b5751bcccc33ad1edb4696a30f59da948563950e\nbefore_conflicting_intent=1 after_conflicting_intent=0\nbefore_planned_not_implemented=31 after_planned_not_implemented=32\nbefore_total_diagnostics=183 after_total_diagnostics=183\ntarget_before=unknown/positive target_after=required/negative\n[2026-08-01T09:32:00Z] [RESULT] [provider:codex] generated analysis refresh\nsource=tracked-file overlay on 1ebad96 (unrelated untracked inputs excluded)\nverification={"filesChecked":19,"untrackedInputsChecked":5,"status":"ok"}\nprefact=skipped\n[2026-08-01T09:40:00Z] [RESULT] [provider:codex] isolated Docker core E2E\nsuite=core result=T2C-E2E-000:PASS tests=318 pass=311 skip=7 fail=0\ngold_v2=PASS gold_v1=PASS cli_smoke=PASS mcp_smoke=PASS a2a_smoke=PASS examples=PASS\n[2026-08-01T09:44:00Z] [RESULT] [provider:codex] isolated Docker full-toolchain E2E\nsuite=full result=T2C-E2E-000:PASS tests=318 pass=318 skip=0 fail=0\ngold_v2=PASS gold_v1=PASS cli_smoke=PASS mcp_smoke=PASS a2a_smoke=PASS\nsdk_examples=PASS languages=5 fingerprint=1b5dbbf867286090\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-016/ai-codex-logs.txt", "path": "ticket-016 / ai-codex-logs.txt", "size": "453B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 PHP 8.4 available; ext-ast unavailable; selected TOKEN_PARSE boundary\n2026-07-31 focused PHP + existing AST suite 5/5 PASS\n2026-07-31 redsl A/B: 40 tracked PHP files, 2127 unique records, +80 relations\n2026-07-31 redsl diagnostics warnings 730 -> 712; plans stayed 1; extraction warnings 0\n2026-07-31 verify PASS: 304 total, 303 pass, 1 JDK skip; 104 modules, 75 env keys\n2026-07-31 gold v2/v1 100%; examples PASS, SDK fingerprints unchanged\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-015/ai-codex-logs.txt", "path": "ticket-015 / ai-codex-logs.txt", "size": "383B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 PLF-003 title reproduced as "Implement Implement ... and it ..."\n2026-07-31 focused test failed with the exact malformed title\n2026-07-31 lossless source-title fallback implemented under src/synthesis\n2026-07-31 focused suite 18/18 pass; real fixture title preserves implement + verify\n2026-07-31 verify PASS: 300 total, 299 pass, 1 JDK skip; gold v2/v1 and examples PASS\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-014/ai-codex-logs.txt", "path": "ticket-014 / ai-codex-logs.txt", "size": "871B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 existing src/retry.py falsely aligned with a new retry/backoff TODO; 0 plans\n2026-07-31 missing src/retry_backoff.py produced 1 grounded plan and Koru PLF-001\n2026-07-31 Koru false-success root cause: todo2code ticket was not classified as edit work\n2026-07-31 Koru runner fixed to treat todo2code/code-change labels as edit work\n2026-07-31 Koru PLF-002 produced verified branch koru/run-6e596247e153 commit 1809ea5\n2026-07-31 independent pytest and todo2code re-analysis passed; targeted planned gap cleared\n2026-07-31 gold added existing-path negative and implemented-capability positive; 14/14 diagnostic codes\n2026-07-31 Koru replay created PLF-003 for existing src/retry.py; verified commit 55a8b15\n2026-07-31 independent replay: 6 pytest pass, zero target plans, capability_overlap:2\n2026-07-31 weekly/nlp2uri/algitex deterministic regressions succeeded\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-013/ai-codex-logs.txt", "path": "ticket-013 / ai-codex-logs.txt", "size": "706B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-013 opened\n2026-07-31 verified all three candidates in the current OpenRouter catalog with structured_outputs\n2026-07-31 Gemini 3 Flash Preview PASS 6/6, 64064 ms, 116604 tokens, $0.076411\n2026-07-31 Codestral 2508 PASS 6/6, 57129 ms, 118920 tokens, $0.037994\n2026-07-31 DeepSeek V4 Pro stopped after crossing the 900000 ms run budget; no manifest\n2026-07-31 weekly Codestral: 161 records, 6 requests, 218741 ms sequential\n2026-07-31 weekly Codestral after concurrency=3: 161 records, 6 requests, 53362 ms\n2026-07-31 nlp2uri Codestral after concurrency=3: 619 records, 20 requests, 194750 ms, $0.08588244\n2026-07-31 algitex deterministic full scan PASS: 2643 Markdown records, 9.4 s wall\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-012/ai-codex-logs.txt", "path": "ticket-012 / ai-codex-logs.txt", "size": "862B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-012 opened\n2026-07-31 attributed auto-beta failure to a schema-incomplete provider response\n2026-07-31 selected deepseek/deepseek-v4-flash from the live OpenRouter model API\n2026-07-31 DeepSeek attempt reached the contradictory 120s client timeout\n2026-07-31 aligned live request timeout with the 300s stage budget\n2026-07-31 selected qwen/qwen3.7-plus for the second explicit-model attempt\n2026-07-31 Qwen passed NL/Markdown but violated documentation and communication schemas twice\n2026-07-31 added one bounded schema-preserving correction to all direct extractors\n2026-07-31 rejected openai/gpt-5.4-mini after two corrected NL runs still violated the schema\n2026-07-31 google/gemini-3.6-flash passed all six live stages in 125486 ms for $0.412363\n2026-07-31 implementation and documentation pushed to main as 11348c0; nlp2uri.yaml excluded\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-011/ai-codex-logs.txt", "path": "ticket-011 / ai-codex-logs.txt", "size": "501B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-011 opened\n2026-07-31 measured 155 ambiguous leaf aliases in todo2code and 2 in subactor-improvement\n2026-07-31 implemented AST-backed NL symbol resolution outside project/\n2026-07-31 focused resolver tests passed; gold v2 extended to 10 exact-target relations\n2026-07-31 full verify passed: 277 tests, 276 pass, 1 JDK skip\n2026-07-31 gold v1/v2 and all five SDK examples passed\n2026-07-31 implementation commit 25df74a pushed to main; nlp2uri.yaml excluded\n2026-07-31 ticket closed\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-010/ai-codex-logs.txt", "path": "ticket-010 / ai-codex-logs.txt", "size": "417B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-010 opened\n2026-07-31 mapped AST adapters, Markdown chunking and output boundaries\n2026-07-31 implemented content-addressed fail-open cache outside project/\n2026-07-31 targeted cache and extractor tests passed\n2026-07-31 benchmarked three tracked repository snapshots\n2026-07-31 exact commit passed 261 tests, gold v1/v2 and five SDK examples\n2026-07-31 ticket closed; implementation commit f1d9334\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-009/ai-codex-logs.txt", "path": "ticket-009 / ai-codex-logs.txt", "size": "659B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-009 started\n- production structured OpenRouter boundaries found: 7\n- manual runtime strategies found: unchecked generic, duplicated validator, coercive normalizer\n- executable files in ticket directory: 0\n2026-07-31 ticket-009 verified\n- npm run verify: PASS (256 total, 255 pass, 1 JDK skip)\n- structured response gate: PASS (7 canonical, 0 raw)\n- generated schema gate: PASS\n- evaluate:gold v2: 100% required gates\n- evaluate:gold:v1: PASS\n- examples:check: PASS (5 SDK)\n- git diff --check: PASS\n2026-07-31 ticket-009 published\n- implementation commit: d0fc143\n- origin/main push: PASS\n- unrelated staged nlp2uri.yaml: preserved, excluded\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-008/ai-codex-logs.txt", "path": "ticket-008 / ai-codex-logs.txt", "size": "343B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-008 completed\n- Docker engine: running, version 29.1.3\n- governance script syntax: PASS\n- isolated scaffolder/index test: PASS\n- todo2code communication integration: PASS\n- generated participant: agent:codex / agent\n- invented human participants: 0\n- unresolved approval route: unresolved:human\n- upstream main push: 72e5f6c\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-007/ai-codex-logs.txt", "path": "ticket-007 / ai-codex-logs.txt", "size": "423B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-007 initialized\n- selected the first open P1 readiness gap\n- implementation files remain outside project/ticket-007\n- no human participant file or registry entry created\n2026-07-31 implementation completed\n- real ticket-006: 3 issues, all route to unresolved:human, none empty\n- focused communication tests: 7/7 pass\n- full verify: 253 tests, 252 pass, 1 JDK skip\n- gold v2/v1 and five-SDK examples: PASS\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-006/ai-codex-logs.txt", "path": "ticket-006 / ai-codex-logs.txt", "size": "1.6KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nInput from ticket-005 live evaluation:\n- attempt 1: no decisions array,\n- attempt 2: judgments instead of decisions,\n- attempt 3: invalid confidence type/range,\n- all attempts failed closed,\n- no relation or coverage change was accepted.\n\nSelected next work:\ncanonical structured-output conformance and precise provider diagnostics.\n\nWorkflow state: PLAN\n\n2026-07-31 offline conformance implementation\n\n- provider schema and runtime validator share\n src/semantic/reranker-response.ts,\n- verdict/reason values and compatibility rule share\n src/semantic/reranker.ts,\n- published schema drift is checked in semantic-reranker.test.ts,\n- invalid response error identifies property + provider/model/response ID,\n- no raw response persistence and no coercion,\n- focused semantic tests: 5/5 PASS.\n\nWorkflow transition: PLAN -> TOOLS\n\n2026-07-31 tracked live comparison\n\n- root: clean subactor/platform worktree,\n- commit: 3e96573d587cb664741849ceba205bf303b9f418,\n- candidates: reciprocal E5 selected top-1, 6 declarations,\n- qwen/qwen3.7-plus: three prior contract failures from ticket-005,\n- qwen/qwen3.7-flash:\n response.decisions[0] contains unknown properties: decision,\n- response identity:\n Alibaba/qwen/qwen3.7-flash/gen-1785490219-noOw2NdfoPMqC6dLf7x6,\n- graph mutations: 0.\n\nFinal gates:\n- npm run verify: 252 total, 251 pass, 0 fail, 1 local JDK skip,\n- gold v2/v1: PASS,\n- examples:check: PASS, 227 records, 97 relations, five SDKs,\n- npm audit --omit=dev: 0 vulnerabilities,\n- CLI, MCP, A2A and Docker smoke: PASS.\n\nDecision: retain conformance diagnostics; reject production semantic\nenablement. Workflow state: DONE.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-005/ai-codex-logs.txt", "path": "ticket-005 / ai-codex-logs.txt", "size": "3.5KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nUser instruction: kontynuuj, with an explicit correction that executable source\nmust not live under project/ticket-*.\n\nPrevious measured result:\ncross-language expected=0/6\ncross-language forbidden violations=0/6\nraw E5 new platform candidates=2\nmanually accepted raw E5 candidates=0\n\nWorkflow state: PLAN\nImplementation status: waiting for P-CORE-008 review\n\n2026-07-31 owner approval and continuation\n\nUser approved work on subsequent todo2code tickets and requested an explicit\naudit of:\nuser-* / ai-* -> Intent DSL -> divergence -> required respondent.\n\nWorkflow transition: PLAN -> TOOLS\nHuman participant file remains unchanged.\n\n2026-07-31 communication fidelity validation\n\nFocused regression: 25/25 PASS for communication, identity, pipeline and task\nsynthesis after the initial implementation.\n\nExternal read-only migration (`wellmanifest/new-project`, historical\n2b9e3c9):\n- filename-only rename: 0 records; explicit owner-specific migration warnings,\n- Opus, typed request/message: 9 human + 58 agent records, 0 issues,\n- GPT56Luna, typed request/message: 9 human + 72 agent records, 3 unanswered\n prompt fragments, 0 false human-agent file conflict.\n\nFull gates after implementation:\n- npm run verify: PASS (247 total, 246 pass, 1 local JDK skip),\n- evaluate:gold v2 and v1: PASS, 100% gated precision/recall,\n- examples:check: PASS (227 records, 97 relations),\n- npm audit --omit=dev: 0 vulnerabilities,\n- CLI, MCP, A2A and Docker smoke: PASS.\n\n2026-07-31 audited reranker evaluation\n\nOffline contracts:\n- candidate set bounded to 1..10 per declaration,\n- retrieval creates no relation,\n- accept/reject/abstain decisions require both record IDs and exact grounded\n quotes,\n- accepted relations retain retrieval, decision, reranker and citation\n provenance,\n- captured gold reranker: 6/6 expected, 0/6 forbidden violations, 1 abstention.\n\nLive tracked repository:\n- repository: subactor/platform,\n- commit: 3e96573d587cb664741849ceba205bf303b9f418,\n- graph fingerprint:\n 250df4ff83f456fb371278d4a0c2cf17dd025582b6865a0cb2f01bd469fd1dd0,\n- selected reciprocal E5 shortlist: 6 declarations; top-3=18 candidates,\n top-1=6 candidates,\n- qwen/qwen3.7-plus attempt 1: missing decisions array,\n- attempt 2: returned judgments instead of decisions,\n- attempt 3: invalid non-numeric/out-of-range confidence,\n- result: fail-closed, 0 materialized relations, no coverage claim.\n\nFinal gates:\n- npm run verify: PASS (251 total, 250 pass, 1 local JDK skip),\n- one earlier full-suite CLI-watch timing failure; isolated retry 3/3 PASS and\n repeated full verify PASS,\n- evaluate:gold v2: deterministic linker 0/6; captured reranker 6/6 expected,\n 0/6 forbidden, accepted 6, abstained 1,\n- evaluate:gold v1: PASS,\n- examples:check: PASS (227 records, 97 relations, five SDKs),\n- npm audit --omit=dev: 0 vulnerabilities,\n- CLI, MCP, A2A and Docker smoke: PASS.\n\nDecision: reject production semantic reranking; do not export it and do not\nchange the deterministic linker. Workflow state: DONE.\n\nFinal communication re-analysis after closing documentation:\n- participants: codex 51 records, tom-sapletta-com 4 records,\n- 0 blocking, 8 warning, 8 review_required,\n- 7 AGENT_CLAIM_WITHOUT_EVIDENCE -> codex (workspace remains uncommitted),\n- 1 AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED -> tom-sapletta-com,\n- 8 AGENT_WORK_OUTSIDE_REQUEST -> tom-sapletta-com because the detailed latest\n instruction is present in the conversation but not in the human-owned file.\n\nNo human-owned file was modified to suppress these findings.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-004/ai-codex-logs.txt", "path": "ticket-004 / ai-codex-logs.txt", "size": "2.9KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nUser decision: kontynuuj\nPrevious recommendation: replace further dictionary growth with a\nlanguage-independent topic-matching experiment.\nWorkflow state: TOOLS\n\nCurrent known gap:\nKolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem\nsrc/queue/task-retry-backoff.ts\nResult: 0/1 relation because lexical topics do not cross the language boundary.\n\nConstraints:\noffline CI remains provider-independent\nthree-topic hard-negative boundary remains in force\nmodel-derived evidence must be explicit and auditable\nexternal inputs remain tracked-only snapshots\n\n2026-07-31 local embedding benchmark\n\nMiniLM revision=86741b4e3f5cb7765a600d3a3d55a0f6a6cb443d\npositive_min=0.673289 negative_max=0.732568 separation=-0.059279\npairwise_correct=5/6\n\nE5 revision=f470c6a1a906014160ece1968c484b275f0396de\nquery_prefix=query: passage_prefix=passage:\npositive_min=0.759374 negative_max=0.835202 separation=-0.075828\npairwise_correct=6/6 minimum_pairwise_margin=0.007190\n\nDecision: no global cosine threshold is safe.\n\n2026-07-31 tracked platform ranking\n\ncommit=3e96573d587cb664741849ceba205bf303b9f418\ngraph=ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d\nmodule_aggregates=133 actionable_targetless_declarations=66\n\nforward score>=0.75 margin>=0.01:\nselected=6 new_candidates=2 manually_accepted=0\n\nreciprocal top-1 with forward/reverse margin>=0.01:\nselected=1 new_candidates=0\n\nDecision: reject production embedding matcher; workflow TOOLS -> ANALYSIS.\n\n2026-07-31 gold cohort\n\ncross_language_cases=7\nknown_positive_relations=6 satisfied=0\nforbidden_pairs=6 violations=0\ngated exact-target/capability-topic precision=100% recall=100%\ngold v1=PASS gold v2=PASS\nWorkflow transition: ANALYSIS -> VERIFY.\n\n2026-07-31 full validation and close\n\n$ npm run verify\ntests=244 pass=243 fail=0 skip=1\nJava skip reason: local JDK unavailable; required CI supplies JDK 17.\nLLM boundary=PASS (9 entrypoints, 31 modules)\nmodule graph=PASS (94 modules, 429 imports, no cycles)\nenvironment contract=PASS (63/63)\nworkflows=PASS\ngenerated analysis=PASS (18 files)\n\n$ npm run evaluate:gold && npm run evaluate:gold:v1\nResult: PASS, gated precision/recall 100%, stability PASS.\nCross-language: expected=0/6, forbidden violations=0/6.\n\n$ npm run examples:check\nResult: PASS, five SDK fingerprints agree.\n\n$ npm audit --omit=dev\nResult: PASS, 0 vulnerabilities.\n\n$ make smoke protocol-smoke\nResult: PASS, CLI, MCP and A2A.\n\n$ make docker-smoke\nResult: PASS.\n\nResult: all acceptance criteria satisfied; workflow VERIFY -> DONE.\n\n2026-07-31 repository layout correction\n\nUser review identified executable code under project/ticket-004.\nMoved:\nproject/ticket-004/evaluate-embeddings.py\n-> scripts/research/evaluate-embedding-pairs.py\nproject/ticket-004/rank-graph-embeddings.py\n-> scripts/research/rank-intent-graph-embeddings.py\n\nBenchmark inputs, captured results, decisions and raw logs remain under the\nticket. No experiment code remains there.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-003/ai-codex-logs.txt", "path": "ticket-003 / ai-codex-logs.txt", "size": "3.9KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nUser decision: kontynuuj\nPrevious recommendation: audit and classify the residual actionable changelog\nfindings before changing linker policy.\nWorkflow state: TOOLS\n\nBaseline source: project/ticket-002/iteration-01.json\nTarget tracked runtime: 18cc21b\nExternal corpus: unchanged seven detached commits from ticket-002\n\n2026-07-31 current residual baseline\n\nsemcod/code2docs run=20260731T072143Z-a3208b84 records=6717 relations=35468 changelog=269 graph=83dcfa7a5b21ca77\nsemcod/code2llm run=20260731T072152Z-fb1ab530 records=16899 relations=41758 changelog=955 graph=bd57f05a14c3abca\nsemcod/code2logic run=20260731T072209Z-30215e36 records=21423 relations=16933 changelog=120 graph=c6e9f7a0671dc9b4\nsemcod/domd run=20260731T072221Z-f577ffe7 records=10611 relations=7484 changelog=99 graph=a9d2d5eb1287b7cb\nsemcod/pactfix run=20260731T072226Z-0fb2f8b8 records=5161 relations=3917 changelog=48 graph=9c2d15fc76b8585f\nsemcod/redup run=20260731T072230Z-6a2d832d records=7204 relations=19259 changelog=269 graph=b3a582ffa178ee30\nsubactor/platform run=20260731T072237Z-6cab0835 records=10628 relations=11424 changelog=93 graph=ae92ead72d35e88e\nResult: 7/7 succeeded, residual findings=1853.\n\n2026-07-31 deterministic audit\n\nSelection: lexical target-class:action strata, stable ID, round-robin, 24 per\nrepository.\nsampled=168\nnon_actionable_file_update=28 across 5 repositories\nnon_actionable_file_summary=1 across 1 repository\nroadmap_not_release=6 sampled / 30 census across 2 repositories\nsubstantive_or_unverified=133 sampled / 1275 census across 7 repositories\nSelected correction: exact Update <file> bookkeeping only.\nWorkflow transition: TOOLS -> ANALYSIS.\n\n2026-07-31 regression before implementation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=5 fail=1\nfailure: Diagnostics ignore non-actionable changelog mechanics but retain\nrelease claims\nfirst counterexample: Update src/runtime.ts\nResult: expected red regression confirmed before implementation.\n\n2026-07-31 focused validation after implementation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=6 fail=0\n\n$ npm run evaluate:gold\nPASS: all measured precision/recall 100%, forbidden diagnostics 0, stability PASS\n\n2026-07-31 external A/B\n\nsemcod/code2docs graph=same changelog=269->127 unlinked=455->418\nsemcod/code2llm graph=same changelog=955->650 unlinked=1312->1219\nsemcod/code2logic graph=same changelog=120->109 unlinked=1503->1492\nsemcod/domd graph=same changelog=99->99 unlinked=772->772\nsemcod/pactfix graph=same changelog=48->48 unlinked=217->217\nsemcod/redup graph=same changelog=269->184 unlinked=703->661\nsubactor/platform graph=same changelog=93->89 unlinked=766->761\n\nTotal: changelog 1853->1306 (-547), unlinked 5728->5540 (-188),\nall diagnostics 16280->15545 (-735).\nResult: keep iteration; workflow transition ANALYSIS -> VERIFY.\n\n2026-07-31 full validation and close\n\n$ npm run verify\ntests=242 pass=241 fail=0 skip=1\nJava fixture skip reason: local JDK unavailable; required CI uses JDK 17.\nLLM boundary=PASS (9 entrypoints, 31 modules)\nmodule graph=PASS (94 modules, 429 imports, no cycles)\nenvironment contract=PASS (63/63)\nworkflows=PASS\ngenerated analysis=PASS (18 files)\n\n$ npm run examples:check\nResult: PASS, five SDK fingerprints agree.\n\n$ npm audit --omit=dev\nResult: PASS, 0 vulnerabilities.\n\n$ make smoke protocol-smoke\nResult: PASS, CLI, MCP and A2A.\n\n$ make docker-smoke\nResult: PASS.\n\nReadiness updated with residual census:\nsubstantive_or_unverified=1275\nroadmap_not_release=30\nnon_actionable_file_summary=1\ntotal retained=1306\n\nResult: all acceptance criteria satisfied; workflow transition VERIFY -> DONE.\n\n2026-07-31 repository layout correction\n\nUser review identified executable code under project/ticket-003.\nMoved:\nproject/ticket-003/sample-changelog.mjs\n-> scripts/research/audit-changelog-sample.mjs\n\nTicket inputs, captured results, decisions and raw logs remain under the\nticket. No experiment code remains there.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-002/ai-codex-logs.txt", "path": "ticket-002 / ai-codex-logs.txt", "size": "6.2KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31T06:49:07Z ticket initialization\n\n$ git status --short\n?? nlp2uri.yaml\n\n$ docker version --format 'client={{.Client.Version}} server={{.Server.Version}}'\nclient=29.1.3 server=29.1.3\n\n$ verify required container files\nDockerfile\ndocker-compose.yml\n\n$ verify external tracked commits\nsemcod/code2llm b297d60\nsemcod/domd b6c5ad2\nsemcod/pactfix daf301a\nsemcod/code2logic ba93489\nsemcod/code2docs c738aff\nsemcod/redup a175fb0\nsubactor/platform 3e96573\n\nResult: planning prerequisites verified; state WAIT_FOR_APPROVAL.\n\n$ git diff --check\nexit 0\n\n$ verify ticket files are non-empty\nOK project/ticket-002/README.md\nOK project/ticket-002/preprompt.md\nOK project/ticket-002/user-tom-sapletta-com.md\nOK project/ticket-002/ai-codex.md\nOK project/ticket-002/ai-codex-logs.txt\nOK project/ticket-002/changelog.md\n\n$ npm run verify:generated-analysis\n{"filesChecked":18,"untrackedInputsChecked":7,"status":"ok"}\n\n2026-07-31 approval\n\nUser decision: kontynuuj\nWorkflow transition: WAIT_FOR_APPROVAL -> TOOLS\n\n2026-07-31 generated-analysis audit\n\n$ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\ndetached tracked worktree: used\ncode2docs/redup/vallm/code2llm: completed\n{"filesChecked":18,"filesChanged":8}\n{"filesChecked":18,"untrackedInputsChecked":7,"status":"ok"}\nprefact: skipped; requires T2C_APPLY_PREFACT=1\nResult: generated analysis passed, but project/README.md generation replaced\nthe manually added ticket index. The namespace conflict is retained as a\nfollow-up tooling defect; ticket discovery remains available through TODO.md.\n\n2026-07-31 external deterministic baseline\n\nPolicy: detached tracked-only commits; TASK.md/TODO.md/CHANGELOG.md selected\nonly when tracked; documents README.md and docs/**/*.md; deterministic NL and\nMarkdown; no communication, task synthesis or LLM summary.\n\nsemcod/code2llm b297d600 run=20260731T065730Z-ca7a9a28 time=18s records=16899 relations=41747 graph=2e57056bf75fc5ef diagnostics=4700 warnings=9\nsemcod/domd b6c5ad24 run=20260731T065753Z-a3fde5a3 time=5s records=10611 relations=7470 graph=9df7e187f82b4ce8 diagnostics=2109 warnings=0\nsemcod/pactfix daf301a9 run=20260731T065802Z-48dc0b12 time=5s records=5161 relations=3917 graph=9c2d15fc76b8585f diagnostics=664 warnings=5\nsemcod/code2logic ba93489b run=20260731T065808Z-a52c2716 time=12s records=21423 relations=16927 graph=722f90e806be667f diagnostics=4680 warnings=3\nsemcod/code2docs c738aff7 run=20260731T065827Z-9f042652 time=9s records=6717 relations=35447 graph=4598fbe9eec85d61 diagnostics=1555 warnings=0\nsemcod/redup a175fb0a run=20260731T065840Z-61c33c16 time=6s records=7204 relations=19173 graph=ed0359f98ed4e18f diagnostics=2384 warnings=0\nsubactor/platform 3e96573d run=20260731T065848Z-3863e97d time=6s records=10628 relations=11002 graph=1c4166dd1b7b7789 diagnostics=1271 warnings=1\n\nResult: 7/7 succeeded. CHANGELOG_WITHOUT_IMPLEMENTATION occurred in every\nrepository, 2877 times in total. Samples include both substantive claims and\nnon-actionable generated-file updates/placeholders; broad topic linking is\ntherefore rejected for the first iteration.\n\n2026-07-31 regression before implementation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=5 fail=1\nfailure: Diagnostics ignore non-actionable changelog mechanics but retain\nrelease claims\nfirst counterexample: Update project/calls.mmd\nResult: expected red regression confirmed before the implementation change.\n\n2026-07-31 iteration 01 focused and gold validation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=6 fail=0\n\n$ npm run evaluate:gold\nextraction=100%/100% linking=100%/100% diagnostics=100%/100%\nforbiddenDiagnosticCodes=0 repeatedRunStability=PASS knownGap=0/1\n\n2026-07-31 iteration 01 external comparison\n\nRuntime: clean 5f5ae593 plus only src/graph/changelog-signal.ts and the\ndiagnostics integration. External commits and deterministic input policy are\nunchanged.\n\nsemcod/code2llm graph=same changelog=1411->955 review=1411->955 unlinked=1332->1313\nsemcod/domd graph=same changelog=105->99 review=105->99 unlinked=779->773\nsemcod/pactfix graph=same changelog=48->48 review=48->48 unlinked=217->217\nsemcod/code2logic graph=same changelog=121->120 review=121->120 unlinked=1504->1503\nsemcod/code2docs graph=same changelog=396->269 review=396->269 unlinked=463->455\nsemcod/redup graph=same changelog=703->269 review=703->269 unlinked=708->703\nsubactor/platform graph=same changelog=93->93 review=93->93 unlinked=780->780\n\nTotal: CHANGELOG_WITHOUT_IMPLEMENTATION 2877->1853 (-1024),\nUNLINKED_RECORD 5783->5744 (-39), all diagnostics 17363->16300 (-1063).\nResult: keep iteration 01; target improved in 5 repositories with no graph or\ngold regression. Workflow transition: ANALYSIS -> VERIFY.\n\n2026-07-31 final validation\n\n$ npm run verify\nPASS: 241 tests, 240 pass, 0 fail, 1 Java skip (JDK unavailable)\nPASS: LLM boundary 9 entrypoints / 31 modules\nPASS: module boundary 94 modules / 429 imports / 0 cycles\nPASS: env contract 63/63, workflow YAML, generated-analysis isolation\n\n$ npm run evaluate:gold\nPASS: all measured precision/recall 100%, forbidden diagnostics 0, stability PASS\n\n$ npm run examples:check\nPASS: 5 SDKs, shared graph and patch fingerprints\n\n$ npm audit --omit=dev\nPASS: 0 vulnerabilities\n\n$ make smoke protocol-smoke\nPASS: offline CLI, MCP and A2A\n\n$ make docker-smoke\nPASS: image build, /healthz and doctor\n\nResult: all acceptance criteria satisfied. Workflow transition: VERIFY -> DONE.\n\n2026-07-31 iteration 02 generated-analysis isolation\n\n$ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\nFAIL: project/index.html references untracked input nlp2uri.yaml\nCause: generated HTML quoted the committed ticket log containing an earlier\ngit-status line; the detached generator did not consume the untracked file.\n\n$ npm run build && node --test dist/test/generated-analysis.test.js\nbefore implementation: tests=4 pass=3 fail=1\nfailing regression: accepts an untracked filename already quoted by tracked evidence\n\nAfter implementation:\nfocused generated-analysis tests=4 pass=4 fail=0\nnew untracked reference hard negative=PASS\ntracked audit quotation=PASS\n\n$ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\nPASS: {"filesChecked":18,"untrackedInputsChecked":6,"status":"ok"}\n\n$ npm run verify\nPASS: 242 tests, 241 pass, 0 fail, 1 Java skip\n\n$ make docker-smoke\nPASS\n", "is_subdir": true}, {"name": "logs.txt", "rel_path": "ticket-001/logs.txt", "path": "ticket-001 / logs.txt", "size": "598B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-29 bootstrap initialized; no test or runtime output produced.\n\n2026-07-29 validation outputs:\nGitHub repository lookup: 404 Not Found\nGitHub CLI auth: token invalid\nDocker CLI: Docker version 29.6.1, build 8900f1d\nDocker engine: permission denied while connecting to Docker Desktop Linux engine\ndocker compose config --quiet: exit code 0\nGit: initialized empty repository on main; no commits yet.\n\n2026-07-29 GitHub publication:\nGitHub authentication: verified for account MatthiasLew with repo and read:org scopes.\nRemote repository: https://github.com/semcod/todo2code\nVisibility: PUBLIC\n", "is_subdir": true}]; + const files = [{"name": "calls.png", "rel_path": "calls.png", "path": "calls.png", "size": "97.9KB", "icon": "πŸ–ΌοΈ", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "compact_flow.png", "rel_path": "compact_flow.png", "path": "compact_flow.png", "size": "31.9KB", "icon": "πŸ–ΌοΈ", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "flow.png", "rel_path": "flow.png", "path": "flow.png", "size": "13.9KB", "icon": "πŸ–ΌοΈ", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "README.md", "rel_path": "README.md", "path": "README.md", "size": "9.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# code2llm - Generated Analysis Files\n\n\nThis directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase. # noqa: E501\n\n## πŸ“ Generated Files Overview\n\nWhen you run `code2llm ./ -f all`, the following files are created:\n\n### 🎯 Core Analysis Files\n\n| File | Format | Purpose | Key Insights |\n|------|--------|---------|--------------|\n| `evolution.toon.yaml` | **YAML** | **πŸ“‹ Refactoring queue** - Prioritized improvements | 0 refactoring actions needed |\n| `map.toon.yaml` | **YAML** | **πŸ—ΊοΈ Structural map + project header** - Modules, imports, exports, signatures, stats, alerts, hotspots, trend | Project architecture overview |\n\n### πŸ€– LLM-Ready Documentation\n\n| File | Format | Purpose | Use Case |\n|------|--------|---------|----------|\n| `prompt.txt` | **Text** | **πŸ“ Ready-to-send prompt** - Lists all files with instructions | Attach to LLM conversation as context guide |\n| `context.md` | **Markdown** | **πŸ“– LLM narrative** - Architecture summary | Paste into ChatGPT/Claude for code analysis |\n\n### πŸ“Š Visualizations\n\n| File | Format | Purpose | Description |\n|------|--------|---------|-------------|\n| `flow.mmd` | **Mermaid** | **πŸ”„ Control flow diagram** | Function call paths with complexity styling |\n| `calls.mmd` | **Mermaid** | **πŸ“ž Call graph** | Function dependencies (edges only) |\n| `compact_flow.mmd` | **Mermaid** | **πŸ“¦ Module overview** | Aggregated module-level view |\n\n## πŸš€ Quick Start Commands\n\n### Basic Analysis\n```bash\n# Quick health check (TOON format only)\ncode2llm ./ -f toon\n\n# Generate all formats (what created these files)\ncode2llm ./ -f all\n\n# LLM-ready context only\ncode2llm ./ -f context\n```\n\n### Performance Options\n```bash\n# Fast analysis for large projects\ncode2llm ./ -f toon --strategy quick\n\n# Memory-limited analysis\ncode2llm ./ -f all --max-memory 500\n\n# Skip PNG generation (faster)\ncode2llm ./ -f all --no-png\n```\n\n### Refactoring Focus\n```bash\n# Get refactoring recommendations\ncode2llm ./ -f evolution\n\n# Focus on specific code smells\ncode2llm ./ -f toon --refactor --smell god_function\n\n# Data flow analysis\ncode2llm ./ -f flow --data-flow\n```\n\n## πŸ“– Understanding Each File\n\n### `analysis.toon` - Health Diagnostics\n**Purpose**: Quick overview of code health issues\n**Key sections**:\n- **HEALTH**: Critical issues (πŸ”΄) and warnings (🟑)\n- **REFACTOR**: Prioritized refactoring actions\n- **COUPLING**: Module dependencies and potential cycles\n- **LAYERS**: Package complexity metrics\n- **FUNCTIONS**: High-complexity functions (CC β‰₯ 10)\n- **CLASSES**: Complex classes needing attention\n\n**Example usage**:\n```bash\n# View health issues\ncat analysis.toon | head -30\n\n# Check refactoring priorities\ngrep \"REFACTOR\" analysis.toon\n```\n\n### `evolution.toon.yaml` - Refactoring Queue\n**Purpose**: Step-by-step refactoring plan\n**Key sections**:\n- **NEXT**: Immediate actions to take\n- **RISKS**: Potential breaking changes\n- **METRICS-TARGET**: Success criteria\n\n**Example usage**:\n```bash\n# Get refactoring plan\ncat evolution.toon.yaml\n\n# Track progress\ngrep \"NEXT\" evolution.toon.yaml\n```\n\n### `flow.toon` - Legacy Data Flow Analysis\n**Purpose**: Understand data movement through the system (legacy / explicit opt-in)\n**Key sections**:\n- **PIPELINES**: Data processing chains\n- **CONTRACTS**: Function input/output contracts\n- **SIDE_EFFECTS**: Functions with external impacts\n\n**Example usage**:\n```bash\n# Find data pipelines\ngrep \"PIPELINES\" flow.toon\n\n# Identify side effects\ngrep \"SIDE_EFFECTS\" flow.toon\n```\n\n### `map.toon.yaml` - Structural Map + Project Header\n**Purpose**: High-level architecture overview plus compact project header\n**Key sections**:\n- **MODULES**: All modules with basic stats\n- **IMPORTS**: Dependency relationships\n- **EXPORTS**: Public API surface and signatures\n- **HEADER**: Stats, alerts, hotspots, evolution trend\n\n**Example usage**:\n```bash\n# See project structure\ncat map.toon.yaml | head -50\n\n# Find public APIs\ngrep \"SIGNATURES\" map.toon.yaml\n```\n\n### `project.toon.yaml` - Compact Analysis View\n**Purpose**: Compact module view generated from project.yaml data\n**Status**: Legacy view generated on demand from unified project.yaml\n\n**Example usage**:\n```bash\n# View compact project structure\ncat project.toon.yaml | head -30\n\n# Find largest files\ngrep -E \"^ .*[0-9]{3,}$\" project.toon.yaml | sort -t',' -k2 -n -r | head -10\n```\n\n### `prompt.txt` - Ready-to-Send LLM Prompt\n**Purpose**: Pre-formatted prompt listing all generated files for LLM conversation\n**Generation**: Written when `code2llm` runs with a source path and requests `-f all` (including `--no-chunk`) or `code2logic` # noqa: E501\n**Contents**:\n- **Files section**: Lists all existing generated files with descriptions, including `project.toon.yaml` when generated by `-f all` # noqa: E501\n- **Source files section**: Highlights important source files such as `cli_exports/orchestrator.py`\n- **Missing section**: Shows which files weren't generated (if any)\n- **Task section**: Refactoring brief with concrete execution instructions, not just analysis\n- **Priority Order section**: State-dependent refactoring priorities, starting with blockers and then architecture cleanup # noqa: E501\n- **Requirements section**: Guidelines for suggested changes\n\n**Example usage**:\n```bash\n# View the prompt\ncat prompt.txt\n\n# Copy to clipboard and paste into ChatGPT/Claude\ncat prompt.txt | pbcopy # macOS\ncat prompt.txt | xclip -sel clip # Linux\n```\n\n### `context.md` - LLM Narrative\n**Purpose**: Ready-to-paste context for AI assistants\n**Key sections**:\n- **Overview**: Project statistics\n- **Architecture**: Module breakdown\n- **Entry Points**: Public interfaces\n- **Patterns**: Design patterns detected\n\n**Example usage**:\n```bash\n# Copy to clipboard for LLM\ncat context.md | pbcopy # macOS\ncat context.md | xclip -sel clip # Linux\n\n# Use with Claude/ChatGPT for code analysis\n```\n\n### Visualization Files (`*.mmd`, `*.png`)\n**Purpose**: Visual understanding of code structure\n**Files**:\n- `flow.mmd` - Detailed control flow with complexity colors\n- `calls.mmd` - Simple call graph\n- `compact_flow.mmd` - High-level module view\n- `*.png` - Pre-rendered images\n\n**Example usage**:\n```bash\n# View diagrams\nopen flow.png # macOS\nxdg-open flow.png # Linux\n\n# Edit in Mermaid Live Editor\n# Copy content of .mmd files to https://mermaid.live\n```\n\n## πŸ” Common Analysis Patterns\n\n### 1. Code Health Assessment\n```bash\n# Quick health check\ncode2llm ./ -f toon\ncat analysis.toon | grep -E \"(HEALTH|REFACTOR)\"\n```\n\n### 2. Refactoring Planning\n```bash\n# Get refactoring queue\ncode2llm ./ -f evolution\ncat evolution.toon.yaml\n\n# Focus on specific issues\ncode2llm ./ -f toon --refactor --smell god_function\n```\n\n### 3. LLM Assistance\n```bash\n# Generate context for AI\ncode2llm ./ -f context\ncat context.md\n\n# Use with Claude: \"Based on this context, help me refactor the god modules\"\n```\n\n### 4. Team Documentation\n```bash\n# Generate all docs for team\ncode2llm ./ -f all -o ./docs/\n\n# Create visual diagrams\nopen docs/flow.png\n```\n\n## πŸ“Š Interpreting Metrics\n\n### Complexity Metrics (CC)\n- **πŸ”΄ Critical (β‰₯5.0)**: Immediate refactoring needed\n- **🟠 High (3.0-4.9)**: Consider refactoring\n- **🟑 Medium (1.5-2.9)**: Monitor complexity\n- **🟒 Low (0.1-1.4)**: Acceptable\n- **βšͺ Basic (0.0)**: Simple functions\n\n### Module Health\n- **GOD Module**: Too large (>500 lines, >20 methods)\n- **HUB**: High fan-out (calls many modules)\n- **FAN-IN**: High incoming dependencies\n- **CYCLES**: Circular dependencies\n\n### Data Flow Indicators\n- **PIPELINE**: Sequential data processing\n- **CONTRACT**: Clear input/output specification\n- **SIDE_EFFECT**: External state modification\n\n## πŸ› οΈ Integration Examples\n\n### CI/CD Pipeline\n```bash\n#!/bin/bash\n# Analyze code quality in CI\ncode2llm ./ -f toon -o ./analysis\nif grep -q \"πŸ”΄ GOD\" ./analysis/analysis.toon; then\n echo \"❌ God modules detected\"\n exit 1\nfi\n```\n\n### Pre-commit Hook\n```bash\n#!/bin/sh\n# .git/hooks/pre-commit\ncode2llm ./ -f toon -o ./temp_analysis\nif grep -q \"πŸ”΄\" ./temp_analysis/analysis.toon; then\n echo \"⚠️ Critical issues found. Review before committing.\"\nfi\nrm -rf ./temp_analysis\n```\n\n### Documentation Generation\n```bash\n# Generate docs for README\ncode2llm ./ -f context -o ./docs/\necho \"## Architecture\" >> README.md\ncat docs/context.md >> README.md\n```\n\n## πŸ“š Next Steps\n\n1. **Review `analysis.toon`** - Identify critical issues\n2. **Check `evolution.toon.yaml`** - Plan refactoring priorities\n3. **Use `context.md`** - Get LLM assistance for complex changes\n4. **Reference visualizations** - Understand system architecture\n5. **Track progress** - Re-run analysis after changes\n\n## πŸ”§ Advanced Usage\n\n### Custom Analysis\n```bash\n# Deep analysis with all insights\ncode2llm ./ -m hybrid -f all --max-depth 15 -v\n\n# Performance-optimized\ncode2llm ./ -m static -f toon --strategy quick\n\n# Refactoring-focused\ncode2llm ./ -f toon,evolution --refactor\n```\n\n### Output Customization\n```bash\n# Separate output directories\ncode2llm ./ -f all -o ./analysis-$(date +%Y%m%d)\n\n# Split YAML into multiple files\ncode2llm ./ -f yaml --split-output\n\n# Separate orphaned functions\ncode2llm ./ -f yaml --separate-orphans\n```\n\n---\n\n**Generated by**: `code2llm ./ -f all --readme` \n**Analysis Date**: 2026-08-04 \n**Total Functions**: 4129 \n**Total Classes**: 404 \n**Modules**: 281 \n\nFor more information about code2llm, visit: https://github.com/tom-sapletta/code2llm\n", "is_subdir": false}, {"name": "TICKETS.md", "rel_path": "TICKETS.md", "path": "TICKETS.md", "size": "5.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket index (`project/`)\n\nThis index follows `wellmanifest/new-project` 0.6.0 without taking ownership\nof `project/README.md`, which remains a generated technical-analysis artifact.\n\n\n| Ticket ID | Spec | Preprompt | Human input | Agent plans | Agent logs | Changelog |\n| :--- | :--- | :--- | :--- | :--- | :--- | :--- |\n| **ticket-001** | [`README.md`](./ticket-001/README.md) | - | - | - | - | - |\n| **ticket-002** | [`README.md`](./ticket-002/README.md) | [`preprompt.md`](./ticket-002/preprompt.md) | [`user-tom-sapletta-com.md`](./ticket-002/user-tom-sapletta-com.md) | [`ai-codex.md`](./ticket-002/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-002/ai-codex-logs.txt) | [`changelog.md`](./ticket-002/changelog.md) |\n| **ticket-003** | [`README.md`](./ticket-003/README.md) | [`preprompt.md`](./ticket-003/preprompt.md) | [`user-tom-sapletta-com.md`](./ticket-003/user-tom-sapletta-com.md) | [`ai-codex.md`](./ticket-003/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-003/ai-codex-logs.txt) | [`changelog.md`](./ticket-003/changelog.md) |\n| **ticket-004** | [`README.md`](./ticket-004/README.md) | [`preprompt.md`](./ticket-004/preprompt.md) | [`user-tom-sapletta-com.md`](./ticket-004/user-tom-sapletta-com.md) | [`ai-codex.md`](./ticket-004/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-004/ai-codex-logs.txt) | [`changelog.md`](./ticket-004/changelog.md) |\n| **ticket-005** | [`README.md`](./ticket-005/README.md) | [`preprompt.md`](./ticket-005/preprompt.md) | [`user-tom-sapletta-com.md`](./ticket-005/user-tom-sapletta-com.md) | [`ai-codex.md`](./ticket-005/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-005/ai-codex-logs.txt) | [`changelog.md`](./ticket-005/changelog.md) |\n| **ticket-006** | [`README.md`](./ticket-006/README.md) | [`preprompt.md`](./ticket-006/preprompt.md) | - | [`ai-codex.md`](./ticket-006/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-006/ai-codex-logs.txt) | [`changelog.md`](./ticket-006/changelog.md) |\n| **ticket-007** | [`README.md`](./ticket-007/README.md) | [`preprompt.md`](./ticket-007/preprompt.md) | - | [`ai-codex.md`](./ticket-007/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-007/ai-codex-logs.txt) | [`changelog.md`](./ticket-007/changelog.md) |\n| **ticket-008** | [`README.md`](./ticket-008/README.md) | [`preprompt.md`](./ticket-008/preprompt.md) | - | [`ai-codex.md`](./ticket-008/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-008/ai-codex-logs.txt) | [`changelog.md`](./ticket-008/changelog.md) |\n| **ticket-009** | [`README.md`](./ticket-009/README.md) | [`preprompt.md`](./ticket-009/preprompt.md) | - | [`ai-codex.md`](./ticket-009/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-009/ai-codex-logs.txt) | [`changelog.md`](./ticket-009/changelog.md) |\n| **ticket-010** | [`README.md`](./ticket-010/README.md) | [`preprompt.md`](./ticket-010/preprompt.md) | - | [`ai-codex.md`](./ticket-010/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-010/ai-codex-logs.txt) | [`changelog.md`](./ticket-010/changelog.md) |\n| **ticket-011** | [`README.md`](./ticket-011/README.md) | [`preprompt.md`](./ticket-011/preprompt.md) | - | [`ai-codex.md`](./ticket-011/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-011/ai-codex-logs.txt) | [`changelog.md`](./ticket-011/changelog.md) |\n| **ticket-012** | [`README.md`](./ticket-012/README.md) | [`preprompt.md`](./ticket-012/preprompt.md) | - | [`ai-codex.md`](./ticket-012/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-012/ai-codex-logs.txt) | [`changelog.md`](./ticket-012/changelog.md) |\n| **ticket-013** | [`README.md`](./ticket-013/README.md) | [`preprompt.md`](./ticket-013/preprompt.md) | - | [`ai-codex.md`](./ticket-013/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-013/ai-codex-logs.txt) | [`changelog.md`](./ticket-013/changelog.md) |\n| **ticket-014** | [`README.md`](./ticket-014/README.md) | [`preprompt.md`](./ticket-014/preprompt.md) | - | [`ai-codex.md`](./ticket-014/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-014/ai-codex-logs.txt) | [`changelog.md`](./ticket-014/changelog.md) |\n| **ticket-015** | [`README.md`](./ticket-015/README.md) | [`preprompt.md`](./ticket-015/preprompt.md) | - | [`ai-codex.md`](./ticket-015/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-015/ai-codex-logs.txt) | [`changelog.md`](./ticket-015/changelog.md) |\n| **ticket-016** | [`README.md`](./ticket-016/README.md) | [`preprompt.md`](./ticket-016/preprompt.md) | - | [`ai-codex.md`](./ticket-016/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-016/ai-codex-logs.txt) | [`changelog.md`](./ticket-016/changelog.md) |\n| **ticket-017** | [`README.md`](./ticket-017/README.md) | [`preprompt.md`](./ticket-017/preprompt.md) | - | [`ai-codex.md`](./ticket-017/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-017/ai-codex-logs.txt) | [`changelog.md`](./ticket-017/changelog.md) |\n| **ticket-018** | [`README.md`](./ticket-018/README.md) | [`preprompt.md`](./ticket-018/preprompt.md) | - | [`ai-codex.md`](./ticket-018/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-018/ai-codex-logs.txt) | [`changelog.md`](./ticket-018/changelog.md) |\n| **ticket-019** | [`README.md`](./ticket-019/README.md) | [`preprompt.md`](./ticket-019/preprompt.md) | - | [`ai-codex.md`](./ticket-019/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-019/ai-codex-logs.txt) | [`changelog.md`](./ticket-019/changelog.md) |\n| **ticket-020** | [`README.md`](./ticket-020/README.md) | [`preprompt.md`](./ticket-020/preprompt.md) | - | [`ai-codex.md`](./ticket-020/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-020/ai-codex-logs.txt) | [`changelog.md`](./ticket-020/changelog.md) |\n| **ticket-022** | [`README.md`](./ticket-022/README.md) | [`preprompt.md`](./ticket-022/preprompt.md) | - | [`ai-codex.md`](./ticket-022/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-022/ai-codex-logs.txt) | [`changelog.md`](./ticket-022/changelog.md) |\n\n", "is_subdir": false}, {"name": "context.md", "rel_path": "context.md", "path": "context.md", "size": "33.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# System Architecture Analysis\n\n\n## Overview\n\n- **Project**: /home/tom/github/semcod/todo2code\n- **Primary Language**: typescript\n- **Languages**: typescript: 173, json: 40, python: 16, javascript: 15, shell: 8\n- **Analysis Mode**: static\n- **Total Functions**: 4129\n- **Total Classes**: 404\n- **Modules**: 281\n- **Entry Points**: 2776\n\n## Architecture by Module\n\n### src.cli\n- **Functions**: 202\n- **Classes**: 1\n- **File**: `cli.ts`\n\n### src.services.actions\n- **Functions**: 145\n- **Classes**: 1\n- **File**: `actions.ts`\n\n### src.interfaces.a2a-task-store\n- **Functions**: 101\n- **Classes**: 3\n- **File**: `a2a-task-store.ts`\n\n### src.diff.reality\n- **Functions**: 97\n- **Classes**: 4\n- **File**: `reality.ts`\n\n### src.communication.analyzer\n- **Functions**: 88\n- **Classes**: 3\n- **File**: `analyzer.ts`\n\n### src.communication.intake-service\n- **Functions**: 82\n- **Classes**: 2\n- **File**: `intake-service.ts`\n\n### src.communication.intake-contract\n- **Functions**: 76\n- **Classes**: 7\n- **File**: `intake-contract.ts`\n\n### src.evaluation.gold-cases\n- **Functions**: 75\n- **Classes**: 4\n- **File**: `gold-cases.ts`\n\n### src.operations.validation\n- **Functions**: 75\n- **File**: `validation.ts`\n\n### src.core.text\n- **Functions**: 66\n- **File**: `text.ts`\n\n### src.extractors.git\n- **Functions**: 64\n- **Classes**: 6\n- **File**: `git.ts`\n\n### src.graph.diagnostics\n- **Functions**: 61\n- **Classes**: 1\n- **File**: `diagnostics.ts`\n\n### src.comparison.workspace\n- **Functions**: 56\n- **Classes**: 3\n- **File**: `workspace.ts`\n\n### src.graph.linker\n- **Functions**: 55\n- **Classes**: 1\n- **File**: `linker.ts`\n\n### src.synthesis.code-change-plan.implementation-source-patch-assert\n- **Functions**: 55\n- **Classes**: 2\n- **File**: `implementation-source-patch-assert.ts`\n\n### src.synthesis.code-change-plan.implementation-source-patch-apply-core\n- **Functions**: 54\n- **Classes**: 6\n- **File**: `implementation-source-patch-apply-core.ts`\n\n### src.synthesis.todo-patch\n- **Functions**: 53\n- **Classes**: 5\n- **File**: `todo-patch.ts`\n\n### src.extractors.communication-helpers\n- **Functions**: 49\n- **Classes**: 3\n- **File**: `communication-helpers.ts`\n\n### src.interfaces.a2a\n- **Functions**: 48\n- **File**: `a2a.ts`\n\n### sdk.typescript.src\n- **Functions**: 48\n- **Classes**: 14\n- **File**: `index.ts`\n\n## Key Entry Points\n\nMain execution flows into the system:\n\n### sdk.python.examples.basic.main\n- **Calls**: os.environ.get, os.environ.get, os.environ.get, T2CClient, print, client.agent_card, print, client.extract_nl_result\n\n### scripts.research.rank-intent-graph-embeddings.main\n- **Calls**: scripts.research.rank-intent-graph-embeddings.parse_args, args.graph.read_bytes, json.loads, sorted, sorted, time.monotonic, SentenceTransformer, model.encode\n\n### src.comparison.workspace.compareWorkspaceIntent\n- **Calls**: src.comparison.workspace.resolve, src.comparison.workspace.git, src.comparison.workspace.trim, src.comparison.workspace.relative, src.comparison.workspace.startsWith, src.comparison.workspace.isAbsolute, src.comparison.workspace.Error, src.comparison.workspace.scopedOutputDirectory\n\n### scripts.research.evaluate-embedding-pairs.main\n- **Calls**: scripts.research.evaluate-embedding-pairs.parse_args, json.loads, src.synthesis.code-change-plan.implementation-indexing.list, time.monotonic, SentenceTransformer, model.encode, dict, args.output.write_text\n\n### src.interfaces.intake_cli.main\n- **Calls**: argparse.ArgumentParser, parser.add_subparsers, sub.add_parser, encode.add_argument, encode.add_argument, sub.add_parser, decode.add_argument, decode.add_argument\n\n### src.comparison.workspace.temporaryParent\n- **Calls**: src.comparison.workspace.git, src.comparison.workspace.join, src.comparison.workspace.commonPipelineOptions, src.comparison.workspace.optionsForRoot, src.comparison.workspace.runPipeline, src.comparison.workspace.all, src.comparison.workspace.buildRealityView, src.comparison.workspace.diffIntentGraphs\n\n### src.comparison.workspace.baseWorktree\n- **Calls**: src.comparison.workspace.git, src.comparison.workspace.join, src.comparison.workspace.commonPipelineOptions, src.comparison.workspace.optionsForRoot, src.comparison.workspace.runPipeline, src.comparison.workspace.all, src.comparison.workspace.buildRealityView, src.comparison.workspace.diffIntentGraphs\n\n### src.extractors.todo.extractTodo\n- **Calls**: src.extractors.todo.resolve, src.extractors.todo.pathExists, src.extractors.todo.readText, src.extractors.todo.relativePosix, src.extractors.todo.split, src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim\n\n### scripts.verify-env-contract.makefile\n- **Calls**: scripts.verify-env-contract.readFile, scripts.verify-env-contract.join, scripts.verify-env-contract.matchAll, scripts.verify-env-contract.add, scripts.verify-env-contract.b, scripts.verify-env-contract.filter, scripts.verify-env-contract.has, scripts.verify-env-contract.sort\n\n### python.ast_extract.main\n- **Calls**: argparse.ArgumentParser, parser.add_argument, parser.add_argument, parser.add_argument, parser.parse_args, None.resolve, python.ast_extract.iter_python_files, print\n\n### src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited\n- **Calls**: src.communication.llm.implementation.now, src.communication.llm.implementation.extractCommunicationIntent, src.communication.llm.implementation.audit, src.communication.llm.implementation.markDeterministic, src.communication.llm.implementation.deterministicSyntheses, src.communication.llm.implementation.deterministicGeneration, src.communication.llm.implementation.OpenRouterClient, src.communication.llm.implementation.isConfigured\n\n### src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited\n- **Calls**: src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.now, src.extractors.nl-llm.extractNlIntent, src.extractors.nl-llm.markDeterministicNlRecords, src.extractors.nl-llm.nlStageAudit, src.extractors.nl-llm.OpenRouterClient, src.extractors.nl-llm.isConfigured, src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow\n\n### src.graph.linker.linkIntentRecords\n- **Calls**: src.graph.linker.Date, src.graph.linker.toISOString, src.graph.linker.assertIntentRecords, src.graph.linker.deduplicateRecords, src.graph.linker.sort, src.graph.linker.localeCompare, src.graph.linker.Map, src.graph.linker.map\n\n### scripts.live-model-comparison.main\n- **Calls**: scripts.live-model-comparison.loadEnvFile, scripts.live-model-comparison.getConfig, scripts.live-model-comparison.Error, scripts.live-model-comparison.write, scripts.live-model-comparison.SKIPPED, scripts.live-model-comparison.Number, scripts.live-model-comparison.split, scripts.live-model-comparison.map\n\n### rust-ast.src.main.main\n- **Calls**: rust-ast.src.main.let, rust-ast.src.main.arguments, rust-ast.src.main.collect_files, rust-ast.src.main.sort, rust-ast.src.main.slash, rust-ast.src.main.strip_prefix, rust-ast.src.main.unwrap_or, rust-ast.src.main.metadata\n\n### sdk.typescript.examples.basic.baseUrl\n- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error\n\n### sdk.typescript.examples.basic.token\n- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error\n\n### sdk.typescript.examples.basic.root\n- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error\n\n### sdk.typescript.examples.basic.main\n- **Calls**: sdk.typescript.examples.basic.T2CClient, sdk.typescript.examples.basic.health, sdk.typescript.examples.basic.log, sdk.typescript.examples.basic.agentCard, sdk.typescript.examples.basic.map, sdk.typescript.examples.basic.join, sdk.typescript.examples.basic.extractNl, sdk.typescript.examples.basic.Error\n\n### sdk.python.todo2code.runtime.TypeScriptRuntime.reality\n- **Calls**: tempfile.TemporaryDirectory, self.invoke, Path, Path, Path, str, str, str\n\n### src.extractors.nl.extractNlIntent\n- **Calls**: src.extractors.nl.assertNlExtractionOptions, src.extractors.nl.resolve, src.extractors.nl.readText, src.extractors.nl.isAbsolute, src.extractors.nl.relativePosix, src.extractors.nl.replace, src.extractors.nl.splitIntentLines, src.extractors.nl.classifyAction\n\n### src.extractors.ast.extractAstIntent\n- **Calls**: src.extractors.ast.resolve, src.extractors.ast.ContentCache, src.extractors.ast.loadIgnoreMatcher, src.extractors.ast.walkFiles, src.extractors.ast.readText, src.extractors.ast.relativePosix, src.extractors.ast.getOrCompute, src.extractors.ast.sha256\n\n### src.extractors.todo.body\n- **Calls**: src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim, src.extractors.todo.toLowerCase, src.extractors.todo.readListBlock, src.extractors.todo.classifyAction, src.extractors.todo.resolve, src.extractors.todo.extractPaths\n\n### src.extractors.todo.relative\n- **Calls**: src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim, src.extractors.todo.toLowerCase, src.extractors.todo.readListBlock, src.extractors.todo.classifyAction, src.extractors.todo.resolve, src.extractors.todo.extractPaths\n\n### src.extractors.todo.lines\n- **Calls**: src.extractors.todo.match, src.extractors.todo.splice, src.extractors.todo.trim, src.extractors.todo.toLowerCase, src.extractors.todo.readListBlock, src.extractors.todo.classifyAction, src.extractors.todo.resolve, src.extractors.todo.extractPaths\n\n### src.synthesis.todo-patch.applyTodoPatch\n- **Calls**: src.synthesis.todo-patch.all, src.synthesis.todo-patch.readText, src.synthesis.todo-patch.assertTodoPatchArtifact, src.synthesis.todo-patch.sha256, src.synthesis.todo-patch.Error, src.synthesis.todo-patch.assertApproval, src.synthesis.todo-patch.ensureDir, src.synthesis.todo-patch.dirname\n\n### src.extractors.changelog.extractChangelog\n- **Calls**: src.extractors.changelog.resolve, src.extractors.changelog.pathExists, src.extractors.changelog.readText, src.extractors.changelog.relativePosix, src.extractors.changelog.split, src.extractors.changelog.match, src.extractors.changelog.trim, src.extractors.changelog.readListBlock\n\n### src.graph.diff.diffIntentGraphs\n- **Calls**: src.graph.diff.assertGraph, src.graph.diff.Map, src.graph.diff.map, src.graph.diff.has, src.graph.diff.push, src.graph.diff.groupRecords, src.graph.diff.Set, src.graph.diff.keys\n\n### php.ast_extract.parseFile\n- **Calls**: php.ast_extract.file_get_contents, php.ast_extract.RuntimeException, php.ast_extract.preg_split, php.ast_extract.token_get_all, php.ast_extract.foreach, php.ast_extract.normalizedToken, php.ast_extract.substr_count, php.ast_extract.defined\n\n### src.cli.handleCommunication\n- **Calls**: src.cli.resolve, src.cli.all, src.cli.extractCommunicationIntentAudited, src.cli.optionString, src.cli.optionNullableString, src.cli.optionLlmMode, src.cli.extractGitIntent, src.cli.optionNumber\n\n## Process Flows\n\nKey execution flows identified:\n\n### Flow 1: main\n```\nmain [sdk.python.examples.basic]\n```\n\n### Flow 2: compareWorkspaceIntent\n```\ncompareWorkspaceIntent [src.comparison.workspace]\n └─> git\n └─> execFileAsync\n```\n\n### Flow 3: temporaryParent\n```\ntemporaryParent [src.comparison.workspace]\n └─> git\n └─> execFileAsync\n```\n\n### Flow 4: baseWorktree\n```\nbaseWorktree [src.comparison.workspace]\n └─> git\n └─> execFileAsync\n```\n\n### Flow 5: extractTodo\n```\nextractTodo [src.extractors.todo]\n```\n\n### Flow 6: makefile\n```\nmakefile [scripts.verify-env-contract]\n```\n\n### Flow 7: extractCommunicationIntentAudited\n```\nextractCommunicationIntentAudited [src.communication.llm.implementation.CommunicationLlmRequiredError]\n```\n\n### Flow 8: extractNlIntentAudited\n```\nextractNlIntentAudited [src.extractors.nl-llm.NlLlmRequiredError]\n └─> assertNlExtractionOptions\n```\n\n### Flow 9: linkIntentRecords\n```\nlinkIntentRecords [src.graph.linker]\n```\n\n### Flow 10: baseUrl\n```\nbaseUrl [sdk.typescript.examples.basic]\n └─> health\n```\n\n## Key Classes\n\n### src.communication.intake-service.GovernedIntakeService\n- **Methods**: 82\n- **Key Methods**: src.communication.intake-service.GovernedIntakeService.command, src.communication.intake-service.GovernedIntakeService.duplicate, src.communication.intake-service.GovernedIntakeService.state, src.communication.intake-service.GovernedIntakeService.actor, src.communication.intake-service.GovernedIntakeService.event, src.communication.intake-service.GovernedIntakeService.appended, src.communication.intake-service.GovernedIntakeService.actual, src.communication.intake-service.GovernedIntakeService.updated, src.communication.intake-service.GovernedIntakeService.participantId, src.communication.intake-service.GovernedIntakeService.ticketId\n\n### src.communication.intake-contract.IntakeError\n- **Methods**: 76\n- **Key Methods**: src.communication.intake-contract.IntakeError.super, src.communication.intake-contract.IntakeError.payloadHash, src.communication.intake-contract.IntakeError.canonicalJson, src.communication.intake-contract.IntakeError.record, src.communication.intake-contract.IntakeError.assertIntakeEnvelope, src.communication.intake-contract.IntakeError.envelope, src.communication.intake-contract.IntakeError.validateIntakeEnvelopeHeader, src.communication.intake-contract.IntakeError.validateIntakeEnvelopeTimestamp, src.communication.intake-contract.IntakeError.assertCommand, src.communication.intake-contract.IntakeError.assertQuery\n\n### sdk.typescript.src.T2CClient\n- **Methods**: 46\n- **Key Methods**: sdk.typescript.src.T2CClient.health, sdk.typescript.src.T2CClient.agentCard, sdk.typescript.src.T2CClient.send, sdk.typescript.src.T2CClient.result, sdk.typescript.src.T2CClient.call, sdk.typescript.src.T2CClient.task, sdk.typescript.src.T2CClient.detail, sdk.typescript.src.T2CClient.part, sdk.typescript.src.T2CClient.getTask, sdk.typescript.src.T2CClient.cancelTask\n\n### src.semantic.reranker-llm.SemanticRerankerRequiredError\n- **Methods**: 43\n- **Key Methods**: src.semantic.reranker-llm.SemanticRerankerRequiredError.super, src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates, src.semantic.reranker-llm.SemanticRerankerRequiredError.assertSemanticCandidateSet, src.semantic.reranker-llm.SemanticRerankerRequiredError.validateCandidateSetSize, src.semantic.reranker-llm.SemanticRerankerRequiredError.model, src.semantic.reranker-llm.SemanticRerankerRequiredError.modelRevision, src.semantic.reranker-llm.SemanticRerankerRequiredError.cached, src.semantic.reranker-llm.SemanticRerankerRequiredError.client, src.semantic.reranker-llm.SemanticRerankerRequiredError.payload, src.semantic.reranker-llm.SemanticRerankerRequiredError.response\n\n### src.llm.structured-schema.StructuredResponseError\n- **Methods**: 37\n- **Key Methods**: src.llm.structured-schema.StructuredResponseError.super, src.llm.structured-schema.StructuredResponseError.schema, src.llm.structured-schema.StructuredResponseError.parse, src.llm.structured-schema.StructuredResponseError.string, src.llm.structured-schema.StructuredResponseError.pattern, src.llm.structured-schema.StructuredResponseError.fail, src.llm.structured-schema.StructuredResponseError.fail, src.llm.structured-schema.StructuredResponseError.nullableString, src.llm.structured-schema.StructuredResponseError.base, src.llm.structured-schema.StructuredResponseError.number\n\n### sdk.python.todo2code.client.T2CClient\n> Client for the todo2code A2A endpoint.\n\nExample:\n >>> client = T2CClient(\"http://localhost:8787\")\n- **Methods**: 34\n- **Key Methods**: sdk.python.todo2code.client.T2CClient.__init__, sdk.python.todo2code.client.T2CClient._headers, sdk.python.todo2code.client.T2CClient._open, sdk.python.todo2code.client.T2CClient._rpc, sdk.python.todo2code.client.T2CClient._get, sdk.python.todo2code.client.T2CClient.health, sdk.python.todo2code.client.T2CClient.agent_card, sdk.python.todo2code.client.T2CClient.send, sdk.python.todo2code.client.T2CClient.call, sdk.python.todo2code.client.T2CClient.compare_workspace\n\n### src.llm.openrouter.OpenRouterClient\n- **Methods**: 33\n- **Key Methods**: src.llm.openrouter.OpenRouterClient.isConfigured, src.llm.openrouter.OpenRouterClient.listAvailableModels, src.llm.openrouter.OpenRouterClient.controller, src.llm.openrouter.OpenRouterClient.timeout, src.llm.openrouter.OpenRouterClient.response, src.llm.openrouter.OpenRouterClient.text, src.llm.openrouter.OpenRouterClient.clearTimeout, src.llm.openrouter.OpenRouterClient.chatText, src.llm.openrouter.OpenRouterClient.chatTextWithMetadata, src.llm.openrouter.OpenRouterClient.response\n\n### src.extractors.nl-llm-helpers.NlAttemptError\n- **Methods**: 31\n- **Key Methods**: src.extractors.nl-llm-helpers.NlAttemptError.super, src.extractors.nl-llm-helpers.NlAttemptError.extractNlWithCorrection, src.extractors.nl-llm-helpers.NlAttemptError.completion, src.extractors.nl-llm-helpers.NlAttemptError.markDeterministicNlRecords, src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord, src.extractors.nl-llm-helpers.NlAttemptError.lines, src.extractors.nl-llm-helpers.NlAttemptError.action, src.extractors.nl-llm-helpers.NlAttemptError.normalizedText, src.extractors.nl-llm-helpers.NlAttemptError.statementText, src.extractors.nl-llm-helpers.NlAttemptError.nlStageAudit\n\n### src.extractors.markdown-llm-helpers.MarkdownAttemptError\n- **Methods**: 30\n- **Key Methods**: src.extractors.markdown-llm-helpers.MarkdownAttemptError.super, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichments, src.extractors.markdown-llm-helpers.MarkdownAttemptError.responseByRecord, src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes, src.extractors.markdown-llm-helpers.MarkdownAttemptError.corrected, src.extractors.markdown-llm-helpers.MarkdownAttemptError.failed, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment, src.extractors.markdown-llm-helpers.MarkdownAttemptError.metadata, src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering\n\n### src.extractors.docs-llm.DocumentationLlmRequiredError\n- **Methods**: 29\n- **Key Methods**: src.extractors.docs-llm.DocumentationLlmRequiredError.super, src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent, src.extractors.docs-llm.DocumentationLlmRequiredError.startedAt, src.extractors.docs-llm.DocumentationLlmRequiredError.client, src.extractors.docs-llm.DocumentationLlmRequiredError.requireConfiguredClient, src.extractors.docs-llm.DocumentationLlmRequiredError.cache, src.extractors.docs-llm.DocumentationLlmRequiredError.chunks, src.extractors.docs-llm.DocumentationLlmRequiredError.selectedChunks, src.extractors.docs-llm.DocumentationLlmRequiredError.systemPrompt, src.extractors.docs-llm.DocumentationLlmRequiredError.results\n\n### sdk.php.src.Client.Todo2Code.Client\n- **Methods**: 27\n- **Key Methods**: sdk.php.src.Client.Client.__construct, sdk.php.src.Client.Client.health, sdk.php.src.Client.Client.agentCard, sdk.php.src.Client.Client.send, sdk.php.src.Client.Client.call, sdk.php.src.Client.Client.rpc, sdk.php.src.Client.Client.extractAst, sdk.php.src.Client.Client.extractConfig, sdk.php.src.Client.Client.extractNl, sdk.php.src.Client.Client.extractDocs\n\n### java.JavaAstExtract.JavaAstExtract\n- **Methods**: 25\n- **Key Methods**: java.JavaAstExtract.JavaAstExtract.main, java.JavaAstExtract.JavaAstExtract.emit, java.JavaAstExtract.JavaAstExtract.parseFile, java.JavaAstExtract.JavaAstExtract.emit, java.JavaAstExtract.JavaAstExtract.collect, java.JavaAstExtract.JavaAstExtract.try, java.JavaAstExtract.JavaAstExtract.containsIgnored, java.JavaAstExtract.JavaAstExtract.try, java.JavaAstExtract.JavaAstExtract.Collector, java.JavaAstExtract.JavaAstExtract.add\n\n### src.synthesis.tasks-llm.TaskSynthesisAttemptError\n- **Methods**: 21\n- **Key Methods**: src.synthesis.tasks-llm.TaskSynthesisAttemptError.super, src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeTodoProposals, src.synthesis.tasks-llm.TaskSynthesisAttemptError.startedAt, src.synthesis.tasks-llm.TaskSynthesisAttemptError.assertConclusions, src.synthesis.tasks-llm.TaskSynthesisAttemptError.client, src.synthesis.tasks-llm.TaskSynthesisAttemptError.prompt, src.synthesis.tasks-llm.TaskSynthesisAttemptError.payload, src.synthesis.tasks-llm.TaskSynthesisAttemptError.failure, src.synthesis.tasks-llm.TaskSynthesisAttemptError.responses, src.synthesis.tasks-llm.TaskSynthesisAttemptError.synthesizeWithCorrection\n\n### src.summary.summarizer.SummaryAttemptError\n- **Methods**: 21\n- **Key Methods**: src.summary.summarizer.SummaryAttemptError.super, src.summary.summarizer.SummaryAttemptError.summarizeWithCorrection, src.summary.summarizer.SummaryAttemptError.conclusions, src.summary.summarizer.SummaryAttemptError.generationMetadata, src.summary.summarizer.SummaryAttemptError.message, src.summary.summarizer.SummaryAttemptError.materializeConclusions, src.summary.summarizer.SummaryAttemptError.parsed, src.summary.summarizer.SummaryAttemptError.conclusions, src.summary.summarizer.SummaryAttemptError.diagnosticIds, src.summary.summarizer.SummaryAttemptError.assertConclusions\n\n### src.extractors.nl-llm.NlLlmRequiredError\n- **Methods**: 19\n- **Key Methods**: src.extractors.nl-llm.NlLlmRequiredError.super, src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited, src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions, src.extractors.nl-llm.NlLlmRequiredError.startedAt, src.extractors.nl-llm.NlLlmRequiredError.result, src.extractors.nl-llm.NlLlmRequiredError.client, src.extractors.nl-llm.NlLlmRequiredError.absolute, src.extractors.nl-llm.NlLlmRequiredError.body, src.extractors.nl-llm.NlLlmRequiredError.sourcePath, src.extractors.nl-llm.NlLlmRequiredError.maxLine\n\n### src.communication.intake-store.IntakeEventStore\n- **Methods**: 19\n- **Key Methods**: src.communication.intake-store.IntakeEventStore.read, src.communication.intake-store.IntakeEventStore.names, src.communication.intake-store.IntakeEventStore.name, src.communication.intake-store.IntakeEventStore.eventPath, src.communication.intake-store.IntakeEventStore.stat, src.communication.intake-store.IntakeEventStore.event, src.communication.intake-store.IntakeEventStore.lockPath, src.communication.intake-store.IntakeEventStore.stream, src.communication.intake-store.IntakeEventStore.existing, src.communication.intake-store.IntakeEventStore.writeRegistry\n\n### src.sdk.typescript.Todo2CodeClient\n- **Methods**: 16\n- **Key Methods**: src.sdk.typescript.Todo2CodeClient.a2a, src.sdk.typescript.Todo2CodeClient.health, src.sdk.typescript.Todo2CodeClient.diffGraphs, src.sdk.typescript.Todo2CodeClient.diffGraphFiles, src.sdk.typescript.Todo2CodeClient.compareWorkspace, src.sdk.typescript.Todo2CodeClient.proposeTodo, src.sdk.typescript.Todo2CodeClient.renderTodo, src.sdk.typescript.Todo2CodeClient.applyTodo, src.sdk.typescript.Todo2CodeClient.proposeCodeChange, src.sdk.typescript.Todo2CodeClient.renderCodeChange\n\n### src.communication.llm.implementation.CommunicationLlmRequiredError\n- **Methods**: 15\n- **Key Methods**: src.communication.llm.implementation.CommunicationLlmRequiredError.super, src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited, src.communication.llm.implementation.CommunicationLlmRequiredError.startedAt, src.communication.llm.implementation.CommunicationLlmRequiredError.deterministic, src.communication.llm.implementation.CommunicationLlmRequiredError.records, src.communication.llm.implementation.CommunicationLlmRequiredError.client, src.communication.llm.implementation.CommunicationLlmRequiredError.groups, src.communication.llm.implementation.CommunicationLlmRequiredError.response, src.communication.llm.implementation.CommunicationLlmRequiredError.enrichments, src.communication.llm.implementation.CommunicationLlmRequiredError.enrichedByOriginal\n\n### src.core.content-cache.ContentCache\n- **Methods**: 13\n- **Key Methods**: src.core.content-cache.ContentCache.getOrCompute, src.core.content-cache.ContentCache.assertNamespace, src.core.content-cache.ContentCache.key, src.core.content-cache.ContentCache.filePath, src.core.content-cache.ContentCache.cached, src.core.content-cache.ContentCache.value, src.core.content-cache.ContentCache.snapshot, src.core.content-cache.ContentCache.envelope, src.core.content-cache.ContentCache.write, src.core.content-cache.ContentCache.directory\n\n### python.ast_extract.FactVisitor\n- **Methods**: 13\n- **Key Methods**: python.ast_extract.FactVisitor.__init__, python.ast_extract.FactVisitor.excerpt, python.ast_extract.FactVisitor.add, python.ast_extract.FactVisitor.visit_Import, python.ast_extract.FactVisitor.visit_ImportFrom, python.ast_extract.FactVisitor.visit_FunctionDef, python.ast_extract.FactVisitor.visit_AsyncFunctionDef, python.ast_extract.FactVisitor.visit_ClassDef, python.ast_extract.FactVisitor.add_named_constant, python.ast_extract.FactVisitor.visit_Assign\n- **Inherits**: ast.NodeVisitor\n\n## Data Transformation Functions\n\nKey functions that process and transform data:\n\n### examples.backend.src.request-handlers.parseOffset\n- **Output to**: examples.backend.src.request-handlers.Number, examples.backend.src.request-handlers.isFinite\n\n### examples.backend.src.request-handlers.parsed\n\n### examples.backend.src.request-handlers.parseLimit\n- **Output to**: examples.backend.src.request-handlers.Number, examples.backend.src.request-handlers.isFinite\n\n### examples.backend.src.validation.validateEventPayload\n- **Output to**: examples.backend.src.validation.isArray, examples.backend.src.validation.invalid, examples.backend.src.validation.trim, examples.backend.src.validation.has, examples.backend.src.validation.join\n\n### examples.src.runtime.validateContract\n- **Output to**: examples.src.runtime.Error\n\n### java.JavaAstExtract.JavaAstExtract.parseFile\n\n### src.cli.parsed\n- **Output to**: src.cli.has, src.cli.printHelp\n\n### src.cli.formatWatchEvent\n- **Output to**: src.cli.Date, src.cli.toISOString, src.cli.file, src.cli.join, src.cli.change\n\n### src.cli.parseDiffMode\n- **Output to**: src.cli.optionString, src.cli.toLowerCase, src.cli.Error\n\n### src.cli.parseArgs\n- **Output to**: src.cli.push, src.cli.slice, src.cli.startsWith, src.cli.split, src.cli.set\n\n### src.extractors.runtime-cycle.parseCycle\n- **Output to**: src.extractors.runtime-cycle.parse, src.extractors.runtime-cycle.Error, src.extractors.runtime-cycle.JSON, src.extractors.runtime-cycle.String, src.extractors.runtime-cycle.isArray\n\n### src.extractors.configuration.format\n- **Output to**: src.extractors.configuration.buildRecord, src.extractors.configuration.join, src.extractors.configuration.trim\n\n### src.extractors.configuration.configurationFormat\n- **Output to**: src.extractors.configuration.basename, src.extractors.configuration.toLowerCase, src.extractors.configuration.startsWith, src.extractors.configuration.endsWith\n\n### src.extractors.configuration.parsed\n- **Output to**: src.extractors.configuration.keys, src.extractors.configuration.sort, src.extractors.configuration.map, src.extractors.configuration.findKeyLine\n\n### src.extractors.docs-deterministic.convertDocument\n- **Output to**: src.extractors.docs-deterministic.relativePosix, src.extractors.docs-deterministic.split, src.extractors.docs-deterministic.handleDocumentationLine, src.extractors.docs-deterministic.push\n\n### src.extractors.docs-deterministic.parseFenceBlock\n- **Output to**: src.extractors.docs-deterministic.match, src.extractors.docs-deterministic.trim, src.extractors.docs-deterministic.codeBlockRecord, src.extractors.docs-deterministic.startsWith, src.extractors.docs-deterministic.slice\n\n### src.extractors.docs-deterministic.parseSectionHeading\n- **Output to**: src.extractors.docs-deterministic.match, src.extractors.docs-deterministic.trim, src.extractors.docs-deterministic.splice, src.extractors.docs-deterministic.statementRecord\n\n### src.extractors.docs-deterministic.parseBulletStatement\n- **Output to**: src.extractors.docs-deterministic.match, src.extractors.docs-deterministic.readListBlock, src.extractors.docs-deterministic.qualifyingStatement\n\n### src.extractors.docs-deterministic.parseParagraphStatement\n- **Output to**: src.extractors.docs-deterministic.trim, src.extractors.docs-deterministic.readParagraph, src.extractors.docs-deterministic.qualifyingStatement\n\n### src.extractors.markdown-llm-helpers.MarkdownAttemptError.validateEnrichments\n- **Output to**: src.extractors.markdown-llm-helpers.isArray, src.extractors.markdown-llm-helpers.Error, src.extractors.markdown-llm-helpers.Set, src.extractors.markdown-llm-helpers.map, src.extractors.markdown-llm-helpers.has\n\n### src.extractors.communication-helpers.parseEnvelope\n- **Output to**: src.extractors.communication-helpers.split, src.extractors.communication-helpers.trim, src.extractors.communication-helpers.slice, src.extractors.communication-helpers.findIndex, src.extractors.communication-helpers.match\n\n### src.extractors.communication-helpers.parsed\n\n### src.extractors.git.processDiscoveryDirectory\n- **Output to**: src.extractors.git.join, src.extractors.git.resolveDiscoveryPrefix, src.extractors.git.gitMarkerState, src.extractors.git.push, src.extractors.git.registerDiscoveredRepository\n\n### src.extractors.ast.external.parsed\n- **Output to**: src.extractors.ast.external.adapterRecords\n\n### src.services.actions.parseCommunicationGraphFilter\n- **Output to**: src.services.actions.stringValue, src.services.actions.toLowerCase, src.services.actions.booleanValue\n\n## Behavioral Patterns\n\n### recursion_dotted_name\n- **Type**: recursion\n- **Confidence**: 0.90\n- **Functions**: python.ast_extract.dotted_name\n\n### state_machine_GovernedIntakeService\n- **Type**: state_machine\n- **Confidence**: 0.70\n- **Functions**: src.communication.intake-service.GovernedIntakeService.command, src.communication.intake-service.GovernedIntakeService.duplicate, src.communication.intake-service.GovernedIntakeService.state, src.communication.intake-service.GovernedIntakeService.actor, src.communication.intake-service.GovernedIntakeService.event\n\n## Public API Surface\n\nFunctions exposed as public API (no underscore prefix):\n\n- `sdk.python.examples.basic.main` - 62 calls\n- `scripts.research.rank-intent-graph-embeddings.main` - 43 calls\n- `src.comparison.workspace.compareWorkspaceIntent` - 40 calls\n- `sdk.rust.src.client.parse_http_response` - 37 calls\n- `sdk.rust.examples.basic.run` - 33 calls\n- `src.pipeline.run.executePipeline` - 31 calls\n- `scripts.research.evaluate-embedding-pairs.main` - 30 calls\n- `src.interfaces.intake_cli.main` - 29 calls\n- `src.comparison.workspace.temporaryParent` - 25 calls\n- `src.comparison.workspace.baseWorktree` - 25 calls\n- `sdk.go.examples.basic.main.run` - 25 calls\n- `src.extractors.todo.extractTodo` - 24 calls\n- `src.interfaces.a2a-message-command.looksLikeJson` - 24 calls\n- `scripts.verify-env-contract.makefile` - 24 calls\n- `python.ast_extract.main` - 24 calls\n- `src.communication.llm.implementation.CommunicationLlmRequiredError.extractCommunicationIntentAudited` - 23 calls\n- `src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited` - 22 calls\n- `src.graph.linker.linkIntentRecords` - 22 calls\n- `scripts.live-model-comparison.main` - 22 calls\n- `rust-ast.src.main.main` - 21 calls\n- `src.extractors.git.extractRepositoryGitIntent` - 21 calls\n- `python.ast_extract.iter_python_files` - 21 calls\n- `sdk.typescript.examples.basic.baseUrl` - 21 calls\n- `sdk.typescript.examples.basic.token` - 21 calls\n- `sdk.typescript.examples.basic.root` - 21 calls\n- `sdk.typescript.examples.basic.main` - 21 calls\n- `sdk.python.todo2code.runtime.TypeScriptRuntime.reality` - 21 calls\n- `rust-ast.src.main.collect_files` - 20 calls\n- `src.extractors.nl.extractNlIntent` - 20 calls\n- `src.extractors.ast.extractAstIntent` - 20 calls\n- `src.extractors.todo.body` - 20 calls\n- `src.extractors.todo.relative` - 20 calls\n- `src.extractors.todo.lines` - 20 calls\n- `src.synthesis.todo-patch.createTodoPatch` - 20 calls\n- `src.synthesis.todo-patch.applyTodoPatch` - 20 calls\n- `src.communication.intake-service.GovernedIntakeService.validateProjection` - 20 calls\n- `src.extractors.changelog.extractChangelog` - 19 calls\n- `src.graph.diff.diffIntentGraphs` - 19 calls\n- `php.ast_extract.parseFile` - 19 calls\n- `src.cli.handleCommunication` - 18 calls\n\n## System Interactions\n\nHow components interact:\n\n```mermaid\ngraph TD\n main --> get\n main --> T2CClient\n main --> print\n main --> parse_args\n main --> read_bytes\n main --> loads\n main --> sorted\n compareWorkspaceInte --> resolve\n compareWorkspaceInte --> git\n compareWorkspaceInte --> trim\n compareWorkspaceInte --> relative\n compareWorkspaceInte --> startsWith\n main --> list\n main --> monotonic\n main --> SentenceTransformer\n main --> ArgumentParser\n main --> add_subparsers\n main --> add_parser\n main --> add_argument\n temporaryParent --> git\n temporaryParent --> join\n temporaryParent --> commonPipelineOption\n temporaryParent --> optionsForRoot\n temporaryParent --> runPipeline\n baseWorktree --> git\n baseWorktree --> join\n baseWorktree --> commonPipelineOption\n baseWorktree --> optionsForRoot\n baseWorktree --> runPipeline\n extractTodo --> resolve\n```\n\n## Reverse Engineering Guidelines\n\n1. **Entry Points**: Start analysis from the entry points listed above\n2. **Core Logic**: Focus on classes with many methods\n3. **Data Flow**: Follow data transformation functions\n4. **Process Flows**: Use the flow diagrams for execution paths\n5. **API Surface**: Public API functions reveal the interface\n\n## Context for LLM\n\nMaintain the identified architectural patterns and public API surface when suggesting changes.", "is_subdir": false}, {"name": "calls.mmd", "rel_path": "calls.mmd", "path": "calls.mmd", "size": "71.1KB", "icon": "πŸ“ˆ", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart LR\n%% generated in 0.04s\n subgraph examples__backend\n examples__backend__src__request_handlers__handleHealth["handleHealth"]\n examples__backend__src__validation__agent["agent"]\n examples__backend__src__request_handlers__size["size"]\n examples__backend__src__server__createBackend["createBackend"]\n examples__backend__src__request_handlers__handleEventList["handleEventList"]\n examples__backend__src__request_handlers__handleRequest["handleRequest"]\n examples__backend__src__validation__invalid["invalid"]\n examples__backend__src__server__sendJson["sendJson"]\n examples__backend__src__request_handlers__handleEventPublish["handleEventPublish"]\n examples__backend__src__request_handlers__parseOffset["parseOffset"]\n examples__backend__src__validation__record["record"]\n examples__backend__src__request_handlers__event["event"]\n examples__backend__src__request_handlers__parseLimit["parseLimit"]\n examples__backend__src__request_handlers__validation["validation"]\n examples__backend__src__server__startBackend["startBackend"]\n examples__backend__src__server__store["store"]\n examples__backend__src__request_handlers__readBody["readBody"]\n examples__backend__src__request_handlers__sendJson["sendJson"]\n examples__backend__src__validation__ALLOWED_ACTIONS["ALLOWED_ACTIONS"]\n examples__backend__src__validation__validateEventPayload["validateEventPayload"]\n examples__backend__src__validation__action["action"]\n examples__backend__src__request_handlers__MAX_BODY_BYTES["MAX_BODY_BYTES"]\n examples__backend__src__server__server["server"]\n examples__backend__src__validation__object["object"]\n end\n subgraph examples__frontend\n examples__frontend__src__app__state["state"]\n examples__frontend__src__render__renderTable["renderTable"]\n examples__frontend__src__app__refresh["refresh"]\n examples__frontend__src__render__headerRow["headerRow"]\n examples__frontend__src__app__mountPanel["mountPanel"]\n examples__frontend__src__app__reload["reload"]\n examples__frontend__src__render__classifyEvent["classifyEvent"]\n examples__frontend__src__render__toRows["toRows"]\n examples__frontend__src__app__createState["createState"]\n end\n subgraph examples__src\n examples__src__runtime__executeContract["executeContract"]\n examples__src__runtime__validateContract["validateContract"]\n end\n subgraph java__JavaAstExtract\n java__JavaAstExtract__JavaAstExtract__slash["slash"]\n java__JavaAstExtract__JavaAstExtract__collect["collect"]\n java__JavaAstExtract__JavaAstExtract__json["json"]\n java__JavaAstExtract__JavaAstExtract__map["map"]\n java__JavaAstExtract__JavaAstExtract__try["try"]\n java__JavaAstExtract__JavaAstExtract__containsIgnored["containsIgnored"]\n java__JavaAstExtract__JavaAstExtract__escape["escape"]\n java__JavaAstExtract__JavaAstExtract__add["add"]\n java__JavaAstExtract__JavaAstExtract__emit["emit"]\n java__JavaAstExtract__JavaAstExtract__main["main"]\n end\n subgraph rust_ast__src\n rust_ast__src__main__visit_item_use["visit_item_use"]\n rust_ast__src__main__visit_impl_item_fn["visit_impl_item_fn"]\n rust_ast__src__main__visit_item_static["visit_item_static"]\n rust_ast__src__main__visit_item_const["visit_item_const"]\n rust_ast__src__main__add["add"]\n rust_ast__src__main__visit_item_mod["visit_item_mod"]\n rust_ast__src__main__visit_item_fn["visit_item_fn"]\n rust_ast__src__main__qualified["qualified"]\n rust_ast__src__main__modifiers["modifiers"]\n rust_ast__src__main__visit_item_type["visit_item_type"]\n rust_ast__src__main__visit_item_enum["visit_item_enum"]\n rust_ast__src__main__slash["slash"]\n rust_ast__src__main__visit_expr_call["visit_expr_call"]\n rust_ast__src__main__visit_item_trait["visit_item_trait"]\n rust_ast__src__main__excerpt["excerpt"]\n rust_ast__src__main__main["main"]\n rust_ast__src__main__type_item["type_item"]\n rust_ast__src__main__collect_files["collect_files"]\n rust_ast__src__main__visit_expr_method_call["visit_expr_method_call"]\n rust_ast__src__main__arguments["arguments"]\n rust_ast__src__main__visit_item_struct["visit_item_struct"]\n end\n subgraph src__cli\n src__cli__main["main"]\n src__cli__svg["svg"]\n src__cli__handleExtractAst["handleExtractAst"]\n src__cli__handleDiagnose["handleDiagnose"]\n src__cli__handleExtract["handleExtract"]\n src__cli__result["result"]\n src__cli__taskFile["taskFile"]\n src__cli__handleCommunication["handleCommunication"]\n src__cli__isPlanSet["isPlanSet"]\n src__cli__doctor["doctor"]\n src__cli__handleLink["handleLink"]\n src__cli__emitExtraction["emitExtraction"]\n src__cli__parseArgs["parseArgs"]\n src__cli__handleDiff["handleDiff"]\n src__cli__optionTaskMode["optionTaskMode"]\n src__cli__handleCompareWorkspace["handleCompareWorkspace"]\n src__cli__handleEvaluateCodeChange["handleEvaluateCodeChange"]\n src__cli__handleWatch["handleWatch"]\n src__cli__handleExtractCommunication["handleExtractCommunication"]\n src__cli__handleGraphDiff["handleGraphDiff"]\n src__cli__emitJson["emitJson"]\n src__cli__view["view"]\n src__cli__controller["controller"]\n src__cli__handleApplySourcePatch["handleApplySourcePatch"]\n src__cli__buildDiffPayload["buildDiffPayload"]\n src__cli__context["context"]\n src__cli__handleRenderTodo["handleRenderTodo"]\n src__cli__handleExtractDocs["handleExtractDocs"]\n src__cli__printHelp["printHelp"]\n src__cli__optionNullableString["optionNullableString"]\n src__cli__optionPipelineTaskMode["optionPipelineTaskMode"]\n src__cli__handleReality["handleReality"]\n src__cli__optionString["optionString"]\n src__cli__handleProposeTodo["handleProposeTodo"]\n src__cli__resolveMainCommand["resolveMainCommand"]\n src__cli__handleExtractConfig["handleExtractConfig"]\n src__cli__buildCommonPipelineOptions["buildCommonPipelineOptions"]\n src__cli__diff["diff"]\n src__cli__optionNumber["optionNumber"]\n src__cli__handler["handler"]\n src__cli__resolvePipelineRoot["resolvePipelineRoot"]\n src__cli__root["root"]\n src__cli__handleIntake["handleIntake"]\n src__cli__handleProposeSourcePatch["handleProposeSourcePatch"]\n src__cli__handleProposeCodeChange["handleProposeCodeChange"]\n src__cli__optionNlMode["optionNlMode"]\n src__cli__commandHandlers["commandHandlers"]\n src__cli__execFileAsync["execFileAsync"]\n src__cli__optionList["optionList"]\n src__cli__handleExtractGit["handleExtractGit"]\n src__cli__handleExtractNl["handleExtractNl"]\n src__cli__command["command"]\n src__cli__formatWatchEvent["formatWatchEvent"]\n src__cli__diagnosticsPath["diagnosticsPath"]\n src__cli__handleRenderCodeChange["handleRenderCodeChange"]\n src__cli__handleSummarize["handleSummarize"]\n src__cli__reportPipelineDegradation["reportPipelineDegradation"]\n src__cli__file["file"]\n src__cli__handleExtractMarkdown["handleExtractMarkdown"]\n src__cli__pipeline["pipeline"]\n src__cli__buildWorkspaceComparisonOptions["buildWorkspaceComparisonOption"]\n src__cli__handleExtractRuntime["handleExtractRuntime"]\n src__cli__absolute["absolute"]\n src__cli__resolveWatchTaskFile["resolveWatchTaskFile"]\n src__cli__diagnostics["diagnostics"]\n src__cli__parsed["parsed"]\n src__cli__initProject["initProject"]\n src__cli__invokedPath["invokedPath"]\n src__cli__handleCloseCodeChange["handleCloseCodeChange"]\n src__cli__buildGitDiff["buildGitDiff"]\n src__cli__stop["stop"]\n src__cli__handleApplyTodo["handleApplyTodo"]\n src__cli__optionBoolean["optionBoolean"]\n src__cli__optionLlmMode["optionLlmMode"]\n src__cli__parseDiffMode["parseDiffMode"]\n src__cli__stamp["stamp"]\n src__cli__optionSummaryMode["optionSummaryMode"]\n src__cli__buildFileDiff["buildFileDiff"]\n src__cli__handlePipeline["handlePipeline"]\n src__cli__buildPipelineOptions["buildPipelineOptions"]\n end\n subgraph src__extractors\n src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage["errorMessage"]\n src__extractors__nl__absolute["absolute"]\n src__extractors__markdown_paths__addBasenameIndexMatch["addBasenameIndexMatch"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract["markdownResponseContract"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichment["enrichment"]\n src__extractors__git__extractChangedSymbols["extractChangedSymbols"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent["extractDocumentationIntent"]\n src__extractors__nl__confidence["confidence"]\n src__extractors__runtime_cycle__sourcePathFor["sourcePathFor"]\n src__extractors__docs_deterministic__primePathMapper["primePathMapper"]\n src__extractors__markdown_paths__buildBasenameIndex["buildBasenameIndex"]\n src__extractors__docs_chunks__sectionText["sectionText"]\n src__extractors__docs_deterministic__heading["heading"]\n src__extractors__communication_helpers__nestedRoleIndex["nestedRoleIndex"]\n src__extractors__ast__isIntentRecords["isIntentRecords"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownRecords["enrichMarkdownRecords"]\n src__extractors__todo__body["body"]\n src__extractors__communication_file_helpers__buildLocalWarnings["buildLocalWarnings"]\n src__extractors__runtime_cycle__MAX_PER_SECTION["MAX_PER_SECTION"]\n src__extractors__markdown_paths__createMarkdownPathResolver["createMarkdownPathResolver"]\n src__extractors__docs_deterministic__parseBulletStatement["parseBulletStatement"]\n src__extractors__docs_record__anchorToSource["anchorToSource"]\n src__extractors__docs_record__allowedAction["allowedAction"]\n src__extractors__communication_helpers__listValue["listValue"]\n src__extractors__todo__resolvedPaths["resolvedPaths"]\n src__extractors__communication_file_helpers__appendRegistryAlignmentWarnings["appendRegistryAlignmentWarning"]\n src__extractors__markdown_llm__MarkdownLlmRequiredError__client["client"]\n src__extractors__runtime_cycle__proposalAction["proposalAction"]\n src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited["extractNlIntentAudited"]\n src__extractors__docs_deterministic__qualifyingStatement["qualifyingStatement"]\n src__extractors__runtime_cycle__results["results"]\n src__extractors__docs_deterministic__resolver["resolver"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks["loadDocumentChunks"]\n src__extractors__docs_schema__documentRecord["documentRecord"]\n src__extractors__configuration__uniqueEntries["uniqueEntries"]\n src__extractors__runtime_cycle__tags["tags"]\n src__extractors__nl_llm_helpers__NlAttemptError__action["action"]\n src__extractors__git__resolveDiscoveryPrefix["resolveDiscoveryPrefix"]\n src__extractors__docs_record__hasTarget["hasTarget"]\n src__extractors__configuration__yamlOrAssignmentEntries["yamlOrAssignmentEntries"]\n src__extractors__docs_deterministic__extractDocumentationBaseline["extractDocumentationBaseline"]\n src__extractors__configuration__entry["entry"]\n src__extractors__todo__match["match"]\n src__extractors__docs_chunks__workerCount["workerCount"]\n src__extractors__git__registerDiscoveredRepository["registerDiscoveredRepository"]\n src__extractors__communication_helpers__match["match"]\n src__extractors__todo__checked["checked"]\n src__extractors__ast__records__moduleRecords["moduleRecords"]\n src__extractors__runtime_cycle__proposalRecord["proposalRecord"]\n src__extractors__runtime_cycle__factsMetadata["factsMetadata"]\n src__extractors__git__extractGitIntent["extractGitIntent"]\n src__extractors__docs_schema__target["target"]\n src__extractors__nl__object["object"]\n src__extractors__communication_helpers__heading["heading"]\n src__extractors__configuration__bounded["bounded"]\n src__extractors__ast__external__execFileAsync["execFileAsync"]\n src__extractors__communication_file_helpers__hasExplicitEnvelopeMetadata["hasExplicitEnvelopeMetadata"]\n src__extractors__nl_llm__NlLlmRequiredError__client["client"]\n src__extractors__git__root["root"]\n src__extractors__runtime_cycle__violationRecord["violationRecord"]\n src__extractors__todo__text["text"]\n src__extractors__communication_helpers__inferGovernanceIdentityFromFilename["inferGovernanceIdentityFromFil"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch["enrichSplitBatch"]\n src__extractors__configuration__tomlEntries["tomlEntries"]\n src__extractors__ast__records__adapterRecords["adapterRecords"]\n src__extractors__communication_helpers__raw["raw"]\n src__extractors__markdown_paths__basenames["basenames"]\n src__extractors__changelog__relative["relative"]\n src__extractors__git__readStats["readStats"]\n src__extractors__runtime_cycle__jsonScalar["jsonScalar"]\n src__extractors__docs_deterministic__match["match"]\n src__extractors__docs_record__OBJECT_PLACEHOLDERS["OBJECT_PLACEHOLDERS"]\n src__extractors__git__runGit["runGit"]\n src__extractors__git__readCommits["readCommits"]\n src__extractors__markdown_paths__headingScopes["headingScopes"]\n src__extractors__ast__isExtractionResult["isExtractionResult"]\n src__extractors__markdown_paths__index["index"]\n src__extractors__communication_file_helpers__envelope["envelope"]\n src__extractors__nl_llm_helpers__NlAttemptError__NL_RECORD_CONTRACT["NL_RECORD_CONTRACT"]\n src__extractors__todo__block["block"]\n src__extractors__nl_llm_helpers__NlAttemptError__resolveAction["resolveAction"]\n src__extractors__configuration__lines["lines"]\n src__extractors__docs_chunks__markdownSections["markdownSections"]\n src__extractors__markdown_paths__readBasenameDirectoryEntries["readBasenameDirectoryEntries"]\n src__extractors__git__extractRepositoryGitIntent["extractRepositoryGitIntent"]\n src__extractors__todo__raw["raw"]\n src__extractors__runtime_cycle__text["text"]\n src__extractors__communication_helpers__basename["basename"]\n src__extractors__git__filterDiscoveryChildren["filterDiscoveryChildren"]\n src__extractors__configuration__parsed["parsed"]\n src__extractors__docs_schema__documentResponseSchema["documentResponseSchema"]\n src__extractors__configuration__isConfigurationPath["isConfigurationPath"]\n src__extractors__docs_record__resolveAction["resolveAction"]\n src__extractors__nl_llm_helpers__NlAttemptError__resolveModality["resolveModality"]\n src__extractors__git__readChangedFiles["readChangedFiles"]\n src__extractors__docs_record__modality["modality"]\n src__extractors__git__processDiscoveryDirectory["processDiscoveryDirectory"]\n src__extractors__docs_deterministic__parseParagraphStatement["parseParagraphStatement"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__selectWithinBudget["selectWithinBudget"]\n src__extractors__communication_helpers__item["item"]\n src__extractors__docs_deterministic__parseFenceBlock["parseFenceBlock"]\n src__extractors__configuration__fileAggregate["fileAggregate"]\n src__extractors__nl_llm_helpers__NlAttemptError__clampLine["clampLine"]\n src__extractors__markdown_paths__createBasenameIndexState["createBasenameIndexState"]\n src__extractors__nl__sourcePath["sourcePath"]\n src__extractors__git__readDiscoveryEntries["readDiscoveryEntries"]\n src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText["nonEmptyText"]\n src__extractors__git__mapWithConcurrency["mapWithConcurrency"]\n src__extractors__docs_chunks__prioritizeDocumentChunks["prioritizeDocumentChunks"]\n src__extractors__nl__assertNlExtractionOptions["assertNlExtractionOptions"]\n src__extractors__nl_llm_helpers__NlAttemptError__NL_ACTION_SET["NL_ACTION_SET"]\n src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow["fallbackOrThrow"]\n src__extractors__configuration__pair["pair"]\n src__extractors__nl__action["action"]\n src__extractors__docs_deterministic__action["action"]\n src__extractors__runtime_cycle__extractRuntimeCycleIntent["extractRuntimeCycleIntent"]\n src__extractors__configuration__jsonEntries["jsonEntries"]\n src__extractors__nl_llm_helpers__NlAttemptError__statementText["statementText"]\n src__extractors__runtime_cycle__watched["watched"]\n src__extractors__docs_record__fallback["fallback"]\n src__extractors__communication_helpers__fileParts["fileParts"]\n src__extractors__changelog__extractChangelog["extractChangelog"]\n src__extractors__nl_llm_helpers__NlAttemptError__allowedAction["allowedAction"]\n src__extractors__docs_chunks__needles["needles"]\n src__extractors__docs_chunks__chunkPriority["chunkPriority"]\n src__extractors__configuration__heading["heading"]\n src__extractors__git__count["count"]\n src__extractors__nl__extractNlIntent["extractNlIntent"]\n src__extractors__communication_file_helpers__appendIdentityWarnings["appendIdentityWarnings"]\n src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder["isPlaceholder"]\n src__extractors__nl_llm_helpers__NlAttemptError__NL_MODALITY_SET["NL_MODALITY_SET"]\n src__extractors__communication_helpers__nestedParticipant["nestedParticipant"]\n src__extractors__docs_deterministic__codeBlockRecord["codeBlockRecord"]\n src__extractors__nl_llm_helpers__NlAttemptError__resolveObject["resolveObject"]\n src__extractors__docs_deterministic__handleDocumentationLine["handleDocumentationLine"]\n src__extractors__docs_chunks__sectionLines["sectionLines"]\n src__extractors__configuration__relative["relative"]\n src__extractors__communication_helpers__nestedRole["nestedRole"]\n src__extractors__docs_chunks__takeLineBatch["takeLineBatch"]\n src__extractors__configuration__match["match"]\n src__extractors__changelog__lines["lines"]\n src__extractors__docs_record__isPlaceholder["isPlaceholder"]\n src__extractors__docs_record__allowedLifecycle["allowedLifecycle"]\n src__extractors__nl_llm_helpers__NlAttemptError__nlStrings["nlStrings"]\n src__extractors__markdown_paths__isRepositoryPath["isRepositoryPath"]\n src__extractors__git__result["result"]\n src__extractors__todo__lines["lines"]\n src__extractors__communication_helpers__normalize["normalize"]\n src__extractors__git__execFileAsync["execFileAsync"]\n src__extractors__configuration__extractConfigurationIntent["extractConfigurationIntent"]\n src__extractors__docs_deterministic__statementRecord["statementRecord"]\n src__extractors__docs_deterministic__root["root"]\n src__extractors__markdown_paths__repositoryRoot["repositoryRoot"]\n src__extractors__nl__detectMissingFields["detectMissingFields"]\n src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord["toIntentRecord"]\n src__extractors__ast__external__result["result"]\n src__extractors__todo__extractTodo["extractTodo"]\n src__extractors__communication_helpers__parseEnvelope["parseEnvelope"]\n src__extractors__docs_record__resolveModality["resolveModality"]\n src__extractors__todo__task["task"]\n src__extractors__communication_helpers__inferIdentityFromPathAndFilename["inferIdentityFromPathAndFilena"]\n src__extractors__docs_deterministic__targetsOf["targetsOf"]\n src__extractors__markdown_paths__isNestedCheckout["isNestedCheckout"]\n src__extractors__communication_helpers__unquote["unquote"]\n src__extractors__docs_chunks__item["item"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__outcomes["outcomes"]\n src__extractors__markdown_paths__scanDirectoryForBasenames["scanDirectoryForBasenames"]\n src__extractors__docs_deterministic__convertDocument["convertDocument"]\n src__extractors__ast__external__runExternalAstAdapter["runExternalAstAdapter"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk["extractChunk"]\n src__extractors__docs_schema__strings["strings"]\n src__extractors__runtime_cycle__label["label"]\n src__extractors__todo__extractExplicitId["extractExplicitId"]\n src__extractors__nl_llm_helpers__NlAttemptError__normalizedText["normalizedText"]\n src__extractors__communication_helpers__sameStrings["sameStrings"]\n src__extractors__communication_file_helpers__appendTimestampWarnings["appendTimestampWarnings"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__requireConfiguredClient["requireConfiguredClient"]\n src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt["sourceExcerpt"]\n src__extractors__docs_deterministic__parseSectionHeading["parseSectionHeading"]\n src__extractors__communication_helpers__inferIdentity["inferIdentity"]\n src__extractors__git__takeNextDiscoveryDirectory["takeNextDiscoveryDirectory"]\n src__extractors__communication_helpers__isTicketEvidenceFile["isTicketEvidenceFile"]\n src__extractors__markdown_paths__headingDirectories["headingDirectories"]\n src__extractors__communication_file_helpers__appendA2aAgentWarnings["appendA2aAgentWarnings"]\n src__extractors__todo__inferOwner["inferOwner"]\n src__extractors__runtime_cycle__probeRecord["probeRecord"]\n src__extractors__docs_record__target["target"]\n src__extractors__git__createDiscoveryState["createDiscoveryState"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering["enrichBatchCovering"]\n src__extractors__docs_chunks__worker["worker"]\n src__extractors__nl_llm__NlLlmRequiredError__assertNlExtractionOptions["assertNlExtractionOptions"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__files["files"]\n src__extractors__markdown_llm__MarkdownLlmRequiredError__extractMarkdownIntentAudited["extractMarkdownIntentAudited"]\n src__extractors__git__gitMarkerState["gitMarkerState"]\n src__extractors__runtime_cycle__parseCycle["parseCycle"]\n src__extractors__communication_file_helpers__shouldSkipCommunicationFile["shouldSkipCommunicationFile"]\n src__extractors__configuration__dockerEntries["dockerEntries"]\n src__extractors__git__isGitWorkTree["isGitWorkTree"]\n src__extractors__communication_helpers__communicationSegments["communicationSegments"]\n src__extractors__changelog__body["body"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownBatchWithCorrection["enrichMarkdownBatchWithCorrect"]\n src__extractors__configuration__configurationFormat["configurationFormat"]\n src__extractors__docs_deterministic__marker["marker"]\n src__extractors__configuration__findKeyLine["findKeyLine"]\n src__extractors__communication_file_helpers__inferred["inferred"]\n src__extractors__todo__heading["heading"]\n src__extractors__docs_chunks__flush["flush"]\n src__extractors__communication_helpers__isCommunicationType["isCommunicationType"]\n src__extractors__communication_helpers__normalizeType["normalizeType"]\n src__extractors__configuration__files["files"]\n src__extractors__docs_deterministic__readParagraph["readParagraph"]\n src__extractors__docs_record__linesFromChunk["linesFromChunk"]\n src__extractors__nl__inferActor["inferActor"]\n src__extractors__docs_record__action["action"]\n src__extractors__docs_record__clampLine["clampLine"]\n src__extractors__runtime_cycle__boundedArray["boundedArray"]\n src__extractors__docs_chunks__splitLongSection["splitLongSection"]\n src__extractors__todo__classified["classified"]\n src__extractors__git__state["state"]\n src__extractors__runtime_cycle__driftRecord["driftRecord"]\n src__extractors__configuration__entries["entries"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__emptyCoverage["emptyCoverage"]\n src__extractors__todo__relative["relative"]\n src__extractors__docs_chunks__chunkMarkdown["chunkMarkdown"]\n src__extractors__communication_file_helpers__appendRoleAndParticipantWarnings["appendRoleAndParticipantWarnin"]\n src__extractors__nl__classified["classified"]\n src__extractors__docs_chunks__index["index"]\n src__extractors__todo__action["action"]\n src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow["fallbackOrThrow"]\n src__extractors__communication_helpers__isCommunicationNoise["isCommunicationNoise"]\n src__extractors__nl_llm_helpers__NlAttemptError__lines["lines"]\n src__extractors__configuration__configurationRecords["configurationRecords"]\n src__extractors__docs_record__toDocumentIntentRecord["toDocumentIntentRecord"]\n src__extractors__docs_record__allowedModality["allowedModality"]\n src__extractors__docs_llm__DocumentationLlmRequiredError__readPrompt["readPrompt"]\n src__extractors__communication_helpers__flush["flush"]\n src__extractors__docs_record__keywordOverlap["keywordOverlap"]\n src__extractors__changelog__changelogAction["changelogAction"]\n src__extractors__configuration__MAX_ENTRIES_PER_FILE["MAX_ENTRIES_PER_FILE"]\n src__extractors__git__hasMoreDiscoveryWork["hasMoreDiscoveryWork"]\n src__extractors__configuration__line["line"]\n src__extractors__docs_record__statementText["statementText"]\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings["strings"]\n src__extractors__nl__body["body"]\n src__extractors__docs_record__resolveTarget["resolveTarget"]\n src__extractors__git__discoverGitRepositories["discoverGitRepositories"]\n src__extractors__git__finishDiscovery["finishDiscovery"]\n src__extractors__nl__missing["missing"]\n src__extractors__docs_chunks__mapConcurrent["mapConcurrent"]\n src__extractors__docs_schema__documentResponseContract["documentResponseContract"]\n src__extractors__nl_llm_helpers__NlAttemptError__allowedModality["allowedModality"]\n src__extractors__markdown_paths__state["state"]\n src__extractors__docs_record__resolveObject["resolveObject"]\n end\n rust_ast__src__main__main --> rust_ast__src__main__arguments\n rust_ast__src__main__main --> rust_ast__src__main__collect_files\n rust_ast__src__main__main --> rust_ast__src__main__slash\n rust_ast__src__main__collect_files --> rust_ast__src__main__slash\n rust_ast__src__main__add --> rust_ast__src__main__excerpt\n rust_ast__src__main__visit_item_mod --> rust_ast__src__main__qualified\n rust_ast__src__main__visit_item_mod --> rust_ast__src__main__add\n rust_ast__src__main__visit_item_use --> rust_ast__src__main__add\n rust_ast__src__main__visit_item_struct --> rust_ast__src__main__type_item\n rust_ast__src__main__visit_item_enum --> rust_ast__src__main__type_item\n rust_ast__src__main__visit_item_trait --> rust_ast__src__main__type_item\n rust_ast__src__main__visit_item_type --> rust_ast__src__main__type_item\n rust_ast__src__main__visit_item_const --> rust_ast__src__main__qualified\n rust_ast__src__main__visit_item_const --> rust_ast__src__main__add\n rust_ast__src__main__visit_item_const --> rust_ast__src__main__modifiers\n rust_ast__src__main__visit_item_static --> rust_ast__src__main__qualified\n rust_ast__src__main__visit_item_static --> rust_ast__src__main__add\n rust_ast__src__main__visit_item_static --> rust_ast__src__main__modifiers\n rust_ast__src__main__visit_item_fn --> rust_ast__src__main__qualified\n rust_ast__src__main__visit_item_fn --> rust_ast__src__main__add\n rust_ast__src__main__visit_impl_item_fn --> rust_ast__src__main__add\n rust_ast__src__main__visit_expr_call --> rust_ast__src__main__add\n rust_ast__src__main__visit_expr_method_call --> rust_ast__src__main__add\n rust_ast__src__main__type_item --> rust_ast__src__main__qualified\n rust_ast__src__main__type_item --> rust_ast__src__main__add\n rust_ast__src__main__type_item --> rust_ast__src__main__modifiers\n examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleHealth\n examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleEventPublish\n examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleEventList\n examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleHealth\n examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleEventPublish\n examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleEventList\n examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__request_handlers__handleHealth --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__request_handlers__handleHealth --> examples__backend__src__request_handlers__size\n examples__backend__src__request_handlers__handleEventPublish --> examples__backend__src__request_handlers__readBody\n examples__backend__src__request_handlers__handleEventPublish --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__request_handlers__validation --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__request_handlers__event --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__parseOffset\n examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__parseLimit\n examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__sendJson\n examples__backend__src__validation__ALLOWED_ACTIONS --> examples__backend__src__validation__invalid\n examples__backend__src__validation__validateEventPayload --> examples__backend__src__validation__invalid\n examples__backend__src__validation__record --> examples__backend__src__validation__invalid\n examples__backend__src__validation__agent --> examples__backend__src__validation__invalid\n examples__backend__src__validation__action --> examples__backend__src__validation__invalid\n examples__backend__src__validation__object --> examples__backend__src__validation__invalid\n examples__backend__src__server__createBackend --> examples__backend__src__server__sendJson\n examples__backend__src__server__store --> examples__backend__src__server__sendJson\n examples__backend__src__server__server --> examples__backend__src__server__sendJson\n examples__backend__src__server__startBackend --> examples__backend__src__server__createBackend\n examples__frontend__src__render__toRows --> examples__frontend__src__render__classifyEvent\n examples__frontend__src__render__renderTable --> examples__frontend__src__render__headerRow\n examples__frontend__src__app__mountPanel --> examples__frontend__src__app__createState\n examples__frontend__src__app__mountPanel --> examples__frontend__src__app__refresh\n examples__frontend__src__app__mountPanel --> examples__frontend__src__app__reload\n examples__frontend__src__app__mountPanel --> examples__frontend__src__app__state\n examples__frontend__src__app__state --> examples__frontend__src__app__refresh\n examples__frontend__src__app__reload --> examples__frontend__src__app__refresh\n examples__src__runtime__executeContract --> examples__src__runtime__validateContract\n java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__add\n java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__emit\n java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__collect\n java__JavaAstExtract__JavaAstExtract__emit --> java__JavaAstExtract__JavaAstExtract__json\n java__JavaAstExtract__JavaAstExtract__emit --> java__JavaAstExtract__JavaAstExtract__map\n java__JavaAstExtract__JavaAstExtract__collect --> java__JavaAstExtract__JavaAstExtract__try\n java__JavaAstExtract__JavaAstExtract__collect --> java__JavaAstExtract__JavaAstExtract__containsIgnored\n java__JavaAstExtract__JavaAstExtract__try --> java__JavaAstExtract__JavaAstExtract__slash\n java__JavaAstExtract__JavaAstExtract__json --> java__JavaAstExtract__JavaAstExtract__escape\n src__cli__main --> src__cli__printHelp\n src__cli__main --> src__cli__parseArgs\n src__cli__main --> src__cli__resolveMainCommand\n src__cli__main --> src__cli__commandHandlers\n src__cli__parsed --> src__cli__printHelp\n src__cli__command --> src__cli__printHelp\n src__cli__commandHandlers --> src__cli__initProject\n src__cli__commandHandlers --> src__cli__doctor\n src__cli__handleLink --> src__cli__emitJson\n src__cli__handleLink --> src__cli__optionString\n src__cli__handleDiagnose --> src__cli__emitJson\n src__cli__handleDiagnose --> src__cli__optionString\n src__cli__handleSummarize --> src__cli__optionString\n src__cli__handleSummarize --> src__cli__optionSummaryMode\n src__cli__diagnosticsPath --> src__cli__optionNumber\n src__cli__diagnosticsPath --> src__cli__optionBoolean\n src__cli__diagnostics --> src__cli__optionNumber\n src__cli__diagnostics --> src__cli__optionBoolean\n src__cli__result --> src__cli__execFileAsync\n src__cli__handleProposeTodo --> src__cli__optionString\n src__cli__handleProposeTodo --> src__cli__optionTaskMode\n src__cli__handleRenderTodo --> src__cli__optionString\n src__cli__handleApplyTodo --> src__cli__optionString\n src__cli__handleProposeCodeChange --> src__cli__optionString\n src__cli__handleRenderCodeChange --> src__cli__optionString\n src__cli__handleProposeSourcePatch --> src__cli__optionString\n src__cli__isPlanSet --> src__cli__optionString\n src__cli__handleApplySourcePatch --> src__cli__optionString\n src__cli__handleEvaluateCodeChange --> src__cli__optionString\n src__cli__handleCloseCodeChange --> src__cli__optionString\n src__cli__handleCompareWorkspace --> src__cli__resolvePipelineRoot\n src__cli__handleCompareWorkspace --> src__cli__buildWorkspaceComparisonOptions\n src__cli__root --> src__cli__optionString\n src__cli__root --> src__cli__optionNullableString\n src__cli__root --> src__cli__optionLlmMode\n src__cli__handlePipeline --> src__cli__resolvePipelineRoot\n src__cli__handlePipeline --> src__cli__buildPipelineOptions\n src__cli__handlePipeline --> src__cli__optionNullableString\n src__cli__handlePipeline --> src__cli__reportPipelineDegradation\n src__cli__handleWatch --> src__cli__resolvePipelineRoot\n src__cli__handleWatch --> src__cli__resolveWatchTaskFile\n src__cli__handleWatch --> src__cli__buildPipelineOptions\n src__cli__handleWatch --> src__cli__optionNumber\n src__cli__handleWatch --> src__cli__optionBoolean\n src__cli__taskFile --> src__cli__optionNumber\n src__cli__taskFile --> src__cli__optionBoolean\n src__cli__taskFile --> src__cli__formatWatchEvent\n src__cli__pipeline --> src__cli__optionNumber\n src__cli__pipeline --> src__cli__optionBoolean\n src__cli__pipeline --> src__cli__formatWatchEvent\n src__cli__controller --> src__cli__optionNumber\n src__cli__controller --> src__cli__optionBoolean\n src__cli__controller --> src__cli__formatWatchEvent\n src__cli__stop --> src__cli__optionNumber\n src__cli__stop --> src__cli__optionBoolean\n src__cli__stop --> src__cli__formatWatchEvent\n src__cli__buildPipelineOptions --> src__cli__buildCommonPipelineOptions\n src__cli__buildCommonPipelineOptions --> src__cli__optionNullableString\n src__cli__buildCommonPipelineOptions --> src__cli__optionList\n src__cli__buildCommonPipelineOptions --> src__cli__optionBoolean\n src__cli__buildCommonPipelineOptions --> src__cli__optionString\n src__cli__buildCommonPipelineOptions --> src__cli__optionNumber\n src__cli__buildCommonPipelineOptions --> src__cli__optionNlMode\n src__cli__buildCommonPipelineOptions --> src__cli__optionLlmMode\n src__cli__buildCommonPipelineOptions --> src__cli__optionPipelineTaskMode\n src__cli__resolveWatchTaskFile --> src__cli__optionNullableString\n src__cli__buildWorkspaceComparisonOptions --> src__cli__optionString\n src__cli__buildWorkspaceComparisonOptions --> src__cli__optionNullableString\n src__cli__buildWorkspaceComparisonOptions --> src__cli__optionList\n src__cli__buildWorkspaceComparisonOptions --> src__cli__optionBoolean\n src__cli__buildWorkspaceComparisonOptions --> src__cli__optionLlmMode\n src__cli__buildWorkspaceComparisonOptions --> src__cli__optionNumber\n src__cli__formatWatchEvent --> src__cli__file\n src__cli__stamp --> src__cli__file\n src__cli__handleDiff --> src__cli__parseDiffMode\n src__cli__handleDiff --> src__cli__handleGraphDiff\n src__cli__handleDiff --> src__cli__buildDiffPayload\n src__cli__handleDiff --> src__cli__optionString\n src__cli__handleDiff --> src__cli__optionNumber\n src__cli__svg --> src__cli__optionNumber\n src__cli__svg --> src__cli__optionBoolean\n src__cli__parseDiffMode --> src__cli__optionString\n src__cli__handleGraphDiff --> src__cli__optionString\n src__cli__handleGraphDiff --> src__cli__optionNumber\n src__cli__diff --> src__cli__optionNumber\n src__cli__buildDiffPayload --> src__cli__buildFileDiff\n src__cli__buildDiffPayload --> src__cli__buildGitDiff\n src__cli__buildFileDiff --> src__cli__optionNumber\n src__cli__context --> src__cli__optionString\n src__cli__context --> src__cli__optionBoolean\n src__cli__context --> src__cli__optionNumber\n src__cli__buildGitDiff --> src__cli__optionNumber\n src__cli__buildGitDiff --> src__cli__optionString\n src__cli__buildGitDiff --> src__cli__optionBoolean\n src__cli__handleReality --> src__cli__optionString\n src__cli__handleReality --> src__cli__optionNumber\n src__cli__handleReality --> src__cli__optionBoolean\n src__cli__view --> src__cli__optionNumber\n src__cli__view --> src__cli__optionBoolean\n src__cli__handleExtract --> src__cli__optionString\n src__cli__handleExtract --> src__cli__handler\n src__cli__handleExtractNl --> src__cli__optionString\n src__cli__handleExtractNl --> src__cli__optionNlMode\n src__cli__handleExtractNl --> src__cli__emitExtraction\n src__cli__handleExtractGit --> src__cli__optionNumber\n src__cli__handleExtractGit --> src__cli__emitExtraction\n src__cli__handleExtractAst --> src__cli__emitExtraction\n src__cli__handleExtractConfig --> src__cli__emitExtraction\n src__cli__handleExtractRuntime --> src__cli__emitExtraction\n src__cli__handleExtractMarkdown --> src__cli__optionNullableString\n src__cli__handleExtractMarkdown --> src__cli__optionLlmMode\n src__cli__handleExtractMarkdown --> src__cli__emitExtraction\n src__cli__handleExtractDocs --> src__cli__optionList\n src__cli__handleExtractDocs --> src__cli__emitExtraction\n src__cli__handleExtractCommunication --> src__cli__optionString\n src__cli__handleExtractCommunication --> src__cli__optionNullableString\n src__cli__handleExtractCommunication --> src__cli__optionLlmMode\n src__cli__handleExtractCommunication --> src__cli__emitExtraction\n src__cli__handleCommunication --> src__cli__optionString\n src__cli__handleCommunication --> src__cli__optionNullableString\n src__cli__handleCommunication --> src__cli__optionLlmMode\n src__cli__handleCommunication --> src__cli__optionNumber\n src__cli__handleCommunication --> src__cli__optionBoolean\n src__cli__handleIntake --> src__cli__optionString\n src__cli__handleIntake --> src__cli__optionBoolean\n src__cli__absolute --> src__cli__optionString\n src__cli__doctor --> src__cli__execFileAsync\n src__cli__optionNumber --> src__cli__optionString\n src__cli__optionList --> src__cli__optionString\n src__cli__optionNlMode --> src__cli__optionLlmMode\n src__cli__optionLlmMode --> src__cli__optionString\n src__cli__optionTaskMode --> src__cli__optionString\n src__cli__optionSummaryMode --> src__cli__optionLlmMode\n src__cli__optionSummaryMode --> src__cli__optionBoolean\n src__cli__optionPipelineTaskMode --> src__cli__optionString\n src__cli__invokedPath --> src__cli__main\n src__extractors__nl__extractNlIntent --> src__extractors__nl__assertNlExtractionOptions\n src__extractors__nl__extractNlIntent --> src__extractors__nl__detectMissingFields\n src__extractors__nl__absolute --> src__extractors__nl__detectMissingFields\n src__extractors__nl__absolute --> src__extractors__nl__inferActor\n src__extractors__nl__body --> src__extractors__nl__detectMissingFields\n src__extractors__nl__body --> src__extractors__nl__inferActor\n src__extractors__nl__sourcePath --> src__extractors__nl__detectMissingFields\n src__extractors__nl__sourcePath --> src__extractors__nl__inferActor\n src__extractors__nl__classified --> src__extractors__nl__inferActor\n src__extractors__nl__action --> src__extractors__nl__inferActor\n src__extractors__nl__object --> src__extractors__nl__inferActor\n src__extractors__nl__missing --> src__extractors__nl__inferActor\n src__extractors__nl__confidence --> src__extractors__nl__inferActor\n src__extractors__ast__isExtractionResult --> src__extractors__ast__isIntentRecords\n src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__parseCycle\n src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__sourcePathFor\n src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__boundedArray\n src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__probeRecord\n src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__label\n src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__violationRecord\n src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__parseCycle\n src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__sourcePathFor\n src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__boundedArray\n src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__probeRecord\n src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__label\n src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__violationRecord\n src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__probeRecord\n src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__boundedArray\n src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__label\n src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__violationRecord\n src__extractors__runtime_cycle__label --> src__extractors__runtime_cycle__text\n src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__label\n src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__text\n src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__watched\n src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__tags\n src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__factsMetadata\n src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__label\n src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__text\n src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__watched\n src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__tags\n src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__jsonScalar\n src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__text\n src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__tags\n src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__jsonScalar\n src__extractors__runtime_cycle__proposalRecord --> src__extractors__runtime_cycle__text\n src__extractors__runtime_cycle__proposalRecord --> src__extractors__runtime_cycle__proposalAction\n src__extractors__runtime_cycle__factsMetadata --> src__extractors__runtime_cycle__jsonScalar\n src__extractors__configuration__MAX_ENTRIES_PER_FILE --> src__extractors__configuration__isConfigurationPath\n src__extractors__configuration__MAX_ENTRIES_PER_FILE --> src__extractors__configuration__configurationRecords\n src__extractors__configuration__extractConfigurationIntent --> src__extractors__configuration__isConfigurationPath\n src__extractors__configuration__extractConfigurationIntent --> src__extractors__configuration__configurationRecords\n src__extractors__configuration__files --> src__extractors__configuration__configurationRecords\n src__extractors__configuration__relative --> src__extractors__configuration__configurationRecords\n src__extractors__configuration__configurationRecords --> src__extractors__configuration__dockerEntries\n src__extractors__configuration__configurationRecords --> src__extractors__configuration__jsonEntries\n src__extractors__configuration__configurationRecords --> src__extractors__configuration__tomlEntries\n src__extractors__configuration__configurationRecords --> src__extractors__configuration__yamlOrAssignmentEntries\n src__extractors__configuration__configurationRecords --> src__extractors__configuration__fileAggregate\n src__extractors__configuration__entries --> src__extractors__configuration__fileAggregate\n src__extractors__configuration__bounded --> src__extractors__configuration__fileAggregate\n src__extractors__configuration__fileAggregate --> src__extractors__configuration__configurationFormat\n src__extractors__configuration__jsonEntries --> src__extractors__configuration__findKeyLine\n src__extractors__configuration__parsed --> src__extractors__configuration__findKeyLine\n src__extractors__configuration__lines --> src__extractors__configuration__findKeyLine\n src__extractors__configuration__tomlEntries --> src__extractors__configuration__entries\n src__extractors__configuration__tomlEntries --> src__extractors__configuration__match\n src__extractors__configuration__tomlEntries --> src__extractors__configuration__entry\n src__extractors__configuration__tomlEntries --> src__extractors__configuration__uniqueEntries\n src__extractors__configuration__line --> src__extractors__configuration__entry\n src__extractors__configuration__heading --> src__extractors__configuration__entry\n src__extractors__configuration__pair --> src__extractors__configuration__entry\n src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__entries\n src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__match\n src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__entry\n src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__uniqueEntries\n src__extractors__configuration__dockerEntries --> src__extractors__configuration__match\n src__extractors__docs_schema__target --> src__extractors__docs_schema__strings\n src__extractors__docs_schema__documentRecord --> src__extractors__docs_schema__strings\n src__extractors__docs_schema__documentRecord --> src__extractors__docs_schema__target\n src__extractors__docs_schema__documentResponseSchema --> src__extractors__docs_schema__documentResponseContract\n src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited --> src__extractors__nl_llm__NlLlmRequiredError__assertNlExtractionOptions\n src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited --> src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow\n src__extractors__nl_llm__NlLlmRequiredError__client --> src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__requireConfiguredClient\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__selectWithinBudget\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__readPrompt\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk\n src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage\n src__extractors__docs_llm__DocumentationLlmRequiredError__files --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage\n src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage\n src__extractors__changelog__extractChangelog --> src__extractors__changelog__changelogAction\n src__extractors__changelog__body --> src__extractors__changelog__changelogAction\n src__extractors__changelog__relative --> src__extractors__changelog__changelogAction\n src__extractors__changelog__lines --> src__extractors__changelog__changelogAction\n src__extractors__docs_deterministic__extractDocumentationBaseline --> src__extractors__docs_deterministic__convertDocument\n src__extractors__docs_deterministic__extractDocumentationBaseline --> src__extractors__docs_deterministic__primePathMapper\n src__extractors__docs_deterministic__root --> src__extractors__docs_deterministic__convertDocument\n src__extractors__docs_deterministic__root --> src__extractors__docs_deterministic__primePathMapper\n src__extractors__docs_deterministic__resolver --> src__extractors__docs_deterministic__convertDocument\n src__extractors__docs_deterministic__resolver --> src__extractors__docs_deterministic__primePathMapper\n src__extractors__docs_deterministic__convertDocument --> src__extractors__docs_deterministic__handleDocumentationLine\n src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseFenceBlock\n src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseSectionHeading\n src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseBulletStatement\n src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseParagraphStatement\n src__extractors__docs_deterministic__parseFenceBlock --> src__extractors__docs_deterministic__match\n src__extractors__docs_deterministic__parseFenceBlock --> src__extractors__docs_deterministic__codeBlockRecord\n src__extractors__docs_deterministic__marker --> src__extractors__docs_deterministic__codeBlockRecord\n src__extractors__docs_deterministic__parseSectionHeading --> src__extractors__docs_deterministic__match\n src__extractors__docs_deterministic__parseSectionHeading --> src__extractors__docs_deterministic__statementRecord\n src__extractors__docs_deterministic__heading --> src__extractors__docs_deterministic__match\n src__extractors__docs_deterministic__parseBulletStatement --> src__extractors__docs_deterministic__match\n src__extractors__docs_deterministic__parseBulletStatement --> src__extractors__docs_deterministic__qualifyingStatement\n src__extractors__docs_deterministic__parseParagraphStatement --> src__extractors__docs_deterministic__readParagraph\n src__extractors__docs_deterministic__parseParagraphStatement --> src__extractors__docs_deterministic__qualifyingStatement\n src__extractors__docs_deterministic__action --> src__extractors__docs_deterministic__targetsOf\n src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__buildBasenameIndex\n src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__headingScopes\n src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__isRepositoryPath\n src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__basenames\n src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__headingScopes\n src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__isRepositoryPath\n src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__basenames\n src__extractors__markdown_paths__basenames --> src__extractors__markdown_paths__headingScopes\n src__extractors__markdown_paths__basenames --> src__extractors__markdown_paths__isRepositoryPath\n src__extractors__markdown_paths__headingDirectories --> src__extractors__markdown_paths__isRepositoryPath\n src__extractors__markdown_paths__headingDirectories --> src__extractors__markdown_paths__basenames\n src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__createBasenameIndexState\n src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__readBasenameDirectoryEntries\n src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__isNestedCheckout\n src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__scanDirectoryForBasenames\n src__extractors__markdown_paths__index --> src__extractors__markdown_paths__readBasenameDirectoryEntries\n src__extractors__markdown_paths__index --> src__extractors__markdown_paths__isNestedCheckout\n src__extractors__markdown_paths__index --> src__extractors__markdown_paths__scanDirectoryForBasenames\n src__extractors__markdown_paths__state --> src__extractors__markdown_paths__readBasenameDirectoryEntries\n src__extractors__markdown_paths__state --> src__extractors__markdown_paths__isNestedCheckout\n src__extractors__markdown_paths__state --> src__extractors__markdown_paths__scanDirectoryForBasenames\n src__extractors__markdown_paths__scanDirectoryForBasenames --> src__extractors__markdown_paths__addBasenameIndexMatch\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveObject\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__anchorToSource\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveTarget\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveAction\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveModality\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__allowedLifecycle\n src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__linesFromChunk\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveObject\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__anchorToSource\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveTarget\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveAction\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveModality\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__allowedLifecycle\n src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__linesFromChunk\n src__extractors__docs_record__statementText --> src__extractors__docs_record__resolveObject\n src__extractors__docs_record__target --> src__extractors__docs_record__allowedLifecycle\n src__extractors__docs_record__target --> src__extractors__docs_record__linesFromChunk\n src__extractors__docs_record__action --> src__extractors__docs_record__allowedLifecycle\n src__extractors__docs_record__action --> src__extractors__docs_record__linesFromChunk\n src__extractors__docs_record__modality --> src__extractors__docs_record__allowedLifecycle\n src__extractors__docs_record__modality --> src__extractors__docs_record__linesFromChunk\n src__extractors__docs_record__resolveObject --> src__extractors__docs_record__isPlaceholder\n src__extractors__docs_record__fallback --> src__extractors__docs_record__isPlaceholder\n src__extractors__docs_record__anchorToSource --> src__extractors__docs_record__clampLine\n src__extractors__docs_record__anchorToSource --> src__extractors__docs_record__keywordOverlap\n src__extractors__docs_record__resolveTarget --> src__extractors__docs_record__hasTarget\n src__extractors__docs_record__resolveAction --> src__extractors__docs_record__allowedAction\n src__extractors__docs_record__resolveModality --> src__extractors__docs_record__allowedModality\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownRecords --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__outcomes --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichment --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownBatchWithCorrection\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__emptyCoverage\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering\n src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings\n src__extractors__communication_helpers__parseEnvelope --> src__extractors__communication_helpers__match\n src__extractors__communication_helpers__parseEnvelope --> src__extractors__communication_helpers__unquote\n src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__basename\n src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__inferGovernanceIdentityFromFilename\n src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__inferIdentityFromPathAndFilename\n src__extractors__communication_helpers__inferGovernanceIdentityFromFilename --> src__extractors__communication_helpers__match\n src__extractors__communication_helpers__inferIdentityFromPathAndFilename --> src__extractors__communication_helpers__isCommunicationType\n src__extractors__communication_helpers__fileParts --> src__extractors__communication_helpers__isCommunicationType\n src__extractors__communication_helpers__nestedRoleIndex --> src__extractors__communication_helpers__isCommunicationType\n src__extractors__communication_helpers__nestedRole --> src__extractors__communication_helpers__isCommunicationType\n src__extractors__communication_helpers__nestedParticipant --> src__extractors__communication_helpers__isCommunicationType\n src__extractors__communication_helpers__isTicketEvidenceFile --> src__extractors__communication_helpers__basename\n src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__isCommunicationNoise\n src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__match\n src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__flush\n src__extractors__communication_helpers__flush --> src__extractors__communication_helpers__isCommunicationNoise\n src__extractors__communication_helpers__item --> src__extractors__communication_helpers__isCommunicationNoise\n src__extractors__communication_helpers__raw --> src__extractors__communication_helpers__match\n src__extractors__communication_helpers__heading --> src__extractors__communication_helpers__match\n src__extractors__communication_helpers__normalizeType --> src__extractors__communication_helpers__isCommunicationType\n src__extractors__communication_helpers__listValue --> src__extractors__communication_helpers__unquote\n src__extractors__communication_helpers__sameStrings --> src__extractors__communication_helpers__normalize\n src__extractors__todo__extractTodo --> src__extractors__todo__match\n src__extractors__todo__body --> src__extractors__todo__match\n src__extractors__todo__relative --> src__extractors__todo__match\n src__extractors__todo__lines --> src__extractors__todo__match\n src__extractors__todo__raw --> src__extractors__todo__match\n src__extractors__todo__heading --> src__extractors__todo__match\n src__extractors__todo__task --> src__extractors__todo__inferOwner\n src__extractors__todo__checked --> src__extractors__todo__inferOwner\n src__extractors__todo__block --> src__extractors__todo__inferOwner\n src__extractors__todo__text --> src__extractors__todo__inferOwner\n src__extractors__todo__classified --> src__extractors__todo__inferOwner\n src__extractors__todo__action --> src__extractors__todo__inferOwner\n src__extractors__todo__resolvedPaths --> src__extractors__todo__inferOwner\n src__extractors__todo__inferOwner --> src__extractors__todo__match\n src__extractors__todo__extractExplicitId --> src__extractors__todo__match\n src__extractors__git__extractGitIntent --> src__extractors__git__isGitWorkTree\n src__extractors__git__extractGitIntent --> src__extractors__git__extractRepositoryGitIntent\n src__extractors__git__extractGitIntent --> src__extractors__git__discoverGitRepositories\n src__extractors__git__extractGitIntent --> src__extractors__git__mapWithConcurrency\n src__extractors__git__root --> src__extractors__git__isGitWorkTree\n src__extractors__git__root --> src__extractors__git__extractRepositoryGitIntent\n src__extractors__git__count --> src__extractors__git__isGitWorkTree\n src__extractors__git__count --> src__extractors__git__extractRepositoryGitIntent\n src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readCommits\n src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readChangedFiles\n src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readStats\n src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__runGit\n src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__extractChangedSymbols\n src__extractors__git__discoverGitRepositories --> src__extractors__git__createDiscoveryState\n src__extractors__git__discoverGitRepositories --> src__extractors__git__hasMoreDiscoveryWork\n src__extractors__git__discoverGitRepositories --> src__extractors__git__takeNextDiscoveryDirectory\n src__extractors__git__discoverGitRepositories --> src__extractors__git__readDiscoveryEntries\n src__extractors__git__discoverGitRepositories --> src__extractors__git__processDiscoveryDirectory\n src__extractors__git__discoverGitRepositories --> src__extractors__git__filterDiscoveryChildren\n src__extractors__git__discoverGitRepositories --> src__extractors__git__finishDiscovery\n src__extractors__git__state --> src__extractors__git__hasMoreDiscoveryWork\n src__extractors__git__state --> src__extractors__git__takeNextDiscoveryDirectory\n src__extractors__git__state --> src__extractors__git__readDiscoveryEntries\n src__extractors__git__state --> src__extractors__git__processDiscoveryDirectory\n src__extractors__git__state --> src__extractors__git__filterDiscoveryChildren\n src__extractors__git__processDiscoveryDirectory --> src__extractors__git__resolveDiscoveryPrefix\n src__extractors__git__processDiscoveryDirectory --> src__extractors__git__gitMarkerState\n src__extractors__git__processDiscoveryDirectory --> src__extractors__git__registerDiscoveredRepository\n src__extractors__git__registerDiscoveredRepository --> src__extractors__git__isGitWorkTree\n src__extractors__git__isGitWorkTree --> src__extractors__git__runGit\n src__extractors__git__runGit --> src__extractors__git__execFileAsync\n src__extractors__git__result --> src__extractors__git__execFileAsync\n src__extractors__git__readCommits --> src__extractors__git__runGit\n src__extractors__git__readChangedFiles --> src__extractors__git__runGit\n src__extractors__git__readStats --> src__extractors__git__runGit\n src__extractors__docs_chunks__prioritizeDocumentChunks --> src__extractors__docs_chunks__chunkPriority\n src__extractors__docs_chunks__needles --> src__extractors__docs_chunks__chunkPriority\n src__extractors__docs_chunks__mapConcurrent --> src__extractors__docs_chunks__worker\n src__extractors__docs_chunks__index --> src__extractors__docs_chunks__worker\n src__extractors__docs_chunks__item --> src__extractors__docs_chunks__worker\n src__extractors__docs_chunks__workerCount --> src__extractors__docs_chunks__worker\n src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__markdownSections\n src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__flush\n src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__splitLongSection\n src__extractors__docs_chunks__sectionLines --> src__extractors__docs_chunks__flush\n src__extractors__docs_chunks__sectionLines --> src__extractors__docs_chunks__splitLongSection\n src__extractors__docs_chunks__sectionText --> src__extractors__docs_chunks__flush\n src__extractors__docs_chunks__sectionText --> src__extractors__docs_chunks__splitLongSection\n src__extractors__docs_chunks__splitLongSection --> src__extractors__docs_chunks__takeLineBatch\n src__extractors__markdown_llm__MarkdownLlmRequiredError__extractMarkdownIntentAudited --> src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow\n src__extractors__markdown_llm__MarkdownLlmRequiredError__client --> src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow\n src__extractors__communication_file_helpers__envelope --> src__extractors__communication_file_helpers__shouldSkipCommunicationFile\n src__extractors__communication_file_helpers__inferred --> src__extractors__communication_file_helpers__shouldSkipCommunicationFile\n src__extractors__communication_file_helpers__shouldSkipCommunicationFile --> src__extractors__communication_file_helpers__hasExplicitEnvelopeMetadata\n src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendRoleAndParticipantWarnings\n src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendIdentityWarnings\n src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendRegistryAlignmentWarnings\n src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendA2aAgentWarnings\n src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendTimestampWarnings\n src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt\n src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveAction\n src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText\n src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject\n src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveModality\n src__extractors__nl_llm_helpers__NlAttemptError__lines --> src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt\n src__extractors__nl_llm_helpers__NlAttemptError__action --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject\n src__extractors__nl_llm_helpers__NlAttemptError__normalizedText --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject\n src__extractors__nl_llm_helpers__NlAttemptError__statementText --> src__extractors__nl_llm_helpers__NlAttemptError__resolveModality\n src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt --> src__extractors__nl_llm_helpers__NlAttemptError__clampLine\n src__extractors__nl_llm_helpers__NlAttemptError__resolveAction --> src__extractors__nl_llm_helpers__NlAttemptError__allowedAction\n src__extractors__nl_llm_helpers__NlAttemptError__resolveModality --> src__extractors__nl_llm_helpers__NlAttemptError__allowedModality\n src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText\n src__extractors__nl_llm_helpers__NlAttemptError__resolveObject --> src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder\n src__extractors__nl_llm_helpers__NlAttemptError__resolveObject --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText\n src__extractors__nl_llm_helpers__NlAttemptError__NL_ACTION_SET --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings\n src__extractors__nl_llm_helpers__NlAttemptError__NL_MODALITY_SET --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings\n src__extractors__nl_llm_helpers__NlAttemptError__NL_RECORD_CONTRACT --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings\n src__extractors__ast__external__runExternalAstAdapter --> src__extractors__ast__external__execFileAsync\n src__extractors__ast__external__result --> src__extractors__ast__external__execFileAsync\n src__extractors__ast__records__adapterRecords --> src__extractors__ast__records__moduleRecords\n", "is_subdir": false}, {"name": "compact_flow.mmd", "rel_path": "compact_flow.mmd", "path": "compact_flow.mmd", "size": "764B", "icon": "πŸ“ˆ", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.04s\n examples__frontend["examples.frontend<br/>25 funcs"]\n java__JavaAstExtract["java.JavaAstExtract<br/>12 funcs"]\n python__ast_extract["python.ast_extract<br/>18 funcs"]\n scripts__research["scripts.research<br/>71 funcs"]\n sdk__python["sdk.python<br/>68 funcs"]\n src__graph["src.graph<br/>227 funcs"]\n src__live["src.live<br/>60 funcs"]\n src__synthesis["src.synthesis<br/>477 funcs"]\n scripts__research ==>|7| src__live\n sdk__python ==>|4| src__synthesis\n sdk__python -->|2| java__JavaAstExtract\n scripts__research -->|1| src__synthesis\n scripts__research -->|1| src__graph\n python__ast_extract -->|1| src__graph\n sdk__python -->|1| src__graph\n sdk__python -->|1| examples__frontend\n", "is_subdir": false}, {"name": "flow.mmd", "rel_path": "flow.mmd", "path": "flow.mmd", "size": "2.1KB", "icon": "πŸ“ˆ", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.04s\n\n %% Entry points (blue)\n classDef entry fill:#4dabf7,stroke:#1971c2,color:#fff\n\n subgraph CLI\n src__cli__execFileAsync["execFileAsync"]\n src__cli__main["main"]\n src__cli__parsed["parsed"]\n src__cli__command["command"]\n src__cli__config["config"]\n src__cli__handler["handler"]\n src__cli__commandHandlers["commandHandlers"]\n src__cli__resolveMainCommand["resolveMainCommand"]\n src__cli__handleLink["handleLink"]\n src__cli__files["files"]\n src__cli__records["records"]\n src__cli__graph["graph"]\n src__cli__handleDiagnose["handleDiagnose"]\n src__cli__graphFile["graphFile"]\n src__cli__handleSummarize["handleSummarize"]\n ...["+109 more"]\n end\n\n subgraph Core\n project__install_project_package["install_project_package"]\n project__cleanup_analysis_snapshot["cleanup_analysis_snapshot"]\n project__run_analysis_tool["run_analysis_tool"]\n rust_ast__src__main__main["main"]\n rust_ast__src__main__new["new"]\n rust_ast__src__main__visit_item_mod["visit_item_mod"]\n rust_ast__src__main__visit_item_use["visit_item_use"]\n rust_ast__src__main__visit_item_struct["visit_item_struct"]\n rust_ast__src__main__visit_item_enum["visit_item_enum"]\n rust_ast__src__main__visit_item_trait["visit_item_trait"]\n rust_ast__src__main__visit_item_type["visit_item_type"]\n rust_ast__src__main__visit_item_const["visit_item_const"]\n rust_ast__src__main__visit_item_static["visit_item_static"]\n rust_ast__src__main__visit_item_fn["visit_item_fn"]\n rust_ast__src__main__visit_item_impl["visit_item_impl"]\n ...["+2517 more"]\n end\n\n subgraph Exporters\n end\n\n class project__install_project_package,project__cleanup_analysis_snapshot,project__run_analysis_tool,rust_ast__src__main__main,rust_ast__src__main__new,rust_ast__src__main__visit_item_mod,rust_ast__src__main__visit_item_use,rust_ast__src__main__visit_item_struct,rust_ast__src__main__visit_item_enum,rust_ast__src__main__visit_item_trait entry\n", "is_subdir": false}, {"name": "prompt.txt", "rel_path": "prompt.txt", "path": "prompt.txt", "size": "2.9KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "You are an AI assistant helping me understand and improve a codebase.\n# generated in 0.00s\nUse the attached/generated files as the authoritative context.\nYour goal is to refactor the project based on these files, not just summarize it.\n\nwe are in project path: todo2code\n\nFiles for analysis:\n\nNote: project/validation.toon.yaml and project/duplication.toon.yaml are generated by external tools (vallm and redup)\n- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [25KB]\n- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [181KB]\n- evolution.toon.yaml (Refactoring queue - ranked actions by impact/effort, risks, metrics targets, history) [2KB]\n- project.toon.yaml (Compact project overview - generated from project.yaml data) [2KB]\n- context.md (LLM narrative - architecture summary and project context) [33KB]\n- README.md (Generated documentation - overview and usage guide) [9KB]\n\nTask:\n- Treat this prompt as a refactoring brief: identify the highest-priority changes and prepare concrete edits.\n- Use the file set to decide whether the first pass should focus on correctness, duplication, complexity reduction, or architecture cleanup.\n- If you can safely implement the refactor, do it; otherwise give an exact file-by-file change plan and test plan.\n- Use analysis.toon.yaml to locate high-CC functions and god modules that should be split first.\n- Keep module boundaries intact and update imports/exports according to map.toon.yaml.\n- Use evolution.toon.yaml as the execution backlog and work from the top-ranked items.\n- Keep project.toon.yaml aligned with the refactored architecture.\n\nPriority Order:\nP1 β€” Split or simplify the highest-CC / god modules identified in analysis.toon.yaml.\nP1 β€” Preserve module boundaries and update imports/exports according to map.toon.yaml.\nP2 β€” Keep the compact project overview in project.toon.yaml aligned with the refactor.\nP2 β€” Execute the highest-impact items from evolution.toon.yaml in order of benefit/risk.\n\nFocus Areas for Analysis:\n1. **Code Health Analysis** - Review complexity metrics, god modules, coupling issues from analysis.toon.yaml\n2. **Structural Map** - Use map.toon.yaml to inspect imports, exports, signatures, and the project header\n3. **Refactoring Priorities** - Examine ranked refactoring actions and risk assessment from evolution.toon.yaml\n4. **Project Overview** - Review the compact project overview from project.toon.yaml\n\nAnalysis Strategy:\n- Start with analysis.toon.yaml for health metrics, then map.toon.yaml for structure and signatures\n- Review evolution.toon.yaml for action priorities and next steps\n- Compare the compact project overview in project.toon.yaml with the main analysis files\n\nConstraints:\n- Prefer minimal, incremental changes.\n- Maintain full backward compatibility.\n- Base recommendations on concrete metrics from the provided files.\n- If uncertain, ask clarifying questions.\n", "is_subdir": false}, {"name": "governance-check.bat", "rel_path": "governance-check.bat", "path": "governance-check.bat", "size": "265B", "icon": "πŸ“„", "type": "unknown", "type_name": "BAT", "content": "[Binary file]", "is_subdir": false}, {"name": "governance-check.sh", "rel_path": "governance-check.sh", "path": "governance-check.sh", "size": "322B", "icon": "πŸ“„", "type": "unknown", "type_name": "SH", "content": "[Binary file]", "is_subdir": false}, {"name": "mermaid.export", "rel_path": "mermaid.export", "path": "mermaid.export", "size": "168.7KB", "icon": "πŸ“„", "type": "unknown", "type_name": "EXPORT", "content": "[Binary file]", "is_subdir": false}, {"name": "new-ticket.sh", "rel_path": "new-ticket.sh", "path": "new-ticket.sh", "size": "7.4KB", "icon": "πŸ“„", "type": "unknown", "type_name": "SH", "content": "[Binary file]", "is_subdir": false}, {"name": "readme.sh", "rel_path": "readme.sh", "path": "readme.sh", "size": "3.2KB", "icon": "πŸ“„", "type": "unknown", "type_name": "SH", "content": "[Binary file]", "is_subdir": false}, {"name": "analysis.toon.yaml", "rel_path": "analysis.toon.yaml", "path": "analysis.toon.yaml", "size": "25.4KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# code2llm | 281f 43441L | typescript:173,json:40,python:16,javascript:15,shell:8,rust:7,go:6,php:4,toml:3,yaml:2,yml:2,java:1,proto:1,txt:1 | 2026-08-04\n# generated in 0.31s\n# CCΜ…=3.1 | critical:24/4129 | dups:0 | cycles:0\n\nHEALTH[20]:\n πŸ”΄ GOD src/diff/reality.ts = 690L, 4 classes, 89m, max CC=15\n 🟑 CC generationMetadata CC=17 (limit:15)\n 🟑 CC compareGraphs CC=15 (limit:15)\n 🟑 CC looksLikeJson CC=20 (limit:15)\n 🟑 CC buildRealityTotals CC=15 (limit:15)\n 🟑 CC persistPipelineArtifacts CC=17 (limit:15)\n 🟑 CC persistFailedRunState CC=19 (limit:15)\n 🟑 CC assertRerankerDecision CC=17 (limit:15)\n 🟑 CC assertGeneration CC=16 (limit:15)\n 🟑 CC validateOperationStep CC=23 (limit:15)\n 🟑 CC collectAgentActionIssues CC=15 (limit:15)\n 🟑 CC parseFile CC=38 (limit:15)\n 🟑 CC makefile CC=28 (limit:15)\n 🟑 CC visited CC=15 (limit:15)\n 🟑 CC visit CC=15 (limit:15)\n 🟑 CC main CC=27 (limit:15)\n 🟑 CC iter_python_files CC=16 (limit:15)\n 🟑 CC run CC=26 (limit:15)\n 🟑 CC baseUrl CC=17 (limit:15)\n 🟑 CC token CC=17 (limit:15)\n\nREFACTOR[2]:\n 1. split src/diff/reality.ts (god module)\n 2. split 19 high-CC methods (CC>15)\n\nPIPELINES[2116]:\n [1] Src [main]: main β†’ arguments\n PURITY: 100% pure\n [2] Src [new]: new\n PURITY: 100% pure\n [3] Src [visit_item_mod]: visit_item_mod β†’ qualified\n PURITY: 100% pure\n [4] Src [visit_item_use]: visit_item_use β†’ add β†’ excerpt\n PURITY: 100% pure\n [5] Src [visit_item_struct]: visit_item_struct β†’ type_item β†’ qualified\n PURITY: 100% pure\n [6] Src [visit_item_enum]: visit_item_enum β†’ type_item β†’ qualified\n PURITY: 100% pure\n [7] Src [visit_item_trait]: visit_item_trait β†’ type_item β†’ qualified\n PURITY: 100% pure\n [8] Src [visit_item_type]: visit_item_type β†’ type_item β†’ qualified\n PURITY: 100% pure\n [9] Src [visit_item_const]: visit_item_const β†’ qualified\n PURITY: 100% pure\n [10] Src [visit_item_static]: visit_item_static β†’ qualified\n PURITY: 100% pure\n [11] Src [visit_item_fn]: visit_item_fn β†’ qualified\n PURITY: 100% pure\n [12] Src [visit_item_impl]: visit_item_impl\n PURITY: 100% pure\n [13] Src [visit_impl_item_fn]: visit_impl_item_fn β†’ add β†’ excerpt\n PURITY: 100% pure\n [14] Src [visit_expr_call]: visit_expr_call β†’ add β†’ excerpt\n PURITY: 100% pure\n [15] Src [visit_expr_method_call]: visit_expr_method_call β†’ add β†’ excerpt\n PURITY: 100% pure\n [16] Src [MAX_BODY_BYTES]: MAX_BODY_BYTES β†’ handleHealth β†’ sendJson\n PURITY: 100% pure\n [17] Src [handleRequest]: handleRequest β†’ handleHealth β†’ sendJson\n PURITY: 100% pure\n [18] Src [url]: url\n PURITY: 100% pure\n [19] Src [body]: body\n PURITY: 100% pure\n [20] Src [validation]: validation β†’ sendJson\n PURITY: 100% pure\n [21] Src [event]: event β†’ sendJson\n PURITY: 100% pure\n [22] Src [ALLOWED_ACTIONS]: ALLOWED_ACTIONS β†’ invalid\n PURITY: 100% pure\n [23] Src [validateEventPayload]: validateEventPayload β†’ invalid\n PURITY: 100% pure\n [24] Src [record]: record β†’ invalid\n PURITY: 100% pure\n [25] Src [agent]: agent β†’ invalid\n PURITY: 100% pure\n [26] Src [action]: action β†’ invalid\n PURITY: 100% pure\n [27] Src [object]: object β†’ invalid\n PURITY: 100% pure\n [28] Src [enqueueEvent]: enqueueEvent\n PURITY: 100% pure\n [29] Src [listEvents]: listEvents\n PURITY: 100% pure\n [30] Src [start]: start\n PURITY: 100% pure\n [31] Src [store]: store β†’ sendJson\n PURITY: 100% pure\n [32] Src [server]: server β†’ sendJson\n PURITY: 100% pure\n [33] Src [body]: body\n PURITY: 100% pure\n [34] Src [startBackend]: startBackend β†’ createBackend β†’ sendJson\n PURITY: 100% pure\n [35] Src [port]: port\n PURITY: 100% pure\n [36] Src [host]: host\n PURITY: 100% pure\n [37] Src [fetchEvents]: fetchEvents\n PURITY: 100% pure\n [38] Src [url]: url\n PURITY: 100% pure\n [39] Src [response]: response\n PURITY: 100% pure\n [40] Src [payload]: payload\n PURITY: 100% pure\n [41] Src [publishEvent]: publishEvent\n PURITY: 100% pure\n [42] Src [toRows]: toRows β†’ classifyEvent\n PURITY: 100% pure\n [43] Src [renderTable]: renderTable β†’ headerRow\n PURITY: 100% pure\n [44] Src [table]: table\n PURITY: 100% pure\n [45] Src [head]: head\n PURITY: 100% pure\n [46] Src [body]: body\n PURITY: 100% pure\n [47] Src [tr]: tr\n PURITY: 100% pure\n [48] Src [renderError]: renderError\n PURITY: 100% pure\n [49] Src [message]: message\n PURITY: 100% pure\n [50] Src [mountPanel]: mountPanel β†’ createState\n PURITY: 100% pure\n\nLAYERS:\n php/ CCΜ„=8.7 ←in:0 β†’out:0\n β”‚ !! ast_extract.php 233L 0C 7m CC=38 ←0\n β”‚\n golang/ CCΜ„=5.3 ←in:0 β†’out:0\n β”‚ ast_extract.go 368L 3C 15m CC=14 ←0\n β”‚\n python/ CCΜ„=4.2 ←in:0 β†’out:1\n β”‚ !! ast_extract 221L 1C 18m CC=16 ←0\n β”‚ requirements.txt 1L 0C 0m CC=0.0 ←0\n β”‚\n scripts/ CCΜ„=3.4 ←in:0 β†’out:0\n β”‚ audit-changelog-sample.mjs 226L 0C 39m CC=11 ←0\n β”‚ examples-check.sh 210L 0C 3m CC=0.0 ←0\n β”‚ live-contract-check.mjs 200L 0C 26m CC=5 ←0\n β”‚ rerank-embedding-shortlist.mjs 191L 0C 27m CC=14 ←0\n β”‚ !! rank-intent-graph-embeddings 174L 0C 3m CC=27 ←0\n β”‚ live-model-comparison.mjs 125L 0C 15m CC=13 ←0\n β”‚ e2e.sh 109L 0C 3m CC=0.0 ←0\n β”‚ !! verify-env-contract.mjs 103L 0C 15m CC=28 ←0\n β”‚ evaluate-embedding-pairs 101L 0C 2m CC=9 ←0\n β”‚ verify-generated-analysis.mjs 88L 0C 14m CC=8 ←0\n β”‚ verify-module-boundaries.mjs 87L 0C 16m CC=7 ←0\n β”‚ !! verify-no-llm-imports.mjs 78L 0C 6m CC=15 ←0\n β”‚ sync-generated-readme-metadata.mjs 66L 0C 14m CC=4 ←0\n β”‚ smoke.sh 57L 0C 0m CC=0.0 ←0\n β”‚ assert-demollm-run.mjs 45L 0C 9m CC=2 ←0\n β”‚ verify-workflow-yaml.mjs 43L 0C 9m CC=11 ←0\n β”‚ normalize-generated-analysis-roots.mjs 38L 0C 7m CC=4 ←0\n β”‚ docker-smoke.sh 36L 0C 1m CC=0.0 ←0\n β”‚ verify-structured-responses.mjs 35L 0C 7m CC=8 ←0\n β”‚ generate-response-schemas.mjs 27L 0C 4m CC=2 ←0\n β”‚ vallm-compatible 25L 0C 1m CC=2 ←0\n β”‚ package 25L 0C 0m CC=0.0 ←0\n β”‚ a2a-request.sh 23L 0C 0m CC=0.0 ←0\n β”‚ mcp-request.sh 11L 0C 0m CC=0.0 ←0\n β”‚\n src/ CCΜ„=3.1 ←in:0 β†’out:0\n β”‚ !! cli.ts 942L 1C 124m CC=13 ←0\n β”‚ !! actions.ts 806L 1C 106m CC=13 ←0\n β”‚ !! reality.ts 690L 4C 89m CC=15 ←0\n β”‚ !! analyzer.ts 596L 3C 81m CC=15 ←0\n β”‚ !! a2a-task-store.ts 560L 3C 88m CC=11 ←0\n β”‚ !! text.ts 530L 0C 61m CC=14 ←0\n β”‚ gold-cases.ts 489L 4C 62m CC=8 ←0\n β”‚ diagnostics.ts 459L 1C 59m CC=11 ←0\n β”‚ implementation-source-patch-apply-core.ts 434L 6C 50m CC=13 ←0\n β”‚ !! validation.ts 429L 0C 69m CC=23 ←0\n β”‚ !! gold-types.ts 405L 15C 17m CC=17 ←0\n β”‚ git.ts 397L 6C 57m CC=11 ←0\n β”‚ implementation-source-patch-assert.ts 397L 2C 52m CC=11 ←0\n β”‚ !! run.ts 384L 4C 33m CC=20 ←0\n β”‚ markdown-llm-helpers.ts 383L 5C 30m CC=14 ←0\n β”‚ todo-patch.ts 372L 5C 52m CC=12 ←0\n β”‚ docs-deterministic.ts 369L 3C 43m CC=11 ←0\n β”‚ implementation-helpers.ts 357L 5C 33m CC=10 ←0\n β”‚ communication-file-helpers.ts 342L 2C 45m CC=14 ←0\n β”‚ workspace.ts 342L 3C 54m CC=12 ←0\n β”‚ intake-contract.ts 334L 7C 34m CC=14 ←0\n β”‚ summarizer.ts 333L 5C 27m CC=10 ←0\n β”‚ a2a.ts 332L 0C 47m CC=9 ←0\n β”‚ gold.ts 329L 3C 31m CC=14 ←0\n β”‚ mcp-tools.ts 323L 1C 10m CC=10 ←0\n β”‚ code-change.ts 322L 0C 35m CC=11 ←0\n β”‚ communication-helpers.ts 320L 3C 45m CC=14 ←0\n β”‚ contract-check.ts 317L 6C 39m CC=14 ←2\n β”‚ result.ts 311L 0C 23m CC=7 ←0\n β”‚ intent.ts 309L 4C 37m CC=12 ←0\n β”‚ runtime-cycle.ts 306L 1C 35m CC=9 ←0\n β”‚ !! run-persistence.ts 297L 0C 28m CC=19 ←0\n β”‚ watcher.ts 292L 6C 42m CC=12 ←0\n β”‚ reranker-llm.ts 291L 2C 35m CC=9 ←0\n β”‚ intake-service.ts 291L 2C 48m CC=13 ←0\n β”‚ linker.ts 286L 1C 52m CC=8 ←3\n β”‚ implementation-review.ts 274L 3C 33m CC=7 ←0\n β”‚ docs-llm.ts 269L 1C 28m CC=12 ←0\n β”‚ implementation-helpers-plans.ts 269L 3C 36m CC=9 ←0\n β”‚ typescript.ts 266L 1C 26m CC=8 ←0\n β”‚ tasks-llm.ts 266L 4C 22m CC=11 ←0\n β”‚ nl-llm-helpers.ts 261L 3C 31m CC=11 ←0\n β”‚ mcp.ts 261L 2C 38m CC=9 ←0\n β”‚ text-render.ts 251L 2C 33m CC=13 ←0\n β”‚ candidate.ts 250L 1C 19m CC=8 ←0\n β”‚ code-change.ts 250L 19C 0m CC=0.0 ←0\n β”‚ openrouter-request.ts 242L 4C 30m CC=9 ←0\n β”‚ openrouter.ts 240L 5C 31m CC=13 ←0\n β”‚ utils.ts 239L 0C 42m CC=8 ←0\n β”‚ diff.ts 235L 1C 38m CC=11 ←0\n β”‚ implementation-source-patch-create.ts 235L 3C 30m CC=6 ←0\n β”‚ implementation-source-patch-apply-diff.ts 233L 3C 31m CC=11 ←0\n β”‚ code-change-path.ts 232L 0C 23m CC=11 ←0\n β”‚ env.ts 231L 1C 20m CC=13 ←0\n β”‚ structured-schema.ts 218L 5C 25m CC=10 ←0\n β”‚ model-comparison.ts 218L 4C 21m CC=12 ←0\n β”‚ identity.ts 216L 3C 33m CC=12 ←0\n β”‚ intent.ts 212L 13C 0m CC=0.0 ←0\n β”‚ io.ts 211L 2C 30m CC=11 ←0\n β”‚ conclusions.ts 210L 0C 21m CC=9 ←0\n β”‚ configuration.ts 208L 1C 38m CC=10 ←0\n β”‚ git.ts 208L 4C 27m CC=6 ←0\n β”‚ implementation.ts 208L 4C 21m CC=12 ←0\n β”‚ ignore.ts 200L 3C 23m CC=10 ←0\n β”‚ docs-record.ts 193L 0C 34m CC=14 ←0\n β”‚ run-helpers.ts 188L 0C 18m CC=11 ←0\n β”‚ a2a-card.ts 181L 0C 7m CC=3 ←0\n β”‚ markdown-llm.ts 178L 2C 11m CC=9 ←0\n β”‚ pipeline.ts 173L 7C 0m CC=0.0 ←0\n β”‚ task-synthesis-materialize.ts 172L 0C 35m CC=5 ←0\n β”‚ typescript.ts 172L 6C 16m CC=2 ←0\n β”‚ a2a-run-list-item.ts 171L 2C 29m CC=8 ←0\n β”‚ ast.ts 167L 2C 15m CC=12 ←0\n β”‚ id.ts 167L 0C 16m CC=5 ←0\n β”‚ a2a-types.ts 164L 9C 14m CC=10 ←0\n β”‚ nl-llm.ts 163L 2C 19m CC=10 ←0\n β”‚ linker-candidates.ts 163L 1C 23m CC=10 ←0\n β”‚ intake-store.ts 161L 3C 19m CC=11 ←0\n β”‚ markdown-paths.ts 158L 2C 22m CC=12 ←0\n β”‚ record.ts 158L 2C 10m CC=6 ←0\n β”‚ intake-protobuf.ts 158L 0C 29m CC=13 ←0\n β”‚ intake_cli 156L 0C 6m CC=10 ←0\n β”‚ types.ts 155L 8C 0m CC=0.0 ←0\n β”‚ text.ts 153L 0C 34m CC=6 ←0\n β”‚ diff-ui.ts 152L 0C 7m CC=5 ←0\n β”‚ text-myers.ts 152L 3C 27m CC=9 ←0\n β”‚ docs-chunks.ts 147L 0C 29m CC=8 ←0\n β”‚ symbol-resolution.ts 146L 3C 22m CC=10 ←0\n β”‚ !! a2a-message-command.ts 144L 0C 30m CC=20 ←1\n β”‚ implementation-helpers-acceptance.ts 141L 2C 15m CC=4 ←0\n β”‚ content-cache.ts 139L 4C 12m CC=5 ←0\n β”‚ classifier.ts 135L 4C 32m CC=6 ←0\n β”‚ gold-extraction.ts 127L 0C 13m CC=5 ←0\n β”‚ implementation-semantic.ts 125L 1C 13m CC=9 ←0\n β”‚ a2a-message.ts 125L 0C 19m CC=12 ←0\n β”‚ subactor.ts 122L 1C 9m CC=13 ←0\n β”‚ validation.ts 113L 2C 28m CC=11 ←0\n β”‚ validation.ts 111L 0C 11m CC=7 ←0\n β”‚ nl.ts 107L 1C 12m CC=10 ←0\n β”‚ types.ts 106L 11C 0m CC=0.0 ←0\n β”‚ svg.ts 104L 2C 7m CC=2 ←0\n β”‚ changelog.ts 99L 0C 16m CC=11 ←0\n β”‚ records.ts 97L 0C 10m CC=6 ←0\n β”‚ a2a-history.ts 96L 1C 17m CC=13 ←0\n β”‚ todo.ts 93L 0C 18m CC=5 ←0\n β”‚ changelog-signal.ts 89L 0C 12m CC=8 ←0\n β”‚ mcp-resources.ts 88L 0C 13m CC=6 ←0\n β”‚ contract.ts 84L 0C 7m CC=1 ←0\n β”‚ linker-relations.ts 83L 3C 7m CC=7 ←0\n β”‚ governed-intake.proto 78L 0C 0m CC=0.0 ←0\n β”‚ implementation-helpers-close.ts 75L 2C 10m CC=4 ←0\n β”‚ implementation-source-patch-diff.ts 74L 0C 16m CC=6 ←0\n β”‚ task-synthesis-payload.ts 70L 0C 8m CC=3 ←0\n β”‚ docs-types.ts 68L 7C 0m CC=0.0 ←0\n β”‚ markdown-block.ts 67L 1C 3m CC=10 ←0\n β”‚ task-synthesis-contract.ts 66L 3C 6m CC=1 ←0\n β”‚ artifact.ts 66L 2C 10m CC=6 ←0\n β”‚ payload.ts 65L 0C 8m CC=12 ←0\n β”‚ communication.ts 63L 1C 7m CC=7 ←0\n β”‚ capability-evidence.ts 62L 0C 14m CC=10 ←0\n β”‚ implementation-targets.ts 61L 0C 9m CC=5 ←0\n β”‚ render.ts 61L 0C 13m CC=10 ←0\n β”‚ run-summary.ts 58L 1C 4m CC=5 ←0\n β”‚ target.ts 57L 0C 12m CC=9 ←0\n β”‚ security.ts 55L 0C 11m CC=7 ←0\n β”‚ index.ts 53L 0C 0m CC=0.0 ←0\n β”‚ gold-metrics.ts 50L 1C 11m CC=4 ←0\n β”‚ external.ts 48L 1C 5m CC=9 ←0\n β”‚ diagnostics.ts 45L 2C 0m CC=0.0 ←0\n β”‚ gold-cli.ts 44L 0C 10m CC=12 ←0\n β”‚ docs-schema.ts 43L 0C 5m CC=1 ←0\n β”‚ reranker-response.ts 42L 1C 5m CC=1 ←0\n β”‚ python.ts 39L 0C 6m CC=2 ←0\n β”‚ text-types.ts 39L 4C 0m CC=0.0 ←0\n β”‚ implementation-helpers.ts 39L 0C 0m CC=0.0 ←0\n β”‚ intake-actions.ts 38L 0C 10m CC=6 ←0\n β”‚ participant-registry-v2.schema.json 36L 0C 0m CC=0.0 ←0\n β”‚ markdown.ts 35L 1C 4m CC=4 ←0\n β”‚ php.ts 34L 0C 6m CC=2 ←0\n β”‚ compile-cli.ts 34L 0C 7m CC=10 ←0\n β”‚ constants.ts 31L 0C 14m CC=1 ←0\n β”‚ unsupported.ts 30L 0C 4m CC=5 ←0\n β”‚ implementation-helpers-shared.ts 29L 0C 2m CC=1 ←0\n β”‚ !! record-metadata.ts 27L 0C 3m CC=17 ←0\n β”‚ implementation-indexing.ts 25L 0C 4m CC=4 ←3\n β”‚ failure.ts 25L 1C 3m CC=7 ←0\n β”‚ grounding.ts 24L 0C 5m CC=5 ←0\n β”‚ rust.ts 20L 0C 2m CC=1 ←0\n β”‚ go.ts 20L 0C 2m CC=1 ←0\n β”‚ java.ts 20L 0C 2m CC=1 ←0\n β”‚ types.ts 20L 2C 0m CC=0.0 ←0\n β”‚ event-v1.schema.json 20L 0C 0m CC=0.0 ←0\n β”‚ envelope-v1.schema.json 20L 0C 0m CC=0.0 ←0\n β”‚ audit.ts 19L 0C 1m CC=1 ←0\n β”‚ !! diff-ui-script.ts 17L 0C 8m CC=15 ←0\n β”‚ implementation-diagnostics.ts 17L 0C 2m CC=2 ←0\n β”‚ command-v1.schema.json 17L 0C 0m CC=0.0 ←0\n β”‚ query-v1.schema.json 11L 0C 0m CC=0.0 ←0\n β”‚ diagnostic-v1.schema.json 11L 0C 0m CC=0.0 ←0\n β”‚ mcp-errors.ts 10L 1C 2m CC=3 ←0\n β”‚ git-binary.ts 10L 0C 2m CC=1 ←0\n β”‚ implementation-source-patch.ts 9L 0C 0m CC=0.0 ←0\n β”‚ result-v1.schema.json 9L 0C 0m CC=0.0 ←0\n β”‚ index.ts 8L 0C 0m CC=0.0 ←0\n β”‚ implementation-source-patch-apply.ts 8L 0C 0m CC=0.0 ←0\n β”‚ index.ts 4L 0C 0m CC=0.0 ←0\n β”‚ index.ts 4L 0C 0m CC=0.0 ←0\n β”‚ version.ts 2L 0C 0m CC=0.0 ←0\n β”‚ version.ts 2L 0C 0m CC=0.0 ←0\n β”‚ index.ts 1L 0C 0m CC=0.0 ←0\n β”‚ implementation.ts 1L 0C 0m CC=0.0 ←0\n β”‚ llm.ts 1L 0C 0m CC=0.0 ←0\n β”‚\n java/ CCΜ„=3.0 ←in:2 β†’out:0\n β”‚ JavaAstExtract.java 260L 1C 12m CC=10 ←1\n β”‚\n sdk/ CCΜ„=2.7 ←in:0 β†’out:0\n β”‚ client 469L 7C 45m CC=7 ←0\n β”‚ index.ts 420L 14C 45m CC=8 ←0\n β”‚ Client.php 401L 1C 27m CC=11 ←0\n β”‚ runtime 225L 3C 10m CC=9 ←0\n β”‚ !! client.rs 221L 1C 19m CC=18 ←0\n β”‚ types.go 215L 19C 2m CC=4 ←0\n β”‚ client.go 197L 3C 10m CC=9 ←0\n β”‚ todo2code_sdk 171L 1C 11m CC=2 ←0\n β”‚ !! main.go 163L 0C 5m CC=26 ←0\n β”‚ types.rs 140L 11C 1m CC=2 ←0\n β”‚ actions.go 136L 0C 18m CC=3 ←0\n β”‚ basic.php 112L 0C 0m CC=0.0 ←0\n β”‚ !! basic.rs 108L 0C 3m CC=20 ←0\n β”‚ actions.rs 100L 1C 20m CC=4 ←0\n β”‚ basic 95L 0C 1m CC=11 ←0\n β”‚ !! basic.ts 84L 0C 19m CC=17 ←0\n β”‚ lib.rs 49L 0C 0m CC=0.0 ←0\n β”‚ error.rs 37L 2C 2m CC=2 ←0\n β”‚ local_runtime 36L 0C 1m CC=1 ←0\n β”‚ __init__ 33L 0C 0m CC=0.0 ←0\n β”‚ package.json 32L 0C 0m CC=0.0 ←0\n β”‚ todo2code.go 30L 0C 0m CC=0.0 ←0\n β”‚ Error.php 25L 1C 2m CC=1 ←0\n β”‚ tsconfig.json 20L 0C 0m CC=0.0 ←0\n β”‚ composer.json 18L 0C 0m CC=0.0 ←0\n β”‚ Cargo.toml 17L 0C 0m CC=0.0 ←0\n β”‚ pyproject.toml 17L 0C 0m CC=0.0 ←0\n β”‚ __init__ 13L 0C 0m CC=0.0 ←0\n β”‚ __init__ 1L 0C 0m CC=0.0 ←0\n β”‚\n examples/ CCΜ„=2.3 ←in:0 β†’out:0\n β”‚ request-handlers.ts 88L 0C 18m CC=9 ←0\n β”‚ render.ts 64L 1C 12m CC=4 ←0\n β”‚ api.ts 50L 3C 6m CC=6 ←1\n β”‚ store.ts 48L 3C 4m CC=1 ←0\n β”‚ server.ts 43L 1C 8m CC=4 ←0\n β”‚ app.ts 43L 1C 7m CC=4 ←0\n β”‚ participants.json 37L 0C 0m CC=0.0 ←0\n β”‚ validation.ts 31L 1C 7m CC=10 ←0\n β”‚ python 23L 0C 0m CC=0.0 ←0\n β”‚ typescript.mjs 16L 0C 1m CC=1 ←0\n β”‚ tsconfig.json 15L 0C 0m CC=0.0 ←0\n β”‚ tsconfig.json 14L 0C 0m CC=0.0 ←0\n β”‚ runtime.ts 13L 1C 2m CC=2 ←0\n β”‚ helper 9L 0C 2m CC=1 ←0\n β”‚\n rust-ast/ CCΜ„=1.9 ←in:0 β†’out:0\n β”‚ main.rs 322L 3C 23m CC=9 ←0\n β”‚ Cargo.toml 12L 0C 0m CC=0.0 ←0\n β”‚\n ./ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! goal.yaml 530L 0C 0m CC=0.0 ←0\n β”‚ Makefile 132L 0C 0m CC=0.0 ←0\n β”‚ project.sh 124L 0C 3m CC=0.0 ←0\n β”‚ project2.sh 79L 0C 0m CC=0.0 ←0\n β”‚ package.json 52L 0C 0m CC=0.0 ←0\n β”‚ Dockerfile 45L 0C 0m CC=0.0 ←0\n β”‚ compose.e2e.yml 27L 0C 0m CC=0.0 ←0\n β”‚ tsconfig.json 23L 0C 0m CC=0.0 ←0\n β”‚ docker-compose.yml 18L 0C 0m CC=0.0 ←0\n β”‚ nlp2uri.yaml 8L 0C 0m CC=0.0 ←0\n β”‚\n schemas/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! gold-dataset.schema.json 585L 0C 0m CC=0.0 ←0\n β”‚ document-extraction-response.schema.json 186L 0C 0m CC=0.0 ←0\n β”‚ intent-record.schema.json 132L 0C 0m CC=0.0 ←0\n β”‚ semantic-rerank.schema.json 113L 0C 0m CC=0.0 ←0\n β”‚ code-change-plan.schema.json 98L 0C 0m CC=0.0 ←0\n β”‚ operation-plan.schema.json 94L 0C 0m CC=0.0 ←0\n β”‚ intent-graph-diff.schema.json 80L 0C 0m CC=0.0 ←0\n β”‚ code-change-source-patch.schema.json 63L 0C 0m CC=0.0 ←0\n β”‚ todo-proposal.schema.json 61L 0C 0m CC=0.0 ←0\n β”‚ todo-patch.schema.json 59L 0C 0m CC=0.0 ←0\n β”‚ semantic-candidate-set.schema.json 54L 0C 0m CC=0.0 ←0\n β”‚ code-change-acceptance.schema.json 53L 0C 0m CC=0.0 ←0\n β”‚ conclusion.schema.json 51L 0C 0m CC=0.0 ←0\n β”‚ intent-graph.schema.json 40L 0C 0m CC=0.0 ←0\n β”‚ participant-synthesis.schema.json 39L 0C 0m CC=0.0 ←0\n β”‚ variable-contract.schema.json 38L 0C 0m CC=0.0 ←0\n β”‚ code-change-source-apply-receipt.schema.json 31L 0C 0m CC=0.0 ←0\n β”‚ code-change-review.schema.json 27L 0C 0m CC=0.0 ←0\n β”‚ participant-registry.schema.json 27L 0C 0m CC=0.0 ←0\n β”‚ code-change-close-result.schema.json 26L 0C 0m CC=0.0 ←0\n β”‚ code-change-plan-set.schema.json 22L 0C 0m CC=0.0 ←0\n β”‚ code-change-source-patch-set.schema.json 18L 0C 0m CC=0.0 ←0\n β”‚\n adapters/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ package.json 14L 0C 0m CC=0.0 ←0\n β”‚\n evaluation/ CCΜ„=0.0 ←in:0 β†’out:0\n β”‚ !! dataset.json 2410L 0C 0m CC=0.0 ←0\n β”‚ !! dataset.json 761L 0C 0m CC=0.0 ←0\n β”‚\n\nCOUPLING:\n scripts.research sdk.python src.live src.synthesis src.graph java examples.frontend python\n scripts.research ── 7 1 1 !! fan-out\n sdk.python ── 4 1 2 1 !! fan-out\n src.live ←7 ── hub\n src.synthesis ←1 ←4 ── hub\n src.graph ←1 ←1 ── ←1\n java ←2 ── \n examples.frontend ←1 ── \n python 1 ──\n CYCLES: none\n HUB: src.live/ (fan-in=7)\n HUB: src.synthesis/ (fan-in=5)\n SMELL: scripts.research/ fan-out=9 β†’ split needed\n SMELL: sdk.python/ fan-out=8 β†’ split needed\n\nEXTERNAL:\n validation: run `vallm batch .` β†’ validation.toon\n duplication: run `redup scan .` β†’ duplication.toon\n", "is_subdir": false}, {"name": "calls.toon.yaml", "rel_path": "calls.toon.yaml", "path": "calls.toon.yaml", "size": "13.5KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# code2llm call graph | /home/tom/github/semcod/todo2code\n# generated in 0.23s\n# nodes: 399 | edges: 500 | modules: 30\n# CCΜ„=3.1\n\nHUBS[20]:\n src.cli.optionString\n CC=2 in:33 out:1 total:34\n src.cli.optionNumber\n CC=5 in:20 out:5 total:25\n src.extractors.git.extractRepositoryGitIntent\n CC=11 in:3 out:21 total:24\n src.extractors.todo.extractTodo\n CC=5 in:0 out:24 total:24\n src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited\n CC=10 in:0 out:22 total:22\n rust-ast.src.main.main\n CC=6 in:0 out:21 total:21\n rust-ast.src.main.collect_files\n CC=9 in:1 out:20 total:21\n src.extractors.todo.body\n CC=5 in:0 out:20 total:20\n src.extractors.nl.extractNlIntent\n CC=5 in:0 out:20 total:20\n src.extractors.todo.lines\n CC=5 in:0 out:20 total:20\n src.extractors.todo.relative\n CC=5 in:0 out:20 total:20\n src.cli.optionBoolean\n CC=3 in:17 out:3 total:20\n rust-ast.src.main.add\n CC=1 in:9 out:10 total:19\n src.extractors.changelog.extractChangelog\n CC=10 in:0 out:19 total:19\n src.cli.handleCommunication\n CC=11 in:0 out:18 total:18\n src.extractors.configuration.configurationRecords\n CC=4 in:4 out:12 total:16\n java.JavaAstExtract.JavaAstExtract.main\n CC=10 in:0 out:16 total:16\n src.extractors.ast.records.moduleRecords\n CC=6 in:1 out:14 total:15\n src.extractors.changelog.relative\n CC=7 in:0 out:15 total:15\n src.extractors.changelog.lines\n CC=7 in:0 out:15 total:15\n\nMODULES:\n examples.backend.src.request-handlers [12 funcs]\n MAX_BODY_BYTES CC=9 out:5\n event CC=1 out:1\n handleEventList CC=1 out:5\n handleEventPublish CC=4 out:6\n handleHealth CC=1 out:2\n handleRequest CC=9 out:5\n parseLimit CC=2 out:2\n parseOffset CC=2 out:2\n readBody CC=3 out:5\n sendJson CC=1 out:4\n examples.backend.src.server [5 funcs]\n createBackend CC=4 out:5\n sendJson CC=1 out:4\n server CC=3 out:4\n startBackend CC=3 out:3\n store CC=3 out:4\n examples.backend.src.validation [7 funcs]\n ALLOWED_ACTIONS CC=10 out:5\n action CC=2 out:3\n agent CC=2 out:3\n invalid CC=1 out:0\n object CC=2 out:3\n record CC=2 out:3\n validateEventPayload CC=10 out:5\n examples.frontend.src.app [5 funcs]\n createState CC=1 out:0\n mountPanel CC=1 out:4\n refresh CC=4 out:6\n reload CC=1 out:1\n state CC=1 out:1\n examples.frontend.src.render [4 funcs]\n classifyEvent CC=4 out:0\n headerRow CC=2 out:2\n renderTable CC=3 out:4\n toRows CC=1 out:2\n examples.src.runtime [2 funcs]\n executeContract CC=1 out:1\n validateContract CC=2 out:1\n java.JavaAstExtract [10 funcs]\n add CC=1 out:0\n collect CC=1 out:11\n containsIgnored CC=3 out:2\n emit CC=1 out:3\n escape CC=9 out:6\n json CC=1 out:1\n main CC=10 out:16\n map CC=1 out:0\n slash CC=1 out:1\n try CC=3 out:13\n rust-ast.src.main [21 funcs]\n add CC=1 out:10\n arguments CC=5 out:9\n collect_files CC=9 out:20\n excerpt CC=1 out:7\n main CC=6 out:21\n modifiers CC=3 out:4\n qualified CC=2 out:3\n slash CC=1 out:2\n type_item CC=1 out:8\n visit_expr_call CC=1 out:9\n src.cli [80 funcs]\n absolute CC=3 out:1\n buildCommonPipelineOptions CC=3 out:8\n buildDiffPayload CC=2 out:2\n buildFileDiff CC=3 out:6\n buildGitDiff CC=5 out:6\n buildPipelineOptions CC=1 out:1\n buildWorkspaceComparisonOptions CC=3 out:6\n command CC=3 out:2\n commandHandlers CC=2 out:6\n context CC=2 out:4\n src.extractors.ast [2 funcs]\n isExtractionResult CC=5 out:3\n isIntentRecords CC=2 out:1\n src.extractors.ast.external [3 funcs]\n execFileAsync CC=3 out:0\n result CC=2 out:1\n runExternalAstAdapter CC=9 out:6\n src.extractors.ast.records [2 funcs]\n adapterRecords CC=2 out:3\n moduleRecords CC=6 out:14\n src.extractors.changelog [5 funcs]\n body CC=7 out:15\n changelogAction CC=11 out:3\n extractChangelog CC=10 out:19\n lines CC=7 out:15\n relative CC=7 out:15\n src.extractors.communication-file-helpers [10 funcs]\n appendA2aAgentWarnings CC=5 out:4\n appendIdentityWarnings CC=4 out:2\n appendRegistryAlignmentWarnings CC=7 out:2\n appendRoleAndParticipantWarnings CC=3 out:2\n appendTimestampWarnings CC=3 out:2\n buildLocalWarnings CC=3 out:5\n envelope CC=2 out:1\n hasExplicitEnvelopeMetadata CC=1 out:2\n inferred CC=2 out:1\n shouldSkipCommunicationFile CC=8 out:3\n src.extractors.communication-helpers [23 funcs]\n basename CC=1 out:0\n communicationSegments CC=14 out:12\n fileParts CC=5 out:2\n flush CC=5 out:5\n heading CC=2 out:1\n inferGovernanceIdentityFromFilename CC=7 out:3\n inferIdentity CC=2 out:5\n inferIdentityFromPathAndFilename CC=9 out:5\n isCommunicationNoise CC=3 out:2\n isCommunicationType CC=1 out:2\n src.extractors.configuration [23 funcs]\n MAX_ENTRIES_PER_FILE CC=4 out:10\n bounded CC=1 out:3\n configurationFormat CC=6 out:4\n configurationRecords CC=4 out:12\n dockerEntries CC=6 out:6\n entries CC=1 out:3\n entry CC=1 out:1\n extractConfigurationIntent CC=4 out:10\n fileAggregate CC=3 out:10\n files CC=4 out:5\n src.extractors.docs-chunks [15 funcs]\n chunkMarkdown CC=8 out:9\n chunkPriority CC=3 out:4\n flush CC=2 out:2\n index CC=1 out:3\n item CC=1 out:3\n mapConcurrent CC=3 out:7\n markdownSections CC=4 out:2\n needles CC=1 out:2\n prioritizeDocumentChunks CC=3 out:6\n sectionLines CC=2 out:3\n src.extractors.docs-deterministic [19 funcs]\n action CC=3 out:6\n codeBlockRecord CC=2 out:2\n convertDocument CC=4 out:4\n extractDocumentationBaseline CC=4 out:8\n handleDocumentationLine CC=5 out:4\n heading CC=1 out:1\n marker CC=4 out:2\n match CC=2 out:0\n parseBulletStatement CC=6 out:3\n parseFenceBlock CC=7 out:5\n src.extractors.docs-llm [8 funcs]\n errorMessage CC=2 out:1\n extractChunk CC=12 out:8\n extractDocumentationIntent CC=3 out:12\n files CC=3 out:7\n loadDocumentChunks CC=4 out:8\n readPrompt CC=2 out:6\n requireConfiguredClient CC=3 out:4\n selectWithinBudget CC=2 out:3\n src.extractors.docs-record [20 funcs]\n OBJECT_PLACEHOLDERS CC=14 out:13\n action CC=11 out:7\n allowedAction CC=1 out:1\n allowedLifecycle CC=1 out:1\n allowedModality CC=1 out:1\n anchorToSource CC=7 out:10\n clampLine CC=1 out:3\n fallback CC=2 out:1\n hasTarget CC=4 out:1\n isPlaceholder CC=3 out:3\n src.extractors.docs-schema [5 funcs]\n documentRecord CC=1 out:8\n documentResponseContract CC=1 out:2\n documentResponseSchema CC=1 out:1\n strings CC=1 out:2\n target CC=1 out:2\n src.extractors.git [25 funcs]\n count CC=2 out:2\n createDiscoveryState CC=1 out:0\n discoverGitRepositories CC=4 out:7\n execFileAsync CC=1 out:0\n extractChangedSymbols CC=9 out:3\n extractGitIntent CC=6 out:7\n extractRepositoryGitIntent CC=11 out:21\n filterDiscoveryChildren CC=5 out:6\n finishDiscovery CC=4 out:1\n gitMarkerState CC=5 out:5\n src.extractors.markdown-llm [3 funcs]\n client CC=2 out:2\n extractMarkdownIntentAudited CC=9 out:14\n fallbackOrThrow CC=2 out:5\n src.extractors.markdown-llm-helpers [9 funcs]\n emptyCoverage CC=2 out:1\n enrichBatchCovering CC=6 out:11\n enrichMarkdownBatchWithCorrection CC=1 out:0\n enrichMarkdownRecords CC=13 out:9\n enrichSplitBatch CC=2 out:7\n enrichment CC=1 out:6\n markdownResponseContract CC=1 out:7\n outcomes CC=4 out:2\n strings CC=1 out:5\n src.extractors.markdown-paths [14 funcs]\n addBasenameIndexMatch CC=3 out:4\n basenames CC=11 out:10\n buildBasenameIndex CC=7 out:7\n createBasenameIndexState CC=1 out:1\n createMarkdownPathResolver CC=12 out:12\n headingDirectories CC=11 out:9\n headingScopes CC=4 out:6\n index CC=6 out:4\n isNestedCheckout CC=2 out:1\n isRepositoryPath CC=5 out:3\n src.extractors.nl [12 funcs]\n absolute CC=2 out:14\n action CC=1 out:9\n assertNlExtractionOptions CC=9 out:2\n body CC=2 out:14\n classified CC=1 out:9\n confidence CC=1 out:9\n detectMissingFields CC=10 out:5\n extractNlIntent CC=5 out:20\n inferActor CC=5 out:2\n missing CC=1 out:9\n src.extractors.nl-llm [4 funcs]\n assertNlExtractionOptions CC=2 out:4\n client CC=2 out:2\n extractNlIntentAudited CC=10 out:22\n fallbackOrThrow CC=1 out:0\n src.extractors.nl-llm-helpers [18 funcs]\n NL_ACTION_SET CC=1 out:7\n NL_MODALITY_SET CC=1 out:7\n NL_RECORD_CONTRACT CC=1 out:7\n action CC=1 out:1\n allowedAction CC=1 out:1\n allowedModality CC=1 out:1\n clampLine CC=1 out:3\n isPlaceholder CC=2 out:3\n lines CC=1 out:1\n nlStrings CC=1 out:6\n src.extractors.runtime-cycle [17 funcs]\n MAX_PER_SECTION CC=8 out:12\n boundedArray CC=8 out:4\n driftRecord CC=5 out:5\n extractRuntimeCycleIntent CC=8 out:12\n factsMetadata CC=5 out:3\n jsonScalar CC=6 out:1\n label CC=2 out:1\n parseCycle CC=7 out:5\n probeRecord CC=9 out:8\n proposalAction CC=5 out:0\n src.extractors.todo [16 funcs]\n action CC=2 out:12\n block CC=2 out:12\n body CC=5 out:20\n checked CC=2 out:12\n classified CC=2 out:12\n extractExplicitId CC=5 out:3\n extractTodo CC=5 out:24\n heading CC=1 out:1\n inferOwner CC=4 out:1\n lines CC=5 out:20\n\nEDGES:\n rust-ast.src.main.main β†’ rust-ast.src.main.arguments\n rust-ast.src.main.main β†’ rust-ast.src.main.collect_files\n rust-ast.src.main.main β†’ rust-ast.src.main.slash\n rust-ast.src.main.collect_files β†’ rust-ast.src.main.slash\n rust-ast.src.main.add β†’ rust-ast.src.main.excerpt\n rust-ast.src.main.visit_item_mod β†’ rust-ast.src.main.qualified\n rust-ast.src.main.visit_item_mod β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_item_use β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_item_struct β†’ rust-ast.src.main.type_item\n rust-ast.src.main.visit_item_enum β†’ rust-ast.src.main.type_item\n rust-ast.src.main.visit_item_trait β†’ rust-ast.src.main.type_item\n rust-ast.src.main.visit_item_type β†’ rust-ast.src.main.type_item\n rust-ast.src.main.visit_item_const β†’ rust-ast.src.main.qualified\n rust-ast.src.main.visit_item_const β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_item_const β†’ rust-ast.src.main.modifiers\n rust-ast.src.main.visit_item_static β†’ rust-ast.src.main.qualified\n rust-ast.src.main.visit_item_static β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_item_static β†’ rust-ast.src.main.modifiers\n rust-ast.src.main.visit_item_fn β†’ rust-ast.src.main.qualified\n rust-ast.src.main.visit_item_fn β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_impl_item_fn β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_expr_call β†’ rust-ast.src.main.add\n rust-ast.src.main.visit_expr_method_call β†’ rust-ast.src.main.add\n rust-ast.src.main.type_item β†’ rust-ast.src.main.qualified\n rust-ast.src.main.type_item β†’ rust-ast.src.main.add\n rust-ast.src.main.type_item β†’ rust-ast.src.main.modifiers\n examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.handleHealth\n examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.handleEventPublish\n examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.handleEventList\n examples.backend.src.request-handlers.MAX_BODY_BYTES β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.handleHealth\n examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.handleEventPublish\n examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.handleEventList\n examples.backend.src.request-handlers.handleRequest β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.request-handlers.handleHealth β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.request-handlers.handleHealth β†’ examples.backend.src.request-handlers.size\n examples.backend.src.request-handlers.handleEventPublish β†’ examples.backend.src.request-handlers.readBody\n examples.backend.src.request-handlers.handleEventPublish β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.request-handlers.validation β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.request-handlers.event β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.request-handlers.handleEventList β†’ examples.backend.src.request-handlers.parseOffset\n examples.backend.src.request-handlers.handleEventList β†’ examples.backend.src.request-handlers.parseLimit\n examples.backend.src.request-handlers.handleEventList β†’ examples.backend.src.request-handlers.sendJson\n examples.backend.src.validation.ALLOWED_ACTIONS β†’ examples.backend.src.validation.invalid\n examples.backend.src.validation.validateEventPayload β†’ examples.backend.src.validation.invalid\n examples.backend.src.validation.record β†’ examples.backend.src.validation.invalid\n examples.backend.src.validation.agent β†’ examples.backend.src.validation.invalid\n examples.backend.src.validation.action β†’ examples.backend.src.validation.invalid\n examples.backend.src.validation.object β†’ examples.backend.src.validation.invalid\n examples.backend.src.server.createBackend β†’ examples.backend.src.server.sendJson\n", "is_subdir": false}, {"name": "calls.yaml", "rel_path": "calls.yaml", "path": "calls.yaml", "size": "262.9KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "project: /home/tom/github/semcod/todo2code\ngenerated_from: code2llm call graph analysis\nstats:\n total_nodes: 399\n total_edges: 500\n modules_count: 30\nnodes:\n src.extractors.docs-llm.DocumentationLlmRequiredError.errorMessage:\n name: errorMessage\n module: src.extractors.docs-llm\n line: 267\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 3\n examples.backend.src.request-handlers.handleHealth:\n name: handleHealth\n module: examples.backend.src.request-handlers\n line: 25\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.extractors.nl.absolute:\n name: absolute\n module: src.extractors.nl\n line: 40\n cyclomatic_complexity: 2\n calls_out: 14\n calls_in: 0\n rust-ast.src.main.visit_item_use:\n name: visit_item_use\n module: rust-ast.src.main\n line: 216\n cyclomatic_complexity: 1\n calls_out: 8\n calls_in: 0\n src.extractors.markdown-paths.addBasenameIndexMatch:\n name: addBasenameIndexMatch\n module: src.extractors.markdown-paths\n line: 148\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n java.JavaAstExtract.JavaAstExtract.slash:\n name: slash\n module: java.JavaAstExtract\n line: 259\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.cli.main:\n name: main\n module: src.cli\n line: 61\n cyclomatic_complexity: 9\n calls_out: 12\n calls_in: 1\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.markdownResponseContract:\n name: markdownResponseContract\n module: src.extractors.markdown-llm-helpers\n line: 369\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 1\n examples.backend.src.validation.agent:\n name: agent\n module: examples.backend.src.validation\n line: 22\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichment:\n name: enrichment\n module: src.extractors.markdown-llm-helpers\n line: 371\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 0\n src.extractors.git.extractChangedSymbols:\n name: extractChangedSymbols\n module: src.extractors.git\n line: 376\n cyclomatic_complexity: 9\n calls_out: 3\n calls_in: 1\n src.extractors.docs-llm.DocumentationLlmRequiredError.extractDocumentationIntent:\n name: extractDocumentationIntent\n module: src.extractors.docs-llm\n line: 45\n cyclomatic_complexity: 3\n calls_out: 12\n calls_in: 0\n src.cli.svg:\n name: svg\n module: src.cli\n line: 564\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.cli.handleExtractAst:\n name: handleExtractAst\n module: src.cli\n line: 619\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.cli.handleDiagnose:\n name: handleDiagnose\n module: src.cli\n line: 139\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.cli.handleExtract:\n name: handleExtract\n module: src.cli\n line: 577\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 0\n src.cli.result:\n name: result\n module: src.cli\n line: 770\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.nl.confidence:\n name: confidence\n module: src.extractors.nl\n line: 53\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n src.extractors.runtime-cycle.sourcePathFor:\n name: sourcePathFor\n module: src.extractors.runtime-cycle\n line: 89\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 2\n src.extractors.docs-deterministic.primePathMapper:\n name: primePathMapper\n module: src.extractors.docs-deterministic\n line: 87\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 3\n src.extractors.markdown-paths.buildBasenameIndex:\n name: buildBasenameIndex\n module: src.extractors.markdown-paths\n line: 90\n cyclomatic_complexity: 7\n calls_out: 7\n calls_in: 1\n src.extractors.docs-chunks.sectionText:\n name: sectionText\n module: src.extractors.docs-chunks\n line: 76\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.cli.taskFile:\n name: taskFile\n module: src.cli\n line: 348\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.cli.handleCommunication:\n name: handleCommunication\n module: src.cli\n line: 666\n cyclomatic_complexity: 11\n calls_out: 18\n calls_in: 0\n src.extractors.docs-deterministic.heading:\n name: heading\n module: src.extractors.docs-deterministic\n line: 180\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.communication-helpers.nestedRoleIndex:\n name: nestedRoleIndex\n module: src.extractors.communication-helpers\n line: 155\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 0\n src.cli.isPlanSet:\n name: isPlanSet\n module: src.cli\n line: 263\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.extractors.ast.isIntentRecords:\n name: isIntentRecords\n module: src.extractors.ast\n line: 153\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownRecords:\n name: enrichMarkdownRecords\n module: src.extractors.markdown-llm-helpers\n line: 57\n cyclomatic_complexity: 13\n calls_out: 9\n calls_in: 0\n src.extractors.todo.body:\n name: body\n module: src.extractors.todo\n line: 28\n cyclomatic_complexity: 5\n calls_out: 20\n calls_in: 0\n src.extractors.communication-file-helpers.buildLocalWarnings:\n name: buildLocalWarnings\n module: src.extractors.communication-file-helpers\n line: 254\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 0\n src.cli.doctor:\n name: doctor\n module: src.cli\n line: 757\n cyclomatic_complexity: 6\n calls_out: 7\n calls_in: 1\n examples.backend.src.request-handlers.size:\n name: size\n module: examples.backend.src.request-handlers\n line: 71\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n examples.backend.src.server.createBackend:\n name: createBackend\n module: examples.backend.src.server\n line: 16\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 1\n src.extractors.runtime-cycle.MAX_PER_SECTION:\n name: MAX_PER_SECTION\n module: src.extractors.runtime-cycle\n line: 15\n cyclomatic_complexity: 8\n calls_out: 12\n calls_in: 0\n src.extractors.markdown-paths.createMarkdownPathResolver:\n name: createMarkdownPathResolver\n module: src.extractors.markdown-paths\n line: 39\n cyclomatic_complexity: 12\n calls_out: 12\n calls_in: 0\n examples.frontend.src.app.state:\n name: state\n module: examples.frontend.src.app\n line: 37\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.cli.handleLink:\n name: handleLink\n module: src.cli\n line: 131\n cyclomatic_complexity: 2\n calls_out: 9\n calls_in: 0\n src.extractors.docs-deterministic.parseBulletStatement:\n name: parseBulletStatement\n module: src.extractors.docs-deterministic\n line: 191\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 1\n java.JavaAstExtract.JavaAstExtract.collect:\n name: collect\n module: java.JavaAstExtract\n line: 58\n cyclomatic_complexity: 1\n calls_out: 11\n calls_in: 1\n src.extractors.docs-record.anchorToSource:\n name: anchorToSource\n module: src.extractors.docs-record\n line: 93\n cyclomatic_complexity: 7\n calls_out: 10\n calls_in: 2\n src.extractors.docs-record.allowedAction:\n name: allowedAction\n module: src.extractors.docs-record\n line: 183\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.extractors.communication-helpers.listValue:\n name: listValue\n module: src.extractors.communication-helpers\n line: 259\n cyclomatic_complexity: 2\n calls_out: 8\n calls_in: 0\n src.extractors.todo.resolvedPaths:\n name: resolvedPaths\n module: src.extractors.todo\n line: 51\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n rust-ast.src.main.visit_impl_item_fn:\n name: visit_impl_item_fn\n module: rust-ast.src.main\n line: 275\n cyclomatic_complexity: 2\n calls_out: 10\n calls_in: 0\n examples.backend.src.request-handlers.handleEventList:\n name: handleEventList\n module: examples.backend.src.request-handlers\n line: 50\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 2\n src.cli.emitExtraction:\n name: emitExtraction\n module: src.cli\n line: 691\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 8\n src.extractors.communication-file-helpers.appendRegistryAlignmentWarnings:\n name: appendRegistryAlignmentWarnings\n module: src.extractors.communication-file-helpers\n line: 299\n cyclomatic_complexity: 7\n calls_out: 2\n calls_in: 1\n src.extractors.markdown-llm.MarkdownLlmRequiredError.client:\n name: client\n module: src.extractors.markdown-llm\n line: 78\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n rust-ast.src.main.visit_item_static:\n name: visit_item_static\n module: rust-ast.src.main\n line: 250\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n rust-ast.src.main.visit_item_const:\n name: visit_item_const\n module: rust-ast.src.main\n line: 243\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n java.JavaAstExtract.JavaAstExtract.json:\n name: json\n module: java.JavaAstExtract\n line: 237\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.extractors.runtime-cycle.proposalAction:\n name: proposalAction\n module: src.extractors.runtime-cycle\n line: 285\n cyclomatic_complexity: 5\n calls_out: 0\n calls_in: 1\n src.extractors.nl-llm.NlLlmRequiredError.extractNlIntentAudited:\n name: extractNlIntentAudited\n module: src.extractors.nl-llm\n line: 33\n cyclomatic_complexity: 10\n calls_out: 22\n calls_in: 0\n src.extractors.docs-deterministic.qualifyingStatement:\n name: qualifyingStatement\n module: src.extractors.docs-deterministic\n line: 270\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.extractors.runtime-cycle.results:\n name: results\n module: src.extractors.runtime-cycle\n line: 46\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 0\n src.extractors.docs-deterministic.resolver:\n name: resolver\n module: src.extractors.docs-deterministic\n line: 63\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 0\n src.extractors.docs-llm.DocumentationLlmRequiredError.loadDocumentChunks:\n name: loadDocumentChunks\n module: src.extractors.docs-llm\n line: 104\n cyclomatic_complexity: 4\n calls_out: 8\n calls_in: 1\n src.cli.parseArgs:\n name: parseArgs\n module: src.cli\n line: 779\n cyclomatic_complexity: 13\n calls_out: 5\n calls_in: 1\n src.extractors.docs-schema.documentRecord:\n name: documentRecord\n module: src.extractors.docs-schema\n line: 15\n cyclomatic_complexity: 1\n calls_out: 8\n calls_in: 0\n examples.frontend.src.render.renderTable:\n name: renderTable\n module: examples.frontend.src.render\n line: 23\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.extractors.configuration.uniqueEntries:\n name: uniqueEntries\n module: src.extractors.configuration\n line: 195\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n examples.src.runtime.executeContract:\n name: executeContract\n module: examples.src.runtime\n line: 10\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.runtime-cycle.tags:\n name: tags\n module: src.extractors.runtime-cycle\n line: 119\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 3\n src.extractors.nl-llm-helpers.NlAttemptError.action:\n name: action\n module: src.extractors.nl-llm-helpers\n line: 88\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.git.resolveDiscoveryPrefix:\n name: resolveDiscoveryPrefix\n module: src.extractors.git\n line: 264\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.extractors.docs-record.hasTarget:\n name: hasTarget\n module: src.extractors.docs-record\n line: 152\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 1\n src.extractors.configuration.yamlOrAssignmentEntries:\n name: yamlOrAssignmentEntries\n module: src.extractors.configuration\n line: 162\n cyclomatic_complexity: 7\n calls_out: 6\n calls_in: 1\n src.cli.handleDiff:\n name: handleDiff\n module: src.cli\n line: 468\n cyclomatic_complexity: 9\n calls_out: 12\n calls_in: 0\n src.cli.optionTaskMode:\n name: optionTaskMode\n module: src.cli\n line: 860\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.cli.handleCompareWorkspace:\n name: handleCompareWorkspace\n module: src.cli\n line: 330\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.extractors.docs-deterministic.extractDocumentationBaseline:\n name: extractDocumentationBaseline\n module: src.extractors.docs-deterministic\n line: 56\n cyclomatic_complexity: 4\n calls_out: 8\n calls_in: 0\n rust-ast.src.main.add:\n name: add\n module: rust-ast.src.main\n line: 158\n cyclomatic_complexity: 1\n calls_out: 10\n calls_in: 9\n src.cli.handleEvaluateCodeChange:\n name: handleEvaluateCodeChange\n module: src.cli\n line: 290\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 0\n src.extractors.configuration.entry:\n name: entry\n module: src.extractors.configuration\n line: 191\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 5\n src.extractors.todo.match:\n name: match\n module: src.extractors.todo\n line: 87\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 8\n src.extractors.docs-chunks.workerCount:\n name: workerCount\n module: src.extractors.docs-chunks\n line: 50\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n examples.frontend.src.app.refresh:\n name: refresh\n module: examples.frontend.src.app\n line: 18\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 3\n src.extractors.git.registerDiscoveredRepository:\n name: registerDiscoveredRepository\n module: src.extractors.git\n line: 252\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.extractors.communication-helpers.match:\n name: match\n module: src.extractors.communication-helpers\n line: 125\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 5\n src.extractors.todo.checked:\n name: checked\n module: src.extractors.todo\n line: 45\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n src.cli.handleWatch:\n name: handleWatch\n module: src.cli\n line: 346\n cyclomatic_complexity: 1\n calls_out: 11\n calls_in: 0\n src.extractors.ast.records.moduleRecords:\n name: moduleRecords\n module: src.extractors.ast.records\n line: 34\n cyclomatic_complexity: 6\n calls_out: 14\n calls_in: 1\n src.extractors.runtime-cycle.proposalRecord:\n name: proposalRecord\n module: src.extractors.runtime-cycle\n line: 250\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 2\n rust-ast.src.main.visit_item_mod:\n name: visit_item_mod\n module: rust-ast.src.main\n line: 206\n cyclomatic_complexity: 1\n calls_out: 11\n calls_in: 0\n src.cli.handleExtractCommunication:\n name: handleExtractCommunication\n module: src.cli\n line: 656\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 0\n src.extractors.runtime-cycle.factsMetadata:\n name: factsMetadata\n module: src.extractors.runtime-cycle\n line: 293\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.extractors.git.extractGitIntent:\n name: extractGitIntent\n module: src.extractors.git\n line: 40\n cyclomatic_complexity: 6\n calls_out: 7\n calls_in: 0\n src.extractors.docs-schema.target:\n name: target\n module: src.extractors.docs-schema\n line: 13\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.extractors.nl.object:\n name: object\n module: src.extractors.nl\n line: 51\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n rust-ast.src.main.visit_item_fn:\n name: visit_item_fn\n module: rust-ast.src.main\n line: 257\n cyclomatic_complexity: 1\n calls_out: 13\n calls_in: 0\n src.extractors.communication-helpers.heading:\n name: heading\n module: src.extractors.communication-helpers\n line: 207\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.extractors.configuration.bounded:\n name: bounded\n module: src.extractors.configuration\n line: 50\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.extractors.ast.external.execFileAsync:\n name: execFileAsync\n module: src.extractors.ast.external\n line: 8\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 2\n src.extractors.communication-file-helpers.hasExplicitEnvelopeMetadata:\n name: hasExplicitEnvelopeMetadata\n module: src.extractors.communication-file-helpers\n line: 116\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n rust-ast.src.main.qualified:\n name: qualified\n module: rust-ast.src.main\n line: 154\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 5\n java.JavaAstExtract.JavaAstExtract.map:\n name: map\n module: java.JavaAstExtract\n line: 182\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 3\n src.cli.handleGraphDiff:\n name: handleGraphDiff\n module: src.cli\n line: 494\n cyclomatic_complexity: 7\n calls_out: 11\n calls_in: 1\n src.extractors.nl-llm.NlLlmRequiredError.client:\n name: client\n module: src.extractors.nl-llm\n line: 61\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.extractors.git.root:\n name: root\n module: src.extractors.git\n line: 41\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n examples.backend.src.request-handlers.handleRequest:\n name: handleRequest\n module: examples.backend.src.request-handlers\n line: 7\n cyclomatic_complexity: 9\n calls_out: 5\n calls_in: 0\n rust-ast.src.main.modifiers:\n name: modifiers\n module: rust-ast.src.main\n line: 193\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 4\n src.extractors.runtime-cycle.violationRecord:\n name: violationRecord\n module: src.extractors.runtime-cycle\n line: 173\n cyclomatic_complexity: 4\n calls_out: 7\n calls_in: 3\n java.JavaAstExtract.JavaAstExtract.try:\n name: try\n module: java.JavaAstExtract\n line: 83\n cyclomatic_complexity: 3\n calls_out: 13\n calls_in: 1\n src.extractors.todo.text:\n name: text\n module: src.extractors.todo\n line: 48\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n examples.backend.src.validation.invalid:\n name: invalid\n module: examples.backend.src.validation\n line: 14\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 6\n src.extractors.communication-helpers.inferGovernanceIdentityFromFilename:\n name: inferGovernanceIdentityFromFilename\n module: src.extractors.communication-helpers\n line: 141\n cyclomatic_complexity: 7\n calls_out: 3\n calls_in: 1\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichSplitBatch:\n name: enrichSplitBatch\n module: src.extractors.markdown-llm-helpers\n line: 153\n cyclomatic_complexity: 2\n calls_out: 7\n calls_in: 1\n java.JavaAstExtract.JavaAstExtract.containsIgnored:\n name: containsIgnored\n module: java.JavaAstExtract\n line: 70\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.cli.emitJson:\n name: emitJson\n module: src.cli\n line: 701\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 2\n src.extractors.configuration.tomlEntries:\n name: tomlEntries\n module: src.extractors.configuration\n line: 145\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 1\n src.extractors.ast.records.adapterRecords:\n name: adapterRecords\n module: src.extractors.ast.records\n line: 5\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.cli.view:\n name: view\n module: src.cli\n line: 561\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.cli.controller:\n name: controller\n module: src.cli\n line: 351\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.extractors.communication-helpers.raw:\n name: raw\n module: src.extractors.communication-helpers\n line: 206\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n examples.frontend.src.render.headerRow:\n name: headerRow\n module: examples.frontend.src.render\n line: 55\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n examples.backend.src.server.sendJson:\n name: sendJson\n module: examples.backend.src.server\n line: 26\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 3\n rust-ast.src.main.visit_item_type:\n name: visit_item_type\n module: rust-ast.src.main\n line: 238\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.cli.handleApplySourcePatch:\n name: handleApplySourcePatch\n module: src.cli\n line: 272\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 0\n src.extractors.markdown-paths.basenames:\n name: basenames\n module: src.extractors.markdown-paths\n line: 42\n cyclomatic_complexity: 11\n calls_out: 10\n calls_in: 3\n src.extractors.changelog.relative:\n name: relative\n module: src.extractors.changelog\n line: 28\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n src.extractors.git.readStats:\n name: readStats\n module: src.extractors.git\n line: 364\n cyclomatic_complexity: 6\n calls_out: 4\n calls_in: 1\n src.extractors.runtime-cycle.jsonScalar:\n name: jsonScalar\n module: src.extractors.runtime-cycle\n line: 302\n cyclomatic_complexity: 6\n calls_out: 1\n calls_in: 3\n src.extractors.docs-deterministic.match:\n name: match\n module: src.extractors.docs-deterministic\n line: 160\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 4\n src.extractors.docs-record.OBJECT_PLACEHOLDERS:\n name: OBJECT_PLACEHOLDERS\n module: src.extractors.docs-record\n line: 21\n cyclomatic_complexity: 14\n calls_out: 13\n calls_in: 0\n src.cli.buildDiffPayload:\n name: buildDiffPayload\n module: src.cli\n line: 512\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.extractors.git.runGit:\n name: runGit\n module: src.extractors.git\n line: 325\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 5\n src.extractors.git.readCommits:\n name: readCommits\n module: src.extractors.git\n line: 334\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 1\n src.cli.context:\n name: context\n module: src.cli\n line: 535\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.extractors.markdown-paths.headingScopes:\n name: headingScopes\n module: src.extractors.markdown-paths\n line: 83\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 3\n src.extractors.ast.isExtractionResult:\n name: isExtractionResult\n module: src.extractors.ast\n line: 162\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 0\n src.cli.handleRenderTodo:\n name: handleRenderTodo\n module: src.cli\n line: 180\n cyclomatic_complexity: 8\n calls_out: 5\n calls_in: 0\n src.extractors.markdown-paths.index:\n name: index\n module: src.extractors.markdown-paths\n line: 91\n cyclomatic_complexity: 6\n calls_out: 4\n calls_in: 0\n examples.backend.src.request-handlers.handleEventPublish:\n name: handleEventPublish\n module: examples.backend.src.request-handlers\n line: 29\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 2\n src.cli.handleExtractDocs:\n name: handleExtractDocs\n module: src.cli\n line: 646\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.extractors.communication-file-helpers.envelope:\n name: envelope\n module: src.extractors.communication-file-helpers\n line: 51\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.cli.printHelp:\n name: printHelp\n module: src.cli\n line: 890\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 3\n src.extractors.nl-llm-helpers.NlAttemptError.NL_RECORD_CONTRACT:\n name: NL_RECORD_CONTRACT\n module: src.extractors.nl-llm-helpers\n line: 242\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 0\n src.extractors.todo.block:\n name: block\n module: src.extractors.todo\n line: 46\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n src.cli.optionNullableString:\n name: optionNullableString\n module: src.cli\n line: 823\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 8\n src.extractors.nl-llm-helpers.NlAttemptError.resolveAction:\n name: resolveAction\n module: src.extractors.nl-llm-helpers\n line: 167\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.extractors.configuration.lines:\n name: lines\n module: src.extractors.configuration\n line: 134\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.extractors.docs-chunks.markdownSections:\n name: markdownSections\n module: src.extractors.docs-chunks\n line: 94\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 1\n src.extractors.markdown-paths.readBasenameDirectoryEntries:\n name: readBasenameDirectoryEntries\n module: src.extractors.markdown-paths\n line: 113\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 3\n src.extractors.git.extractRepositoryGitIntent:\n name: extractRepositoryGitIntent\n module: src.extractors.git\n line: 74\n cyclomatic_complexity: 11\n calls_out: 21\n calls_in: 3\n src.extractors.todo.raw:\n name: raw\n module: src.extractors.todo\n line: 35\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.runtime-cycle.text:\n name: text\n module: src.extractors.runtime-cycle\n line: 115\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 5\n src.extractors.communication-helpers.basename:\n name: basename\n module: src.extractors.communication-helpers\n line: 168\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.extractors.git.filterDiscoveryChildren:\n name: filterDiscoveryChildren\n module: src.extractors.git\n line: 221\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 2\n src.extractors.configuration.parsed:\n name: parsed\n module: src.extractors.configuration\n line: 132\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.extractors.docs-schema.documentResponseSchema:\n name: documentResponseSchema\n module: src.extractors.docs-schema\n line: 41\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.cli.optionPipelineTaskMode:\n name: optionPipelineTaskMode\n module: src.cli\n line: 876\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 1\n src.extractors.configuration.isConfigurationPath:\n name: isConfigurationPath\n module: src.extractors.configuration\n line: 30\n cyclomatic_complexity: 10\n calls_out: 6\n calls_in: 2\n src.extractors.docs-record.resolveAction:\n name: resolveAction\n module: src.extractors.docs-record\n line: 156\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 2\n src.extractors.nl-llm-helpers.NlAttemptError.resolveModality:\n name: resolveModality\n module: src.extractors.nl-llm-helpers\n line: 171\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.cli.handleReality:\n name: handleReality\n module: src.cli\n line: 551\n cyclomatic_complexity: 9\n calls_out: 12\n calls_in: 0\n examples.backend.src.request-handlers.parseOffset:\n name: parseOffset\n module: examples.backend.src.request-handlers\n line: 59\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.extractors.git.readChangedFiles:\n name: readChangedFiles\n module: src.extractors.git\n line: 352\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 1\n src.cli.optionString:\n name: optionString\n module: src.cli\n line: 818\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 33\n src.cli.handleProposeTodo:\n name: handleProposeTodo\n module: src.cli\n line: 163\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 0\n src.extractors.docs-record.modality:\n name: modality\n module: src.extractors.docs-record\n line: 37\n cyclomatic_complexity: 11\n calls_out: 7\n calls_in: 0\n examples.backend.src.validation.record:\n name: record\n module: examples.backend.src.validation\n line: 21\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.extractors.git.processDiscoveryDirectory:\n name: processDiscoveryDirectory\n module: src.extractors.git\n line: 228\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 2\n src.extractors.docs-deterministic.parseParagraphStatement:\n name: parseParagraphStatement\n module: src.extractors.docs-deterministic\n line: 212\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n examples.backend.src.request-handlers.event:\n name: event\n module: examples.backend.src.request-handlers\n line: 46\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.docs-llm.DocumentationLlmRequiredError.selectWithinBudget:\n name: selectWithinBudget\n module: src.extractors.docs-llm\n line: 147\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.extractors.communication-helpers.item:\n name: item\n module: src.extractors.communication-helpers\n line: 197\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.extractors.docs-deterministic.parseFenceBlock:\n name: parseFenceBlock\n module: src.extractors.docs-deterministic\n line: 154\n cyclomatic_complexity: 7\n calls_out: 5\n calls_in: 1\n src.extractors.configuration.fileAggregate:\n name: fileAggregate\n module: src.extractors.configuration\n line: 82\n cyclomatic_complexity: 3\n calls_out: 10\n calls_in: 3\n src.extractors.nl-llm-helpers.NlAttemptError.clampLine:\n name: clampLine\n module: src.extractors.nl-llm-helpers\n line: 218\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.extractors.markdown-paths.createBasenameIndexState:\n name: createBasenameIndexState\n module: src.extractors.markdown-paths\n line: 105\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.extractors.nl.sourcePath:\n name: sourcePath\n module: src.extractors.nl\n line: 42\n cyclomatic_complexity: 2\n calls_out: 14\n calls_in: 0\n src.cli.resolveMainCommand:\n name: resolveMainCommand\n module: src.cli\n line: 125\n cyclomatic_complexity: 5\n calls_out: 0\n calls_in: 1\n src.extractors.git.readDiscoveryEntries:\n name: readDiscoveryEntries\n module: src.extractors.git\n line: 209\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n rust-ast.src.main.visit_item_enum:\n name: visit_item_enum\n module: rust-ast.src.main\n line: 228\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.extractors.nl-llm-helpers.NlAttemptError.nonEmptyText:\n name: nonEmptyText\n module: src.extractors.nl-llm-helpers\n line: 188\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 3\n src.extractors.git.mapWithConcurrency:\n name: mapWithConcurrency\n module: src.extractors.git\n line: 306\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n src.extractors.docs-chunks.prioritizeDocumentChunks:\n name: prioritizeDocumentChunks\n module: src.extractors.docs-chunks\n line: 3\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 0\n src.extractors.nl.assertNlExtractionOptions:\n name: assertNlExtractionOptions\n module: src.extractors.nl\n line: 25\n cyclomatic_complexity: 9\n calls_out: 2\n calls_in: 1\n src.extractors.nl-llm-helpers.NlAttemptError.NL_ACTION_SET:\n name: NL_ACTION_SET\n module: src.extractors.nl-llm-helpers\n line: 234\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 0\n src.extractors.nl-llm.NlLlmRequiredError.fallbackOrThrow:\n name: fallbackOrThrow\n module: src.extractors.nl-llm\n line: 116\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n examples.backend.src.request-handlers.parseLimit:\n name: parseLimit\n module: examples.backend.src.request-handlers\n line: 64\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.extractors.configuration.pair:\n name: pair\n module: src.extractors.configuration\n line: 156\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.extractors.nl.action:\n name: action\n module: src.extractors.nl\n line: 50\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n src.extractors.docs-deterministic.action:\n name: action\n module: src.extractors.docs-deterministic\n line: 296\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 0\n rust-ast.src.main.slash:\n name: slash\n module: rust-ast.src.main\n line: 320\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.extractors.runtime-cycle.extractRuntimeCycleIntent:\n name: extractRuntimeCycleIntent\n module: src.extractors.runtime-cycle\n line: 29\n cyclomatic_complexity: 8\n calls_out: 12\n calls_in: 0\n src.extractors.configuration.jsonEntries:\n name: jsonEntries\n module: src.extractors.configuration\n line: 131\n cyclomatic_complexity: 7\n calls_out: 7\n calls_in: 1\n src.extractors.nl-llm-helpers.NlAttemptError.statementText:\n name: statementText\n module: src.extractors.nl-llm-helpers\n line: 91\n cyclomatic_complexity: 10\n calls_out: 6\n calls_in: 0\n src.extractors.runtime-cycle.watched:\n name: watched\n module: src.extractors.runtime-cycle\n line: 129\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n src.extractors.docs-record.fallback:\n name: fallback\n module: src.extractors.docs-record\n line: 81\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.extractors.communication-helpers.fileParts:\n name: fileParts\n module: src.extractors.communication-helpers\n line: 154\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 0\n src.extractors.changelog.extractChangelog:\n name: extractChangelog\n module: src.extractors.changelog\n line: 18\n cyclomatic_complexity: 10\n calls_out: 19\n calls_in: 0\n src.extractors.nl-llm-helpers.NlAttemptError.allowedAction:\n name: allowedAction\n module: src.extractors.nl-llm-helpers\n line: 222\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.extractors.docs-chunks.needles:\n name: needles\n module: src.extractors.docs-chunks\n line: 7\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.cli.handleExtractConfig:\n name: handleExtractConfig\n module: src.cli\n line: 624\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.extractors.docs-chunks.chunkPriority:\n name: chunkPriority\n module: src.extractors.docs-chunks\n line: 23\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 2\n src.extractors.configuration.heading:\n name: heading\n module: src.extractors.configuration\n line: 150\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 0\n src.extractors.git.count:\n name: count\n module: src.extractors.git\n line: 42\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.extractors.nl.extractNlIntent:\n name: extractNlIntent\n module: src.extractors.nl\n line: 38\n cyclomatic_complexity: 5\n calls_out: 20\n calls_in: 0\n src.extractors.communication-file-helpers.appendIdentityWarnings:\n name: appendIdentityWarnings\n module: src.extractors.communication-file-helpers\n line: 282\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 1\n examples.frontend.src.app.mountPanel:\n name: mountPanel\n module: examples.frontend.src.app\n line: 36\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.extractors.nl-llm-helpers.NlAttemptError.isPlaceholder:\n name: isPlaceholder\n module: src.extractors.nl-llm-helpers\n line: 192\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.cli.buildCommonPipelineOptions:\n name: buildCommonPipelineOptions\n module: src.cli\n line: 384\n cyclomatic_complexity: 3\n calls_out: 8\n calls_in: 1\n examples.backend.src.request-handlers.validation:\n name: validation\n module: examples.backend.src.request-handlers\n line: 39\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.cli.diff:\n name: diff\n module: src.cli\n line: 504\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.extractors.nl-llm-helpers.NlAttemptError.NL_MODALITY_SET:\n name: NL_MODALITY_SET\n module: src.extractors.nl-llm-helpers\n line: 236\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 0\n src.cli.optionNumber:\n name: optionNumber\n module: src.cli\n line: 837\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 20\n src.cli.handler:\n name: handler\n module: src.cli\n line: 594\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.cli.resolvePipelineRoot:\n name: resolvePipelineRoot\n module: src.cli\n line: 367\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 3\n src.extractors.communication-helpers.nestedParticipant:\n name: nestedParticipant\n module: src.extractors.communication-helpers\n line: 157\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 0\n src.extractors.docs-deterministic.codeBlockRecord:\n name: codeBlockRecord\n module: src.extractors.docs-deterministic\n line: 325\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 2\n src.extractors.nl-llm-helpers.NlAttemptError.resolveObject:\n name: resolveObject\n module: src.extractors.nl-llm-helpers\n line: 197\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 3\n src.extractors.docs-deterministic.handleDocumentationLine:\n name: handleDocumentationLine\n module: src.extractors.docs-deterministic\n line: 132\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 1\n src.extractors.docs-chunks.sectionLines:\n name: sectionLines\n module: src.extractors.docs-chunks\n line: 75\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n java.JavaAstExtract.JavaAstExtract.escape:\n name: escape\n module: java.JavaAstExtract\n line: 240\n cyclomatic_complexity: 9\n calls_out: 6\n calls_in: 1\n src.extractors.configuration.relative:\n name: relative\n module: src.extractors.configuration\n line: 19\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.extractors.communication-helpers.nestedRole:\n name: nestedRole\n module: src.extractors.communication-helpers\n line: 156\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 0\n src.extractors.docs-chunks.takeLineBatch:\n name: takeLineBatch\n module: src.extractors.docs-chunks\n line: 128\n cyclomatic_complexity: 8\n calls_out: 2\n calls_in: 1\n src.extractors.configuration.match:\n name: match\n module: src.extractors.configuration\n line: 175\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 3\n java.JavaAstExtract.JavaAstExtract.add:\n name: add\n module: java.JavaAstExtract\n line: 181\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.cli.root:\n name: root\n module: src.cli\n line: 667\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.extractors.changelog.lines:\n name: lines\n module: src.extractors.changelog\n line: 30\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n src.cli.handleIntake:\n name: handleIntake\n module: src.cli\n line: 706\n cyclomatic_complexity: 13\n calls_out: 13\n calls_in: 0\n examples.backend.src.server.startBackend:\n name: startBackend\n module: examples.backend.src.server\n line: 35\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.cli.handleProposeSourcePatch:\n name: handleProposeSourcePatch\n module: src.cli\n line: 257\n cyclomatic_complexity: 6\n calls_out: 6\n calls_in: 0\n src.extractors.docs-record.isPlaceholder:\n name: isPlaceholder\n module: src.extractors.docs-record\n line: 75\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 2\n src.extractors.docs-record.allowedLifecycle:\n name: allowedLifecycle\n module: src.extractors.docs-record\n line: 191\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 5\n src.extractors.nl-llm-helpers.NlAttemptError.nlStrings:\n name: nlStrings\n module: src.extractors.nl-llm-helpers\n line: 241\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 3\n src.cli.handleProposeCodeChange:\n name: handleProposeCodeChange\n module: src.cli\n line: 222\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 0\n rust-ast.src.main.visit_expr_call:\n name: visit_expr_call\n module: rust-ast.src.main\n line: 288\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n rust-ast.src.main.visit_item_trait:\n name: visit_item_trait\n module: rust-ast.src.main\n line: 233\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.extractors.markdown-paths.isRepositoryPath:\n name: isRepositoryPath\n module: src.extractors.markdown-paths\n line: 76\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 4\n src.extractors.git.result:\n name: result\n module: src.extractors.git\n line: 326\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.todo.lines:\n name: lines\n module: src.extractors.todo\n line: 32\n cyclomatic_complexity: 5\n calls_out: 20\n calls_in: 0\n src.extractors.communication-helpers.normalize:\n name: normalize\n module: src.extractors.communication-helpers\n line: 282\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n examples.backend.src.server.store:\n name: store\n module: examples.backend.src.server\n line: 17\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.extractors.git.execFileAsync:\n name: execFileAsync\n module: src.extractors.git\n line: 12\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.cli.optionNlMode:\n name: optionNlMode\n module: src.cli\n line: 850\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.extractors.configuration.extractConfigurationIntent:\n name: extractConfigurationIntent\n module: src.extractors.configuration\n line: 11\n cyclomatic_complexity: 4\n calls_out: 10\n calls_in: 0\n src.extractors.docs-deterministic.statementRecord:\n name: statementRecord\n module: src.extractors.docs-deterministic\n line: 288\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.extractors.docs-deterministic.root:\n name: root\n module: src.extractors.docs-deterministic\n line: 60\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 0\n src.extractors.markdown-paths.repositoryRoot:\n name: repositoryRoot\n module: src.extractors.markdown-paths\n line: 40\n cyclomatic_complexity: 11\n calls_out: 11\n calls_in: 0\n src.extractors.nl.detectMissingFields:\n name: detectMissingFields\n module: src.extractors.nl\n line: 95\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 4\n src.cli.commandHandlers:\n name: commandHandlers\n module: src.cli\n line: 89\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 1\n rust-ast.src.main.excerpt:\n name: excerpt\n module: rust-ast.src.main\n line: 186\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 1\n src.extractors.nl-llm-helpers.NlAttemptError.toIntentRecord:\n name: toIntentRecord\n module: src.extractors.nl-llm-helpers\n line: 85\n cyclomatic_complexity: 11\n calls_out: 11\n calls_in: 0\n src.extractors.ast.external.result:\n name: result\n module: src.extractors.ast.external\n line: 32\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.cli.execFileAsync:\n name: execFileAsync\n module: src.cli\n line: 41\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 2\n src.extractors.todo.extractTodo:\n name: extractTodo\n module: src.extractors.todo\n line: 19\n cyclomatic_complexity: 5\n calls_out: 24\n calls_in: 0\n src.extractors.communication-helpers.parseEnvelope:\n name: parseEnvelope\n module: src.extractors.communication-helpers\n line: 118\n cyclomatic_complexity: 5\n calls_out: 8\n calls_in: 0\n src.extractors.docs-record.resolveModality:\n name: resolveModality\n module: src.extractors.docs-record\n line: 164\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 2\n src.extractors.todo.task:\n name: task\n module: src.extractors.todo\n line: 43\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n examples.backend.src.request-handlers.readBody:\n name: readBody\n module: examples.backend.src.request-handlers\n line: 69\n cyclomatic_complexity: 3\n calls_out: 5\n calls_in: 1\n src.extractors.communication-helpers.inferIdentityFromPathAndFilename:\n name: inferIdentityFromPathAndFilename\n module: src.extractors.communication-helpers\n line: 153\n cyclomatic_complexity: 9\n calls_out: 5\n calls_in: 1\n src.extractors.docs-deterministic.targetsOf:\n name: targetsOf\n module: src.extractors.docs-deterministic\n line: 359\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 1\n src.extractors.markdown-paths.isNestedCheckout:\n name: isNestedCheckout\n module: src.extractors.markdown-paths\n line: 121\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 3\n rust-ast.src.main.main:\n name: main\n module: rust-ast.src.main\n line: 36\n cyclomatic_complexity: 6\n calls_out: 21\n calls_in: 0\n src.extractors.communication-helpers.unquote:\n name: unquote\n module: src.extractors.communication-helpers\n line: 318\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.extractors.docs-chunks.item:\n name: item\n module: src.extractors.docs-chunks\n line: 45\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n examples.frontend.src.app.reload:\n name: reload\n module: examples.frontend.src.app\n line: 38\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.outcomes:\n name: outcomes\n module: src.extractors.markdown-llm-helpers\n line: 71\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 0\n src.extractors.markdown-paths.scanDirectoryForBasenames:\n name: scanDirectoryForBasenames\n module: src.extractors.markdown-paths\n line: 125\n cyclomatic_complexity: 8\n calls_out: 8\n calls_in: 3\n java.JavaAstExtract.JavaAstExtract.emit:\n name: emit\n module: java.JavaAstExtract\n line: 219\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.extractors.docs-deterministic.convertDocument:\n name: convertDocument\n module: src.extractors.docs-deterministic\n line: 100\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 3\n src.extractors.ast.external.runExternalAstAdapter:\n name: runExternalAstAdapter\n module: src.extractors.ast.external\n line: 23\n cyclomatic_complexity: 9\n calls_out: 6\n calls_in: 0\n src.extractors.docs-llm.DocumentationLlmRequiredError.extractChunk:\n name: extractChunk\n module: src.extractors.docs-llm\n line: 161\n cyclomatic_complexity: 12\n calls_out: 8\n calls_in: 1\n src.extractors.docs-schema.strings:\n name: strings\n module: src.extractors.docs-schema\n line: 12\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.extractors.runtime-cycle.label:\n name: label\n module: src.extractors.runtime-cycle\n line: 111\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 5\n examples.backend.src.request-handlers.sendJson:\n name: sendJson\n module: examples.backend.src.request-handlers\n line: 81\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 7\n src.cli.optionList:\n name: optionList\n module: src.cli\n line: 845\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 3\n src.cli.handleExtractGit:\n name: handleExtractGit\n module: src.cli\n line: 614\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.extractors.todo.extractExplicitId:\n name: extractExplicitId\n module: src.extractors.todo\n line: 91\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 11\n src.cli.handleExtractNl:\n name: handleExtractNl\n module: src.cli\n line: 601\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 0\n src.cli.command:\n name: command\n module: src.cli\n line: 72\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.cli.formatWatchEvent:\n name: formatWatchEvent\n module: src.cli\n line: 448\n cyclomatic_complexity: 10\n calls_out: 7\n calls_in: 5\n src.extractors.nl-llm-helpers.NlAttemptError.normalizedText:\n name: normalizedText\n module: src.extractors.nl-llm-helpers\n line: 89\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.cli.diagnosticsPath:\n name: diagnosticsPath\n module: src.cli\n line: 557\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.extractors.communication-helpers.sameStrings:\n name: sameStrings\n module: src.extractors.communication-helpers\n line: 281\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 0\n examples.backend.src.validation.ALLOWED_ACTIONS:\n name: ALLOWED_ACTIONS\n module: examples.backend.src.validation\n line: 11\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.extractors.communication-file-helpers.appendTimestampWarnings:\n name: appendTimestampWarnings\n module: src.extractors.communication-file-helpers\n line: 328\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n rust-ast.src.main.type_item:\n name: type_item\n module: rust-ast.src.main\n line: 306\n cyclomatic_complexity: 1\n calls_out: 8\n calls_in: 4\n src.extractors.docs-llm.DocumentationLlmRequiredError.requireConfiguredClient:\n name: requireConfiguredClient\n module: src.extractors.docs-llm\n line: 85\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n src.cli.handleRenderCodeChange:\n name: handleRenderCodeChange\n module: src.cli\n line: 241\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 0\n src.extractors.nl-llm-helpers.NlAttemptError.sourceExcerpt:\n name: sourceExcerpt\n module: src.extractors.nl-llm-helpers\n line: 157\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 2\n src.extractors.docs-deterministic.parseSectionHeading:\n name: parseSectionHeading\n module: src.extractors.docs-deterministic\n line: 173\n cyclomatic_complexity: 9\n calls_out: 4\n calls_in: 1\n src.extractors.communication-helpers.inferIdentity:\n name: inferIdentity\n module: src.extractors.communication-helpers\n line: 132\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.extractors.git.takeNextDiscoveryDirectory:\n name: takeNextDiscoveryDirectory\n module: src.extractors.git\n line: 201\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 2\n src.cli.handleSummarize:\n name: handleSummarize\n module: src.cli\n line: 146\n cyclomatic_complexity: 5\n calls_out: 8\n calls_in: 0\n src.cli.reportPipelineDegradation:\n name: reportPipelineDegradation\n module: src.cli\n line: 882\n cyclomatic_complexity: 6\n calls_out: 2\n calls_in: 1\n src.extractors.communication-helpers.isTicketEvidenceFile:\n name: isTicketEvidenceFile\n module: src.extractors.communication-helpers\n line: 167\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 0\n src.extractors.markdown-paths.headingDirectories:\n name: headingDirectories\n module: src.extractors.markdown-paths\n line: 46\n cyclomatic_complexity: 11\n calls_out: 9\n calls_in: 0\n src.cli.file:\n name: file\n module: src.cli\n line: 602\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 2\n examples.backend.src.validation.validateEventPayload:\n name: validateEventPayload\n module: examples.backend.src.validation\n line: 13\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.extractors.communication-file-helpers.appendA2aAgentWarnings:\n name: appendA2aAgentWarnings\n module: src.extractors.communication-file-helpers\n line: 314\n cyclomatic_complexity: 5\n calls_out: 4\n calls_in: 1\n src.extractors.todo.inferOwner:\n name: inferOwner\n module: src.extractors.todo\n line: 86\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 11\n src.extractors.runtime-cycle.probeRecord:\n name: probeRecord\n module: src.extractors.runtime-cycle\n line: 134\n cyclomatic_complexity: 9\n calls_out: 8\n calls_in: 3\n src.extractors.docs-record.target:\n name: target\n module: src.extractors.docs-record\n line: 35\n cyclomatic_complexity: 11\n calls_out: 7\n calls_in: 0\n src.extractors.git.createDiscoveryState:\n name: createDiscoveryState\n module: src.extractors.git\n line: 184\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichBatchCovering:\n name: enrichBatchCovering\n module: src.extractors.markdown-llm-helpers\n line: 112\n cyclomatic_complexity: 6\n calls_out: 11\n calls_in: 3\n rust-ast.src.main.collect_files:\n name: collect_files\n module: rust-ast.src.main\n line: 101\n cyclomatic_complexity: 9\n calls_out: 20\n calls_in: 1\n src.extractors.docs-chunks.worker:\n name: worker\n module: src.extractors.docs-chunks\n line: 41\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 4\n examples.frontend.src.render.classifyEvent:\n name: classifyEvent\n module: examples.frontend.src.render\n line: 13\n cyclomatic_complexity: 4\n calls_out: 0\n calls_in: 1\n src.cli.handleExtractMarkdown:\n name: handleExtractMarkdown\n module: src.cli\n line: 636\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.extractors.nl-llm.NlLlmRequiredError.assertNlExtractionOptions:\n name: assertNlExtractionOptions\n module: src.extractors.nl-llm\n line: 38\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 1\n src.extractors.docs-llm.DocumentationLlmRequiredError.files:\n name: files\n module: src.extractors.docs-llm\n line: 110\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 0\n src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited:\n name: extractMarkdownIntentAudited\n module: src.extractors.markdown-llm\n line: 34\n cyclomatic_complexity: 9\n calls_out: 14\n calls_in: 0\n src.extractors.git.gitMarkerState:\n name: gitMarkerState\n module: src.extractors.git\n line: 277\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 1\n src.extractors.runtime-cycle.parseCycle:\n name: parseCycle\n module: src.extractors.runtime-cycle\n line: 68\n cyclomatic_complexity: 7\n calls_out: 5\n calls_in: 2\n src.extractors.communication-file-helpers.shouldSkipCommunicationFile:\n name: shouldSkipCommunicationFile\n module: src.extractors.communication-file-helpers\n line: 102\n cyclomatic_complexity: 8\n calls_out: 3\n calls_in: 2\n rust-ast.src.main.visit_expr_method_call:\n name: visit_expr_method_call\n module: rust-ast.src.main\n line: 296\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 0\n src.extractors.configuration.dockerEntries:\n name: dockerEntries\n module: src.extractors.configuration\n line: 173\n cyclomatic_complexity: 6\n calls_out: 6\n calls_in: 1\n src.cli.pipeline:\n name: pipeline\n module: src.cli\n line: 349\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.extractors.git.isGitWorkTree:\n name: isGitWorkTree\n module: src.extractors.git\n line: 287\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 4\n src.extractors.communication-helpers.communicationSegments:\n name: communicationSegments\n module: src.extractors.communication-helpers\n line: 181\n cyclomatic_complexity: 14\n calls_out: 12\n calls_in: 0\n src.extractors.changelog.body:\n name: body\n module: src.extractors.changelog\n line: 27\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.enrichMarkdownBatchWithCorrection:\n name: enrichMarkdownBatchWithCorrection\n module: src.extractors.markdown-llm-helpers\n line: 187\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.cli.buildWorkspaceComparisonOptions:\n name: buildWorkspaceComparisonOptions\n module: src.cli\n line: 414\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 1\n src.cli.handleExtractRuntime:\n name: handleExtractRuntime\n module: src.cli\n line: 629\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.extractors.configuration.configurationFormat:\n name: configurationFormat\n module: src.extractors.configuration\n line: 113\n cyclomatic_complexity: 6\n calls_out: 4\n calls_in: 1\n rust-ast.src.main.arguments:\n name: arguments\n module: rust-ast.src.main\n line: 82\n cyclomatic_complexity: 5\n calls_out: 9\n calls_in: 1\n src.extractors.docs-deterministic.marker:\n name: marker\n module: src.extractors.docs-deterministic\n line: 162\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 0\n src.cli.absolute:\n name: absolute\n module: src.cli\n line: 712\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 0\n src.extractors.configuration.findKeyLine:\n name: findKeyLine\n module: src.extractors.configuration\n line: 204\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 3\n src.cli.resolveWatchTaskFile:\n name: resolveWatchTaskFile\n module: src.cli\n line: 409\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n src.extractors.communication-file-helpers.inferred:\n name: inferred\n module: src.extractors.communication-file-helpers\n line: 52\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.extractors.todo.heading:\n name: heading\n module: src.extractors.todo\n line: 36\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.docs-chunks.flush:\n name: flush\n module: src.extractors.docs-chunks\n line: 63\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 3\n src.extractors.communication-helpers.isCommunicationType:\n name: isCommunicationType\n module: src.extractors.communication-helpers\n line: 251\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 6\n examples.backend.src.validation.action:\n name: action\n module: examples.backend.src.validation\n line: 23\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.extractors.communication-helpers.normalizeType:\n name: normalizeType\n module: src.extractors.communication-helpers\n line: 246\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 0\n src.cli.diagnostics:\n name: diagnostics\n module: src.cli\n line: 558\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n examples.backend.src.request-handlers.MAX_BODY_BYTES:\n name: MAX_BODY_BYTES\n module: examples.backend.src.request-handlers\n line: 5\n cyclomatic_complexity: 9\n calls_out: 5\n calls_in: 0\n examples.backend.src.server.server:\n name: server\n module: examples.backend.src.server\n line: 18\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.extractors.configuration.files:\n name: files\n module: src.extractors.configuration\n line: 15\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 0\n src.extractors.docs-deterministic.readParagraph:\n name: readParagraph\n module: src.extractors.docs-deterministic\n line: 235\n cyclomatic_complexity: 11\n calls_out: 5\n calls_in: 1\n src.extractors.docs-record.linesFromChunk:\n name: linesFromChunk\n module: src.extractors.docs-record\n line: 172\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 5\n src.extractors.nl.inferActor:\n name: inferActor\n module: src.extractors.nl\n line: 87\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 9\n src.extractors.docs-record.action:\n name: action\n module: src.extractors.docs-record\n line: 36\n cyclomatic_complexity: 11\n calls_out: 7\n calls_in: 0\n src.extractors.docs-record.clampLine:\n name: clampLine\n module: src.extractors.docs-record\n line: 179\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.extractors.runtime-cycle.boundedArray:\n name: boundedArray\n module: src.extractors.runtime-cycle\n line: 94\n cyclomatic_complexity: 8\n calls_out: 4\n calls_in: 3\n src.extractors.docs-chunks.splitLongSection:\n name: splitLongSection\n module: src.extractors.docs-chunks\n line: 107\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 3\n src.extractors.todo.classified:\n name: classified\n module: src.extractors.todo\n line: 49\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n src.extractors.git.state:\n name: state\n module: src.extractors.git\n line: 172\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 0\n src.extractors.runtime-cycle.driftRecord:\n name: driftRecord\n module: src.extractors.runtime-cycle\n line: 211\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 2\n src.extractors.configuration.entries:\n name: entries\n module: src.extractors.configuration\n line: 43\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 2\n examples.src.runtime.validateContract:\n name: validateContract\n module: examples.src.runtime\n line: 6\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.cli.parsed:\n name: parsed\n module: src.cli\n line: 71\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.emptyCoverage:\n name: emptyCoverage\n module: src.extractors.markdown-llm-helpers\n line: 179\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.extractors.todo.relative:\n name: relative\n module: src.extractors.todo\n line: 29\n cyclomatic_complexity: 5\n calls_out: 20\n calls_in: 0\n src.extractors.docs-chunks.chunkMarkdown:\n name: chunkMarkdown\n module: src.extractors.docs-chunks\n line: 55\n cyclomatic_complexity: 8\n calls_out: 9\n calls_in: 0\n rust-ast.src.main.visit_item_struct:\n name: visit_item_struct\n module: rust-ast.src.main\n line: 223\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.extractors.communication-file-helpers.appendRoleAndParticipantWarnings:\n name: appendRoleAndParticipantWarnings\n module: src.extractors.communication-file-helpers\n line: 273\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n examples.backend.src.validation.object:\n name: object\n module: examples.backend.src.validation\n line: 24\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 0\n src.extractors.nl.classified:\n name: classified\n module: src.extractors.nl\n line: 49\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n src.extractors.docs-chunks.index:\n name: index\n module: src.extractors.docs-chunks\n line: 43\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.extractors.todo.action:\n name: action\n module: src.extractors.todo\n line: 50\n cyclomatic_complexity: 2\n calls_out: 12\n calls_in: 0\n src.extractors.markdown-llm.MarkdownLlmRequiredError.fallbackOrThrow:\n name: fallbackOrThrow\n module: src.extractors.markdown-llm\n line: 135\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 2\n src.extractors.communication-helpers.isCommunicationNoise:\n name: isCommunicationNoise\n module: src.extractors.communication-helpers\n line: 286\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 3\n src.cli.initProject:\n name: initProject\n module: src.cli\n line: 736\n cyclomatic_complexity: 6\n calls_out: 9\n calls_in: 1\n src.extractors.nl-llm-helpers.NlAttemptError.lines:\n name: lines\n module: src.extractors.nl-llm-helpers\n line: 86\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.cli.invokedPath:\n name: invokedPath\n module: src.cli\n line: 936\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 0\n src.extractors.configuration.configurationRecords:\n name: configurationRecords\n module: src.extractors.configuration\n line: 41\n cyclomatic_complexity: 4\n calls_out: 12\n calls_in: 4\n src.cli.handleCloseCodeChange:\n name: handleCloseCodeChange\n module: src.cli\n line: 310\n cyclomatic_complexity: 6\n calls_out: 5\n calls_in: 0\n src.cli.buildGitDiff:\n name: buildGitDiff\n module: src.cli\n line: 534\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 1\n src.cli.stop:\n name: stop\n module: src.cli\n line: 352\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 0\n src.extractors.docs-record.toDocumentIntentRecord:\n name: toDocumentIntentRecord\n module: src.extractors.docs-record\n line: 25\n cyclomatic_complexity: 14\n calls_out: 13\n calls_in: 0\n src.extractors.docs-record.allowedModality:\n name: allowedModality\n module: src.extractors.docs-record\n line: 187\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.cli.handleApplyTodo:\n name: handleApplyTodo\n module: src.cli\n line: 201\n cyclomatic_complexity: 8\n calls_out: 5\n calls_in: 0\n src.cli.optionBoolean:\n name: optionBoolean\n module: src.cli\n line: 830\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 17\n src.cli.optionLlmMode:\n name: optionLlmMode\n module: src.cli\n line: 854\n cyclomatic_complexity: 6\n calls_out: 3\n calls_in: 8\n src.cli.parseDiffMode:\n name: parseDiffMode\n module: src.cli\n line: 488\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.cli.stamp:\n name: stamp\n module: src.cli\n line: 449\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.cli.optionSummaryMode:\n name: optionSummaryMode\n module: src.cli\n line: 866\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n src.cli.buildFileDiff:\n name: buildFileDiff\n module: src.cli\n line: 517\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 1\n src.extractors.docs-llm.DocumentationLlmRequiredError.readPrompt:\n name: readPrompt\n module: src.extractors.docs-llm\n line: 261\n cyclomatic_complexity: 2\n calls_out: 6\n calls_in: 1\n src.extractors.communication-helpers.flush:\n name: flush\n module: src.extractors.communication-helpers\n line: 195\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 1\n src.extractors.docs-record.keywordOverlap:\n name: keywordOverlap\n module: src.extractors.docs-record\n line: 119\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.extractors.changelog.changelogAction:\n name: changelogAction\n module: src.extractors.changelog\n line: 87\n cyclomatic_complexity: 11\n calls_out: 3\n calls_in: 4\n src.extractors.configuration.MAX_ENTRIES_PER_FILE:\n name: MAX_ENTRIES_PER_FILE\n module: src.extractors.configuration\n line: 8\n cyclomatic_complexity: 4\n calls_out: 10\n calls_in: 0\n examples.frontend.src.render.toRows:\n name: toRows\n module: examples.frontend.src.render\n line: 19\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.extractors.git.hasMoreDiscoveryWork:\n name: hasMoreDiscoveryWork\n module: src.extractors.git\n line: 195\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 2\n src.cli.handlePipeline:\n name: handlePipeline\n module: src.cli\n line: 338\n cyclomatic_complexity: 1\n calls_out: 7\n calls_in: 0\n examples.frontend.src.app.createState:\n name: createState\n module: examples.frontend.src.app\n line: 14\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 1\n src.extractors.configuration.line:\n name: line\n module: src.extractors.configuration\n line: 149\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 0\n src.extractors.docs-record.statementText:\n name: statementText\n module: src.extractors.docs-record\n line: 32\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.extractors.markdown-llm-helpers.MarkdownAttemptError.strings:\n name: strings\n module: src.extractors.markdown-llm-helpers\n line: 370\n cyclomatic_complexity: 1\n calls_out: 5\n calls_in: 2\n src.extractors.nl.body:\n name: body\n module: src.extractors.nl\n line: 41\n cyclomatic_complexity: 2\n calls_out: 14\n calls_in: 0\n src.extractors.docs-record.resolveTarget:\n name: resolveTarget\n module: src.extractors.docs-record\n line: 128\n cyclomatic_complexity: 12\n calls_out: 7\n calls_in: 2\n src.extractors.git.discoverGitRepositories:\n name: discoverGitRepositories\n module: src.extractors.git\n line: 171\n cyclomatic_complexity: 4\n calls_out: 7\n calls_in: 1\n src.extractors.git.finishDiscovery:\n name: finishDiscovery\n module: src.extractors.git\n line: 268\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 1\n src.cli.buildPipelineOptions:\n name: buildPipelineOptions\n module: src.cli\n line: 371\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n src.extractors.nl.missing:\n name: missing\n module: src.extractors.nl\n line: 52\n cyclomatic_complexity: 1\n calls_out: 9\n calls_in: 0\n src.extractors.docs-chunks.mapConcurrent:\n name: mapConcurrent\n module: src.extractors.docs-chunks\n line: 33\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 0\n src.extractors.docs-schema.documentResponseContract:\n name: documentResponseContract\n module: src.extractors.docs-schema\n line: 31\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.extractors.nl-llm-helpers.NlAttemptError.allowedModality:\n name: allowedModality\n module: src.extractors.nl-llm-helpers\n line: 226\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.extractors.markdown-paths.state:\n name: state\n module: src.extractors.markdown-paths\n line: 92\n cyclomatic_complexity: 6\n calls_out: 4\n calls_in: 0\n src.extractors.docs-record.resolveObject:\n name: resolveObject\n module: src.extractors.docs-record\n line: 79\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 3\n java.JavaAstExtract.JavaAstExtract.main:\n name: main\n module: java.JavaAstExtract\n line: 21\n cyclomatic_complexity: 10\n calls_out: 16\n calls_in: 0\nedges:\n- caller: rust-ast.src.main.main\n callee: rust-ast.src.main.arguments\n call_type: resolved\n- caller: rust-ast.src.main.main\n callee: rust-ast.src.main.collect_files\n call_type: resolved\n- caller: rust-ast.src.main.main\n callee: rust-ast.src.main.slash\n call_type: resolved\n- caller: rust-ast.src.main.collect_files\n callee: rust-ast.src.main.slash\n call_type: resolved\n- caller: rust-ast.src.main.add\n callee: rust-ast.src.main.excerpt\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_mod\n callee: rust-ast.src.main.qualified\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_mod\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_use\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_struct\n callee: rust-ast.src.main.type_item\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_enum\n callee: rust-ast.src.main.type_item\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_trait\n callee: rust-ast.src.main.type_item\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_type\n callee: rust-ast.src.main.type_item\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_const\n callee: rust-ast.src.main.qualified\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_const\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_const\n callee: rust-ast.src.main.modifiers\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_static\n callee: rust-ast.src.main.qualified\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_static\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_static\n callee: rust-ast.src.main.modifiers\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_fn\n callee: rust-ast.src.main.qualified\n call_type: resolved\n- caller: rust-ast.src.main.visit_item_fn\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_impl_item_fn\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_expr_call\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.visit_expr_method_call\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.type_item\n callee: rust-ast.src.main.qualified\n call_type: resolved\n- caller: rust-ast.src.main.type_item\n callee: rust-ast.src.main.add\n call_type: resolved\n- caller: rust-ast.src.main.type_item\n callee: rust-ast.src.main.modifiers\n call_type: resolved\n- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES\n callee: examples.backend.src.request-handlers.handleHealth\n call_type: resolved\n- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES\n callee: examples.backend.src.request-handlers.handleEventPublish\n call_type: resolved\n- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES\n callee: examples.backend.src.request-handlers.handleEventList\n call_type: resolved\n- caller: examples.backend.src.request-handlers.MAX_BODY_BYTES\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleRequest\n callee: examples.backend.src.request-handlers.handleHealth\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleRequest\n callee: examples.backend.src.request-handlers.handleEventPublish\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleRequest\n callee: examples.backend.src.request-handlers.handleEventList\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleRequest\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleHealth\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleHealth\n callee: examples.backend.src.request-handlers.size\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleEventPublish\n callee: examples.backend.src.request-handlers.readBody\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleEventPublish\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.request-handlers.validation\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.request-handlers.event\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleEventList\n callee: examples.backend.src.request-handlers.parseOffset\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleEventList\n callee: examples.backend.src.request-handlers.parseLimit\n call_type: resolved\n- caller: examples.backend.src.request-handlers.handleEventList\n callee: examples.backend.src.request-handlers.sendJson\n call_type: resolved\n- caller: examples.backend.src.validation.ALLOWED_ACTIONS\n callee: examples.backend.src.validation.invalid\n call_type: resolved\n- caller: examples.backend.src.validation.validateEventPayload\n callee: examples.backend.src.validation.invalid\n call_type: resolved\n- caller: examples.backend.src.validation.record\n callee: examples.backend.src.validation.invalid\n call_type: resolved\n- caller: examples.backend.src.validation.agent\n callee: examples.backend.src.validation.invalid\n call_type: resolved\n- caller: examples.backend.src.validation.action\n callee: examples.backend.src.validation.invalid\n call_type: resolved\n- caller: examples.backend.src.validation.object\n callee: examples.backend.src.validation.invalid\n call_type: resolved\n- caller: examples.backend.src.server.createBackend\n callee: examples.backend.src.server.sendJson\n call_type: resolved\n- caller: examples.backend.src.server.store\n callee: examples.backend.src.server.sendJson\n call_type: resolved\n- caller: examples.backend.src.server.server\n callee: examples.backend.src.server.sendJson\n call_type: resolved\n- caller: examples.backend.src.server.startBackend\n callee: examples.backend.src.server.createBackend\n call_type: resolved\n- caller: examples.frontend.src.render.toRows\n callee: examples.frontend.src.render.classifyEvent\n call_type: resolved\n- caller: examples.frontend.src.render.renderTable\n callee: examples.frontend.src.render.headerRow\n call_type: resolved\n- caller: examples.frontend.src.app.mountPanel\n callee: examples.frontend.src.app.createState\n call_type: resolved\n- caller: examples.frontend.src.app.mountPanel\n callee: examples.frontend.src.app.refresh\n call_type: resolved\n- caller: examples.frontend.src.app.mountPanel\n callee: examples.frontend.src.app.reload\n call_type: resolved\n- caller: examples.frontend.src.app.mountPanel\n callee: examples.frontend.src.app.state\n call_type: resolved\n- caller: examples.frontend.src.app.state\n callee: examples.frontend.src.app.refresh\n call_type: resolved\n- caller: examples.frontend.src.app.reload\n callee: examples.frontend.src.app.refresh\n call_type: resolved\n- caller: examples.src.runtime.executeContract\n callee: examples.src.runtime.validateContract\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.main\n callee: java.JavaAstExtract.JavaAstExtract.add\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.main\n callee: java.JavaAstExtract.JavaAstExtract.emit\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.main\n callee: java.JavaAstExtract.JavaAstExtract.collect\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.emit\n callee: java.JavaAstExtract.JavaAstExtract.json\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.emit\n callee: java.JavaAstExtract.JavaAstExtract.map\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.collect\n callee: java.JavaAstExtract.JavaAstExtract.try\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.collect\n callee: java.JavaAstExtract.JavaAstExtract.containsIgnored\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.try\n callee: java.JavaAstExtract.JavaAstExtract.slash\n call_type: resolved\n- caller: java.JavaAstExtract.JavaAstExtract.json\n callee: java.JavaAstExtract.JavaAstExtract.escape\n call_type: resolved\n- caller: src.cli.main\n callee: src.cli.printHelp\n call_type: resolved\n- caller: src.cli.main\n callee: src.cli.parseArgs\n call_type: resolved\n- caller: src.cli.main\n callee: src.cli.resolveMainCommand\n call_type: resolved\n- caller: src.cli.main\n callee: src.cli.commandHandlers\n call_type: resolved\n- caller: src.cli.parsed\n callee: src.cli.printHelp\n call_type: resolved\n- caller: src.cli.command\n callee: src.cli.printHelp\n call_type: resolved\n- caller: src.cli.commandHandlers\n callee: src.cli.initProject\n call_type: resolved\n- caller: src.cli.commandHandlers\n callee: src.cli.doctor\n call_type: resolved\n- caller: src.cli.handleLink\n callee: src.cli.emitJson\n call_type: resolved\n- caller: src.cli.handleLink\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleDiagnose\n callee: src.cli.emitJson\n call_type: resolved\n- caller: src.cli.handleDiagnose\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleSummarize\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleSummarize\n callee: src.cli.optionSummaryMode\n call_type: resolved\n- caller: src.cli.diagnosticsPath\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.diagnosticsPath\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.diagnostics\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.diagnostics\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.result\n callee: src.cli.execFileAsync\n call_type: resolved\n- caller: src.cli.handleProposeTodo\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleProposeTodo\n callee: src.cli.optionTaskMode\n call_type: resolved\n- caller: src.cli.handleRenderTodo\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleApplyTodo\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleProposeCodeChange\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleRenderCodeChange\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleProposeSourcePatch\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.isPlanSet\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleApplySourcePatch\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleEvaluateCodeChange\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleCloseCodeChange\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleCompareWorkspace\n callee: src.cli.resolvePipelineRoot\n call_type: resolved\n- caller: src.cli.handleCompareWorkspace\n callee: src.cli.buildWorkspaceComparisonOptions\n call_type: resolved\n- caller: src.cli.root\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.root\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.root\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.handlePipeline\n callee: src.cli.resolvePipelineRoot\n call_type: resolved\n- caller: src.cli.handlePipeline\n callee: src.cli.buildPipelineOptions\n call_type: resolved\n- caller: src.cli.handlePipeline\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.handlePipeline\n callee: src.cli.reportPipelineDegradation\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.resolvePipelineRoot\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.resolveWatchTaskFile\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.buildPipelineOptions\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleWatch\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.taskFile\n callee: src.cli.formatWatchEvent\n call_type: resolved\n- caller: src.cli.pipeline\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.pipeline\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.pipeline\n callee: src.cli.formatWatchEvent\n call_type: resolved\n- caller: src.cli.controller\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.controller\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.controller\n callee: src.cli.formatWatchEvent\n call_type: resolved\n- caller: src.cli.stop\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.stop\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.stop\n callee: src.cli.formatWatchEvent\n call_type: resolved\n- caller: src.cli.buildPipelineOptions\n callee: src.cli.buildCommonPipelineOptions\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionList\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionNlMode\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.buildCommonPipelineOptions\n callee: src.cli.optionPipelineTaskMode\n call_type: resolved\n- caller: src.cli.resolveWatchTaskFile\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.buildWorkspaceComparisonOptions\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.buildWorkspaceComparisonOptions\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.buildWorkspaceComparisonOptions\n callee: src.cli.optionList\n call_type: resolved\n- caller: src.cli.buildWorkspaceComparisonOptions\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.buildWorkspaceComparisonOptions\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.buildWorkspaceComparisonOptions\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.formatWatchEvent\n callee: src.cli.file\n call_type: resolved\n- caller: src.cli.stamp\n callee: src.cli.file\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.parseDiffMode\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.handleGraphDiff\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.buildDiffPayload\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleDiff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.svg\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.svg\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.parseDiffMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleGraphDiff\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleGraphDiff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.diff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.buildDiffPayload\n callee: src.cli.buildFileDiff\n call_type: resolved\n- caller: src.cli.buildDiffPayload\n callee: src.cli.buildGitDiff\n call_type: resolved\n- caller: src.cli.buildFileDiff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.context\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.context\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.context\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.buildGitDiff\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.buildGitDiff\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.buildGitDiff\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.handleReality\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleReality\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleReality\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.view\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.view\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.handleExtract\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleExtract\n callee: src.cli.handler\n call_type: resolved\n- caller: src.cli.handleExtractNl\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleExtractNl\n callee: src.cli.optionNlMode\n call_type: resolved\n- caller: src.cli.handleExtractNl\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractGit\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleExtractGit\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractAst\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractConfig\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractRuntime\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractMarkdown\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.handleExtractMarkdown\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.handleExtractMarkdown\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractDocs\n callee: src.cli.optionList\n call_type: resolved\n- caller: src.cli.handleExtractDocs\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleExtractCommunication\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleExtractCommunication\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.handleExtractCommunication\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.handleExtractCommunication\n callee: src.cli.emitExtraction\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionNullableString\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionNumber\n call_type: resolved\n- caller: src.cli.handleCommunication\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.handleIntake\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.handleIntake\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.absolute\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.doctor\n callee: src.cli.execFileAsync\n call_type: resolved\n- caller: src.cli.optionNumber\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionList\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionNlMode\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.optionLlmMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionTaskMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.optionSummaryMode\n callee: src.cli.optionLlmMode\n call_type: resolved\n- caller: src.cli.optionSummaryMode\n callee: src.cli.optionBoolean\n call_type: resolved\n- caller: src.cli.optionPipelineTaskMode\n callee: src.cli.optionString\n call_type: resolved\n- caller: src.cli.invokedPath\n callee: src.cli.main\n call_type: resolved\n- caller: src.extractors.nl.extractNlIntent\n callee: src.extractors.nl.assertNlExtractionOptions\n call_type: resolved\n- caller: src.extractors.nl.extractNlIntent\n callee: src.extractors.nl.detectMissingFields\n call_type: resolved\n- caller: src.extractors.nl.absolute\n callee: src.extractors.nl.detectMissingFields\n call_type: resolved\n- caller: src.extractors.nl.absolute\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.body\n callee: src.extractors.nl.detectMissingFields\n call_type: resolved\n- caller: src.extractors.nl.body\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.sourcePath\n callee: src.extractors.nl.detectMissingFields\n call_type: resolved\n- caller: src.extractors.nl.sourcePath\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.classified\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.action\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.object\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.missing\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.nl.confidence\n callee: src.extractors.nl.inferActor\n call_type: resolved\n- caller: src.extractors.ast.isExtractionResult\n callee: src.extractors.ast.isIntentRecords\n call_type: resolved\n- caller: src.extractors.runtime-cycle.MAX_PER_SECTION\n callee: src.extractors.runtime-cycle.parseCycle\n call_type: resolved\n- caller: src.extractors.runtime-cycle.MAX_PER_SECTION\n callee: src.extractors.runtime-cycle.sourcePathFor\n call_type: resolved\n- caller: src.extractors.runtime-cycle.MAX_PER_SECTION\n callee: src.extractors.runtime-cycle.boundedArray\n call_type: resolved\n- caller: src.extractors.runtime-cycle.MAX_PER_SECTION\n callee: src.extractors.runtime-cycle.probeRecord\n call_type: resolved\n- caller: src.extractors.runtime-cycle.MAX_PER_SECTION\n callee: src.extractors.runtime-cycle.label\n call_type: resolved\n- caller: src.extractors.runtime-cycle.MAX_PER_SECTION\n callee: src.extractors.runtime-cycle.violationRecord\n call_type: resolved\n- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent\n callee: src.extractors.runtime-cycle.parseCycle\n call_type: resolved\n- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent\n callee: src.extractors.runtime-cycle.sourcePathFor\n call_type: resolved\n- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent\n callee: src.extractors.runtime-cycle.boundedArray\n call_type: resolved\n- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent\n callee: src.extractors.runtime-cycle.probeRecord\n call_type: resolved\n- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent\n callee: src.extractors.runtime-cycle.label\n call_type: resolved\n- caller: src.extractors.runtime-cycle.extractRuntimeCycleIntent\n callee: src.extractors.runtime-cycle.violationRecord\n call_type: resolved\n- caller: src.extractors.runtime-cycle.results\n callee: src.extractors.runtime-cycle.probeRecord\n call_type: resolved\n- caller: src.extractors.runtime-cycle.results\n callee: src.extractors.runtime-cycle.boundedArray\n call_type: resolved\n- caller: src.extractors.runtime-cycle.results\n callee: src.extractors.runtime-cycle.label\n call_type: resolved\n- caller: src.extractors.runtime-cycle.results\n callee: src.extractors.runtime-cycle.violationRecord\n call_type: resolved\n- caller: src.extractors.runtime-cycle.label\n callee: src.extractors.runtime-cycle.text\n call_type: resolved\n- caller: src.extractors.runtime-cycle.probeRecord\n callee: src.extractors.runtime-cycle.label\n call_type: resolved\n- caller: src.extractors.runtime-cycle.probeRecord\n callee: src.extractors.runtime-cycle.text\n call_type: resolved\n- caller: src.extractors.runtime-cycle.probeRecord\n callee: src.extractors.runtime-cycle.watched\n call_type: resolved\n- caller: src.extractors.runtime-cycle.probeRecord\n callee: src.extractors.runtime-cycle.tags\n call_type: resolved\n- caller: src.extractors.runtime-cycle.probeRecord\n callee: src.extractors.runtime-cycle.factsMetadata\n call_type: resolved\n- caller: src.extractors.runtime-cycle.violationRecord\n callee: src.extractors.runtime-cycle.label\n call_type: resolved\n- caller: src.extractors.runtime-cycle.violationRecord\n callee: src.extractors.runtime-cycle.text\n call_type: resolved\n- caller: src.extractors.runtime-cycle.violationRecord\n callee: src.extractors.runtime-cycle.watched\n call_type: resolved\n- caller: src.extractors.runtime-cycle.violationRecord\n callee: src.extractors.runtime-cycle.tags\n call_type: resolved\n- caller: src.extractors.runtime-cycle.violationRecord\n callee: src.extractors.runtime-cycle.jsonScalar\n call_type: resolved\n- caller: src.extractors.runtime-cycle.driftRecord\n callee: src.extractors.runtime-cycle.text\n call_type: resolved\n- caller: src.extractors.runtime-cycle.driftRecord\n callee: src.extractors.runtime-cycle.tags\n call_type: resolved\n- caller: src.extractors.runtime-cycle.driftRecord\n callee: src.extractors.runtime-cycle.jsonScalar\n call_type: resolved\n- caller: src.extractors.runtime-cycle.proposalRecord\n callee: src.extractors.runtime-cycle.text\n call_type: resolved\n- caller: src.extractors.runtime-cycle.proposalRecord\n callee: src.extractors.runtime-cycle.proposalAction\n call_type: resolved\n- caller: src.extractors.runtime-cycle.factsMetadata\n callee: src.extractors.runtime-cycle.jsonScalar\n call_type: resolved\n- caller: src.extractors.configuration.MAX_ENTRIES_PER_FILE\n callee: src.extractors.configuration.isConfigurationPath\n call_type: resolved\n- caller: src.extractors.configuration.MAX_ENTRIES_PER_FILE\n callee: src.extractors.configuration.configurationRecords\n call_type: resolved\n- caller: src.extractors.configuration.extractConfigurationIntent\n callee: src.extractors.configuration.isConfigurationPath\n call_type: resolved\n- caller: src.extractors.configuration.extractConfigurationIntent\n callee: src.extractors.configuration.configurationRecords\n call_type: resolved\n- caller: src.extractors.configuration.files\n callee: src.extractors.configuration.configurationRecords\n call_type: resolved\n- caller: src.extractors.configuration.relative\n callee: src.extractors.configuration.configurationRecords\n call_type: resolved\n- caller: src.extractors.configuration.configurationRecords\n callee: src.extractors.configuration.dockerEntries\n call_type: resolved\n- caller: src.extractors.configuration.configurationRecords\n callee: src.extractors.configuration.jsonEntries\n call_type: resolved\n- caller: src.extractors.configuration.configurationRecords\n callee: src.extractors.configuration.tomlEntries\n call_type: resolved\n- caller: src.extractors.configuration.configurationRecords\n callee: src.extractors.configuration.yamlOrAssignmentEntries\n call_type: resolved\n- caller: src.extractors.configuration.configurationRecords\n callee: src.extractors.configuration.fileAggregate\n call_type: resolved\n- caller: src.extractors.configuration.entries\n callee: src.extractors.configuration.fileAggregate\n call_type: resolved\n- caller: src.extractors.configuration.bounded\n callee: src.extractors.configuration.fileAggregate\n call_type: resolved\n- caller: src.extractors.configuration.fileAggregate\n callee: src.extractors.configuration.configurationFormat\n call_type: resolved\n- caller: src.extractors.configuration.jsonEntries\n callee: src.extractors.configuration.findKeyLine\n call_type: resolved\n- caller: src.extractors.configuration.parsed\n callee: src.extractors.configuration.findKeyLine\n call_type: resolved\n- caller: src.extractors.configuration.lines\n callee: src.extractors.configuration.findKeyLine\n call_type: resolved\n- caller: src.extractors.configuration.tomlEntries\n callee: src.extractors.configuration.entries\n call_type: resolved\n- caller: src.extractors.configuration.tomlEntries\n callee: src.extractors.configuration.match\n call_type: resolved\n- caller: src.extractors.configuration.tomlEntries\n callee: src.extractors.configuration.entry\n call_type: resolved\n- caller: src.extractors.configuration.tomlEntrie\n\n... [truncated - file too large]", "is_subdir": false}, {"name": "duplication.toon.yaml", "rel_path": "duplication.toon.yaml", "path": "duplication.toon.yaml", "size": "9.8KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# redup/duplication | 17 groups | 172f 30805L | 2026-08-01\n\nSUMMARY:\n files_scanned: 172\n total_lines: 30805\n dup_groups: 17\n actionable: 17\n review: 0\n generated: 0\n actionable_L: 120\n review_L: 0\n generated_L: 0\n dup_fragments: 44\n saved_lines: 120\n scan_ms: 1116\n\nHOTSPOTS[7] (files with most duplication):\n src/extractors/markdown-llm.ts dup=27L groups=5 frags=5 (0.1%)\n src/communication/llm.ts dup=27L groups=5 frags=5 (0.1%)\n src/extractors/nl-llm.ts dup=22L groups=6 frags=6 (0.1%)\n src/synthesis/tasks-llm.ts dup=13L groups=3 frags=3 (0.0%)\n src/extractors/docs-llm.ts dup=12L groups=3 frags=3 (0.0%)\n src/live/contract-check.ts dup=12L groups=2 frags=2 (0.0%)\n src/live/model-comparison.ts dup=12L groups=2 frags=2 (0.0%)\n\nDUPLICATES[17] (ranked by impact):\n [ff0b7d1fb897f5eb] EXAC readPrompt L=5 N=5 saved=20 sim=1.00\n src/extractors/docs-llm.ts:261-265 (readPrompt)\n src/extractors/markdown-llm.ts:431-435 (readPrompt)\n src/extractors/nl-llm.ts:283-287 (readPrompt)\n src/summary/summarizer.ts:329-333 (readPrompt)\n src/synthesis/tasks-llm.ts:262-266 (readPrompt)\n [09873fe5d7f53db8] STRU constructor L=4 N=5 saved=16 sim=1.00\n src/communication/llm.ts:80-83 (constructor)\n src/extractors/docs-llm.ts:39-42 (constructor)\n src/extractors/markdown-llm.ts:49-52 (constructor)\n src/extractors/nl-llm.ts:47-50 (constructor)\n src/synthesis/tasks-llm.ts:49-52 (constructor)\n [bd6578d73c14c374] STRU constructor L=4 N=5 saved=16 sim=1.00\n src/communication/llm.ts:162-165 (constructor)\n src/extractors/markdown-llm.ts:146-149 (constructor)\n src/extractors/nl-llm.ts:109-112 (constructor)\n src/summary/summarizer.ts:154-157 (constructor)\n src/synthesis/tasks-llm.ts:56-59 (constructor)\n [8f9cb44a5788fdd0] EXAC collect L=9 N=2 saved=9 sim=1.00\n scripts/verify-env-contract.mjs:95-103 (collect)\n scripts/verify-module-boundaries.mjs:59-67 (collect)\n [6363b0c657dbde27] EXAC sumUsage L=9 N=2 saved=9 sim=1.00\n src/live/contract-check.ts:148-156 (sumUsage)\n src/live/model-comparison.ts:206-214 (sumUsage)\n [040774ed1317816e] EXAC markDeterministic L=8 N=2 saved=8 sim=1.00\n src/communication/llm.ts:417-424 (markDeterministic)\n src/extractors/markdown-llm.ts:402-409 (markDeterministic)\n [a81abf06a2409abf] EXAC arrow_function L=6 N=2 saved=6 sim=1.00\n src/communication/llm.ts:418-423 (arrow_function)\n src/extractors/markdown-llm.ts:403-408 (arrow_function)\n [2e20d0fc42b5b689] EXAC errorMessage L=3 N=3 saved=6 sim=1.00\n src/extractors/docs-llm.ts:267-269 (errorMessage)\n src/interfaces/a2a-task-store.ts:511-513 (errorMessage)\n src/interfaces/a2a.ts:310-312 (errorMessage)\n [13e54260c09235cb] EXAC roleOf L=5 N=2 saved=5 sim=1.00\n src/communication/analyzer.ts:464-468 (roleOf)\n src/communication/llm.ts:476-480 (roleOf)\n [5a74faa98e248ba6] EXAC objectValue L=4 N=2 saved=4 sim=1.00\n src/core/schema.ts:771-774 (objectValue)\n src/operations/validation.ts:18-21 (objectValue)\n [6108e7bc94eb85d0] EXAC readJson L=3 N=2 saved=3 sim=1.00\n scripts/research/audit-changelog-sample.mjs:205-207 (readJson)\n scripts/research/rerank-embedding-shortlist.mjs:160-162 (readJson)\n [cf429410d135f725] EXAC clampLine L=3 N=2 saved=3 sim=1.00\n src/extractors/docs-record.ts:179-181 (clampLine)\n src/extractors/nl-llm.ts:271-273 (clampLine)\n [85958beabc80c768] EXAC allowedAction L=3 N=2 saved=3 sim=1.00\n src/extractors/docs-record.ts:183-185 (allowedAction)\n src/extractors/nl-llm.ts:275-277 (allowedAction)\n [9b7097c5386e9cfa] EXAC allowedModality L=3 N=2 saved=3 sim=1.00\n src/extractors/docs-record.ts:187-189 (allowedModality)\n src/extractors/nl-llm.ts:279-281 (allowedModality)\n [b31b50027fdfb178] EXAC round L=3 N=2 saved=3 sim=1.00\n src/live/contract-check.ts:315-317 (round)\n src/live/model-comparison.ts:216-218 (round)\n [dabffb80a2fd2146] EXAC nonBlank L=3 N=2 saved=3 sim=1.00\n src/operations/validation.ts:31-33 (nonBlank)\n src/synthesis/todo-patch.ts:346-348 (nonBlank)\n [21ba1336248390a4] EXAC renderIds L=3 N=2 saved=3 sim=1.00\n src/synthesis/code-change-plan.ts:680-682 (renderIds)\n src/synthesis/todo-patch.ts:317-319 (renderIds)\n\nREFACTOR[17] (ranked by priority):\n [1] β—‹ extract_function β†’ src/utils/readPrompt.py\n WHY: 5 occurrences of 5-line block across 5 files β€” saves 20 lines\n FILES: src/extractors/docs-llm.ts, src/extractors/markdown-llm.ts, src/extractors/nl-llm.ts, src/summary/summarizer.ts, src/synthesis/tasks-llm.ts\n [2] β—‹ extract_function β†’ src/utils/constructor.py\n WHY: 5 occurrences of 4-line block across 5 files β€” saves 16 lines\n FILES: src/communication/llm.ts, src/extractors/docs-llm.ts, src/extractors/markdown-llm.ts, src/extractors/nl-llm.ts, src/synthesis/tasks-llm.ts\n [3] β—‹ extract_function β†’ src/utils/constructor.py\n WHY: 5 occurrences of 4-line block across 5 files β€” saves 16 lines\n FILES: src/communication/llm.ts, src/extractors/markdown-llm.ts, src/extractors/nl-llm.ts, src/summary/summarizer.ts, src/synthesis/tasks-llm.ts\n [4] β—‹ extract_function β†’ scripts/utils/collect.py\n WHY: 2 occurrences of 9-line block across 2 files β€” saves 9 lines\n FILES: scripts/verify-env-contract.mjs, scripts/verify-module-boundaries.mjs\n [5] β—‹ extract_function β†’ src/live/utils/sumUsage.py\n WHY: 2 occurrences of 9-line block across 2 files β€” saves 9 lines\n FILES: src/live/contract-check.ts, src/live/model-comparison.ts\n [6] β—‹ extract_function β†’ src/utils/markDeterministic.py\n WHY: 2 occurrences of 8-line block across 2 files β€” saves 8 lines\n FILES: src/communication/llm.ts, src/extractors/markdown-llm.ts\n [7] β—‹ extract_function β†’ src/utils/arrow_function.py\n WHY: 2 occurrences of 6-line block across 2 files β€” saves 6 lines\n FILES: src/communication/llm.ts, src/extractors/markdown-llm.ts\n [8] β—‹ extract_function β†’ src/utils/errorMessage.py\n WHY: 3 occurrences of 3-line block across 3 files β€” saves 6 lines\n FILES: src/extractors/docs-llm.ts, src/interfaces/a2a-task-store.ts, src/interfaces/a2a.ts\n [9] β—‹ extract_function β†’ src/communication/utils/roleOf.py\n WHY: 2 occurrences of 5-line block across 2 files β€” saves 5 lines\n FILES: src/communication/analyzer.ts, src/communication/llm.ts\n [10] β—‹ extract_function β†’ src/utils/objectValue.py\n WHY: 2 occurrences of 4-line block across 2 files β€” saves 4 lines\n FILES: src/core/schema.ts, src/operations/validation.ts\n [11] β—‹ extract_function β†’ scripts/research/utils/readJson.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: scripts/research/audit-changelog-sample.mjs, scripts/research/rerank-embedding-shortlist.mjs\n [12] β—‹ extract_function β†’ src/extractors/utils/clampLine.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/extractors/docs-record.ts, src/extractors/nl-llm.ts\n [13] β—‹ extract_function β†’ src/extractors/utils/allowedAction.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/extractors/docs-record.ts, src/extractors/nl-llm.ts\n [14] β—‹ extract_function β†’ src/extractors/utils/allowedModality.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/extractors/docs-record.ts, src/extractors/nl-llm.ts\n [15] β—‹ extract_function β†’ src/live/utils/round.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/live/contract-check.ts, src/live/model-comparison.ts\n [16] β—‹ extract_function β†’ src/utils/nonBlank.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/operations/validation.ts, src/synthesis/todo-patch.ts\n [17] β—‹ extract_function β†’ src/synthesis/utils/renderIds.py\n WHY: 2 occurrences of 3-line block across 2 files β€” saves 3 lines\n FILES: src/synthesis/code-change-plan.ts, src/synthesis/todo-patch.ts\n\nQUICK_WINS[8] (low risk, high savings β€” do first):\n [1] extract_function saved=20L β†’ src/utils/readPrompt.py\n FILES: docs-llm.ts, markdown-llm.ts, nl-llm.ts +2\n [2] extract_function saved=16L β†’ src/utils/constructor.py\n FILES: llm.ts, docs-llm.ts, markdown-llm.ts +2\n [3] extract_function saved=16L β†’ src/utils/constructor.py\n FILES: llm.ts, markdown-llm.ts, nl-llm.ts +2\n [4] extract_function saved=9L β†’ scripts/utils/collect.py\n FILES: verify-env-contract.mjs, verify-module-boundaries.mjs\n [5] extract_function saved=9L β†’ src/live/utils/sumUsage.py\n FILES: contract-check.ts, model-comparison.ts\n [6] extract_function saved=8L β†’ src/utils/markDeterministic.py\n FILES: llm.ts, markdown-llm.ts\n [7] extract_function saved=6L β†’ src/utils/arrow_function.py\n FILES: llm.ts, markdown-llm.ts\n [8] extract_function saved=6L β†’ src/utils/errorMessage.py\n FILES: docs-llm.ts, a2a-task-store.ts, a2a.ts\n\nEFFORT_ESTIMATE (total β‰ˆ 4.0h):\n medium readPrompt saved=20L ~40min\n medium constructor saved=16L ~32min\n medium constructor saved=16L ~32min\n easy collect saved=9L ~18min\n easy sumUsage saved=9L ~18min\n easy markDeterministic saved=8L ~16min\n easy arrow_function saved=6L ~12min\n easy errorMessage saved=6L ~12min\n easy roleOf saved=5L ~10min\n easy objectValue saved=4L ~8min\n ... +7 more (~42min)\n\nMETRICS-TARGET:\n dup_groups: 17 β†’ 0\n saved_lines: 120 lines recoverable\n", "is_subdir": false}, {"name": "evolution.toon.yaml", "rel_path": "evolution.toon.yaml", "path": "evolution.toon.yaml", "size": "2.7KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# code2llm/evolution | 3812 func | 162f | 2026-08-04\n# generated in 0.01s\n\nNEXT[10] (ranked by impact):\n [1] !! SPLIT src/cli.ts\n WHY: 942L, 1 classes, max CC=13\n EFFORT: ~4h IMPACT: 12246\n\n [2] !! SPLIT src/services/actions.ts\n WHY: 806L, 1 classes, max CC=13\n EFFORT: ~4h IMPACT: 10478\n\n [3] !! SPLIT-FUNC parseFile CC=38 fan=19\n WHY: CC=38 exceeds 15\n EFFORT: ~1h IMPACT: 722\n\n [4] ! SPLIT-FUNC Client.parse_http_response CC=18 fan=37\n WHY: CC=18 exceeds 15\n EFFORT: ~1h IMPACT: 666\n\n [5] ! SPLIT-FUNC executePipeline CC=20 fan=31\n WHY: CC=20 exceeds 15\n EFFORT: ~1h IMPACT: 620\n\n [6] ! SPLIT-FUNC looksLikeJson CC=20 fan=24\n WHY: CC=20 exceeds 15\n EFFORT: ~1h IMPACT: 480\n\n [7] ! SPLIT-FUNC validateOperationStep CC=23 fan=13\n WHY: CC=23 exceeds 15\n EFFORT: ~1h IMPACT: 299\n\n [8] ! SPLIT-FUNC iter_python_files CC=16 fan=15\n WHY: CC=16 exceeds 15\n EFFORT: ~1h IMPACT: 240\n\n [9] ! SPLIT-FUNC persistFailedRunState CC=19 fan=12\n WHY: CC=19 exceeds 15\n EFFORT: ~1h IMPACT: 228\n\n [10] ! SPLIT-FUNC collectAgentActionIssues CC=15 fan=15\n WHY: CC=15 exceeds 15\n EFFORT: ~1h IMPACT: 225\n\n\nRISKS[3]:\n ⚠ Splitting evaluation/gold/v2/dataset.json may break 0 import paths\n ⚠ Splitting src/cli.ts may break 124 import paths\n ⚠ Splitting src/services/actions.ts may break 106 import paths\n\nMETRICS-TARGET:\n CCΜ„: 3.0 β†’ ≀2.1\n max-CC: 38 β†’ ≀19\n god-modules: 10 β†’ 0\n high-CC(β‰₯15): 14 β†’ ≀7\n hub-types: 0 β†’ ≀0\n\nPATTERNS (language parser shared logic):\n _extract_declarations() in base.py β€” unified extraction for:\n - TypeScript: interfaces, types, classes, functions, arrow funcs\n - PHP: namespaces, traits, classes, functions, includes\n - Ruby: modules, classes, methods, requires\n - C++: classes, structs, functions, #includes\n - C#: classes, interfaces, methods, usings\n - Java: classes, interfaces, methods, imports\n - Go: packages, functions, structs\n - Rust: modules, functions, traits, use statements\n\n Shared regex patterns per language:\n - import: language-specific import/require/using patterns\n - class: class/struct/trait declarations with inheritance\n - function: function/method signatures with visibility\n - brace_tracking: for C-family languages ({ })\n - end_keyword_tracking: for Ruby (module/class/def...end)\n\n Benefits:\n - Consistent extraction logic across all languages\n - Reduced code duplication (~70% reduction in parser LOC)\n - Easier maintenance: fix once, apply everywhere\n - Standardized FunctionInfo/ClassInfo models\n\nHISTORY:\n prev CCΜ„=3.0 β†’ now CCΜ„=3.0\n", "is_subdir": false}, {"name": "map.toon.yaml", "rel_path": "map.toon.yaml", "path": "map.toon.yaml", "size": "181.1KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# todo2code | 281f 43441L | yaml:2,yml:2,json:40,shell:8,toml:3,rust:7,typescript:173,python:16,javascript:15,java:1,proto:1,go:6,php:4,txt:1 | 2026-08-04\n# generated in 0.04s\n# producer: code2llm | artifact: map.toon.yaml | schema: 1\n# stats: 4129 func | 0 cls | 281 mod | CCΜ„=3.1 | critical:24 | cycles:0\n# alerts[5]: fan-out compareWorkspaceIntent=40; CC parseFile=38; fan-out Client.parse_http_response=37; fan-out run=33; fan-out executePipeline=31\n# hotspots[5]: compareWorkspaceIntent fan=40; Client.parse_http_response fan=37; run fan=33; main fan=31; executePipeline fan=31\n# evolution: CCΜ„ 3.0β†’3.1 (regressed +0.1)\n# Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods\nM[281]:\n Dockerfile,45\n Makefile,132\n adapters/tensorflow/package.json,14\n compose.e2e.yml,27\n docker-compose.yml,18\n evaluation/gold/v1/dataset.json,761\n evaluation/gold/v2/dataset.json,2410\n examples/backend/src/request-handlers.ts,88\n examples/backend/src/server.ts,43\n examples/backend/src/store.ts,48\n examples/backend/src/validation.ts,31\n examples/backend/tsconfig.json,14\n examples/frontend/src/api.ts,50\n examples/frontend/src/app.ts,43\n examples/frontend/src/render.ts,64\n examples/frontend/tsconfig.json,15\n examples/project/participants.json,37\n examples/sdk/python.py,23\n examples/sdk/typescript.mjs,16\n examples/src/helper.py,9\n examples/src/runtime.ts,13\n goal.yaml,530\n golang/ast_extract.go,368\n java/JavaAstExtract.java,260\n nlp2uri.yaml,8\n package.json,52\n php/ast_extract.php,233\n project.sh,124\n project2.sh,79\n python/ast_extract.py,221\n python/requirements.txt,1\n rust-ast/Cargo.toml,12\n rust-ast/src/main.rs,322\n schemas/code-change-acceptance.schema.json,53\n schemas/code-change-close-result.schema.json,26\n schemas/code-change-plan-set.schema.json,22\n schemas/code-change-plan.schema.json,98\n schemas/code-change-review.schema.json,27\n schemas/code-change-source-apply-receipt.schema.json,31\n schemas/code-change-source-patch-set.schema.json,18\n schemas/code-change-source-patch.schema.json,63\n schemas/conclusion.schema.json,51\n schemas/document-extraction-response.schema.json,186\n schemas/gold-dataset.schema.json,585\n schemas/intent-graph-diff.schema.json,80\n schemas/intent-graph.schema.json,40\n schemas/intent-record.schema.json,132\n schemas/operation-plan.schema.json,94\n schemas/participant-registry.schema.json,27\n schemas/participant-synthesis.schema.json,39\n schemas/semantic-candidate-set.schema.json,54\n schemas/semantic-rerank.schema.json,113\n schemas/todo-patch.schema.json,59\n schemas/todo-proposal.schema.json,61\n schemas/variable-contract.schema.json,38\n scripts/a2a-request.sh,23\n scripts/assert-demollm-run.mjs,45\n scripts/docker-smoke.sh,36\n scripts/e2e.sh,109\n scripts/examples-check.sh,210\n scripts/generate-response-schemas.mjs,27\n scripts/live-contract-check.mjs,200\n scripts/live-model-comparison.mjs,125\n scripts/mcp-request.sh,11\n scripts/normalize-generated-analysis-roots.mjs,38\n scripts/package.py,25\n scripts/research/audit-changelog-sample.mjs,226\n scripts/research/evaluate-embedding-pairs.py,101\n scripts/research/rank-intent-graph-embeddings.py,174\n scripts/research/rerank-embedding-shortlist.mjs,191\n scripts/smoke.sh,57\n scripts/sync-generated-readme-metadata.mjs,66\n scripts/vallm-compatible.py,25\n scripts/verify-env-contract.mjs,103\n scripts/verify-generated-analysis.mjs,88\n scripts/verify-module-boundaries.mjs,87\n scripts/verify-no-llm-imports.mjs,78\n scripts/verify-structured-responses.mjs,35\n scripts/verify-workflow-yaml.mjs,43\n sdk/__init__.py,1\n sdk/go/actions.go,136\n sdk/go/client.go,197\n sdk/go/examples/basic/main.go,163\n sdk/go/todo2code.go,30\n sdk/go/types.go,215\n sdk/php/composer.json,18\n sdk/php/examples/basic.php,112\n sdk/php/src/Client.php,401\n sdk/php/src/Error.php,25\n sdk/python/__init__.py,13\n sdk/python/examples/basic.py,95\n sdk/python/examples/local_runtime.py,36\n sdk/python/pyproject.toml,17\n sdk/python/todo2code/__init__.py,33\n sdk/python/todo2code/client.py,469\n sdk/python/todo2code/runtime.py,225\n sdk/python/todo2code_sdk.py,171\n sdk/rust/Cargo.toml,17\n sdk/rust/examples/basic.rs,108\n sdk/rust/src/lib.rs,49\n sdk/rust/src/actions.rs,100\n sdk/rust/src/client.rs,221\n sdk/rust/src/error.rs,37\n sdk/rust/src/types.rs,140\n sdk/typescript/examples/basic.ts,84\n sdk/typescript/package.json,32\n sdk/typescript/src/index.ts,420\n sdk/typescript/tsconfig.json,20\n src/index.ts,53\n src/cli.ts,942\n src/communication/analyzer.ts,596\n src/communication/identity.ts,216\n src/communication/intake-contract.ts,334\n src/communication/intake-protobuf.ts,158\n src/communication/intake-service.ts,291\n src/communication/intake-store.ts,161\n src/communication/llm.ts,1\n src/communication/llm/implementation.ts,208\n src/communication/llm/implementation-helpers.ts,357\n src/comparison/workspace.ts,342\n src/config/env.ts,231\n src/core/content-cache.ts,139\n src/core/grounding.ts,24\n src/core/id.ts,167\n src/core/ignore.ts,200\n src/core/io.ts,211\n src/core/record.ts,158\n src/core/record-metadata.ts,27\n src/core/schema/index.ts,4\n src/core/schema/code-change.ts,322\n src/core/schema/conclusions.ts,210\n src/core/schema/constants.ts,31\n src/core/schema/intent.ts,309\n src/core/schema/utils.ts,239\n src/core/security.ts,55\n src/core/target.ts,57\n src/core/text.ts,530\n src/core/types/index.ts,4\n src/core/types/code-change.ts,250\n src/core/types/diagnostics.ts,45\n src/core/types/intent.ts,212\n src/core/types/pipeline.ts,173\n src/core/version.ts,2\n src/diff/git.ts,208\n src/diff/git-binary.ts,10\n src/diff/reality.ts,690\n src/diff/svg.ts,104\n src/diff/text.ts,153\n src/diff/text-myers.ts,152\n src/diff/text-render.ts,251\n src/diff/text-types.ts,39\n src/evaluation/gold.ts,329\n src/evaluation/gold-cases.ts,489\n src/evaluation/gold-cli.ts,44\n src/evaluation/gold-extraction.ts,127\n src/evaluation/gold-metrics.ts,50\n src/evaluation/gold-types.ts,405\n src/extractors/ast.ts,167\n src/extractors/ast/external.ts,48\n src/extractors/ast/go.ts,20\n src/extractors/ast/java.ts,20\n src/extractors/ast/php.ts,34\n src/extractors/ast/python.ts,39\n src/extractors/ast/records.ts,97\n src/extractors/ast/rust.ts,20\n src/extractors/ast/types.ts,20\n src/extractors/ast/typescript.ts,266\n src/extractors/ast/unsupported.ts,30\n src/extractors/changelog.ts,99\n src/extractors/communication.ts,63\n src/extractors/communication-file-helpers.ts,342\n src/extractors/communication-helpers.ts,320\n src/extractors/configuration.ts,208\n src/extractors/docs-chunks.ts,147\n src/extractors/docs-deterministic.ts,369\n src/extractors/docs-llm.ts,269\n src/extractors/docs-record.ts,193\n src/extractors/docs-schema.ts,43\n src/extractors/docs-types.ts,68\n src/extractors/git.ts,397\n src/extractors/markdown.ts,35\n src/extractors/markdown-block.ts,67\n src/extractors/markdown-llm.ts,178\n src/extractors/markdown-llm-helpers.ts,383\n src/extractors/markdown-paths.ts,158\n src/extractors/nl.ts,107\n src/extractors/nl-llm.ts,163\n src/extractors/nl-llm-helpers.ts,261\n src/extractors/runtime-cycle.ts,306\n src/extractors/todo.ts,93\n src/graph/capability-evidence.ts,62\n src/graph/changelog-signal.ts,89\n src/graph/diagnostics.ts,459\n src/graph/diff.ts,235\n src/graph/linker.ts,286\n src/graph/linker-candidates.ts,163\n src/graph/linker-relations.ts,83\n src/graph/symbol-resolution.ts,146\n src/interfaces/a2a.ts,332\n src/interfaces/a2a-card.ts,181\n src/interfaces/a2a-history.ts,96\n src/interfaces/a2a-message.ts,125\n src/interfaces/a2a-message-command.ts,144\n src/interfaces/a2a-run-list-item.ts,171\n src/interfaces/a2a-task-store.ts,560\n src/interfaces/a2a-types.ts,164\n src/interfaces/governed-intake.proto,78\n src/interfaces/intake-actions.ts,38\n src/interfaces/intake-schemas/command-v1.schema.json,17\n src/interfaces/intake-schemas/diagnostic-v1.schema.json,11\n src/interfaces/intake-schemas/envelope-v1.schema.json,20\n src/interfaces/intake-schemas/event-v1.schema.json,20\n src/interfaces/intake-schemas/participant-registry-v2.schema.json,36\n src/interfaces/intake-schemas/query-v1.schema.json,11\n src/interfaces/intake-schemas/result-v1.schema.json,9\n src/interfaces/intake_cli.py,156\n src/interfaces/mcp.ts,261\n src/interfaces/mcp-errors.ts,10\n src/interfaces/mcp-resources.ts,88\n src/interfaces/mcp-tools.ts,323\n src/live/contract-check.ts,317\n src/live/model-comparison.ts,218\n src/llm/audit.ts,19\n src/llm/failure.ts,25\n src/llm/openrouter.ts,240\n src/llm/openrouter-request.ts,242\n src/llm/structured-schema.ts,218\n src/operations/artifact.ts,66\n src/operations/compile-cli.ts,34\n src/operations/contract.ts,84\n src/operations/subactor.ts,122\n src/operations/types.ts,155\n src/operations/validation.ts,429\n src/pipeline/run.ts,384\n src/pipeline/run-helpers.ts,188\n src/pipeline/run-persistence.ts,297\n src/pipeline/run-summary.ts,58\n src/sdk/typescript.ts,172\n src/semantic/reranker/index.ts,8\n src/semantic/reranker-llm.ts,291\n src/semantic/reranker-response.ts,42\n src/semantic/reranker/candidate.ts,250\n src/semantic/reranker/result.ts,311\n src/semantic/reranker/types.ts,106\n src/semantic/reranker/validation.ts,111\n src/services/actions.ts,806\n src/summary/payload.ts,65\n src/summary/render.ts,61\n src/summary/summarizer.ts,333\n src/synthesis/code-change-path.ts,232\n src/synthesis/code-change-plan/index.ts,1\n src/synthesis/code-change-plan/implementation.ts,1\n src/synthesis/code-change-plan/implementation-diagnostics.ts,17\n src/synthesis/code-change-plan/implementation-helpers.ts,39\n src/synthesis/code-change-plan/implementation-helpers-acceptance.ts,141\n src/synthesis/code-change-plan/implementation-helpers-close.ts,75\n src/synthesis/code-change-plan/implementation-helpers-plans.ts,269\n src/synthesis/code-change-plan/implementation-helpers-shared.ts,29\n src/synthesis/code-change-plan/implementation-indexing.ts,25\n src/synthesis/code-change-plan/implementation-review.ts,274\n src/synthesis/code-change-plan/implementation-semantic.ts,125\n src/synthesis/code-change-plan/implementation-source-patch.ts,9\n src/synthesis/code-change-plan/implementation-source-patch-apply.ts,8\n src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts,434\n src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts,233\n src/synthesis/code-change-plan/implementation-source-patch-assert.ts,397\n src/synthesis/code-change-plan/implementation-source-patch-create.ts,235\n src/synthesis/code-change-plan/implementation-source-patch-diff.ts,74\n src/synthesis/code-change-plan/implementation-targets.ts,61\n src/synthesis/task-synthesis-contract.ts,66\n src/synthesis/task-synthesis-materialize.ts,172\n src/synthesis/task-synthesis-payload.ts,70\n src/synthesis/tasks-llm.ts,266\n src/synthesis/todo-patch.ts,372\n src/synthesis/validation.ts,113\n src/tf/classifier.ts,135\n src/version.ts,2\n src/watch/watcher.ts,292\n src/web/diff-ui.ts,152\n src/web/diff-ui-script.ts,17\n tsconfig.json,23\nD:\n php/ast_extract.php:\n e: argumentValue,normalizedToken,significant,qualifiedName,sourceExcerpt,addFact,parseFile\n argumentValue()\n normalizedToken()\n significant()\n qualifiedName()\n sourceExcerpt()\n addFact()\n parseFile()\n scripts/verify-env-contract.mjs:\n i: node:fs,node:path\n e: root,examplePath,example,declared,match,expected,configBody,body,makefile,body,local,auditLocalKeys,body,keys,collectExisting,absolute,collect,absolute\n root()\n examplePath()\n example()\n declared()\n match()\n expected()\n configBody()\n body()\n makefile()\n body()\n local()\n auditLocalKeys()\n body()\n keys()\n collectExisting()\n absolute()\n collect()\n absolute()\n scripts/research/rank-intent-graph-embeddings.py:\n e: parse_args,projection_text,main\n parse_args()\n projection_text(record;prefix)\n main()\n sdk/go/examples/basic/main.go:\n e: main,run,envOr,truncate,joinedIDs\n main()\n run()\n envOr()\n truncate()\n joinedIDs()\n src/operations/validation.ts:\n i: ../core/id.js,../core/types.js,./types.js\n e: VALUE_TYPES,CLASSIFICATIONS,SOURCE_KINDS,RISK_CLASSES,objectValue,exactKeys,actual,nonBlank,dateString,uniqueStrings,assertPrincipalList,principals,isJsonValue,assertVariableContract,contract,source,access,readers,writers,expectedId,assertVariableContractShape,assertVariableContractCore,assertVariableSource,source,assertVariableAccess,access,assertVariableAuthoritativeness,assertVariableMutability,buildVariableContractId,assertGeneration,generation,assertAcyclic,ids,visiting,visited,byId,visit,assertOperationPlan,plan,variables,variableById,validateOperationPlanShape,validateOperationPlanMetadata,validateOperationPlanEvidence,evidence,collectOperationPlanVariables,variables,validateOperationSteps,stepIds,steps,hasCommandStep,founderDecisionRequired,step,validateOperationStep,step,parameters,rollback,validateOperationStepParameters,parameters,reference,variable,validateOperationStepRollback,rollback,validateOperationExpectations,coveredSteps,expectationIds,expectation,verifiedBy,validateOperationDecision,decision,validateOperationVerification,verification,validateOperationPlanHash,castPlan,expectedHash\n VALUE_TYPES()\n CLASSIFICATIONS()\n SOURCE_KINDS()\n RISK_CLASSES()\n objectValue()\n exactKeys()\n actual()\n nonBlank()\n dateString()\n uniqueStrings()\n assertPrincipalList()\n principals()\n isJsonValue()\n assertVariableContract()\n contract()\n source()\n access()\n readers()\n writers()\n expectedId()\n assertVariableContractShape()\n assertVariableContractCore()\n assertVariableSource()\n source()\n assertVariableAccess()\n access()\n assertVariableAuthoritativeness()\n assertVariableMutability()\n buildVariableContractId()\n assertGeneration()\n generation()\n assertAcyclic()\n ids()\n visiting()\n visited()\n byId()\n visit()\n assertOperationPlan()\n plan()\n variables()\n variableById()\n validateOperationPlanShape()\n validateOperationPlanMetadata()\n validateOperationPlanEvidence()\n evidence()\n collectOperationPlanVariables()\n variables()\n validateOperationSteps()\n stepIds()\n steps()\n hasCommandStep()\n founderDecisionRequired()\n step()\n validateOperationStep()\n step()\n parameters()\n rollback()\n validateOperationStepParameters()\n parameters()\n reference()\n variable()\n validateOperationStepRollback()\n rollback()\n validateOperationExpectations()\n coveredSteps()\n expectationIds()\n expectation()\n verifiedBy()\n validateOperationDecision()\n decision()\n validateOperationVerification()\n verification()\n validateOperationPlanHash()\n castPlan()\n expectedHash()\n src/interfaces/a2a-message-command.ts:\n i: ../communication/intake-protobuf.js\n e: parseCommand,protobufCommand,objectCommand,parseCommandFromProtobuf,protobuf,bytes,parseCommandFromObject,objectData,parseCommandFromText,text,looksLikeJson,parseCommandFromJson,parseCommandFromSentence,parseSentenceInput,defaultTextCommand,isSupportedAction,commandInputFromSentence,first,parseText,firstToken,commandFromData,action,nested,parseKeyValues,key,raw,stringValue,parseScalar,normalizeAction,normalized,action\n parseCommand()\n protobufCommand()\n objectCommand()\n parseCommandFromProtobuf()\n protobuf()\n bytes()\n parseCommandFromObject()\n objectData()\n parseCommandFromText()\n text()\n looksLikeJson()\n parseCommandFromJson()\n parseCommandFromSentence()\n parseSentenceInput()\n defaultTextCommand()\n isSupportedAction()\n commandInputFromSentence()\n first()\n parseText()\n firstToken()\n commandFromData()\n action()\n nested()\n parseKeyValues()\n key()\n raw()\n stringValue()\n parseScalar()\n normalizeAction()\n normalized()\n action()\n sdk/rust/examples/basic.rs:\n i: serde_json::json,std::env,todo2code::Client\n e: main,run,joined_ids\n main()\n run()\n joined_ids()\n src/pipeline/run.ts:\n i: ../communication/analyzer.js,../config/env.js,../config/env.js,../core/id.js,../core/io.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-deterministic.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../extractors/runtime-cycle.js,../graph/diagnostics.js,../graph/linker.js,../llm/audit.js,../summary/summarizer.js,../version.js,./run-summary.js,node:path\n e: PipelineContext,PipelineExecutionOutput,PipelinePersistedPaths,PipelineResult,runPipeline,context,execution,persisted,manifest,manifestPath,initializePipelineContext,root,runId,baseOutput,runDirectory,executePipeline,deterministicDocumentFiles,naturalLanguageAudit,result,git,ast,markdown,markdownAudit,documentationStartedAt,deterministicDocs,docs,configurationExtraction,runtime,communicationInput,communicationAudit,communicationSyntheses,allRecords,generatedAt,graph,diagnostics,communicationAnalysis,taskSynthesis\n PipelineContext:\n PipelineExecutionOutput:\n PipelinePersistedPaths:\n PipelineResult:\n runPipeline()\n context()\n execution()\n persisted()\n manifest()\n manifestPath()\n initializePipelineContext()\n root()\n runId()\n baseOutput()\n runDirectory()\n executePipeline()\n deterministicDocumentFiles()\n naturalLanguageAudit()\n result()\n git()\n ast()\n markdown()\n markdownAudit()\n documentationStartedAt()\n deterministicDocs()\n docs()\n configurationExtraction()\n runtime()\n communicationInput()\n communicationAudit()\n communicationSyntheses()\n allRecords()\n generatedAt()\n graph()\n diagnostics()\n communicationAnalysis()\n taskSynthesis()\n src/pipeline/run-persistence.ts:\n i: ../communication/analyzer.js,../communication/llm.js,../config/env.js,../config/env.js,../core/id.js,../core/io.js,../core/types.js,../extractors/docs-llm.js,../extractors/nl-llm.js,../llm/audit.js,../synthesis/tasks-llm.js,../version.js,./run.js,node:path\n e: makePipelineManifest,persistPipelineArtifacts,filePath,graphPath,diagnosticsPath,summaryPath,summaryConclusionsPath,taskSynthesisPath,todoValidationPath,todoPatchPath,todoPatchAuditPath,codeChangePlansPath,codeChangeReviewPath,codeChangeReviewAuditPath,codeChangeSourcePatchesPath,communicationAnalysisPath,communicationMarkdownPath,persistFailedRun,manifestConfiguration,persistFailedRunState,aborted,message,knownAudit,failedAudit,stageValue,reason,skippedAudit,failureCode\n makePipelineManifest()\n persistPipelineArtifacts()\n filePath()\n graphPath()\n diagnosticsPath()\n summaryPath()\n summaryConclusionsPath()\n taskSynthesisPath()\n todoValidationPath()\n todoPatchPath()\n todoPatchAuditPath()\n codeChangePlansPath()\n codeChangeReviewPath()\n codeChangeReviewAuditPath()\n codeChangeSourcePatchesPath()\n communicationAnalysisPath()\n communicationMarkdownPath()\n persistFailedRun()\n manifestConfiguration()\n persistFailedRunState()\n aborted()\n message()\n knownAudit()\n failedAudit()\n stageValue()\n reason()\n skippedAudit()\n failureCode()\n sdk/rust/src/client.rs:\n i: crate::,serde_json::,std::io::,std::net::,std::sync::atomic::,std::time::,super::\n e: Client\n Client:\n src/core/record-metadata.ts:\n i: ./types.js,./version.js\n e: generationMetadata,generationIdentity,separator\n generationMetadata()\n generationIdentity()\n separator()\n src/evaluation/gold-types.ts:\n e: GoldRecordProjection,GoldDocumentModelRecord,GoldExtractionCase,GoldFixtureRecord,GoldExpectedRelation,GoldRerankerDecisionFixture,GoldRerankerFixture,GoldLinkingCase,GoldProposalFixture,GoldDsl2TodoCase,GoldExpectedDiagnostic,GoldDiagnosticsCase,GoldDataset,BinaryMetric,GoldEvaluationReport,assertGoldDataset,dataset,assertDatasetObject,assertDatasetMetadata,assertDatasetCollections,assertUniqueCaseIds,assertExtractionCoverage,channels,assertLinkingCohorts,assertGoldLinkingCohort,assertRerankerFixture,assertRerankerModelIdentity,assertRerankerDecisions,decisions,recordLabels,seenModules,assertRerankerDecision\n GoldRecordProjection:\n GoldDocumentModelRecord:\n GoldExtractionCase:\n GoldFixtureRecord:\n GoldExpectedRelation:\n GoldRerankerDecisionFixture:\n GoldRerankerFixture:\n GoldLinkingCase:\n GoldProposalFixture:\n GoldDsl2TodoCase:\n GoldExpectedDiagnostic:\n GoldDiagnosticsCase:\n GoldDataset:\n BinaryMetric:\n GoldEvaluationReport:\n assertGoldDataset()\n dataset()\n assertDatasetObject()\n assertDatasetMetadata()\n assertDatasetCollections()\n assertUniqueCaseIds()\n assertExtractionCoverage()\n channels()\n assertLinkingCohorts()\n assertGoldLinkingCohort()\n assertRerankerFixture()\n assertRerankerModelIdentity()\n assertRerankerDecisions()\n decisions()\n recordLabels()\n seenModules()\n assertRerankerDecision()\n sdk/typescript/examples/basic.ts:\n i: ../src/index.js\n e: baseUrl,token,root,main,client,health,card,nl,ast,markdown,graph,diagnostics,synthesis,validation,rendered,artifact,reality,gitDiff,comparison\n baseUrl()\n token()\n root()\n main()\n client()\n health()\n card()\n nl()\n ast()\n markdown()\n graph()\n diagnostics()\n synthesis()\n validation()\n rendered()\n artifact()\n reality()\n gitDiff()\n comparison()\n python/ast_extract.py:\n e: FactVisitor,source_hash,dotted_name,is_module_entrypoint,iter_python_files,main\n FactVisitor(ast.NodeVisitor): __init__(2),excerpt(1),add(6),visit_Import(1),visit_ImportFrom(1),visit_FunctionDef(1),visit_AsyncFunctionDef(1),visit_ClassDef(1),add_named_constant(3),visit_Assign(1),visit_AnnAssign(1),visit_If(1),visit_Call(1)\n source_hash(value)\n dotted_name(node)\n is_module_entrypoint(node)\n iter_python_files(root;files_from)\n main()\n src/web/diff-ui-script.ts:\n e: byId,requestHeaders,formatBytes,selectedRun,updateMeta,fillSelect,loadRuns,compareGraphs\n byId()\n requestHeaders()\n formatBytes()\n selectedRun()\n updateMeta()\n fillSelect()\n loadRuns()\n compareGraphs()\n src/diff/reality.ts:\n i: ../core/id.js,../core/schema.js,../core/target.js\n e: RealityRow,IntentRealityView,RealitySvgOptions,RealitySvgLayout,buildRealityView,components,diagnosticsByRecord,rows,buildRealityRows,rows,buildRealityRow,codes,status,compareRealityRows,bySeverity,alignment,bySize,buildRealityTotals,declaredRecords,observedRecords,aligned,declaredTopics,observedTopics,implementationAlignedTopics,documentedObservedTopics,ratio,documentedCoverageLabel,LABEL_CHAR,BADGE_CHAR,widestLabel,groupIntoTopics,symbolPaths,anchors,groups,key,bucket,indexModuleAnchors,modulePaths,targetless,candidates,path,values,resolvesToFile,resolved,indexUnambiguousSymbolPaths,candidates,paths,values,primaryTargetKey,anchor,indexDiagnostics,index,bucket,resolveEvidence,resolveStatus,summarizeLaneTotals,declared,observed,changelog,topicLabel,separator,raw,value,declared,object,renderRealitySvg,theme,maxRows,title,rows,visible,layout,header,body,overflow,height,buildRealityLayout,laneX,laneStep,statusX,statusWidth,renderRealityLaneHeaders,isDeclared,renderRealityRow,y,color,renderRealityLanes,count,cx,renderRealityLaneCell,fill,label,pillWidth,renderMoreTopicsLabel,y,renderRealityHeight,footer,y,renderRealityMarkdown,lanes,escapeMarkdown\n RealityRow:\n IntentRealityView:\n RealitySvgOptions:\n RealitySvgLayout:\n buildRealityView()\n components()\n diagnosticsByRecord()\n rows()\n buildRealityRows()\n rows()\n buildRealityRow()\n codes()\n status()\n compareRealityRows()\n bySeverity()\n alignment()\n bySize()\n buildRealityTotals()\n declaredRecords()\n observedRecords()\n aligned()\n declaredTopics()\n observedTopics()\n implementationAlignedTopics()\n documentedObservedTopics()\n ratio()\n documentedCoverageLabel()\n LABEL_CHAR()\n BADGE_CHAR()\n widestLabel()\n groupIntoTopics()\n symbolPaths()\n anchors()\n groups()\n key()\n bucket()\n indexModuleAnchors()\n modulePaths()\n targetless()\n candidates()\n path()\n values()\n resolvesToFile()\n resolved()\n indexUnambiguousSymbolPaths()\n candidates()\n paths()\n values()\n primaryTargetKey()\n anchor()\n indexDiagnostics()\n index()\n bucket()\n resolveEvidence()\n resolveStatus()\n summarizeLaneTotals()\n declared()\n observed()\n changelog()\n topicLabel()\n separator()\n raw()\n value()\n declared()\n object()\n renderRealitySvg()\n theme()\n maxRows()\n title()\n rows()\n visible()\n layout()\n header()\n body()\n overflow()\n height()\n buildRealityLayout()\n laneX()\n laneStep()\n statusX()\n statusWidth()\n renderRealityLaneHeaders()\n isDeclared()\n renderRealityRow()\n y()\n color()\n renderRealityLanes()\n count()\n cx()\n renderRealityLaneCell()\n fill()\n label()\n pillWidth()\n renderMoreTopicsLabel()\n y()\n renderRealityHeight()\n footer()\n y()\n renderRealityMarkdown()\n lanes()\n escapeMarkdown()\n src/communication/analyzer.ts:\n i: ../core/id.js,../core/schema.js,../core/text.js,../core/types.js,../extractors/communication.js,./llm.js\n e: CommunicationIssue,ParticipantCommunicationAnalysis,CommunicationAnalysis,analyzeCommunication,communication,evidenceByRecord,humanRequests,agentMessages,uniqueIssues,participantRows,collectParticipantsAndIdentityIssues,participants,participant,values,collectConflictIssues,left,right,leftRole,rightRole,code,responseRequiredFrom,resolveConflictCode,collectRequestResponseIssues,response,collectAgentActionIssues,type,participantGit,linked,matchedRequest,deduplicateCommunicationIssues,buildParticipantRows,aliases,matchedGit,evidence,validateSyntheses,byId,ids,record,renderCommunicationMarkdown,addCommunicationIssuesToDiagnostics,hasSerious,communicationIssueTitle,evidenceNeighbors,records,output,left,right,isEvidenceRecord,matchedGitRecords,aliases,semanticMatch,conflictSemanticMatch,leftHasExplicitTarget,rightHasExplicitTarget,agentResponseCoversRequest,candidates,bySource,values,aggregateTopicMatch,requested,response,shared,agentWorkCoveredByHumanScope,requests,sourceRecords,plans,agentSourceRecords,isBroadRequest,isActionableAgentWork,isPositiveImplementationClaim,isHumanDecisionClaim,hasImplementationVerb,withoutTickets,value,intersects,values,participantOf,participantsForRole,roleOf,typeOf,ticketOf,gitAliases,normalizeIdentity,append,values,issue,sortedRespondents,explicitResponseRoute,severityRank,escapeCell,escapeRegex\n CommunicationIssue:\n ParticipantCommunicationAnalysis:\n CommunicationAnalysis:\n analyzeCommunication()\n communication()\n evidenceByRecord()\n humanRequests()\n agentMessages()\n uniqueIssues()\n participantRows()\n collectParticipantsAndIdentityIssues()\n participants()\n participant()\n values()\n collectConflictIssues()\n left()\n right()\n leftRole()\n rightRole()\n code()\n responseRequiredFrom()\n resolveConflictCode()\n collectRequestResponseIssues()\n response()\n collectAgentActionIssues()\n type()\n participantGit()\n linked()\n matchedRequest()\n deduplicateCommunicationIssues()\n buildParticipantRows()\n aliases()\n matchedGit()\n evidence()\n validateSyntheses()\n byId()\n ids()\n record()\n renderCommunicationMarkdown()\n addCommunicationIssuesToDiagnostics()\n hasSerious()\n communicationIssueTitle()\n evidenceNeighbors()\n records()\n output()\n left()\n right()\n isEvidenceRecord()\n matchedGitRecords()\n aliases()\n semanticMatch()\n conflictSemanticMatch()\n leftHasExplicitTarget()\n rightHasExplicitTarget()\n agentResponseCoversRequest()\n candidates()\n bySource()\n values()\n aggregateTopicMatch()\n requested()\n response()\n shared()\n agentWorkCoveredByHumanScope()\n requests()\n sourceRecords()\n plans()\n agentSourceRecords()\n isBroadRequest()\n isActionableAgentWork()\n isPositiveImplementationClaim()\n isHumanDecisionClaim()\n hasImplementationVerb()\n withoutTickets()\n value()\n intersects()\n values()\n participantOf()\n participantsForRole()\n roleOf()\n typeOf()\n ticketOf()\n gitAliases()\n normalizeIdentity()\n append()\n values()\n issue()\n sortedRespondents()\n explicitResponseRoute()\n severityRank()\n escapeCell()\n escapeRegex()\n scripts/verify-no-llm-imports.mjs:\n i: node:fs,node:path\n e: visited,visit,body,resolved,resolveSource,raw\n visited()\n visit()\n body()\n resolved()\n resolveSource()\n raw()\n src/extractors/docs-record.ts:\n i: ../core/record.js,../version.js,./docs-types.js\n e: OBJECT_PLACEHOLDERS,toDocumentIntentRecord,statementText,target,action,modality,isPlaceholder,resolveObject,fallback,anchorToSource,claimedStart,claimedEnd,wanted,lines,scores,claimedScore,bestScore,bestIndex,anchored,keywordOverlap,present,shared,resolveTarget,hasTarget,resolveAction,derived,resolveModality,derived,linesFromChunk,lines,relativeStart,relativeEnd,clampLine,allowedAction,allowedModality,allowedLifecycle\n OBJECT_PLACEHOLDERS()\n toDocumentIntentRecord()\n statementText()\n target()\n action()\n modality()\n isPlaceholder()\n resolveObject()\n fallback()\n anchorToSource()\n claimedStart()\n claimedEnd()\n wanted()\n lines()\n scores()\n claimedScore()\n bestScore()\n bestIndex()\n anchored()\n keywordOverlap()\n present()\n shared()\n resolveTarget()\n hasTarget()\n resolveAction()\n derived()\n resolveModality()\n derived()\n linesFromChunk()\n lines()\n relativeStart()\n relativeEnd()\n clampLine()\n allowedAction()\n allowedModality()\n allowedLifecycle()\n src/extractors/markdown-llm-helpers.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,node:fs,node:path,node:url\n e: MarkdownEnrichment,MarkdownResponse,CoveredBatch,MarkdownAttemptError,StageAuditInput,MARKDOWN_LLM_BATCH_RECORDS\n MarkdownEnrichment:\n MarkdownResponse:\n CoveredBatch:\n MarkdownAttemptError: super(-1),enrichMarkdownRecords(-1),enrichments(-1),responseByRecord(-1),outcomes(-1),corrected(-1),failed(-1),enrichment(-1),metadata(-1),enrichBatchCovering(-1),metadataByRecord(-1),uncovered(-1),enrichSplitBatch(-1),half(-1),emptyCoverage(-1),enrichMarkdownBatchWithCorrection(-1),completion(-1),promptRecord(-1),validateEnrichments(-1),expected(-1),output(-1),enrichRecord(-1),markDeterministic(-1),marked(-1),stageAudit(-1),readPrompt(-1),promptPath(-1),markdownResponseContract(-1),strings(-1),enrichment(-1)\n StageAuditInput:\n MARKDOWN_LLM_BATCH_RECORDS()\n src/extractors/communication-helpers.ts:\n i: ../communication/identity.js,../config/env.js,../core/io.js,../core/record.js,../core/types.js,../tf/classifier.js,node:path\n e: CommunicationEnvelope,InferredCommunicationIdentity,CommunicationSegment,buildCommunicationRecords,segmentType,semantics,classified,action,line,parseEnvelope,lines,end,match,inferIdentity,parts,basename,governanceIdentity,inferGovernanceIdentityFromFilename,governance,inferIdentityFromPathAndFilename,fileParts,nestedRoleIndex,nestedRole,nestedParticipant,isTicketEvidenceFile,basename,communicationSegments,lines,flush,item,raw,heading,cleaned,looksLikeTicket,normalizeRole,normalizeType,normalized,isCommunicationType,first,listValue,stripped,validTimestamp,parsed,resolveIdentity,sameStrings,normalize,isCommunicationNoise,normalized,governanceSectionType,normalized,semanticsFor,unquote\n CommunicationEnvelope:\n InferredCommunicationIdentity:\n CommunicationSegment:\n buildCommunicationRecords()\n segmentType()\n semantics()\n classified()\n action()\n line()\n parseEnvelope()\n lines()\n end()\n match()\n inferIdentity()\n parts()\n basename()\n governanceIdentity()\n inferGovernanceIdentityFromFilename()\n governance()\n inferIdentityFromPathAndFilename()\n fileParts()\n nestedRoleIndex()\n nestedRole()\n nestedParticipant()\n isTicketEvidenceFile()\n basename()\n communicationSegments()\n lines()\n flush()\n item()\n raw()\n heading()\n cleaned()\n looksLikeTicket()\n normalizeRole()\n normalizeType()\n normalized()\n isCommunicationType()\n first()\n listValue()\n stripped()\n validTimestamp()\n parsed()\n resolveIdentity()\n sameStrings()\n normalize()\n isCommunicationNoise()\n normalized()\n governanceSectionType()\n normalized()\n semanticsFor()\n unquote()\n src/extractors/communication-file-helpers.ts:\n i: ../communication/identity.js,../config/env.js,../core/io.js,../core/types.js,./communication-helpers.js,node:path\n e: CommunicationFileOutcome,CommunicationMetadata,extractCommunicationFile,scope,readResult,envelope,inferred,extracted,localWarnings,segmentResult,records,shouldSkipCommunicationFile,explicitEnvelope,hasExplicitEnvelopeMetadata,buildCommunicationSegments,inferredRole,segments,resolveFileScope,relativeToProject,segments,pathTicket,readCommunicationBody,collectCommunicationMetadata,declaredParticipant,declaredRole,declaredParticipantId,identity,participant,role,displayName,explicitMessageType,messageType,ticket,recipient,rawTimestamp,timestamp,declaredGitAuthors,gitAuthors,explicitPaths,explicitSymbols,buildLocalWarnings,appendRoleAndParticipantWarnings,appendIdentityWarnings,appendRegistryAlignmentWarnings,appendA2aAgentWarnings,declaredA2aAgentId,hasRegistryEntry,appendTimestampWarnings,rawTimestamp\n CommunicationFileOutcome:\n CommunicationMetadata:\n extractCommunicationFile()\n scope()\n readResult()\n envelope()\n inferred()\n extracted()\n localWarnings()\n segmentResult()\n records()\n shouldSkipCommunicationFile()\n explicitEnvelope()\n hasExplicitEnvelopeMetadata()\n buildCommunicationSegments()\n inferredRole()\n segments()\n resolveFileScope()\n relativeToProject()\n segments()\n pathTicket()\n readCommunicationBody()\n collectCommunicationMetadata()\n declaredParticipant()\n declaredRole()\n declaredParticipantId()\n identity()\n participant()\n role()\n displayName()\n explicitMessageType()\n messageType()\n ticket()\n recipient()\n rawTimestamp()\n timestamp()\n declaredGitAuthors()\n gitAuthors()\n explicitPaths()\n explicitSymbols()\n buildLocalWarnings()\n appendRoleAndParticipantWarnings()\n appendIdentityWarnings()\n appendRegistryAlignmentWarnings()\n appendA2aAgentWarnings()\n declaredA2aAgentId()\n hasRegistryEntry()\n appendTimestampWarnings()\n rawTimestamp()\n src/core/text.ts:\n i: ./types.js\n e: STOP_WORDS,buildStopWords,classifyActionHeuristically,conventionalAction,prose,searchable,matchedByPattern,extractConventionalAction,conventional,findActionInText,removeInlineCode,detectModality,prose,searchable,matches,detectPolarity,prose,stripped,normalized,normalizeToken,keywords,GENERIC_TOPICS,topicKeywords,separated,foldTopicToken,aliased,singular,similarity,left,right,intersection,extractBacktickValues,value,extractPaths,FILE_EXTENSIONS,hasFileExtension,last,dot,PATH_ROOTS,isPathLike,segments,HOST_TLDS,isHostname,parts,tld,extractSymbols,repositoryPaths,backticks,camel,ticketPrefixes,extractTickets,values,extractVersions,inferObject,normalized,withoutAction,result,normalizeForObject,removeObjectAction,stripObjectConnector,splitIntentLines,lines,raw,cleaned,pieces,value\n STOP_WORDS()\n buildStopWords()\n classifyActionHeuristically()\n conventionalAction()\n prose()\n searchable()\n matchedByPattern()\n extractConventionalAction()\n conventional()\n findActionInText()\n removeInlineCode()\n detectModality()\n prose()\n searchable()\n matches()\n detectPolarity()\n prose()\n stripped()\n normalized()\n normalizeToken()\n keywords()\n GENERIC_TOPICS()\n topicKeywords()\n separated()\n foldTopicToken()\n aliased()\n singular()\n similarity()\n left()\n right()\n intersection()\n extractBacktickValues()\n value()\n extractPaths()\n FILE_EXTENSIONS()\n hasFileExtension()\n last()\n dot()\n PATH_ROOTS()\n isPathLike()\n segments()\n HOST_TLDS()\n isHostname()\n parts()\n tld()\n extractSymbols()\n repositoryPaths()\n backticks()\n camel()\n ticketPrefixes()\n extractTickets()\n values()\n extractVersions()\n inferObject()\n normalized()\n withoutAction()\n result()\n normalizeForObject()\n removeObjectAction()\n stripObjectConnector()\n splitIntentLines()\n lines()\n raw()\n cleaned()\n pieces()\n value()\n src/evaluation/gold.ts:\n i: ../core/id.js,./gold-extraction.js,node:fs\n e: EvaluationCore,EvaluationRun,EvaluationResult,loadGoldDataset,parsed,evaluateGoldDataset,first,second,stable,goldReportIsPerfect,renderGoldReportMarkdown,percent,support,rows,value,evaluateOnce,extraction,linking,dsl2todo,diagnostics,evaluateExtraction,byChannel,actual,overall,evaluateDiagnostics,counts,forbiddenViolations,snapshots,result,evaluateLinking,counts,byClass,forbiddenViolations,snapshots,result,reranking,evaluateDsl2Todo,duplicateCounts,snapshots,result\n EvaluationCore:\n EvaluationRun:\n EvaluationResult:\n loadGoldDataset()\n parsed()\n evaluateGoldDataset()\n first()\n second()\n stable()\n goldReportIsPerfect()\n renderGoldReportMarkdown()\n percent()\n support()\n rows()\n value()\n evaluateOnce()\n extraction()\n linking()\n dsl2todo()\n diagnostics()\n evaluateExtraction()\n byChannel()\n actual()\n overall()\n evaluateDiagnostics()\n counts()\n forbiddenViolations()\n snapshots()\n result()\n evaluateLinking()\n counts()\n byClass()\n forbiddenViolations()\n snapshots()\n result()\n reranking()\n evaluateDsl2Todo()\n duplicateCounts()\n snapshots()\n result()\n src/live/contract-check.ts:\n i: ../core/types.js\n e: LiveBudget,LiveStageMeasurement,LiveHistoryRecord,LiveHistoryStageSummary,LiveHistorySummary,LiveContractAudit,LIVE_HISTORY_LIMIT,liveRequestTimeoutMs,measureLiveStages,missingLiveStages,measureStage,responses,overLatency,sumUsage,values,buildLiveAudit,stages,missingStages,totalLatencyMs,costs,totalCostUsd,overCost,overTotalLatency,buildRecordedLiveAudit,initial,history,toLiveHistoryRecord,appendLiveHistory,kept,summarizeLiveHistory,runs,byStage,entries,redactLiveMessage,renderLiveReport,lines,status,cost,detail,total,median,middle,value,ratio,round\n LiveBudget:\n LiveStageMeasurement:\n LiveHistoryRecord:\n LiveHistoryStageSummary:\n LiveHistorySummary:\n LiveContractAudit:\n LIVE_HISTORY_LIMIT()\n liveRequestTimeoutMs()\n measureLiveStages()\n missingLiveStages()\n measureStage()\n responses()\n overLatency()\n sumUsage()\n values()\n buildLiveAudit()\n stages()\n missingStages()\n totalLatencyMs()\n costs()\n totalCostUsd()\n overCost()\n overTotalLatency()\n buildRecordedLiveAudit()\n initial()\n history()\n toLiveHistoryRecord()\n appendLiveHistory()\n kept()\n summarizeLiveHistory()\n runs()\n byStage()\n entries()\n redactLiveMessage()\n renderLiveReport()\n lines()\n status()\n cost()\n detail()\n total()\n median()\n middle()\n value()\n ratio()\n round()\n src/communication/intake-contract.ts:\n i: node:crypto\n e: VerifiedPrincipal,ParticipantV2,ParticipantRegistryV2,IntakeEnvelope,IntakeDiagnostic,IntakeResult,IntakeError\n VerifiedPrincipal:\n ParticipantV2:\n ParticipantRegistryV2:\n IntakeEnvelope:\n IntakeDiagnostic:\n IntakeResult:\n IntakeError: super(-1),payloadHash(-1),canonicalJson(-1),record(-1),assertIntakeEnvelope(-1),envelope(-1),validateIntakeEnvelopeHeader(-1),validateIntakeEnvelopeTimestamp(-1),assertCommand(-1),assertQuery(-1),invalid(-1),validateIntakeEnvelopeHeader(-1),invalid(-1),invalid(-1),validateIntakeEnvelopeTimestamp(-1),invalid(-1),assertCommand(-1),base(-1),validateCommandPayload(-1),validateCommandPayload(-1),assertParticipant(-1),participantId(-1),assertPrincipal(-1),participantId(-1),role(-1),stringArray(-1),capabilities(-1),participantId(-1),role(-1),ticketId(-1),invalid(-1),invalid(-1),participantId(-1),ticketId(-1),invalid(-1),assertQuery(-1),base(-1),validateQueryPayload(-1),validateQueryPayload(-1),nonBlank(-1),participantId(-1),ticketId(-1),nonBlank(-1),participantId(-1),ticketId(-1),invalid(-1),assertParticipant(-1),entry(-1),participantId(-1),nonBlank(-1),capabilities(-1),stringArray(-1),principalKey(-1),assertPrincipal(-1),principal(-1),nonBlank(-1),nonBlank(-1),commandFields(-1),type(-1),queryFields(-1),type(-1),strictObject(-1),record(-1),allowed(-1),extra(-1),missing(-1),participantId(-1),ticketId(-1),role(-1),nonBlank(-1),stringArray(-1),capabilities(-1),allowed(-1),invalid(-1),diagnostic(-1),known(-1)\n golang/ast_extract.go:\n e: Fact,output,factCollector,main,emit,collectGoFiles,parseFile,position,excerpt,add,visitDecl,visitFunc,visitGenDecl,visitCalls,typeName,declaredTypeKind,strPtr,toSlash\n Fact:\n output:\n factCollector:\n main()\n emit()\n collectGoFiles()\n parseFile()\n position()\n excerpt()\n add()\n visitDecl()\n visitFunc()\n visitGenDecl()\n visitCalls()\n typeName()\n declaredTypeKind()\n strPtr()\n toSlash()\n scripts/research/rerank-embedding-shortlist.mjs:\n i: ../../dist/src/config/env.js,../../dist/src/semantic/reranker-llm.js,node:fs,node:path\n e: options,records,selectedRows,declaration,module,candidateSet,config,rerank,augmentedGraph,originalRelationIds,originallyRelatedPairs,candidateById,accepted,candidate,relation,verdictCounts,resolveDeclaration,exact,matches,resolveModule,exact,matches,readJson,parseArgs,values,key,value,required,value,top\n options()\n records()\n selectedRows()\n declaration()\n module()\n candidateSet()\n config()\n rerank()\n augmentedGraph()\n originalRelationIds()\n originallyRelatedPairs()\n candidateById()\n accepted()\n candidate()\n relation()\n verdictCounts()\n resolveDeclaration()\n exact()\n matches()\n resolveModule()\n exact()\n matches()\n readJson()\n parseArgs()\n values()\n key()\n value()\n required()\n value()\n top()\n src/cli.ts:\n i: ./communication/analyzer.js,./communication/llm.js,./comparison/workspace.js,./config/env.js,./core/io.js,./core/types.js,./diff/git.js,./diff/reality.js,./extractors/ast.js,./extractors/configuration.js,./extractors/docs-llm.js,./extractors/git.js,./extractors/markdown-llm.js,./extractors/nl-llm.js,./extractors/runtime-cycle.js,./graph/diagnostics.js,./graph/diff.js,./graph/linker.js,./interfaces/a2a.js,./interfaces/intake-actions.js,./interfaces/mcp.js,./pipeline/run.js,./services/actions.js,./summary/summarizer.js,./version.js,./watch/watcher.js,node:child_process,node:fs,node:path,node:url,node:util\n e: ParsedArgs,execFileAsync,main,parsed,command,config,handler,commandHandlers,resolveMainCommand,handleLink,files,records,graph,handleDiagnose,graphFile,graph,handleSummarize,graphFile,graph,diagnosticsPath,diagnostics,result,out,handleProposeTodo,graphPath,diagnosticsPath,output,result,handleRenderTodo,synthesisPath,graphPath,diagnosticsPath,patch,audit,result,handleApplyTodo,patch,audit,receipt,actor,approvalHash,result,handleProposeCodeChange,graphPath,diagnosticsPath,output,result,handleRenderCodeChange,plansPath,patch,audit,result,handleProposeSourcePatch,inputPath,output,isPlanSet,result,handleApplySourcePatch,patchPath,actor,approvalHash,receipt,result,handleEvaluateCodeChange,planPath,beforeGraphPath,afterGraphPath,output,result,handleCloseCodeChange,inputPath,beforeGraphPath,afterGraphPath,output,result,handleCompareWorkspace,root,result,handlePipeline,root,options,result,handleWatch,root,taskFile,pipeline,controller,stop,resolvePipelineRoot,buildPipelineOptions,buildCommonPipelineOptions,resolveWatchTaskFile,buildWorkspaceComparisonOptions,formatWatchEvent,stamp,handleDiff,mode,out,svg,html,maxRows,parseDiffMode,mode,handleGraphDiff,beforeFile,afterFile,diff,out,svg,buildDiffPayload,buildFileDiff,beforeFile,afterFile,context,buildGitDiff,context,root,result,handleReality,graphFile,graph,diagnosticsPath,diagnostics,view,out,svg,markdown,handleExtract,extractor,root,out,handler,handleExtractNl,file,inline,result,handleExtractGit,result,handleExtractAst,result,handleExtractConfig,result,handleExtractRuntime,cycle,result,handleExtractMarkdown,result,handleExtractDocs,result,handleExtractCommunication,result,handleCommunication,root,graph,analysis,out,markdown,graphOut,emitExtraction,emitJson,handleIntake,operation,inputPath,absolute,result,intakeExitCode,initProject,moduleRoot,sourceEnv,targetEnv,task,sourceIgnore,targetIgnore,doctor,result,parseArgs,options,value,next,name,next,optionString,value,optionNullableString,value,optionBoolean,value,optionNumber,value,number,optionList,value,optionNlMode,optionLlmMode,value,optionTaskMode,value,optionSummaryMode,optionPipelineTaskMode,value,reportPipelineDegradation,printHelp,invokedPath\n ParsedArgs:\n execFileAsync()\n main()\n parsed()\n command()\n config()\n handler()\n commandHandlers()\n resolveMainCommand()\n handleLink()\n files()\n records()\n graph()\n handleDiagnose()\n graphFile()\n graph()\n handleSummarize()\n graphFile()\n graph()\n diagnosticsPath()\n diagnostics()\n result()\n out()\n handleProposeTodo()\n graphPath()\n diagnosticsPath()\n output()\n result()\n handleRenderTodo()\n synthesisPath()\n graphPath()\n diagnosticsPath()\n patch()\n audit()\n result()\n handleApplyTodo()\n patch()\n audit()\n receipt()\n actor()\n approvalHash()\n result()\n handleProposeCodeChange()\n graphPath()\n diagnosticsPath()\n output()\n result()\n handleRenderCodeChange()\n plansPath()\n patch()\n audit()\n result()\n handleProposeSourcePatch()\n inputPath()\n output()\n isPlanSet()\n result()\n handleApplySourcePatch()\n patchPath()\n actor()\n approvalHash()\n receipt()\n result()\n handleEvaluateCodeChange()\n planPath()\n beforeGraphPath()\n afterGraphPath()\n output()\n result()\n handleCloseCodeChange()\n inputPath()\n beforeGraphPath()\n afterGraphPath()\n output()\n result()\n handleCompareWorkspace()\n root()\n result()\n handlePipeline()\n root()\n options()\n result()\n handleWatch()\n root()\n taskFile()\n pipeline()\n controller()\n stop()\n resolvePipelineRoot()\n buildPipelineOptions()\n buildCommonPipelineOptions()\n resolveWatchTaskFile()\n buildWorkspaceComparisonOptions()\n formatWatchEvent()\n stamp()\n handleDiff()\n mode()\n out()\n svg()\n html()\n maxRows()\n parseDiffMode()\n mode()\n handleGraphDiff()\n beforeFile()\n afterFile()\n diff()\n out()\n svg()\n buildDiffPayload()\n buildFileDiff()\n beforeFile()\n afterFile()\n context()\n buildGitDiff()\n context()\n root()\n result()\n handleReality()\n graphFile()\n graph()\n diagnosticsPath()\n diagnostics()\n view()\n out()\n svg()\n markdown()\n handleExtract()\n extractor()\n root()\n out()\n handler()\n handleExtractNl()\n file()\n inline()\n result()\n handleExtractGit()\n result()\n handleExtractAst()\n result()\n handleExtractConfig()\n result()\n handleExtractRuntime()\n cycle()\n result()\n handleExtractMarkdown()\n result()\n handleExtractDocs()\n result()\n handleExtractCommunication()\n result()\n handleCommunication()\n root()\n graph()\n analysis()\n out()\n markdown()\n graphOut()\n emitExtraction()\n emitJson()\n handleIntake()\n operation()\n inputPath()\n absolute()\n result()\n intakeExitCode()\n initProject()\n moduleRoot()\n sourceEnv()\n targetEnv()\n task()\n sourceIgnore()\n targetIgnore()\n doctor()\n result()\n parseArgs()\n options()\n value()\n next()\n name()\n next()\n optionString()\n value()\n optionNullableString()\n value()\n optionBoolean()\n value()\n optionNumber()\n value()\n number()\n optionList()\n value()\n optionNlMode()\n optionLlmMode()\n value()\n optionTaskMode()\n value()\n optionSummaryMode()\n optionPipelineTaskMode()\n value()\n reportPipelineDegradation()\n printHelp()\n invokedPath()\n src/services/actions.ts:\n i: ../communication/analyzer.js,../communication/llm.js,../comparison/workspace.js,../config/env.js,../core/io.js,../core/security.js,../core/types.js,../core/types.js,../diff/git.js,../diff/reality.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../graph/diagnostics.js,../graph/diff.js,../graph/linker.js,../pipeline/run.js,../summary/summarizer.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,node:path\n e: CommunicationGraphFilter,executeAction,root,handler,executeExtractNlAction,file,text,executeExtractGitAction,executeExtractAstAction,executeExtractConfigAction,executeExtractMarkdownAction,executeExtractDocsAction,executeExtractCommunicationAction,executeAnalyzeCommunicationAction,analysis,executeLinkAction,records,executeDiagnoseAction,graph,executeSummarizeAction,graph,diagnostics,executeProposeTodoAction,graph,diagnostics,result,output,executeRenderTodoAction,graph,diagnostics,synthesis,todoPath,patchPath,auditPath,todoContent,rendered,executeApplyTodoAction,todoPath,patchPath,auditPath,receiptPath,result,executeProposeCodeChangeAction,graph,diagnostics,conclusions,proposals,result,output,executeRenderCodeChangeAction,planSet,review,patchPath,auditPath,executeProposeSourcePatchAction,plan,unifiedDiffs,patch,output,planSet,result,output,executeApplySourcePatchAction,patch,receiptPath,result,executeEvaluateCodeChangeAction,plan,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,result,output,executeCloseCodeChangeAction,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,value,planSet,result,output,executeDiffAction,beforeInput,afterInput,before,after,diff,svg,executeDiffFilesAction,beforePath,afterPath,diff,executeDiffGitAction,result,executeRealityAction,graph,diagnostics,view,executeCompareWorkspaceAction,executePipelineAction,filterCommunicationGraph,filter,records,parseCommunicationGraphFilter,participant,role,ticket,communicationOnly,matchesCommunicationFilter,matchesParticipant,matchesRole,matchesTicket,nlModeValue,llmModeValue,taskSynthesisMode,summaryModeValue,pipelineTaskMode,withTextDiffViews,title,readGraphInput,safePath,readActionObject,safePath,resolveRoot,requested,scopedPath,selected,nullableScopedPath,selected,readRecords,files,safeFile,stringValue,nullableString,stringList,numberValue,number,hasInputValue,objectMapOfStrings,booleanValue,objectValue,registerRunArtifacts,manifestPath,manifest\n CommunicationGraphFilter:\n executeAction()\n root()\n handler()\n executeExtractNlAction()\n file()\n text()\n executeExtractGitAction()\n executeExtractAstAction()\n executeExtractConfigAction()\n executeExtractMarkdownAction()\n executeExtractDocsAction()\n executeExtractCommunicationAction()\n executeAnalyzeCommunicationAction()\n analysis()\n executeLinkAction()\n records()\n executeDiagnoseAction()\n graph()\n executeSummarizeAction()\n graph()\n diagnostics()\n executeProposeTodoAction()\n graph()\n diagnostics()\n result()\n output()\n executeRenderTodoAction()\n graph()\n diagnostics()\n synthesis()\n todoPath()\n patchPath()\n auditPath()\n todoContent()\n rendered()\n executeApplyTodoAction()\n todoPath()\n patchPath()\n auditPath()\n receiptPath()\n result()\n executeProposeCodeChangeAction()\n graph()\n diagnostics()\n conclusions()\n proposals()\n result()\n output()\n executeRenderCodeChangeAction()\n planSet()\n review()\n patchPath()\n auditPath()\n executeProposeSourcePatchAction()\n plan()\n unifiedDiffs()\n patch()\n output()\n planSet()\n result()\n output()\n executeApplySourcePatchAction()\n patch()\n receiptPath()\n result()\n executeEvaluateCodeChangeAction()\n plan()\n beforeGraph()\n beforeDiagnostics()\n afterGraph()\n afterDiagnostics()\n result()\n output()\n executeCloseCodeChangeAction()\n beforeGraph()\n beforeDiagnostics()\n afterGraph()\n afterDiagnostics()\n value()\n planSet()\n result()\n output()\n executeDiffAction()\n beforeInput()\n afterInput()\n before()\n after()\n diff()\n svg()\n executeDiffFilesAction()\n beforePath()\n afterPath()\n diff()\n executeDiffGitAction()\n result()\n executeRealityAction()\n graph()\n diagnostics()\n view()\n executeCompareWorkspaceAction()\n executePipelineAction()\n filterCommunicationGraph()\n filter()\n records()\n parseCommunicationGraphFilter()\n participant()\n role()\n ticket()\n communicationOnly()\n matchesCommunicationFilter()\n matchesParticipant()\n matchesRole()\n matchesTicket()\n nlModeValue()\n llmModeValue()\n taskSynthesisMode()\n summaryModeValue()\n pipelineTaskMode()\n withTextDiffViews()\n title()\n readGraphInput()\n safePath()\n readActionObject()\n safePath()\n resolveRoot()\n requested()\n scopedPath()\n selected()\n nullableScopedPath()\n selected()\n readRecords()\n files()\n safeFile()\n stringValue()\n nullableString()\n stringList()\n numberValue()\n number()\n hasInputValue()\n objectMapOfStrings()\n booleanValue()\n objectValue()\n registerRunArtifacts()\n manifestPath()\n manifest()\n src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:\n i: ../../core/io.js,../../core/schema.js,../../core/security.js,../../version.js,./implementation-diagnostics.js,./implementation-source-patch-apply-diff.js,./implementation-source-patch-assert.js,node:crypto,node:fs,node:path\n e: ApplyCodeChangeSourcePatchOptions,ApplyCodeChangeSourcePatchResult,NormalizedApplyCodeChangeSourcePatchRequest,SourcePatchApplyLock,SourcePatchEditTarget,PreparedSourceEdit,applyCodeChangeSourcePatch,request,root,receiptPath,lock,idempotentResult,prepared,now,receipt,readExistingReceipt,existing,assertPatchApplicationRequest,patch,assertPatchApprovalActor,assertPatchApprovalHash,assertPatchEditsContainDiffs,acquireApplyLock,lock,prepareSourceEdits,target,before,after,prepareSourceEditTarget,relative,absolute,existed,assertSourcePatchTargetNotSymlink,assertDeleteEditClearsAll,validatePatchTargetForEdit,applyPreparedEdits,receipt,rollbackErrors,writePreparedEdits,buildPatchApplyReceipt,fileHashesAfter,rollbackPreparedEdits,assertExistingSourceReceipt,relative,absolute,exists,current,assertSourceApplyReceipt,validateSourceApplyReceiptShape,validateSourceApplyReceiptIdentity,validateSourceApplyReceiptTimestamps,validateSourceApplyReceiptPathHashes,expectedPaths,hashPaths,validateSourceApplyReceiptGeneration,atomicWriteRaw,exactSourcePatchKeys,actual,exactSourcePatchSet,deterministicGeneration\n ApplyCodeChangeSourcePatchOptions:\n ApplyCodeChangeSourcePatchResult:\n NormalizedApplyCodeChangeSourcePatchRequest:\n SourcePatchApplyLock:\n SourcePatchEditTarget:\n PreparedSourceEdit:\n applyCodeChangeSourcePatch()\n request()\n root()\n receiptPath()\n lock()\n idempotentResult()\n prepared()\n now()\n receipt()\n readExistingReceipt()\n existing()\n assertPatchApplicationRequest()\n patch()\n assertPatchApprovalActor()\n assertPatchApprovalHash()\n assertPatchEditsContainDiffs()\n acquireApplyLock()\n lock()\n prepareSourceEdits()\n target()\n before()\n after()\n prepareSourceEditTarget()\n relative()\n absolute()\n existed()\n assertSourcePatchTargetNotSymlink()\n assertDeleteEditClearsAll()\n validatePatchTargetForEdit()\n applyPreparedEdits()\n receipt()\n rollbackErrors()\n writePreparedEdits()\n buildPatchApplyReceipt()\n fileHashesAfter()\n rollbackPreparedEdits()\n assertExistingSourceReceipt()\n relative()\n absolute()\n exists()\n current()\n assertSourceApplyReceipt()\n validateSourceApplyReceiptShape()\n validateSourceApplyReceiptIdentity()\n validateSourceApplyReceiptTimestamps()\n validateSourceApplyReceiptPathHashes()\n expectedPaths()\n hashPaths()\n validateSourceApplyReceiptGeneration()\n atomicWriteRaw()\n exactSourcePatchKeys()\n actual()\n exactSourcePatchSet()\n deterministicGeneration()\n src/llm/openrouter.ts:\n i: ../config/env.js,../core/types.js,./structured-schema.js\n e: ChatMessage,OpenRouterResult,OpenRouterModelsResponse,OpenRouterModelError,OpenRouterClient\n ChatMessage:\n OpenRouterResult:\n OpenRouterModelsResponse:\n OpenRouterModelError: super(-1)\n OpenRouterClient: isConfigured(-1),listAvailableModels(-1),controller(-1),timeout(-1),response(-1),text(-1),clearTimeout(-1),chatText(-1),chatTextWithMetadata(-1),response(-1),content(-1),chatJson(-1),result(-1),chatJsonWithMetadata(-1),response(-1),fallback(-1),request(-1),responseMetadata(-1),usage(-1),stringOrNull(-1),finiteOrNull(-1),createModelError(-1),formatInvalidModelError(-1),extractContent(-1),content(-1),parseJsonContent(-1),trimmed(-1),start(-1),end(-1),parseJsonResponse(-1),metadata(-1),message(-1),shouldRetryWithoutJsonSchema(-1)\n src/config/env.ts:\n i: ../core/io.js,../core/types.js,../version.js,node:fs,node:path\n e: T2CConfig,loadEnvFile,explicit,candidates,content,trimmed,separator,key,value,envString,value,envOptional,value,envNumber,raw,value,envBoolean,raw,envList,raw,envLlmMode,value,getConfig,model,root,configForDisplay,hasOpenRouter\n T2CConfig:\n loadEnvFile()\n explicit()\n candidates()\n content()\n trimmed()\n separator()\n key()\n value()\n envString()\n value()\n envOptional()\n value()\n envNumber()\n raw()\n value()\n envBoolean()\n raw()\n envList()\n raw()\n envLlmMode()\n value()\n getConfig()\n model()\n root()\n configForDisplay()\n hasOpenRouter()\n src/interfaces/a2a-history.ts:\n i: ../config/env.js,../core/security.js,node:fs,node:path\n e: RunHistoryFilters,listIntentRuns,runsDirectory,entries,items,readRunEntries,readRun,runDirectory,graphPath,manifestPath,manifest,matchesRunFilters,participant,role,ticket,severity,normalized,safeRunPath\n RunHistoryFilters:\n listIntentRuns()\n runsDirectory()\n entries()\n items()\n readRunEntries()\n readRun()\n runDirectory()\n graphPath()\n manifestPath()\n manifest()\n matchesRunFilters()\n participant()\n role()\n ticket()\n severity()\n normalized()\n safeRunPath()\n src/diff/text-render.ts:\n i: ./text-types.js\n e: TextDiffSvgOptions,SideBySideRow,renderUnifiedDiff,marker,toSideBySideRows,index,line,pairs,renderTextDiffSvg,theme,maxRows,maxColumns,title,charWidth,rowHeight,gutterWidth,columnWidth,width,totals,y,rendered,skipped,summarizeDiffs,diffHeading,svgBody,sideBySideRowMarkup,changed,number,renderTextDiffHtml,title,sections,renderHtmlSection,hunks,rows,htmlCell,cssClass,number\n TextDiffSvgOptions:\n SideBySideRow:\n renderUnifiedDiff()\n marker()\n toSideBySideRows()\n index()\n line()\n pairs()\n renderTextDiffSvg()\n theme()\n maxRows()\n maxColumns()\n title()\n charWidth()\n rowHeight()\n gutterWidth()\n columnWidth()\n width()\n totals()\n y()\n rendered()\n skipped()\n summarizeDiffs()\n diffHeading()\n svgBody()\n sideBySideRowMarkup()\n changed()\n number()\n renderTextDiffHtml()\n title()\n sections()\n renderHtmlSection()\n hunks()\n rows()\n htmlCell()\n cssClass()\n number()\n src/operations/subactor.ts:\n i: ../core/types.js,./validation.js\n e: CompileSubactorEnvelopeOptions,valueMatchesType,assertBinding,ageSeconds,compileSubactorProcessEnvelope,variableById,referenced,variable,binding,humanApproval,binding\n CompileSubactorEnvelopeOptions:\n valueMatchesType()\n assertBinding()\n ageSeconds()\n compileSubactorProcessEnvelope()\n variableById()\n referenced()\n variable()\n binding()\n humanApproval()\n binding()\n src/communication/intake-protobuf.ts:\n i: ./intake-contract.js\n e: encodeIntakeEnvelope,operation,decodeIntakeEnvelope,parsed,values,unknownFields,payload,envelope,encodeIntakeResult,decodeIntakeResult,parsed,strings,numbers,decodeDelimitedFields,values,strings,numbers,offset,fieldStart,field,wire,raw,value,parsePayloadJson,parseOptionalJson,buildIntakeEnvelope,bytesField,data,varintField,writeVarint,remaining,readVarint,value,byte\n encodeIntakeEnvelope()\n operation()\n decodeIntakeEnvelope()\n parsed()\n values()\n unknownFields()\n payload()\n envelope()\n encodeIntakeResult()\n decodeIntakeResult()\n parsed()\n strings()\n numbers()\n decodeDelimitedFields()\n values()\n strings()\n numbers()\n offset()\n fieldStart()\n field()\n wire()\n raw()\n value()\n parsePayloadJson()\n parseOptionalJson()\n buildIntakeEnvelope()\n bytesField()\n data()\n varintField()\n writeVarint()\n remaining()\n readVarint()\n value()\n byte()\n src/communication/intake-service.ts:\n i: ./intake-store.js,node:crypto,node:fs,node:path\n e: IntakeState,GovernedIntakeService\n IntakeState:\n GovernedIntakeService: command(-1),duplicate(-1),state(-1),actor(-1),event(-1),appended(-1),actual(-1),updated(-1),participantId(-1),ticketId(-1),actual(-1),query(-1),stream(-1),state(-1),payload(-1),command(-1),requireManagerOrBootstrap(-1),ensurePrincipalsUnique(-1),requireCapability(-1),requireKnownActor(-1),requireCapability(-1),participant(-1),requireCapability(-1),participant(-1),participant(-1),requireCapability(-1),rejectSecrets(-1),requireCapability(-1),participant(-1),writeProjection(-1),participant(-1),target(-1),messages(-1),body(-1),projectionHash(-1),stat(-1),existing(-1),assertProjectionWritable(-1),target(-1),slug(-1),directory(-1),roleFiles(-1),stat(-1),existing(-1),validateProjection(-1),participant(-1),target(-1),directory(-1),slug(-1),candidates(-1),roleFiles(-1),conflictingFiles(-1),existing(-1),messages(-1),body(-1),hash(-1),replay(-1),participants(-1),participant(-1),participant(-1),participant(-1),registry(-1),resolveActor(-1),requireKnownActor(-1),requireManagerOrBootstrap(-1),requireCapability(-1),requireCapability(-1),requireKnownActor(-1),requireParticipant(-1),participant(-1),ensurePrincipalsUnique(-1),ensurePrincipalAvailable(-1),key(-1),rejectSecrets(-1),accepted(-1),rejected(-1),envelope(-1),unauthorized(-1),duplicate(-1),drift(-1),escapeRegex(-1),commandEnvelope(-1)\n scripts/live-model-comparison.mjs:\n i: node:fs,node:path,node:url\n e: REPO_ROOT,main,probe,timeoutMs,models,root,config,result,comparison,rendered,jsonTarget,markdownTarget,failedAudit,message,writeFile\n REPO_ROOT()\n main()\n probe()\n timeoutMs()\n models()\n root()\n config()\n result()\n comparison()\n rendered()\n jsonTarget()\n markdownTarget()\n failedAudit()\n message()\n writeFile()\n src/extractors/ast.ts:\n i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/ignore.js,../core/io.js,../core/schema.js,../core/types.js,../version.js,./ast/go.js,./ast/java.js,./ast/php.js,./ast/python.js,./ast/rust.js,./ast/typescript.js,./ast/unsupported.js,node:path\n e: AstExtractionOptions,ExternalCacheAdapter,extractAstIntent,root,cache,matcher,files,body,relative,extracted,adapterFiles,manifest,result,unsupported,sourceManifest,body,isIntentRecords,isExtractionResult,result\n AstExtractionOptions:\n ExternalCacheAdapter:\n extractAstIntent()\n root()\n cache()\n matcher()\n files()\n body()\n relative()\n extracted()\n adapterFiles()\n manifest()\n result()\n unsupported()\n sourceManifest()\n body()\n isIntentRecords()\n isExtractionResult()\n result()\n src/extractors/docs-llm.ts:\n i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/io.js,../core/types.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,./docs-record.js,./docs-schema.js,node:fs,node:path,node:url\n e: DocumentationLlmRequiredError\n DocumentationLlmRequiredError: super(-1),extractDocumentationIntent(-1),startedAt(-1),client(-1),requireConfiguredClient(-1),cache(-1),chunks(-1),selectedChunks(-1),systemPrompt(-1),results(-1),requireConfiguredClient(-1),loadDocumentChunks(-1),files(-1),body(-1),relative(-1),fileChunks(-1),isDocumentChunks(-1),candidate(-1),selectWithinBudget(-1),prioritized(-1),selected(-1),extractChunk(-1),contract(-1),records(-1),buildAudit(-1),status(-1),readPrompt(-1),promptPath(-1),errorMessage(-1)\n src/extractors/markdown-paths.ts:\n i: ../core/io.js,node:fs,node:fs,node:path\n e: MarkdownPathResolver,BasenameIndexState,PATH_SEARCH_EXCLUDES,MAX_INDEXED_FILES,createMarkdownPathResolver,repositoryRoot,basenames,headingDirectories,normalized,candidate,matches,isRepositoryPath,absolute,headingScopes,buildBasenameIndex,index,state,directory,entries,createBasenameIndexState,readBasenameDirectoryEntries,isNestedCheckout,scanDirectoryForBasenames,absolute,addBasenameIndexMatch,matches\n MarkdownPathResolver:\n BasenameIndexState:\n PATH_SEARCH_EXCLUDES()\n MAX_INDEXED_FILES()\n createMarkdownPathResolver()\n repositoryRoot()\n basenames()\n headingDirectories()\n normalized()\n candidate()\n matches()\n isRepositoryPath()\n absolute()\n headingScopes()\n buildBasenameIndex()\n index()\n state()\n directory()\n entries()\n createBasenameIndexState()\n readBasenameDirectoryEntries()\n isNestedCheckout()\n scanDirectoryForBasenames()\n absolute()\n addBasenameIndexMatch()\n matches()\n src/core/schema/intent.ts:\n i: ../id.js\n e: GroundedValidationContext,TodoProposalValidationContext,CodeChangePlanValidationContext,CodeChangeAcceptanceValidationContext,assertIntentRecord,record,recordId,statement,lifecycle,source,epistemic,metadata,assertIntentStatement,statement,assertIntentTarget,target,assertIntentLifecycle,lifecycle,assertIntentSource,source,lines,assertIntentEpistemic,epistemic,assertIntentMetadata,typedMetadata,generation,assertGenerationMatchesExtractor,generation,separator,expectedGenerator,assertIntentGenerationMetadata,generation,assertIntentRecords,assertIntentGraph,graph,recordIds,relationIds,stats,records,expectedFingerprint,assertIntentGraphDiff,diff,records,change,relations,summary,assertRelation,relation\n GroundedValidationContext:\n TodoProposalValidationContext:\n CodeChangePlanValidationContext:\n CodeChangeAcceptanceValidationContext:\n assertIntentRecord()\n record()\n recordId()\n statement()\n lifecycle()\n source()\n epistemic()\n metadata()\n assertIntentStatement()\n statement()\n assertIntentTarget()\n target()\n assertIntentLifecycle()\n lifecycle()\n assertIntentSource()\n source()\n lines()\n assertIntentEpistemic()\n epistemic()\n assertIntentMetadata()\n typedMetadata()\n generation()\n assertGenerationMatchesExtractor()\n generation()\n separator()\n expectedGenerator()\n assertIntentGenerationMetadata()\n generation()\n assertIntentRecords()\n assertIntentGraph()\n graph()\n recordIds()\n relationIds()\n stats()\n records()\n expectedFingerprint()\n assertIntentGraphDiff()\n diff()\n records()\n change()\n relations()\n summary()\n assertRelation()\n relation()\n src/synthesis/todo-patch.ts:\n i: ../core/id.js,../core/io.js,./validation.js,node:crypto,node:fs,node:path\n e: CreateTodoPatchOptions,CreatedTodoPatch,WriteTodoPatchOptions,WrittenTodoPatch,ApplyTodoPatchOptions,diagnosticReportFingerprint,createTodoPatch,expectedValidation,proposalById,selected,proposal,orderedSelected,markdown,renderTodoPatchMarkdown,writeTodoPatchArtifacts,created,patchPath,auditPath,applyTodoPatch,current,receipt,now,currentHash,result,applied,recovered,assertTodoPatchArtifact,artifact,sourceTodo,selected,duplicates,classified,duplicate,assertApproval,assertReceipt,atomicWrite,temporary,existing,handle,appendPatch,separator,wasAlreadyAppended,renderTargets,rendered,renderIds,inline,normalizePath,sameArray,object,exactKeys,expected,missing,extra,nonBlank,hash,isoDate,uniqueIds,uniqueStrings\n CreateTodoPatchOptions:\n CreatedTodoPatch:\n WriteTodoPatchOptions:\n WrittenTodoPatch:\n ApplyTodoPatchOptions:\n diagnosticReportFingerprint()\n createTodoPatch()\n expectedValidation()\n proposalById()\n selected()\n proposal()\n orderedSelected()\n markdown()\n renderTodoPatchMarkdown()\n writeTodoPatchArtifacts()\n created()\n patchPath()\n auditPath()\n applyTodoPatch()\n current()\n receipt()\n now()\n currentHash()\n result()\n applied()\n recovered()\n assertTodoPatchArtifact()\n artifact()\n sourceTodo()\n selected()\n duplicates()\n classified()\n duplicate()\n assertApproval()\n assertReceipt()\n atomicWrite()\n temporary()\n existing()\n handle()\n appendPatch()\n separator()\n wasAlreadyAppended()\n renderTargets()\n rendered()\n renderIds()\n inline()\n normalizePath()\n sameArray()\n object()\n exactKeys()\n expected()\n missing()\n extra()\n nonBlank()\n hash()\n isoDate()\n uniqueIds()\n uniqueStrings()\n src/comparison/workspace.ts:\n i: ../config/env.js,../core/id.js,../core/io.js,../core/security.js,../core/types.js,../diff/reality.js,../graph/diff.js,../pipeline/run.js,node:child_process,node:fs,node:os,node:path,node:util\n e: WorkspaceComparisonOptions,CoverageSnapshot,WorkspaceComparison,execFileAsync,compareWorkspaceIntent,root,repositoryRoot,relativeAnalysisRoot,outputDir,baseRef,baseCommit,headCommit,status,changedFiles,temporaryParent,baseWorktree,baseRoot,pipelineOptions,baseOptions,currentOptions,baseRun,currentRun,baseReality,currentReality,diff,baseCoverage,currentCoverage,alignmentRateDelta,implementationCoverageDelta,plannedCodeCoverageDelta,documentedCodeCoverageDelta,gapsDelta,diagnosticsDelta,comparisonId,comparisonDirectory,artifacts,scopedOutputDirectory,absolute,relative,commonPipelineOptions,optionsForRoot,existingFile,relative,coverage,diagnosticDelta,classifyWorkspaceTrend,severeDelta,improved,regressed,parseAheadBehind,defaultBaseRef,rounded,artifactPaths,relative,renderTrendMarkdown,percent,documentationLine,git,result\n WorkspaceComparisonOptions:\n CoverageSnapshot:\n WorkspaceComparison:\n execFileAsync()\n compareWorkspaceIntent()\n root()\n repositoryRoot()\n relativeAnalysisRoot()\n outputDir()\n baseRef()\n baseCommit()\n headCommit()\n status()\n changedFiles()\n temporaryParent()\n baseWorktree()\n baseRoot()\n pipelineOptions()\n baseOptions()\n currentOptions()\n baseRun()\n currentRun()\n baseReality()\n currentReality()\n diff()\n baseCoverage()\n currentCoverage()\n alignmentRateDelta()\n implementationCoverageDelta()\n plannedCodeCoverageDelta()\n documentedCodeCoverageDelta()\n gapsDelta()\n diagnosticsDelta()\n comparisonId()\n comparisonDirectory()\n artifacts()\n scopedOutputDirectory()\n absolute()\n relative()\n commonPipelineOptions()\n optionsForRoot()\n existingFile()\n relative()\n coverage()\n diagnosticDelta()\n classifyWorkspaceTrend()\n severeDelta()\n improved()\n regressed()\n parseAheadBehind()\n defaultBaseRef()\n rounded()\n artifactPaths()\n relative()\n renderTrendMarkdown()\n percent()\n documentationLine()\n git()\n result()\n src/interfaces/a2a-message.ts:\n e: parseSendConfiguration,validateOutputModes,supported,parseMessage,messageId,contextId,taskId,referenceTaskIds,extensions,metadata,parsePart,output,parsePartContent,content,qualifier,ensureSupportedMessageContent,supported,cloneMessage,clonePart,normalizeUserMessage\n parseSendConfiguration()\n validateOutputModes()\n supported()\n parseMessage()\n messageId()\n contextId()\n taskId()\n referenceTaskIds()\n extensions()\n metadata()\n parsePart()\n output()\n parsePartContent()\n content()\n qualifier()\n ensureSupportedMessageContent()\n supported()\n cloneMessage()\n clonePart()\n normalizeUserMessage()\n src/summary/payload.ts:\n i: ../core/types.js\n e: compactSummaryPayload,referenced,nonAst,moduleAst,relevantAst,ids,selectedRelations,compactRecord\n compactSummaryPayload()\n referenced()\n nonAst()\n moduleAst()\n relevantAst()\n ids()\n selectedRelations()\n compactRecord()\n src/evaluation/gold-cli.ts:\n i: node:fs,node:path\n e: main,args,arg,json,requirePerfect,outIndex,outPath,dataset,report,rendered\n main()\n args()\n arg()\n json()\n requirePerfect()\n outIndex()\n outPath()\n dataset()\n report()\n rendered()\n src/live/model-comparison.ts:\n i: ../core/types.js,./contract-check.js\n e: LiveModelRun,LiveModelMeasurement,LiveModelAgreement,LiveModelComparison,measureLiveModelRun,responses,records,enrichedRecords,costUsd,isLlmEnriched,sourceKey,lines,compareLiveModelOutputs,rightBySource,pairs,agreeing,buildLiveModelComparison,models,passing,pick,measured,renderLiveModelComparison,sumUsage,values,round\n LiveModelRun:\n LiveModelMeasurement:\n LiveModelAgreement:\n LiveModelComparison:\n measureLiveModelRun()\n responses()\n records()\n enrichedRecords()\n costUsd()\n isLlmEnriched()\n sourceKey()\n lines()\n compareLiveModelOutputs()\n rightBySource()\n pairs()\n agreeing()\n buildLiveModelComparison()\n models()\n passing()\n pick()\n measured()\n renderLiveModelComparison()\n sumUsage()\n values()\n round()\n src/watch/watcher.ts:\n i: ../config/env.js,../core/ignore.js,../core/types.js,../pipeline/run.js,node:fs,node:path\n e: SnapshotDelta,ScanOptions,ReportResult,WatchOptions,WatchConfiguration,WatchRuntime,scanTree,maxFiles,absoluteRoot,visit,absolute,relative,stat,diffSnapshots,previous,describeDelta,shown,rest,DEFAULT_MIN_INTERVAL_MS,DEFAULT_SCAN_INTERVAL_MS,watchRepository,configuration,runtime,defaultSleep,timer,onAbort,finish,createWatchConfiguration,root,minIntervalMs,scanIntervalMs,emit,now,sleep,matcher,runReport,result,createWatchRuntime,initialSnapshot,scanTreeCurrent,evaluateChangeCycle,current,delta,handleDelta,maybeGenerateReport,waitMs,generateReportForReason,startedAt,result\n SnapshotDelta:\n ScanOptions:\n ReportResult:\n WatchOptions:\n WatchConfiguration:\n WatchRuntime:\n scanTree()\n maxFiles()\n absoluteRoot()\n visit()\n absolute()\n relative()\n stat()\n diffSnapshots()\n previous()\n describeDelta()\n shown()\n rest()\n DEFAULT_MIN_INTERVAL_MS()\n DEFAULT_SCAN_INTERVAL_MS()\n watchRepository()\n configuration()\n runtime()\n defaultSleep()\n timer()\n onAbort()\n finish()\n createWatchConfiguration()\n root()\n minIntervalMs()\n scanIntervalMs()\n emit()\n now()\n sleep()\n matcher()\n runReport()\n result()\n createWatchRuntime()\n initialSnapshot()\n scanTreeCurrent()\n evaluateChangeCycle()\n current()\n delta()\n handleDelta()\n maybeGenerateReport()\n waitMs()\n generateReportForReason()\n startedAt()\n result()\n src/communication/identity.ts:\n i: ../core/io.js,../core/security.js,./intake-contract.js,node:path\n e: ParticipantIdentityEntry,ParticipantIdentityRegistry,LoadedParticipantIdentityRegistry,loadParticipantIdentityRegistry,v2Path,v1Path,registryPath,normalized,normalizeParticipantIdentityRegistry,registry,participants,ids,principals,key,normalizeV2Entry,principals,kind,assertParticipantIdentityRegistry,registry,ids,external,participants,validateRegistryShape,assertParticipantIdentityEntry,entry,participantId,role,values,assertParticipantIdentityId,assertParticipantIdentityRole,assertDisplayName,assertDuplicateId,assertParticipantIdentityField,values,assertParticipantIdentityFieldUnique,owner,assertRoleCompatibility,exactKeys,allowed,missing,extra\n ParticipantIdentityEntry:\n ParticipantIdentityRegistry:\n LoadedParticipantIdentityRegistry:\n loadParticipantIdentityRegistry()\n v2Path()\n v1Path()\n registryPath()\n normalized()\n normalizeParticipantIdentityRegistry()\n registry()\n participants()\n ids()\n principals()\n key()\n normalizeV2Entry()\n principals()\n kind()\n assertParticipantIdentityRegistry()\n registry()\n ids()\n external()\n participants()\n validateRegistryShape()\n assertParticipantIdentityEntry()\n entry()\n participantId()\n role()\n values()\n assertParticipantIdentityId()\n assertParticipantIdentityRole()\n assertDisplayName()\n assertDuplicateId()\n assertParticipantIdentityField()\n values()\n assertParticipantIdentityFieldUnique()\n owner()\n assertRoleCompatibility()\n exactKeys()\n allowed()\n missing()\n extra()\n src/communication/llm/implementation.ts:\n i: ../../config/env.js,../../llm/failure.js,../../llm/openrouter.js,../../llm/structured-schema.js\n e: ParticipantCommunicationSynthesis,AuditedCommunicationExtractionResult,CommunicationLlmRequiredError,CommunicationAttemptError\n ParticipantCommunicationSynthesis:\n AuditedCommunicationExtractionResult:\n CommunicationLlmRequiredError: super(-1),extractCommunicationIntentAudited(-1),startedAt(-1),deterministic(-1),records(-1),client(-1),groups(-1),response(-1),enrichments(-1),enrichedByOriginal(-1),generation(-1),participants(-1),failure(-1),responses(-1),classifyLlmFailure(-1)\n CommunicationAttemptError: super(-1),enrichWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failed(-1),marked(-1)\n src/extractors/changelog.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path\n e: extractChangelog,absolute,body,relative,lines,raw,versionHeading,categoryHeading,bullet,block,text,action,resolvedPaths,changelogAction,normalized,lower\n extractChangelog()\n absolute()\n body()\n relative()\n lines()\n raw()\n versionHeading()\n categoryHeading()\n bullet()\n block()\n text()\n action()\n resolvedPaths()\n changelogAction()\n normalized()\n lower()\n src/extractors/docs-deterministic.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path\n e: DeterministicDocumentationOptions,DocumentationContext,LineResult,MAX_HEADING_LEVEL,MIN_STATEMENT_CHARS,extractDocumentationBaseline,root,resolver,body,primePathMapper,resolved,mapped,convertDocument,relative,lines,raw,lineResult,handleDocumentationLine,headingRecord,sectionHeading,bulletRecord,paragraphResult,parseFenceBlock,match,marker,language,record,parseSectionHeading,heading,level,title,record,parseBulletStatement,bullet,block,record,parseParagraphStatement,paragraph,record,readParagraph,cursor,line,qualifyingStatement,target,hasCodeSpanIdentifier,statementRecord,action,codeBlockRecord,targetsOf\n DeterministicDocumentationOptions:\n DocumentationContext:\n LineResult:\n MAX_HEADING_LEVEL()\n MIN_STATEMENT_CHARS()\n extractDocumentationBaseline()\n root()\n resolver()\n body()\n primePathMapper()\n resolved()\n mapped()\n convertDocument()\n relative()\n lines()\n raw()\n lineResult()\n handleDocumentationLine()\n headingRecord()\n sectionHeading()\n bulletRecord()\n paragraphResult()\n parseFenceBlock()\n match()\n marker()\n language()\n record()\n parseSectionHeading()\n heading()\n level()\n title()\n record()\n parseBulletStatement()\n bullet()\n block()\n record()\n parseParagraphStatement()\n paragraph()\n record()\n readParagraph()\n cursor()\n line()\n qualifyingStatement()\n target()\n hasCodeSpanIdentifier()\n statementRecord()\n action()\n codeBlockRecord()\n targetsOf()\n src/extractors/git.ts:\n i: ../config/env.js,../core/record.js,../core/text.js,../core/types.js,../tf/classifier.js,node:child_process,node:fs,node:fs,node:path,node:util\n e: GitCommit,ChangedFile,GitExtractionOptions,DiscoveredRepository,RepositoryDiscoveryResult,DiscoveryState,execFileAsync,MAX_DISCOVERED_REPOSITORIES,MAX_DISCOVERY_DIRECTORIES,REPOSITORY_READ_CONCURRENCY,DISCOVERY_EXCLUDED_DIRECTORIES,extractGitIntent,root,count,discovery,results,message,extractRepositoryGitIntent,message,commit,changedFiles,stats,diff,classified,inferredSymbols,scopedFiles,docOnly,discoverGitRepositories,state,current,entries,createDiscoveryState,hasMoreDiscoveryWork,takeNextDiscoveryDirectory,current,readDiscoveryEntries,filterDiscoveryChildren,processDiscoveryDirectory,child,prefix,marker,registerDiscoveredRepository,resolveDiscoveryPrefix,finishDiscovery,gitMarkerState,marker,isGitWorkTree,scopeChangedFile,mapWithConcurrency,results,cursor,workers,index,value,runGit,result,readCommits,output,readChangedFiles,output,parts,status,readStats,output,additions,deletions,extractChangedSymbols,output,symbol,isDocumentationPath\n GitCommit:\n ChangedFile:\n GitExtractionOptions:\n DiscoveredRepository:\n RepositoryDiscoveryResult:\n DiscoveryState:\n execFileAsync()\n MAX_DISCOVERED_REPOSITORIES()\n MAX_DISCOVERY_DIRECTORIES()\n REPOSITORY_READ_CONCURRENCY()\n DISCOVERY_EXCLUDED_DIRECTORIES()\n extractGitIntent()\n root()\n count()\n discovery()\n results()\n message()\n extractRepositoryGitIntent()\n message()\n commit()\n changedFiles()\n stats()\n diff()\n classified()\n inferredSymbols()\n scopedFiles()\n docOnly()\n discoverGitRepositories()\n state()\n current()\n entries()\n createDiscoveryState()\n hasMoreDiscoveryWork()\n takeNextDiscoveryDirectory()\n current()\n readDiscoveryEntries()\n filterDiscoveryChildren()\n processDiscoveryDirectory()\n child()\n prefix()\n marker()\n registerDiscoveredRepository()\n resolveDiscoveryPrefix()\n finishDiscovery()\n gitMarkerState()\n marker()\n isGitWorkTree()\n scopeChangedFile()\n mapWithConcurrency()\n results()\n cursor()\n workers()\n index()\n value()\n runGit()\n result()\n readCommits()\n output()\n readChangedFiles()\n output()\n parts()\n status()\n readStats()\n output()\n additions()\n deletions()\n extractChangedSymbols()\n output()\n symbol()\n isDocumentationPath()\n src/extractors/nl-llm-helpers.ts:\n i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,node:fs,node:path,node:url\n e: RawNlRecord,NlResponse,NlAttemptError\n RawNlRecord:\n NlResponse:\n NlAttemptError: super(-1),extractNlWithCorrection(-1),completion(-1),markDeterministicNlRecords(-1),toIntentRecord(-1),lines(-1),action(-1),normalizedText(-1),statementText(-1),nlStageAudit(-1),readPrompt(-1),promptPath(-1),sourceExcerpt(-1),start(-1),end(-1),resolveAction(-1),resolveModality(-1),OBJECT_PLACEHOLDERS(-1),nonEmptyText(-1),isPlaceholder(-1),text(-1),resolveObject(-1),fallback(-1),clampLine(-1),allowedAction(-1),allowedModality(-1),NL_ACTION_SET(-1),NL_MODALITY_SET(-1),nlStrings(-1),NL_RECORD_CONTRACT(-1),NL_RESPONSE_CONTRACT(-1)\n src/graph/diff.ts:\n i: ../core/id.js,../core/schema.js\n e: DiffSvgOptions,diffIntentGraphs,beforeById,afterById,unchangedRecords,beforeGroups,afterGroups,left,right,paired,beforeRecord,afterRecord,beforeRelations,afterRelations,fingerprint,renderGraphDiffSvg,maxItems,title,visibleRows,width,height,y,assertGraph,groupRecords,groups,identity,values,recordIdentity,normalizeRecord,changedFieldPaths,isObject,relationKey,compareRecords,compareRelations,recordLabel,changeLabel,metricCard,escapeXml,truncate\n DiffSvgOptions:\n diffIntentGraphs()\n beforeById()\n afterById()\n unchangedRecords()\n beforeGroups()\n afterGroups()\n left()\n right()\n paired()\n beforeRecord()\n afterRecord()\n beforeRelations()\n afterRelations()\n fingerprint()\n renderGraphDiffSvg()\n maxItems()\n title()\n visibleRows()\n width()\n height()\n y()\n assertGraph()\n groupRecords()\n groups()\n identity()\n values()\n recordIdentity()\n normalizeRecord()\n changedFieldPaths()\n isObject()\n relationKey()\n compareRecords()\n compareRelations()\n recordLabel()\n changeLabel()\n metricCard()\n escapeXml()\n truncate()\n src/graph/diagnostics.ts:\n i: ../core/id.js,../core/schema.js,../core/target.js,./capability-evidence.js,./changelog-signal.js,./symbol-resolution.js\n e: DiagnosticContext,diagnoseGraph,context,buildDiagnosticContext,neighbors,recordsById,collectRecordDiagnostics,related,missingFields,symbolIssues,isEvidence,planned,notPlanned,notDocumented,changelog,ambiguous,lowConfidence,unlinked,collectRelatedRecords,collectMissingFields,collectSymbolIssues,isRecordEvidenced,hasDocumentedTargetEvidence,buildPlannedNotImplementedDiagnostic,hasLocationOnlyEvidence,buildImplementedWithoutPlanDiagnostic,buildUndocumentedImplementationDiagnostic,buildChangelogWithoutImplementationDiagnostic,buildAmbiguousRequirementDiagnostic,detail,buildLowConfidenceDiagnostic,buildUnlinkedRecordDiagnostic,collectContradictionDiagnostics,indexGroundedImplementationEvidence,grounded,left,right,relationSupportsImplementation,basis,score,ambiguityDetail,paths,ambiguityAction,actions,buildNeighbors,map,appendNeighbor,values,indexImplementedPaths,paths,indexDocumentedPaths,paths,hasImplementedTarget,hasDocumentedTarget,isPlan,isImplementationEvidence,isPublicImplementation,symbol,isReleaseCandidate,isImportantRecord,makeDiagnostic,severityRank\n DiagnosticContext:\n diagnoseGraph()\n context()\n buildDiagnosticContext()\n neighbors()\n recordsById()\n collectRecordDiagnostics()\n related()\n missingFields()\n symbolIssues()\n isEvidence()\n planned()\n notPlanned()\n notDocumented()\n changelog()\n ambiguous()\n lowConfidence()\n unlinked()\n collectRelatedRecords()\n collectMissingFields()\n collectSymbolIssues()\n isRecordEvidenced()\n hasDocumentedTargetEvidence()\n buildPlannedNotImplementedDiagnostic()\n hasLocationOnlyEvidence()\n buildImplementedWithoutPlanDiagnostic()\n buildUndocumentedImplementationDiagnostic()\n buildChangelogWithoutImplementationDiagnostic()\n buildAmbiguousRequirementDiagnostic()\n detail()\n buildLowConfidenceDiagnostic()\n buildUnlinkedRecordDiagnostic()\n collectContradictionDiagnostics()\n indexGroundedImplementationEvidence()\n grounded()\n left()\n right()\n relationSupportsImplementation()\n basis()\n score()\n ambiguityDetail()\n paths()\n ambiguityAction()\n actions()\n buildNeighbors()\n map()\n appendNeighbor()\n values()\n indexImplementedPaths()\n paths()\n indexDocumentedPaths()\n paths()\n hasImplementedTarget()\n hasDocumentedTarget()\n isPlan()\n isImplementationEvidence()\n isPublicImplementation()\n symbol()\n isReleaseCandidate()\n isImportantRecord()\n makeDiagnostic()\n severityRank()\n src/core/io.ts:\n i: ./types.js,node:fs,node:path\n e: WalkOptions,WalkState,DEFAULT_IGNORED_DIRS,ensureDir,readText,stat,pathExists,writeJson,writeText,writeJsonl,readJsonl,body,readJson,walkFiles,state,createWalkState,walkDirectory,entries,walkEntry,absolute,relative,isTargetFile,escapeRegex,globToRegExp,normalized,char,next,after,matchesAnyGlob,normalized,resolveGlobs,files,absolute,relative,relative,relativePosix\n WalkOptions:\n WalkState:\n DEFAULT_IGNORED_DIRS()\n ensureDir()\n readText()\n stat()\n pathExists()\n writeJson()\n writeText()\n writeJsonl()\n readJsonl()\n body()\n readJson()\n walkFiles()\n state()\n createWalkState()\n walkDirectory()\n entries()\n walkEntry()\n absolute()\n relative()\n isTargetFile()\n escapeRegex()\n globToRegExp()\n normalized()\n char()\n next()\n after()\n matchesAnyGlob()\n normalized()\n resolveGlobs()\n files()\n absolute()\n relative()\n relative()\n relativePosix()\n src/core/schema/code-change.ts:\n i: ../id.js,../types.js\n e: assertCodeChangePlan,known,assertCodeChangePlans,known,ids,id,assertCodeChangePlansForReview,ids,plan,evidence,id,assertCodeChangePlanForAcceptance,known,plan,evidence,assertCodeChangeAcceptance,beforeKnown,afterKnown,acceptance,expectedCleared,expectedRemaining,expectedBlocking,expectedAccepted,assertPlanGraphFingerprint,assertCodeChangePlanValue,plan,target,targetPaths,changePaths,change,normalizedPath,risk,evidence,semantic,expectedHash,expectedId,validateCodeChangePlanContext,known,conclusions,proposals,referencedConclusionIds,proposal,proposalIds,assertStringSetMatch\n assertCodeChangePlan()\n known()\n assertCodeChangePlans()\n known()\n ids()\n id()\n assertCodeChangePlansForReview()\n ids()\n plan()\n evidence()\n id()\n assertCodeChangePlanForAcceptance()\n known()\n plan()\n evidence()\n assertCodeChangeAcceptance()\n beforeKnown()\n afterKnown()\n acceptance()\n expectedCleared()\n expectedRemaining()\n expectedBlocking()\n expectedAccepted()\n assertPlanGraphFingerprint()\n assertCodeChangePlanValue()\n plan()\n target()\n targetPaths()\n changePaths()\n change()\n normalizedPath()\n risk()\n evidence()\n semantic()\n expectedHash()\n expectedId()\n validateCodeChangePlanContext()\n known()\n conclusions()\n proposals()\n referencedConclusionIds()\n proposal()\n proposalIds()\n assertStringSetMatch()\n src/synthesis/code-change-path.ts:\n e: NON_SOURCE_DIR_SEGMENTS,BINARY_EXTENSIONS,GENERATED_ANALYSIS_BASENAMES,T2C_ARTIFACT_BASENAMES,EXTENSIONLESS_SOURCE_BASENAMES,isUsefulCodeChangePath,isPlannablePath,normalized,segments,lowerSegments,basename,normalizePlannablePath,isCandidatePathSyntax,splitPathSegments,isInvalidSegmentShape,isConcretePath,hasShellPattern,isDisallowedSegment,isPlannableBasename,lowerBasename,dot,ext,isGeneratedArtifactPath\n NON_SOURCE_DIR_SEGMENTS()\n BINARY_EXTENSIONS()\n GENERATED_ANALYSIS_BASENAMES()\n T2C_ARTIFACT_BASENAMES()\n EXTENSIONLESS_SOURCE_BASENAMES()\n isUsefulCodeChangePath()\n isPlannablePath()\n normalized()\n segments()\n lowerSegments()\n basename()\n normalizePlannablePath()\n isCandidatePathSyntax()\n splitPathSegments()\n isInvalidSegmentShape()\n isConcretePath()\n hasShellPattern()\n isDisallowedSegment()\n isPlannableBasename()\n lowerBasename()\n dot()\n ext()\n isGeneratedArtifactPath()\n src/synthesis/validation.ts:\n i: ../core/schema.js,../core/types.js\n e: TodoProposalDuplicate,TodoProposalValidationResult,validateAndClassifyTodoProposals,existing,duplicates,orderedProposalIds,duplicateProposalIds,duplicateIds,duplicateEvidence,proposalWords,target,sharedTicket,sharedSymbol,sharedPath,similarity,dependencyFirstPriorityOrder,byId,remainingDependencies,dependents,values,compare,left,right,ready,id,remaining,words,jaccard,common,intersects,values\n TodoProposalDuplicate:\n TodoProposalValidationResult:\n validateAndClassifyTodoProposals()\n existing()\n duplicates()\n orderedProposalIds()\n duplicateProposalIds()\n duplicateIds()\n duplicateEvidence()\n proposalWords()\n target()\n sharedTicket()\n sharedSymbol()\n sharedPath()\n similarity()\n dependencyFirstPriorityOrder()\n byId()\n remainingDependencies()\n dependents()\n values()\n compare()\n left()\n right()\n ready()\n id()\n remaining()\n words()\n jaccard()\n common()\n intersects()\n values()\n src/synthesis/tasks-llm.ts:\n i: ../config/env.js,../core/id.js,../core/io.js,../core/schema.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./task-synthesis-contract.js,./task-synthesis-materialize.js,./task-synthesis-payload.js,node:fs,node:path,node:url\n e: RawDiagnosticAction,AuditedTaskSynthesisResult,TaskSynthesisRequiredError,TaskSynthesisAttemptError\n RawDiagnosticAction:\n AuditedTaskSynthesisResult:\n TaskSynthesisRequiredError: super(-1)\n TaskSynthesisAttemptError: super(-1),synthesizeTodoProposals(-1),startedAt(-1),assertConclusions(-1),client(-1),prompt(-1),payload(-1),failure(-1),responses(-1),synthesizeWithCorrection(-1),generation(-1),message(-1),wrapped(-1),fallbackOrThrow(-1),failedAudit(-1),rawDiagnosticActions(-1),generationMetadata(-1),configuration(-1),synthesisAudit(-1),readPrompt(-1),promptPath(-1)\n src/synthesis/code-change-plan/implementation-source-patch-assert.ts:\n i: ../../core/schema.js,./implementation-source-patch-diff.js\n e: SourcePatchEditValidationContext,SourcePatchSetValidationContext,assertCodeChangeSourcePatch,patch,editPaths,assertCodeChangeSourcePatchObject,patch,validateSourcePatchSchema,validateSourcePatchIdentifiers,validateSourcePatchEdits,collectSourcePatchEditPathActions,paths,editContext,validateSourcePatchEdit,normalizedEdit,normalizedPath,assertSourcePatchEditObject,validateSourcePatchEditBody,validateSourcePatchEditDiff,assertUniqueSourcePatchEditPathAction,normalizeSourcePatchEditPath,normalizedPath,ensureSourcePatchEditAction,ensureSourcePatchEditInstruction,validateSourcePatchHashAndId,expectedHash,validateSourcePatchGeneration,validateSourcePatchAgainstPlan,expectedChanges,assertSourcePatchPlanBinding,collectExpectedPlanChanges,validateSourcePatchEditsAgainstPlan,allowed,editPath,validateSourcePatchEvidence,marker,assertCodeChangeSourcePatchSet,set,context,createSourcePatchSetValidationContext,expectedPlanIds,assertSourcePatchSetObject,set,validateSourcePatchSetSchema,validateSourcePatchSetPatches,patchIds,validateSetPatchAndTrackDuplicates,expectedPlan,validateSetPatchGraphFingerprint,assertUniqueSetPatchId,validateSetPatchesPlanCoverage,validateSourcePatchSetGeneration,exactSourcePatchKeys,actual,assertSourcePatchIds,assertSourcePatchStrings,exactSourcePatchSet\n SourcePatchEditValidationContext:\n SourcePatchSetValidationContext:\n assertCodeChangeSourcePatch()\n patch()\n editPaths()\n assertCodeChangeSourcePatchObject()\n patch()\n validateSourcePatchSchema()\n validateSourcePatchIdentifiers()\n validateSourcePatchEdits()\n collectSourcePatchEditPathActions()\n paths()\n editContext()\n validateSourcePatchEdit()\n normalizedEdit()\n normalizedPath()\n assertSourcePatchEditObject()\n validateSourcePatchEditBody()\n validateSourcePatchEditDiff()\n assertUniqueSourcePatchEditPathAction()\n normalizeSourcePatchEditPath()\n normalizedPath()\n ensureSourcePatchEditAction()\n ensureSourcePatchEditInstruction()\n validateSourcePatchHashAndId()\n expectedHash()\n validateSourcePatchGeneration()\n validateSourcePatchAgainstPlan()\n expectedChanges()\n assertSourcePatchPlanBinding()\n collectExpectedPlanChanges()\n validateSourcePatchEditsAgainstPlan()\n allowed()\n editPath()\n validateSourcePatchEvidence()\n marker()\n assertCodeChangeSourcePatchSet()\n set()\n context()\n createSourcePatchSetValidationContext()\n expectedPlanIds()\n assertSourcePatchSetObject()\n set()\n validateSourcePatchSetSchema()\n validateSourcePatchSetPatches()\n patchIds()\n validateSetPatchAndTrackDuplicates()\n expectedPlan()\n validateSetPatchGraphFingerprint()\n assertUniqueSetPatchId()\n validateSetPatchesPlanCoverage()\n validateSourcePatchSetGeneration()\n exactSourcePatchKeys()\n actual()\n assertSourcePatchIds()\n assertSourcePatchStrings()\n exactSourcePatchSet()\n src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts:\n i: ./implementation-source-patch-diff.js\n e: ParsedUnifiedDiffHunk,UnifiedDiffParsingContext,UnifiedDiffCursor,applyUnifiedDiffToText,baseLines,hunks,output,joinAppliedText,parseUnifiedDiffIntoHunks,normalizedDiff,context,createEmptyUnifiedDiffContext,parseUnifiedDiffLines,finalizeUnifiedDiffContext,applyUnifiedDiffLineToContext,header,parseUnifiedDiffHeader,buildParsedUnifiedDiffHunk,applyUnifiedDiffHunks,applyUnifiedDiffHunk,oldIndex,copyBaseLinesToCursor,appendRemainingBaseLines,validateHunkCounts,oldCount,newCount,applyUnifiedDiffLine,mark,body,applyUnifiedDiffContextLine,applyUnifiedDiffDeletionLine,applyUnifiedDiffAdditionLine,splitKeep,lines\n ParsedUnifiedDiffHunk:\n UnifiedDiffParsingContext:\n UnifiedDiffCursor:\n applyUnifiedDiffToText()\n baseLines()\n hunks()\n output()\n joinAppliedText()\n parseUnifiedDiffIntoHunks()\n normalizedDiff()\n context()\n createEmptyUnifiedDiffContext()\n parseUnifiedDiffLines()\n finalizeUnifiedDiffContext()\n applyUnifiedDiffLineToContext()\n header()\n parseUnifiedDiffHeader()\n buildParsedUnifiedDiffHunk()\n applyUnifiedDiffHunks()\n applyUnifiedDiffHunk()\n oldIndex()\n copyBaseLinesToCursor()\n appendRemainingBaseLines()\n validateHunkCounts()\n oldCount()\n newCount()\n applyUnifiedDiffLine()\n mark()\n body()\n applyUnifiedDiffContextLine()\n applyUnifiedDiffDeletionLine()\n applyUnifiedDiffAdditionLine()\n splitKeep()\n lines()\n src/interfaces/a2a-task-store.ts:\n i: ../config/env.js,../core/security.js,../services/actions.js,./intake-actions.js,node:crypto,node:fs,node:path,node:timers/promises\n e: PreparedTask,ListCursor,TaskStoreSnapshot,tasks,messageTaskIndex,clearA2aTaskStoreForTests,handleA2aRpc,handleRpcInTaskStore,params,sendMessage,message,sendConfiguration,prepared,getTask,task,historyLength,cancelTask,task,fullTaskView,scheduleTaskExecution,task,withTaskStore,storePath,release,result,configuredTaskStorePath,acquireTaskStoreLock,deadline,removeLock,removeStaleLock,stat,loadTaskStore,content,snapshot,restored,readTaskStore,stat,restoreTask,assertStoredTask,saveTaskStore,removeTemporaryFile,prepareTask,key,indexedTask,taskForMessage,indexedTaskId,task,continueTask,existing,continuationError,message,createTask,taskId,contextId,executeMessage,command,result,domainResult,rejectTask,protobuf,diagnostic,message,currentTaskState,completeTask,protobuf,message,protobufResult,intakeDomainResult,record,failTask,message,agentMessage,listTasks,contextId,status,pageSize,historyLength,includeArtifacts,statusTimestampAfter,filter,filtered,pageCursor,start,page,last,filteredTasks,compareTasksByUpdate,timestampOrder,indexAfterCursor,exact,cursorTime,next,taskTime,encodeCursor,decodeCursor,decoded,taskView,effectiveHistoryLength,history,cloneArtifact,ownedTask,task,messageKey,errorMessage\n PreparedTask:\n ListCursor:\n TaskStoreSnapshot:\n tasks()\n messageTaskIndex()\n clearA2aTaskStoreForTests()\n handleA2aRpc()\n handleRpcInTaskStore()\n params()\n sendMessage()\n message()\n sendConfiguration()\n prepared()\n getTask()\n task()\n historyLength()\n cancelTask()\n task()\n fullTaskView()\n scheduleTaskExecution()\n task()\n withTaskStore()\n storePath()\n release()\n result()\n configuredTaskStorePath()\n acquireTaskStoreLock()\n deadline()\n removeLock()\n removeStaleLock()\n stat()\n loadTaskStore()\n content()\n snapshot()\n restored()\n readTaskStore()\n stat()\n restoreTask()\n assertStoredTask()\n saveTaskSt\n\n... [truncated - file too large]", "is_subdir": false}, {"name": "planfile-tickets.yaml", "rel_path": "planfile-tickets.yaml", "path": "planfile-tickets.yaml", "size": "149.6KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "source: code2llm\n# generated in 0.13s\nschema: code2llm.planfile_tickets.v1\nproject_root: /home/tom/github/semcod/todo2code\ntickets:\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: php.ast_extract.parseFile (CC=38)'\n description: 'code2llm reports `php.ast_extract.parseFile` at `php/ast_extract.php:77`\n with cyclomatic complexity 38 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - php/ast_extract.php\n dedupe_key: code2llm:cc:php/ast_extract.php:php.ast_extract.parseFile\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.research.rank-intent-graph-embeddings.main\n (CC=27)'\n description: 'code2llm reports `scripts.research.rank-intent-graph-embeddings.main`\n at `scripts/research/rank-intent-graph-embeddings.py:35` with cyclomatic complexity\n 27 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/research/rank-intent-graph-embeddings.py\n dedupe_key: code2llm:cc:scripts/research/rank-intent-graph-embeddings.py:scripts.research.rank-intent-graph-embeddings.main\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.verify-env-contract.makefile (CC=28)'\n description: 'code2llm reports `scripts.verify-env-contract.makefile` at `scripts/verify-env-contract.mjs:41`\n with cyclomatic complexity 28 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/verify-env-contract.mjs\n dedupe_key: code2llm:cc:scripts/verify-env-contract.mjs:scripts.verify-env-contract.makefile\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.go.examples.basic.main.run (CC=26)'\n description: 'code2llm reports `sdk.go.examples.basic.main.run` at `sdk/go/examples/basic/main.go:29`\n with cyclomatic complexity 26 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/go/examples/basic/main.go\n dedupe_key: code2llm:cc:sdk/go/examples/basic/main.go:sdk.go.examples.basic.main.run\n- signal: code2llm_god\n title: 'Split god module: src/diff/reality.ts'\n description: 'code2llm reports `src/diff/reality.ts` as a large module (690 lines,\n 4 classes).\n\n\n Split it by responsibility, keep public imports stable, and add focused tests\n around the moved behavior.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - god-module\n - refactor\n files:\n - src/diff/reality.ts\n dedupe_key: code2llm:god:src/diff/reality.ts\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: decode_envelope'\n description: 'code2llm reports `God Function: decode_envelope` in `src/interfaces/intake_cli.py:78`.\n\n\n Function ''decode_envelope'' is oversized: CC=10, fan-out=8, mutations=28.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/intake_cli.py\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/intake_cli.py:78:God Function:\n decode_envelope'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `src/interfaces/intake_cli.py:122`.\n\n\n Function ''main'' is oversized: CC=5, fan-out=18, mutations=22.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/intake_cli.py\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/intake_cli.py:122:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `scripts/research/evaluate-embedding-pairs.py:26`.\n\n\n Function ''main'' is oversized: CC=9, fan-out=21, mutations=18.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/research/evaluate-embedding-pairs.py\n dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:26:God\n Function: main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `sdk/python/examples/basic.py:22`.\n\n\n Function ''main'' is oversized: CC=11, fan-out=31, mutations=18.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - sdk/python/examples/basic.py\n dedupe_key: 'code2llm:smell:god_function:sdk/python/examples/basic.py:22:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Module: src.cli'\n description: 'code2llm reports `God Module: src.cli` in `src/cli.ts:1`.\n\n\n Module ''src.cli'' is too large (202 functions, 1 classes). Consider splitting\n into sub-modules.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:1:God Module: src.cli'\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: python.ast_extract.iter_python_files (CC=16)'\n description: 'code2llm reports `python.ast_extract.iter_python_files` at `python/ast_extract.py:168`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - python/ast_extract.py\n dedupe_key: code2llm:cc:python/ast_extract.py:python.ast_extract.iter_python_files\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visit (CC=15)'\n description: 'code2llm reports `scripts.verify-no-llm-imports.visit` at `scripts/verify-no-llm-imports.mjs:27`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/verify-no-llm-imports.mjs\n dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visit\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visited (CC=15)'\n description: 'code2llm reports `scripts.verify-no-llm-imports.visited` at `scripts/verify-no-llm-imports.mjs:22`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - scripts/verify-no-llm-imports.mjs\n dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visited\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.rust.examples.basic.run (CC=20)'\n description: 'code2llm reports `sdk.rust.examples.basic.run` at `sdk/rust/examples/basic.rs:27`\n with cyclomatic complexity 20 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/rust/examples/basic.rs\n dedupe_key: code2llm:cc:sdk/rust/examples/basic.rs:sdk.rust.examples.basic.run\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.rust.src.client.parse_http_response (CC=18)'\n description: 'code2llm reports `sdk.rust.src.client.parse_http_response` at `sdk/rust/src/client.rs:152`\n with cyclomatic complexity 18 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/rust/src/client.rs\n dedupe_key: code2llm:cc:sdk/rust/src/client.rs:sdk.rust.src.client.parse_http_response\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.baseUrl (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.baseUrl` at `sdk/typescript/examples/basic.ts:13`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.baseUrl\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.main (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.main` at `sdk/typescript/examples/basic.ts:17`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.main\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.root (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.root` at `sdk/typescript/examples/basic.ts:15`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.root\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.token (CC=17)'\n description: 'code2llm reports `sdk.typescript.examples.basic.token` at `sdk/typescript/examples/basic.ts:14`\n with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - sdk/typescript/examples/basic.ts\n dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.token\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.communication.analyzer.collectAgentActionIssues\n (CC=15)'\n description: 'code2llm reports `src.communication.analyzer.collectAgentActionIssues`\n at `src/communication/analyzer.ts:173` with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/communication/analyzer.ts\n dedupe_key: code2llm:cc:src/communication/analyzer.ts:src.communication.analyzer.collectAgentActionIssues\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.core.record-metadata.generationMetadata\n (CC=17)'\n description: 'code2llm reports `src.core.record-metadata.generationMetadata` at\n `src/core/record-metadata.ts:4` with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/core/record-metadata.ts\n dedupe_key: code2llm:cc:src/core/record-metadata.ts:src.core.record-metadata.generationMetadata\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.diff.reality.buildRealityTotals (CC=15)'\n description: 'code2llm reports `src.diff.reality.buildRealityTotals` at `src/diff/reality.ts:224`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/diff/reality.ts\n dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.buildRealityTotals\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.assertRerankerDecision\n (CC=17)'\n description: 'code2llm reports `src.evaluation.gold-types.assertRerankerDecision`\n at `src/evaluation/gold-types.ts:383` with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/evaluation/gold-types.ts\n dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.assertRerankerDecision\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.interfaces.a2a-message-command.looksLikeJson\n (CC=20)'\n description: 'code2llm reports `src.interfaces.a2a-message-command.looksLikeJson`\n at `src/interfaces/a2a-message-command.ts:56` with cyclomatic complexity 20 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/interfaces/a2a-message-command.ts\n dedupe_key: code2llm:cc:src/interfaces/a2a-message-command.ts:src.interfaces.a2a-message-command.looksLikeJson\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.assertGeneration\n (CC=16)'\n description: 'code2llm reports `src.operations.validation.assertGeneration` at `src/operations/validation.ts:162`\n with cyclomatic complexity 16 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertGeneration\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.operations.validation.validateOperationStep\n (CC=23)'\n description: 'code2llm reports `src.operations.validation.validateOperationStep`\n at `src/operations/validation.ts:277` with cyclomatic complexity 23 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/operations/validation.ts\n dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.validateOperationStep\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.pipeline.run-persistence.persistFailedRunState\n (CC=19)'\n description: 'code2llm reports `src.pipeline.run-persistence.persistFailedRunState`\n at `src/pipeline/run-persistence.ts:206` with cyclomatic complexity 19 (limit\n 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/pipeline/run-persistence.ts\n dedupe_key: code2llm:cc:src/pipeline/run-persistence.ts:src.pipeline.run-persistence.persistFailedRunState\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.pipeline.run-persistence.persistPipelineArtifacts\n (CC=17)'\n description: 'code2llm reports `src.pipeline.run-persistence.persistPipelineArtifacts`\n at `src/pipeline/run-persistence.ts:57` with cyclomatic complexity 17 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/pipeline/run-persistence.ts\n dedupe_key: code2llm:cc:src/pipeline/run-persistence.ts:src.pipeline.run-persistence.persistPipelineArtifacts\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.pipeline.run.executePipeline (CC=20)'\n description: 'code2llm reports `src.pipeline.run.executePipeline` at `src/pipeline/run.ts:198`\n with cyclomatic complexity 20 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/pipeline/run.ts\n dedupe_key: code2llm:cc:src/pipeline/run.ts:src.pipeline.run.executePipeline\n- signal: code2llm_cc\n title: 'Reduce cyclomatic complexity: src.web.diff-ui-script.compareGraphs (CC=15)'\n description: 'code2llm reports `src.web.diff-ui-script.compareGraphs` at `src/web/diff-ui-script.ts:11`\n with cyclomatic complexity 15 (limit 15).\n\n\n Extract smaller functions, flatten conditionals, or split strategy branches. Re-run\n code2llm after the change and keep tests green.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - complexity\n - refactor\n files:\n - src/web/diff-ui-script.ts\n dedupe_key: code2llm:cc:src/web/diff-ui-script.ts:src.web.diff-ui-script.compareGraphs\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: file, self, root, nl_mode'\n description: 'code2llm reports `Data Clump: file, self, root, nl_mode` in `sdk/python/todo2code/client.py:307`.\n\n\n Arguments (file, self, root, nl_mode) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:307:Data Clump:\n file, self, root, nl_mode'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: file, self, root, nl_mode'\n description: 'code2llm reports `Data Clump: file, self, root, nl_mode` in `sdk/python/todo2code/client.py:312`.\n\n\n Arguments (file, self, root, nl_mode) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:312:Data Clump:\n file, self, root, nl_mode'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: root, markdown_mode, changelog, self, todo'\n description: 'code2llm reports `Data Clump: root, markdown_mode, changelog, self,\n todo` in `sdk/python/todo2code/client.py:332`.\n\n\n Arguments (root, markdown_mode, changelog, self, todo) are used together in multiple\n functions: sdk.python.todo2code.client.T2CClient.extract_markdown, sdk.python.todo2code.client.T2CClient.extract_markdown_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:332:Data Clump:\n root, markdown_mode, changelog, self, todo'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: root, markdown_mode, changelog, self, todo'\n description: 'code2llm reports `Data Clump: root, markdown_mode, changelog, self,\n todo` in `sdk/python/todo2code/client.py:341`.\n\n\n Arguments (root, markdown_mode, changelog, self, todo) are used together in multiple\n functions: sdk.python.todo2code.client.T2CClient.extract_markdown, sdk.python.todo2code.client.T2CClient.extract_markdown_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:341:Data Clump:\n root, markdown_mode, changelog, self, todo'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, payload, action'\n description: 'code2llm reports `Data Clump: self, payload, action` in `sdk/python/todo2code/client.py:249`.\n\n\n Arguments (self, payload, action) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send,\n sdk.python.todo2code.client.T2CClient.call.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:249:Data Clump:\n self, payload, action'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, payload, action'\n description: 'code2llm reports `Data Clump: self, payload, action` in `sdk/python/todo2code/client.py:261`.\n\n\n Arguments (self, payload, action) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send,\n sdk.python.todo2code.client.T2CClient.call.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:261:Data Clump:\n self, payload, action'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, root, patterns, excludes'\n description: 'code2llm reports `Data Clump: self, root, patterns, excludes` in `sdk/python/todo2code/client.py:354`.\n\n\n Arguments (self, root, patterns, excludes) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_docs, sdk.python.todo2code.client.T2CClient.extract_docs_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:354:Data Clump:\n self, root, patterns, excludes'\n- signal: code2llm_smell_data_clump\n title: 'Address code smell: Data Clump: self, root, patterns, excludes'\n description: 'code2llm reports `Data Clump: self, root, patterns, excludes` in `sdk/python/todo2code/client.py:362`.\n\n\n Arguments (self, root, patterns, excludes) are used together in multiple functions:\n sdk.python.todo2code.client.T2CClient.extract_docs, sdk.python.todo2code.client.T2CClient.extract_docs_result.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - data-clump\n files:\n - sdk/python/todo2code/client.py\n dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:362:Data Clump:\n self, root, patterns, excludes'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: MAX_PER_SECTION'\n description: 'code2llm reports `God Function: MAX_PER_SECTION` in `src/extractors/runtime-cycle.ts:15`.\n\n\n Function ''MAX_PER_SECTION'' is oversized: CC=8, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/runtime-cycle.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/runtime-cycle.ts:15:God\n Function: MAX_PER_SECTION'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: OBJECT_PLACEHOLDERS'\n description: 'code2llm reports `God Function: OBJECT_PLACEHOLDERS` in `src/extractors/docs-record.ts:21`.\n\n\n Function ''OBJECT_PLACEHOLDERS'' is oversized: CC=14, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/docs-record.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/docs-record.ts:21:God Function:\n OBJECT_PLACEHOLDERS'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: PATH_ROOTS'\n description: 'code2llm reports `God Function: PATH_ROOTS` in `src/core/text.ts:390`.\n\n\n Function ''PATH_ROOTS'' is oversized: CC=13, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/text.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:390:God Function: PATH_ROOTS'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: RPC'\n description: 'code2llm reports `God Function: RPC` in `sdk/go/client.go:70`.\n\n\n Function ''RPC'' is oversized: CC=8, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - sdk/go/client.go\n dedupe_key: 'code2llm:smell:god_function:sdk/go/client.go:70:God Function: RPC'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: absolute'\n description: 'code2llm reports `God Function: absolute` in `src/extractors/nl.ts:40`.\n\n\n Function ''absolute'' is oversized: CC=2, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/nl.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:40:God Function: absolute'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: absoluteRoot'\n description: 'code2llm reports `God Function: absoluteRoot` in `src/watch/watcher.ts:40`.\n\n\n Function ''absoluteRoot'' is oversized: CC=11, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/watch/watcher.ts\n dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:40:God Function: absoluteRoot'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: action'\n description: 'code2llm reports `God Function: action` in `src/extractors/todo.ts:50`.\n\n\n Function ''action'' is oversized: CC=2, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:50:God Function:\n action'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: addCommunicationIssuesToDiagnostics'\n description: 'code2llm reports `God Function: addCommunicationIssuesToDiagnostics`\n in `src/communication/analyzer.ts:305`.\n\n\n Function ''addCommunicationIssuesToDiagnostics'' is oversized: CC=7, fan-out=12,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/analyzer.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:305:God Function:\n addCommunicationIssuesToDiagnostics'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: analyzeCommunication'\n description: 'code2llm reports `God Function: analyzeCommunication` in `src/communication/analyzer.ts:56`.\n\n\n Function ''analyzeCommunication'' is oversized: CC=5, fan-out=18, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/analyzer.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:56:God Function:\n analyzeCommunication'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: applyAcceptedSemanticRelations'\n description: 'code2llm reports `God Function: applyAcceptedSemanticRelations` in\n `src/semantic/reranker/result.ts:226`.\n\n\n Function ''applyAcceptedSemanticRelations'' is oversized: CC=2, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/semantic/reranker/result.ts\n dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/result.ts:226:God\n Function: applyAcceptedSemanticRelations'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: applyCodeChangeSourcePatch'\n description: 'code2llm reports `God Function: applyCodeChangeSourcePatch` in `src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:59`.\n\n\n Function ''applyCodeChangeSourcePatch'' is oversized: CC=4, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:59:God\n Function: applyCodeChangeSourcePatch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: applyTodoPatch'\n description: 'code2llm reports `God Function: applyTodoPatch` in `src/synthesis/todo-patch.ts:160`.\n\n\n Function ''applyTodoPatch'' is oversized: CC=12, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:160:God Function:\n applyTodoPatch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertAcyclicProposalDependencies'\n description: 'code2llm reports `God Function: assertAcyclicProposalDependencies`\n in `src/core/schema/utils.ts:96`.\n\n\n Function ''assertAcyclicProposalDependencies'' is oversized: CC=7, fan-out=11,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/utils.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/utils.ts:96:God Function:\n assertAcyclicProposalDependencies'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertCodeChangeAcceptance'\n description: 'code2llm reports `God Function: assertCodeChangeAcceptance` in `src/core/schema/code-change.ts:125`.\n\n\n Function ''assertCodeChangeAcceptance'' is oversized: CC=11, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/code-change.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/code-change.ts:125:God\n Function: assertCodeChangeAcceptance'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertConclusionValue'\n description: 'code2llm reports `God Function: assertConclusionValue` in `src/core/schema/conclusions.ts:89`.\n\n\n Function ''assertConclusionValue'' is oversized: CC=5, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/conclusions.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/conclusions.ts:89:God Function:\n assertConclusionValue'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertGroundedGenerationMetadata'\n description: 'code2llm reports `God Function: assertGroundedGenerationMetadata`\n in `src/core/schema/utils.ts:167`.\n\n\n Function ''assertGroundedGenerationMetadata'' is oversized: CC=4, fan-out=12,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/utils.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/utils.ts:167:God Function:\n assertGroundedGenerationMetadata'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertIntentGraph'\n description: 'code2llm reports `God Function: assertIntentGraph` in `src/core/schema/intent.ts:220`.\n\n\n Function ''assertIntentGraph'' is oversized: CC=7, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/intent.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/intent.ts:220:God Function:\n assertIntentGraph'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertIntentGraphDiff'\n description: 'code2llm reports `God Function: assertIntentGraphDiff` in `src/core/schema/intent.ts:249`.\n\n\n Function ''assertIntentGraphDiff'' is oversized: CC=7, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/intent.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/intent.ts:249:God Function:\n assertIntentGraphDiff'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertOperationPlan'\n description: 'code2llm reports `God Function: assertOperationPlan` in `src/operations/validation.ts:205`.\n\n\n Function ''assertOperationPlan'' is oversized: CC=1, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/operations/validation.ts\n dedupe_key: 'code2llm:smell:god_function:src/operations/validation.ts:205:God Function:\n assertOperationPlan'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertParticipant'\n description: 'code2llm reports `God Function: assertParticipant` in `src/communication/intake-contract.ts:248`.\n\n\n Function ''assertParticipant'' is oversized: CC=9, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/intake-contract.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/intake-contract.ts:248:God\n Function: assertParticipant'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertParticipantIdentityEntry'\n description: 'code2llm reports `God Function: assertParticipantIdentityEntry` in\n `src/communication/identity.ts:119`.\n\n\n Function ''assertParticipantIdentityEntry'' is oversized: CC=5, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/identity.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/identity.ts:119:God Function:\n assertParticipantIdentityEntry'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertProjectionWritable'\n description: 'code2llm reports `God Function: assertProjectionWritable` in `src/communication/intake-service.ts:158`.\n\n\n Function ''assertProjectionWritable'' is oversized: CC=13, fan-out=18, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/intake-service.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/intake-service.ts:158:God\n Function: assertProjectionWritable'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertTodoPatchArtifact'\n description: 'code2llm reports `God Function: assertTodoPatchArtifact` in `src/synthesis/todo-patch.ts:221`.\n\n\n Function ''assertTodoPatchArtifact'' is oversized: CC=11, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:221:God Function:\n assertTodoPatchArtifact'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: assertTodoProposalValue'\n description: 'code2llm reports `God Function: assertTodoProposalValue` in `src/core/schema/conclusions.ts:116`.\n\n\n Function ''assertTodoProposalValue'' is oversized: CC=9, fan-out=18, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/conclusions.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/conclusions.ts:116:God\n Function: assertTodoProposalValue'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: atomicWrite'\n description: 'code2llm reports `God Function: atomicWrite` in `src/synthesis/todo-patch.ts:274`.\n\n\n Function ''atomicWrite'' is oversized: CC=5, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:274:God Function:\n atomicWrite'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: baseWorktree'\n description: 'code2llm reports `God Function: baseWorktree` in `src/comparison/workspace.ts:97`.\n\n\n Function ''baseWorktree'' is oversized: CC=3, fan-out=25, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/comparison/workspace.ts\n dedupe_key: 'code2llm:smell:god_function:src/comparison/workspace.ts:97:God Function:\n baseWorktree'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: block'\n description: 'code2llm reports `God Function: block` in `src/extractors/todo.ts:46`.\n\n\n Function ''block'' is oversized: CC=2, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:46:God Function:\n block'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: body'\n description: 'code2llm reports `God Function: body` in `src/extractors/nl.ts:41`.\n\n\n Function ''body'' is oversized: CC=2, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/nl.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:41:God Function: body'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: body'\n description: 'code2llm reports `God Function: body` in `src/extractors/changelog.ts:27`.\n\n\n Function ''body'' is oversized: CC=7, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/changelog.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:27:God Function:\n body'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: body'\n description: 'code2llm reports `God Function: body` in `src/extractors/todo.ts:28`.\n\n\n Function ''body'' is oversized: CC=5, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:28:God Function:\n body'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: buildAcceptanceContext'\n description: 'code2llm reports `God Function: buildAcceptanceContext` in `src/synthesis/code-change-plan/implementation-helpers-acceptance.ts:65`.\n\n\n Function ''buildAcceptanceContext'' is oversized: CC=4, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/code-change-plan/implementation-helpers-acceptance.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-helpers-acceptance.ts:65:God\n Function: buildAcceptanceContext'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: buildParticipantRows'\n description: 'code2llm reports `God Function: buildParticipantRows` in `src/communication/analyzer.ts:225`.\n\n\n Function ''buildParticipantRows'' is oversized: CC=7, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/analyzer.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:225:God Function:\n buildParticipantRows'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: byKey'\n description: 'code2llm reports `God Function: byKey` in `src/communication/llm/implementation-helpers.ts:146`.\n\n\n Function ''byKey'' is oversized: CC=6, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/llm/implementation-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:146:God\n Function: byKey'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: changePaths'\n description: 'code2llm reports `God Function: changePaths` in `src/core/schema/code-change.ts:226`.\n\n\n Function ''changePaths'' is oversized: CC=6, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/schema/code-change.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/schema/code-change.ts:226:God\n Function: changePaths'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: checked'\n description: 'code2llm reports `God Function: checked` in `src/extractors/todo.ts:45`.\n\n\n Function ''checked'' is oversized: CC=2, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:45:God Function:\n checked'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: classified'\n description: 'code2llm reports `God Function: classified` in `src/extractors/todo.ts:49`.\n\n\n Function ''classified'' is oversized: CC=2, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:49:God Function:\n classified'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: collect'\n description: 'code2llm reports `God Function: collect` in `java/JavaAstExtract.java:58`.\n\n\n Function ''collect'' is oversized: CC=1, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - java/JavaAstExtract.java\n dedupe_key: 'code2llm:smell:god_function:java/JavaAstExtract.java:58:God Function:\n collect'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: collectCommunicationMetadata'\n description: 'code2llm reports `God Function: collectCommunicationMetadata` in `src/extractors/communication-file-helpers.ts:191`.\n\n\n Function ''collectCommunicationMetadata'' is oversized: CC=14, fan-out=7, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/communication-file-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/communication-file-helpers.ts:191:God\n Function: collectCommunicationMetadata'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: collectConflictIssues'\n description: 'code2llm reports `God Function: collectConflictIssues` in `src/communication/analyzer.ts:111`.\n\n\n Function ''collectConflictIssues'' is oversized: CC=13, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/analyzer.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:111:God Function:\n collectConflictIssues'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: collectRecordDiagnostics'\n description: 'code2llm reports `God Function: collectRecordDiagnostics` in `src/graph/diagnostics.ts:71`.\n\n\n Function ''collectRecordDiagnostics'' is oversized: CC=8, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/graph/diagnostics.ts\n dedupe_key: 'code2llm:smell:god_function:src/graph/diagnostics.ts:71:God Function:\n collectRecordDiagnostics'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: collect_files'\n description: 'code2llm reports `God Function: collect_files` in `rust-ast/src/main.rs:101`.\n\n\n Function ''collect_files'' is oversized: CC=9, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - rust-ast/src/main.rs\n dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:101:God Function:\n collect_files'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: communicationSegments'\n description: 'code2llm reports `God Function: communicationSegments` in `src/extractors/communication-helpers.ts:181`.\n\n\n Function ''communicationSegments'' is oversized: CC=14, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/communication-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/communication-helpers.ts:181:God\n Function: communicationSegments'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: compareWorkspaceIntent'\n description: 'code2llm reports `God Function: compareWorkspaceIntent` in `src/comparison/workspace.ts:78`.\n\n\n Function ''compareWorkspaceIntent'' is oversized: CC=9, fan-out=40, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/comparison/workspace.ts\n dedupe_key: 'code2llm:smell:god_function:src/comparison/workspace.ts:78:God Function:\n compareWorkspaceIntent'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: compileSubactorProcessEnvelope'\n description: 'code2llm reports `God Function: compileSubactorProcessEnvelope` in\n `src/operations/subactor.ts:41`.\n\n\n Function ''compileSubactorProcessEnvelope'' is oversized: CC=13, fan-out=18, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/operations/subactor.ts\n dedupe_key: 'code2llm:smell:god_function:src/operations/subactor.ts:41:God Function:\n compileSubactorProcessEnvelope'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: configurationRecords'\n description: 'code2llm reports `God Function: configurationRecords` in `src/extractors/configuration.ts:41`.\n\n\n Function ''configurationRecords'' is oversized: CC=4, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/configuration.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/configuration.ts:41:God\n Function: configurationRecords'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: controller'\n description: 'code2llm reports `God Function: controller` in `src/llm/openrouter.ts:45`.\n\n\n Function ''controller'' is oversized: CC=13, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/llm/openrouter.ts\n dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:45:God Function:\n controller'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: createMarkdownPathResolver'\n description: 'code2llm reports `God Function: createMarkdownPathResolver` in `src/extractors/markdown-paths.ts:39`.\n\n\n Function ''createMarkdownPathResolver'' is oversized: CC=12, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-paths.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:39:God\n Function: createMarkdownPathResolver'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: createSemanticCandidateSet'\n description: 'code2llm reports `God Function: createSemanticCandidateSet` in `src/semantic/reranker/candidate.ts:16`.\n\n\n Function ''createSemanticCandidateSet'' is oversized: CC=8, fan-out=17, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/semantic/reranker/candidate.ts\n dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/candidate.ts:16:God\n Function: createSemanticCandidateSet'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: createSemanticRerankResult'\n description: 'code2llm reports `God Function: createSemanticRerankResult` in `src/semantic/reranker/result.ts:23`.\n\n\n Function ''createSemanticRerankResult'' is oversized: CC=4, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/semantic/reranker/result.ts\n dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/result.ts:23:God\n Function: createSemanticRerankResult'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: createTodoPatch'\n description: 'code2llm reports `God Function: createTodoPatch` in `src/synthesis/todo-patch.ts:69`.\n\n\n Function ''createTodoPatch'' is oversized: CC=8, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/todo-patch.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:69:God Function:\n createTodoPatch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: decodeDelimitedFields'\n description: 'code2llm reports `God Function: decodeDelimitedFields` in `src/communication/intake-protobuf.ts:69`.\n\n\n Function ''decodeDelimitedFields'' is oversized: CC=13, fan-out=7, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/intake-protobuf.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:69:God\n Function: decodeDelimitedFields'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: decode_chunked'\n description: 'code2llm reports `God Function: decode_chunked` in `sdk/rust/src/client.rs:189`.\n\n\n Function ''decode_chunked'' is oversized: CC=7, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - sdk/rust/src/client.rs\n dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:189:God Function:\n decode_chunked'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: diagnoseGraph'\n description: 'code2llm reports `God Function: diagnoseGraph` in `src/graph/diagnostics.ts:16`.\n\n\n Function ''diagnoseGraph'' is oversized: CC=6, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/graph/diagnostics.ts\n dedupe_key: 'code2llm:smell:god_function:src/graph/diagnostics.ts:16:God Function:\n diagnoseGraph'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: diffIntentGraphs'\n description: 'code2llm reports `God Function: diffIntentGraphs` in `src/graph/diff.ts:16`.\n\n\n Function ''diffIntentGraphs'' is oversized: CC=11, fan-out=19, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/graph/diff.ts\n dedupe_key: 'code2llm:smell:god_function:src/graph/diff.ts:16:God Function: diffIntentGraphs'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: encode_envelope'\n description: 'code2llm reports `God Function: encode_envelope` in `src/interfaces/intake_cli.py:55`.\n\n\n Function ''encode_envelope'' is oversized: CC=6, fan-out=11, mutations=11.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/intake_cli.py\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/intake_cli.py:55:God Function:\n encode_envelope'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: enrichBatchCovering'\n description: 'code2llm reports `God Function: enrichBatchCovering` in `src/extractors/markdown-llm-helpers.ts:112`.\n\n\n Function ''enrichBatchCovering'' is oversized: CC=6, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-llm-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm-helpers.ts:112:God\n Function: enrichBatchCovering'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: enrichMarkdownRecords'\n description: 'code2llm reports `God Function: enrichMarkdownRecords` in `src/extractors/markdown-llm-helpers.ts:57`.\n\n\n Function ''enrichMarkdownRecords'' is oversized: CC=13, fan-out=9, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-llm-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm-helpers.ts:57:God\n Function: enrichMarkdownRecords'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: enrichRecord'\n description: 'code2llm reports `God Function: enrichRecord` in `src/extractors/markdown-llm-helpers.ts:274`.\n\n\n Function ''enrichRecord'' is oversized: CC=14, fan-out=4, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-llm-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm-helpers.ts:274:God\n Function: enrichRecord'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: evaluateDiagnosticsCase'\n description: 'code2llm reports `God Function: evaluateDiagnosticsCase` in `src/evaluation/gold-cases.ts:277`.\n\n\n Function ''evaluateDiagnosticsCase'' is oversized: CC=6, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:277:God Function:\n evaluateDiagnosticsCase'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: evaluateDsl2TodoCase'\n description: 'code2llm reports `God Function: evaluateDsl2TodoCase` in `src/evaluation/gold-cases.ts:305`.\n\n\n Function ''evaluateDsl2TodoCase'' is oversized: CC=5, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:305:God Function:\n evaluateDsl2TodoCase'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: evaluateRerankingCase'\n description: 'code2llm reports `God Function: evaluateRerankingCase` in `src/evaluation/gold-cases.ts:71`.\n\n\n Function ''evaluateRerankingCase'' is oversized: CC=1, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/evaluation/gold-cases.ts\n dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:71:God Function:\n evaluateRerankingCase'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: exchange'\n description: 'code2llm reports `God Function: exchange` in `sdk/rust/src/client.rs:125`.\n\n\n Function ''exchange'' is oversized: CC=10, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - sdk/rust/src/client.rs\n dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:125:God Function:\n exchange'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: executeAnalyzeCommunicationAction'\n description: 'code2llm reports `God Function: executeAnalyzeCommunicationAction`\n in `src/services/actions.ts:158`.\n\n\n Function ''executeAnalyzeCommunicationAction'' is oversized: CC=4, fan-out=18,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/services/actions.ts\n dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:158:God Function:\n executeAnalyzeCommunicationAction'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: executeCloseCodeChangeAction'\n description: 'code2llm reports `God Function: executeCloseCodeChangeAction` in `src/services/actions.ts:413`.\n\n\n Function ''executeCloseCodeChangeAction'' is oversized: CC=13, fan-out=6, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/services/actions.ts\n dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:413:God Function:\n executeCloseCodeChangeAction'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: executePipelineAction'\n description: 'code2llm reports `God Function: executePipelineAction` in `src/services/actions.ts:556`.\n\n\n Function ''executePipelineAction'' is oversized: CC=1, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/services/actions.ts\n dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:556:God Function:\n executePipelineAction'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractAstIntent'\n description: 'code2llm reports `God Function: extractAstIntent` in `src/extractors/ast.ts:23`.\n\n\n Function ''extractAstIntent'' is oversized: CC=12, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/ast.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/ast.ts:23:God Function:\n extractAstIntent'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractChangelog'\n description: 'code2llm reports `God Function: extractChangelog` in `src/extractors/changelog.ts:18`.\n\n\n Function ''extractChangelog'' is oversized: CC=10, fan-out=19, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/changelog.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:18:God Function:\n extractChangelog'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractCommunicationIntentAudited'\n description: 'code2llm reports `God Function: extractCommunicationIntentAudited`\n in `src/communication/llm/implementation.ts:63`.\n\n\n Function ''extractCommunicationIntentAudited'' is oversized: CC=12, fan-out=23,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/llm/implementation.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation.ts:63:God\n Function: extractCommunicationIntentAudited'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractConventionalAction'\n description: 'code2llm reports `God Function: extractConventionalAction` in `src/core/text.ts:83`.\n\n\n Function ''extractConventionalAction'' is oversized: CC=14, fan-out=2, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/text.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:83:God Function: extractConventionalAction'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractDocumentationIntent'\n description: 'code2llm reports `God Function: extractDocumentationIntent` in `src/extractors/docs-llm.ts:45`.\n\n\n Function ''extractDocumentationIntent'' is oversized: CC=3, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/docs-llm.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/docs-llm.ts:45:God Function:\n extractDocumentationIntent'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractMarkdownIntentAudited'\n description: 'code2llm reports `God Function: extractMarkdownIntentAudited` in `src/extractors/markdown-llm.ts:34`.\n\n\n Function ''extractMarkdownIntentAudited'' is oversized: CC=9, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/markdown-llm.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm.ts:34:God Function:\n extractMarkdownIntentAudited'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractNlIntent'\n description: 'code2llm reports `God Function: extractNlIntent` in `src/extractors/nl.ts:38`.\n\n\n Function ''extractNlIntent'' is oversized: CC=5, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/nl.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:38:God Function: extractNlIntent'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractNlIntentAudited'\n description: 'code2llm reports `God Function: extractNlIntentAudited` in `src/extractors/nl-llm.ts:33`.\n\n\n Function ''extractNlIntentAudited'' is oversized: CC=10, fan-out=22, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/nl-llm.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/nl-llm.ts:33:God Function:\n extractNlIntentAudited'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractPhpAst'\n description: 'code2llm reports `God Function: extractPhpAst` in `src/extractors/ast/php.ts:11`.\n\n\n Function ''extractPhpAst'' is oversized: CC=2, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/ast/php.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/php.ts:11:God Function:\n extractPhpAst'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractPythonAst'\n description: 'code2llm reports `God Function: extractPythonAst` in `src/extractors/ast/python.ts:11`.\n\n\n Function ''extractPythonAst'' is oversized: CC=2, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/ast/python.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/python.ts:11:God Function:\n extractPythonAst'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractRepositoryGitIntent'\n description: 'code2llm reports `God Function: extractRepositoryGitIntent` in `src/extractors/git.ts:74`.\n\n\n Function ''extractRepositoryGitIntent'' is oversized: CC=11, fan-out=21, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/git.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/git.ts:74:God Function:\n extractRepositoryGitIntent'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractRuntimeCycleIntent'\n description: 'code2llm reports `God Function: extractRuntimeCycleIntent` in `src/extractors/runtime-cycle.ts:29`.\n\n\n Function ''extractRuntimeCycleIntent'' is oversized: CC=8, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/runtime-cycle.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/runtime-cycle.ts:29:God\n Function: extractRuntimeCycleIntent'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractSymbols'\n description: 'code2llm reports `God Function: extractSymbols` in `src/core/text.ts:459`.\n\n\n Function ''extractSymbols'' is oversized: CC=7, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/text.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:459:God Function: extractSymbols'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: extractTodo'\n description: 'code2llm reports `God Function: extractTodo` in `src/extractors/todo.ts:19`.\n\n\n Function ''extractTodo'' is oversized: CC=5, fan-out=24, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:19:God Function:\n extractTodo'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: files'\n description: 'code2llm reports `God Function: files` in `src/interfaces/a2a-run-list-item.ts:43`.\n\n\n Function ''files'' is oversized: CC=7, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/a2a-run-list-item.ts\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-run-list-item.ts:43:God\n Function: files'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: files'\n description: 'code2llm reports `God Function: files` in `scripts/verify-module-boundaries.mjs:6`.\n\n\n Function ''files'' is oversized: CC=7, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/verify-module-boundaries.mjs\n dedupe_key: 'code2llm:smell:god_function:scripts/verify-module-boundaries.mjs:6:God\n Function: files'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: goldReportIsPerfect'\n description: 'code2llm reports `God Function: goldReportIsPerfect` in `src/evaluation/gold.ts:100`.\n\n\n Function ''goldReportIsPerfect'' is oversized: CC=14, fan-out=0, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/evaluation/gold.ts\n dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold.ts:100:God Function:\n goldReportIsPerfect'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: graph'\n description: 'code2llm reports `God Function: graph` in `scripts/verify-module-boundaries.mjs:7`.\n\n\n Function ''graph'' is oversized: CC=7, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/verify-module-boundaries.mjs\n dedupe_key: 'code2llm:smell:god_function:scripts/verify-module-boundaries.mjs:7:God\n Function: graph'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: handleCommunication'\n description: 'code2llm reports `God Function: handleCommunication` in `src/cli.ts:666`.\n\n\n Function ''handleCommunication'' is oversized: CC=11, fan-out=18, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:666:God Function: handleCommunication'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: handleDiff'\n description: 'code2llm reports `God Function: handleDiff` in `src/cli.ts:468`.\n\n\n Function ''handleDiff'' is oversized: CC=9, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:468:God Function: handleDiff'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: handleGraphDiff'\n description: 'code2llm reports `God Function: handleGraphDiff` in `src/cli.ts:494`.\n\n\n Function ''handleGraphDiff'' is oversized: CC=7, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:494:God Function: handleGraphDiff'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: handleIntake'\n description: 'code2llm reports `God Function: handleIntake` in `src/cli.ts:706`.\n\n\n Function ''handleIntake'' is oversized: CC=13, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:706:God Function: handleIntake'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: handleReality'\n description: 'code2llm reports `God Function: handleReality` in `src/cli.ts:551`.\n\n\n Function ''handleReality'' is oversized: CC=9, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:551:God Function: handleReality'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: handleWatch'\n description: 'code2llm reports `God Function: handleWatch` in `src/cli.ts:346`.\n\n\n Function ''handleWatch'' is oversized: CC=1, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:346:God Function: handleWatch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: index'\n description: 'code2llm reports `God Function: index` in `src/diff/text-render.ts:43`.\n\n\n Function ''index'' is oversized: CC=13, fan-out=2, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/diff/text-render.ts\n dedupe_key: 'code2llm:smell:god_function:src/diff/text-render.ts:43:God Function:\n index'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: indexModuleAnchors'\n description: 'code2llm reports `God Function: indexModuleAnchors` in `src/diff/reality.ts:324`.\n\n\n Function ''indexModuleAnchors'' is oversized: CC=12, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/diff/reality.ts\n dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:324:God Function: indexModuleAnchors'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: indexResolvableBasenames'\n description: 'code2llm reports `God Function: indexResolvableBasenames` in `src/graph/linker.ts:94`.\n\n\n Function ''indexResolvableBasenames'' is oversized: CC=8, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/graph/linker.ts\n dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:94:God Function: indexResolvableBasenames'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: isPathLike'\n description: 'code2llm reports `God Function: isPathLike` in `src/core/text.ts:408`.\n\n\n Function ''isPathLike'' is oversized: CC=13, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/core/text.ts\n dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:408:God Function: isPathLike'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: lines'\n description: 'code2llm reports `God Function: lines` in `src/extractors/changelog.ts:30`.\n\n\n Function ''lines'' is oversized: CC=7, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/changelog.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:30:God Function:\n lines'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: lines'\n description: 'code2llm reports `God Function: lines` in `src/extractors/todo.ts:32`.\n\n\n Function ''lines'' is oversized: CC=5, fan-out=20, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/todo.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:32:God Function:\n lines'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: linkIntentRecords'\n description: 'code2llm reports `God Function: linkIntentRecords` in `src/graph/linker.ts:32`.\n\n\n Function ''linkIntentRecords'' is oversized: CC=5, fan-out=22, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/graph/linker.ts\n dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:32:God Function: linkIntentRecords'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: listAvailableModels'\n description: 'code2llm reports `God Function: listAvailableModels` in `src/llm/openrouter.ts:44`.\n\n\n Function ''listAvailableModels'' is oversized: CC=13, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/llm/openrouter.ts\n dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:44:God Function:\n listAvailableModels'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: listIntentRuns'\n description: 'code2llm reports `God Function: listIntentRuns` in `src/interfaces/a2a-history.ts:25`.\n\n\n Function ''listIntentRuns'' is oversized: CC=2, fan-out=13, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/a2a-history.ts\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:25:God Function:\n listIntentRuns'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: listTasks'\n description: 'code2llm reports `God Function: listTasks` in `src/interfaces/a2a-task-store.ts:444`.\n\n\n Function ''listTasks'' is oversized: CC=9, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/a2a-task-store.ts\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-task-store.ts:444:God\n Function: listTasks'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: loadEnvFile'\n description: 'code2llm reports `God Function: loadEnvFile` in `src/config/env.ts:76`.\n\n\n Function ''loadEnvFile'' is oversized: CC=13, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/config/env.ts\n dedupe_key: 'code2llm:smell:god_function:src/config/env.ts:76:God Function: loadEnvFile'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: loadRuns'\n description: 'code2llm reports `God Function: loadRuns` in `src/web/diff-ui-script.ts:9`.\n\n\n Function ''loadRuns'' is oversized: CC=12, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/web/diff-ui-script.ts\n dedupe_key: 'code2llm:smell:god_function:src/web/diff-ui-script.ts:9:God Function:\n loadRuns'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: local'\n description: 'code2llm reports `God Function: local` in `scripts/verify-env-contract.mjs:52`.\n\n\n Function ''local'' is oversized: CC=13, fan-out=3, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/verify-env-contract.mjs\n dedupe_key: 'code2llm:smell:god_function:scripts/verify-env-contract.mjs:52:God\n Function: local'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `rust-ast/src/main.rs:36`.\n\n\n Function ''main'' is oversized: CC=6, fan-out=21, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - rust-ast/src/main.rs\n dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:36:God Function: main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `java/JavaAstExtract.java:21`.\n\n\n Function ''main'' is oversized: CC=10, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - java/JavaAstExtract.java\n dedupe_key: 'code2llm:smell:god_function:java/JavaAstExtract.java:21:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `src/cli.ts:61`.\n\n\n Function ''main'' is oversized: CC=9, fan-out=12, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:61:God Function: main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `src/evaluation/gold-cli.ts:11`.\n\n\n Function ''main'' is oversized: CC=12, fan-out=15, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/evaluation/gold-cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cli.ts:11:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `golang/ast_extract.go:53`.\n\n\n Function ''main'' is oversized: CC=14, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - golang/ast_extract.go\n dedupe_key: 'code2llm:smell:god_function:golang/ast_extract.go:53:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `scripts/live-model-comparison.mjs:27`.\n\n\n Function ''main'' is oversized: CC=13, fan-out=22, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/live-model-comparison.mjs\n dedupe_key: 'code2llm:smell:god_function:scripts/live-model-comparison.mjs:27:God\n Function: main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `scripts/live-contract-check.mjs:41`.\n\n\n Function ''main'' is oversized: CC=5, fan-out=16, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/live-contract-check.mjs\n dedupe_key: 'code2llm:smell:god_function:scripts/live-contract-check.mjs:41:God\n Function: main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: main'\n description: 'code2llm reports `God Function: main` in `python/ast_extract.py:195`.\n\n\n Function ''main'' is oversized: CC=4, fan-out=19, mutations=12.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - python/ast_extract.py\n dedupe_key: 'code2llm:smell:god_function:python/ast_extract.py:195:God Function:\n main'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: matchesRunFilters'\n description: 'code2llm reports `God Function: matchesRunFilters` in `src/interfaces/a2a-history.ts:77`.\n\n\n Function ''matchesRunFilters'' is oversized: CC=13, fan-out=4, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/interfaces/a2a-history.ts\n dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:77:God Function:\n matchesRunFilters'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: materializeSyntheses'\n description: 'code2llm reports `God Function: materializeSyntheses` in `src/communication/llm/implementation-helpers.ts:127`.\n\n\n Function ''materializeSyntheses'' is oversized: CC=9, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/llm/implementation-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:127:God\n Function: materializeSyntheses'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: materializeTaskSynthesisResponse'\n description: 'code2llm reports `God Function: materializeTaskSynthesisResponse`\n in `src/synthesis/task-synthesis-materialize.ts:14`.\n\n\n Function ''materializeTaskSynthesisResponse'' is oversized: CC=2, fan-out=18,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/synthesis/task-synthesis-materialize.ts\n dedupe_key: 'code2llm:smell:god_function:src/synthesis/task-synthesis-materialize.ts:14:God\n Function: materializeTaskSynthesisResponse'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: maxFiles'\n description: 'code2llm reports `God Function: maxFiles` in `src/watch/watcher.ts:38`.\n\n\n Function ''maxFiles'' is oversized: CC=11, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/watch/watcher.ts\n dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:38:God Function: maxFiles'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: measureStage'\n description: 'code2llm reports `God Function: measureStage` in `src/live/contract-check.ts:115`.\n\n\n Function ''measureStage'' is oversized: CC=14, fan-out=3, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/live/contract-check.ts\n dedupe_key: 'code2llm:smell:god_function:src/live/contract-check.ts:115:God Function:\n measureStage'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: moduleRecords'\n description: 'code2llm reports `God Function: moduleRecords` in `src/extractors/ast/records.ts:34`.\n\n\n Function ''moduleRecords'' is oversized: CC=6, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/extractors/ast/records.ts\n dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/records.ts:34:God Function:\n moduleRecords'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: normalizeParticipantIdentityRegistry'\n description: 'code2llm reports `God Function: normalizeParticipantIdentityRegistry`\n in `src/communication/identity.ts:53`.\n\n\n Function ''normalizeParticipantIdentityRegistry'' is oversized: CC=12, fan-out=12,\n mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/identity.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/identity.ts:53:God Function:\n normalizeParticipantIdentityRegistry'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: numbers'\n description: 'code2llm reports `God Function: numbers` in `src/communication/intake-protobuf.ts:77`.\n\n\n Function ''numbers'' is oversized: CC=13, fan-out=7, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/intake-protobuf.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:77:God\n Function: numbers'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: object'\n description: 'code2llm reports `God Function: object` in `src/llm/structured-schema.ts:155`.\n\n\n Function ''object'' is oversized: CC=7, fan-out=14, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/llm/structured-schema.ts\n dedupe_key: 'code2llm:smell:god_function:src/llm/structured-schema.ts:155:God Function:\n object'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: offset'\n description: 'code2llm reports `God Function: offset` in `src/communication/intake-protobuf.ts:79`.\n\n\n Function ''offset'' is oversized: CC=13, fan-out=7, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/intake-protobuf.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:79:God\n Function: offset'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: options'\n description: 'code2llm reports `God Function: options` in `src/cli.ts:781`.\n\n\n Function ''options'' is oversized: CC=13, fan-out=5, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:781:God Function: options'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: output'\n description: 'code2llm reports `God Function: output` in `src/communication/llm/implementation-helpers.ts:148`.\n\n\n Function ''output'' is oversized: CC=6, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/communication/llm/implementation-helpers.ts\n dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:148:God\n Function: output'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: parseArgs'\n description: 'code2llm reports `God Function: parseArgs` in `src/cli.ts:779`.\n\n\n Function ''parseArgs'' is oversized: CC=13, fan-out=5, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/cli.ts\n dedupe_key: 'code2llm:smell:god_function:src/cli.ts:779:God Function: parseArgs'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: parseArgs'\n description: 'code2llm reports `God Function: parseArgs` in `scripts/research/rerank-embedding-shortlist.mjs:164`.\n\n\n Function ''parseArgs'' is oversized: CC=14, fan-out=11, mutations=0.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/research/rerank-embedding-shortlist.mjs\n dedupe_key: 'code2llm:smell:god_function:scripts/research/rerank-embedding-shortlist.mjs:164:God\n Function: parseArgs'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: parse_args'\n description: 'code2llm reports `God Function: parse_args` in `scripts/research/evaluate-embedding-pairs.py:14`.\n\n\n Function ''parse_args'' is oversized: CC=1, fan-out=3, mutations=8.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - scripts/research/evaluate-embedding-pairs.py\n dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:14:God\n Function: parse_args'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: parse_args'\n description: 'code2llm reports `God Function: p\n\n... [truncated - file too large]", "is_subdir": false}, {"name": "project.toon.yaml", "rel_path": "project.toon.yaml", "path": "project.toon.yaml", "size": "2.4KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# todo2code | 4129 func | 197f | 43441L | typescript | 2026-08-04\n# generated in 0.00s\n\nHEALTH:\n CCΜ„=3.1 critical=187 (limit:10) dup=29 cycles=0\n\nALERTS[20]:\n !!! high_fan_out compareWorkspaceIntent = 40 (limit:10)\n !!! cc_exceeded parseFile = 38 (limit:15)\n !!! high_fan_out Client.parse_http_response = 37 (limit:10)\n !!! high_fan_out run = 33 (limit:10)\n !!! high_fan_out main = 31 (limit:10)\n !!! high_fan_out executePipeline = 31 (limit:10)\n !!! cc_exceeded makefile = 28 (limit:15)\n !!! cc_exceeded main = 27 (limit:15)\n !!! cc_exceeded run = 26 (limit:15)\n !!! high_fan_out temporaryParent = 25 (limit:10)\n\nMODULES[281] (top by size):\n M[evaluation/gold/v2/dataset.json] 2410L C:0 F:0 CC↑0 D:0 (json)\n M[src/cli.ts] 942L C:1 F:124 CC↑13 D:0 (typescript)\n M[src/services/actions.ts] 806L C:1 F:106 CC↑13 D:0 (typescript)\n M[evaluation/gold/v1/dataset.json] 761L C:0 F:0 CC↑0 D:0 (json)\n M[src/diff/reality.ts] 690L C:4 F:89 CC↑15 D:0 (typescript)\n M[src/communication/analyzer.ts] 596L C:3 F:81 CC↑15 D:0 (typescript)\n M[schemas/gold-dataset.schema.json] 585L C:0 F:0 CC↑0 D:0 (json)\n M[src/interfaces/a2a-task-store.ts] 560L C:3 F:88 CC↑11 D:0 (typescript)\n M[src/core/text.ts] 530L C:0 F:61 CC↑14 D:0 (typescript)\n M[goal.yaml] 530L C:0 F:0 CC↑0 D:0 (yaml)\n M[src/evaluation/gold-cases.ts] 489L C:4 F:62 CC↑8 D:0 (typescript)\n M[sdk/python/todo2code/client.py] 469L C:7 F:45 CC↑7 D:0 (python)\n M[src/graph/diagnostics.ts] 459L C:1 F:59 CC↑11 D:0 (typescript)\n M[src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts] 434L C:6 F:50 CC↑13 D:0 (typescript)\n M[src/operations/validation.ts] 429L C:0 F:69 CC↑23 D:0 (typescript)\n LANGS: typescript:173/json:40/python:16/javascript:15/shell:8/rust:7/go:6/php:4/toml:3/other:2/yml:2/yaml:2/java:1/txt:1/proto:1\n\nHOTSPOTS[10]:\n β˜… compareWorkspaceIntent fan=40 // Orchestrates 40 calls\n β˜… Client.parse_http_response fan=37 // Orchestrates 37 calls\n β˜… run fan=33 // Orchestrates 33 calls\n β˜… main fan=31 // Orchestrates 31 calls\n β˜… executePipeline fan=31 // Orchestrates 31 calls\n\nREFACTOR[15]:\n [1] H/L Split parseFile (CC=38)\n [2] H/L Split makefile (CC=28)\n [3] H/L Split main (CC=27)\n [4] H/L Split run (CC=26)\n [5] H/H Split god module src/communication/analyzer.ts (596L, 3 classes)\n\nEVOLUTION:\n 2026-08-04 CCΜ„=3.1 crit=187 43441L // Automated analysis\n", "is_subdir": false}, {"name": "validation.toon.yaml", "rel_path": "validation.toon.yaml", "path": "validation.toon.yaml", "size": "6.4KB", "icon": "βš™οΈ", "type": "yaml", "type_name": "YAML", "content": "# vallm batch | 474f | 227βœ“ 34⚠ 0βœ— | 2026-08-01\n\nSUMMARY:\n scanned: 474 passed: 227 (47.9%) warnings: 34 errors: 0 unsupported: 0\n\nWARNINGS[34]{path,score}:\n src/operations/validation.ts,0.80\n issues[4]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertVariableContract: CC=19 exceeds limit 15,62\n complexity.lizard_cc,warning,assertGeneration: CC=16 exceeds limit 15,110\n complexity.lizard_cc,warning,assertOperationPlan: CC=82 exceeds limit 15,153\n complexity.lizard_length,warning,assertOperationPlan: 129 lines exceeds limit 100,153\n scripts/research/rank-intent-graph-embeddings.py,0.90\n issues[3]{rule,severity,message,line}:\n complexity.cyclomatic,warning,main has cyclomatic complexity 27 (max: 15),35\n complexity.lizard_cc,warning,main: CC=27 exceeds limit 15,35\n complexity.lizard_length,warning,main: 133 lines exceeds limit 100,35\n src/core/ignore.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,translateGlob: CC=29 exceeds limit 15,77\n complexity.lizard_length,warning,translateGlob: 107 lines exceeds limit 100,77\n src/core/schema.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertIntentRecord: CC=23 exceeds limit 15,74\n complexity.lizard_cc,warning,assertGroundedGenerationMetadata: CC=22 exceeds limit 15,533\n src/diff/text.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,myers: CC=21 exceeds limit 15,140\n complexity.lizard_cc,warning,backtrack: CC=25 exceeds limit 15,172\n src/extractors/communication.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,extractCommunicationIntent: CC=78 exceeds limit 15,54\n complexity.lizard_length,warning,extractCommunicationIntent: 151 lines exceeds limit 100,54\n src/interfaces/a2a-task-store.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,listTasks: CC=41 exceeds limit 15,397\n complexity.lizard_length,warning,listTasks: 107 lines exceeds limit 100,397\n src/pipeline/run.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,runPipeline: CC=63 exceeds limit 15,55\n complexity.lizard_length,warning,runPipeline: 358 lines exceeds limit 100,55\n src/semantic/reranker.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertSemanticCandidateSet: CC=22 exceeds limit 15,184\n complexity.lizard_cc,warning,assertSemanticRerankResult: CC=18 exceeds limit 15,311\n src/services/actions.ts,0.90\n issues[2]{rule,severity,message,line}:\n complexity.lizard_cc,warning,executeAction: CC=82 exceeds limit 15,72\n complexity.lizard_length,warning,executeAction: 434 lines exceeds limit 100,72\n examples/backend/src/server.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,handleRequest: CC=18 exceeds limit 15,28\n php/ast_extract.php,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,parseFile: CC=40 exceeds limit 15,77\n python/ast_extract.py,0.95\n issues[2]{rule,severity,message,line}:\n complexity.cyclomatic,warning,iter_python_files has cyclomatic complexity 16 (max: 15),168\n complexity.lizard_cc,warning,iter_python_files: CC=16 exceeds limit 15,168\n sdk/go/examples/basic/main.go,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,run: CC=19 exceeds limit 15,29\n sdk/php/src/Client.php,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,Client::call: CC=21 exceeds limit 15,106\n sdk/rust/examples/basic.rs,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,run: CC=20 exceeds limit 15,27\n src/cli.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,handleExtract: CC=20 exceeds limit 15,518\n src/communication/identity.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertParticipantIdentityRegistry: CC=29 exceeds limit 15,51\n src/comparison/workspace.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,commonPipelineOptions: CC=19 exceeds limit 15,192\n src/core/record.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,buildRecord: CC=33 exceeds limit 15,57\n src/core/text.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,inferObject: CC=31 exceeds limit 15,440\n src/evaluation/gold-types.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,assertLinkingCohorts: CC=25 exceeds limit 15,341\n src/extractors/ast/typescript.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,visit: CC=26 exceeds limit 15,77\n src/extractors/docs-record.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,toDocumentIntentRecord: CC=19 exceeds limit 15,25\n src/extractors/nl-llm.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,toIntentRecord: CC=24 exceeds limit 15,175\n src/graph/linker.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,scorePair: CC=18 exceeds limit 15,342\n src/interfaces/a2a-card.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_length,warning,skills: 103 lines exceeds limit 100,55\n src/interfaces/a2a-message.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_length,warning,parseKeyValues: 119 lines exceeds limit 100,67\n src/live/contract-check.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,measureStage: CC=17 exceeds limit 15,115\n src/llm/openrouter.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,request: CC=26 exceeds limit 15,171\n src/synthesis/code-change-path.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,isPlannablePath: CC=40 exceeds limit 15,138\n src/synthesis/code-change-plan.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,proposeCodeChangePlans: CC=22 exceeds limit 15,109\n src/tf/classifier.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,classifyAction: CC=18 exceeds limit 15,69\n src/watch/watcher.ts,0.95\n issues[1]{rule,severity,message,line}:\n complexity.lizard_cc,warning,watchRepository: CC=21 exceeds limit 15,147\n\n", "is_subdir": false}, {"name": "baseline.json", "rel_path": "ticket-002/baseline.json", "path": "ticket-002 / baseline.json", "size": "7.4KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.external-benchmark/v1",\n "runtime": {\n "name": "todo2code",\n "version": "0.5.0",\n "commit": "5f5ae5938ab77dcce474ba7abbd23686072776ec"\n },\n "policy": {\n "checkout": "detached tracked-only worktree",\n "task": "tracked TASK.md when present; otherwise disabled",\n "todo": "tracked TODO.md when present; otherwise disabled",\n "changelog": "tracked CHANGELOG.md when present; otherwise disabled",\n "documents": [\n "README.md",\n "docs/**/*.md"\n ],\n "nlMode": "deterministic",\n "markdownMode": "deterministic",\n "communication": "disabled",\n "summaryLlm": false,\n "taskSynthesis": "disabled"\n },\n "repositories": [\n {\n "repository": "semcod/code2llm",\n "commit": "b297d600ae7d923ce22730bc90c6cd330ec7e243",\n "status": "succeeded",\n "runId": "20260731T065730Z-ca7a9a28",\n "elapsedSeconds": 18,\n "graphFingerprint": "2e57056bf75fc5ef5dead16dd990f56082a6e184f86ed4995f5607a48bd9e732",\n "records": 16899,\n "relations": 41747,\n "topics": 628,\n "alignedTopics": 107,\n "declaredRecords": 752,\n "observedRecords": 14017,\n "implementationCoveragePercent": 59.4,\n "plannedCodePercent": 43.7,\n "documentedCodePercent": 31.4,\n "warnings": 9,\n "diagnostics": {\n "total": 4700,\n "info": 912,\n "warning": 2377,\n "review_required": 1411,\n "blocking": 0,\n "byCode": {\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 1411,\n "UNLINKED_RECORD": 1332,\n "IMPLEMENTED_NOT_PLANNED": 1044,\n "IMPLEMENTED_NOT_DOCUMENTED": 912,\n "PLANNED_NOT_IMPLEMENTED": 1\n }\n }\n },\n {\n "repository": "semcod/domd",\n "commit": "b6c5ad24f2f2da386a2e3e5bad05433184f54c58",\n "status": "succeeded",\n "runId": "20260731T065753Z-a3fde5a3",\n "elapsedSeconds": 5,\n "graphFingerprint": "9df7e187f82b4ce8028c22938642bf2746ba0fe123ddc26386efa1a6916e6f68",\n "records": 10611,\n "relations": 7470,\n "topics": 241,\n "alignedTopics": 9,\n "declaredRecords": 588,\n "observedRecords": 9914,\n "implementationCoveragePercent": 11.8,\n "plannedCodePercent": 5.4,\n "documentedCodePercent": 5.4,\n "warnings": 0,\n "diagnostics": {\n "total": 2109,\n "info": 616,\n "warning": 1388,\n "review_required": 105,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 779,\n "IMPLEMENTED_NOT_DOCUMENTED": 616,\n "IMPLEMENTED_NOT_PLANNED": 609,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 105\n }\n }\n },\n {\n "repository": "semcod/pactfix",\n "commit": "daf301a9e23d65cd341ffa2d6c0a6cfe728e651d",\n "status": "succeeded",\n "runId": "20260731T065802Z-48dc0b12",\n "elapsedSeconds": 5,\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "records": 5161,\n "relations": 3917,\n "topics": 153,\n "alignedTopics": 2,\n "declaredRecords": 118,\n "observedRecords": 4992,\n "implementationCoveragePercent": 5.0,\n "plannedCodePercent": 1.8,\n "documentedCodePercent": 1.8,\n "warnings": 5,\n "diagnostics": {\n "total": 664,\n "info": 197,\n "warning": 419,\n "review_required": 48,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 217,\n "IMPLEMENTED_NOT_DOCUMENTED": 197,\n "IMPLEMENTED_NOT_PLANNED": 190,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 48,\n "PLANNED_NOT_IMPLEMENTED": 12\n }\n }\n },\n {\n "repository": "semcod/code2logic",\n "commit": "ba93489b56f51af31206671a1f55ab860bb725c2",\n "status": "succeeded",\n "runId": "20260731T065808Z-a52c2716",\n "elapsedSeconds": 12,\n "graphFingerprint": "722f90e806be667f271eb393b523f771cae18cc61912416c5f4d88c9125f01e7",\n "records": 21423,\n "relations": 16927,\n "topics": 359,\n "alignedTopics": 27,\n "declaredRecords": 864,\n "observedRecords": 20413,\n "implementationCoveragePercent": 17.7,\n "plannedCodePercent": 14.1,\n "documentedCodePercent": 14.1,\n "warnings": 3,\n "diagnostics": {\n "total": 4680,\n "info": 1474,\n "warning": 3081,\n "review_required": 121,\n "blocking": 4,\n "byCode": {\n "IMPLEMENTED_NOT_PLANNED": 1574,\n "UNLINKED_RECORD": 1504,\n "IMPLEMENTED_NOT_DOCUMENTED": 1474,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 121,\n "CONFLICTING_INTENT": 4,\n "PLANNED_NOT_IMPLEMENTED": 3\n }\n }\n },\n {\n "repository": "semcod/code2docs",\n "commit": "c738aff7bd51670104e144ae19b657fd3915565d",\n "status": "succeeded",\n "runId": "20260731T065827Z-9f042652",\n "elapsedSeconds": 9,\n "graphFingerprint": "4598fbe9eec85d61f1290a4db5c672bc3923df29d7e9db80923671b7fb3fb36f",\n "records": 6717,\n "relations": 35447,\n "topics": 265,\n "alignedTopics": 57,\n "declaredRecords": 1487,\n "observedRecords": 4556,\n "implementationCoveragePercent": 47.1,\n "plannedCodePercent": 77.0,\n "documentedCodePercent": 47.3,\n "warnings": 0,\n "diagnostics": {\n "total": 1555,\n "info": 283,\n "warning": 876,\n "review_required": 396,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 463,\n "IMPLEMENTED_NOT_PLANNED": 413,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 396,\n "IMPLEMENTED_NOT_DOCUMENTED": 283\n }\n }\n },\n {\n "repository": "semcod/redup",\n "commit": "a175fb0a80b54fcda4bf5cd34c8b087fe9472608",\n "status": "succeeded",\n "runId": "20260731T065840Z-61c33c16",\n "elapsedSeconds": 6,\n "graphFingerprint": "ed0359f98ed4e18f103a3751543f3e08a4accecc1be730633446fc63f4db3087",\n "records": 7204,\n "relations": 19173,\n "topics": 277,\n "alignedTopics": 62,\n "declaredRecords": 563,\n "observedRecords": 5820,\n "implementationCoveragePercent": 49.2,\n "plannedCodePercent": 55.9,\n "documentedCodePercent": 10.8,\n "warnings": 0,\n "diagnostics": {\n "total": 2384,\n "info": 476,\n "warning": 1205,\n "review_required": 703,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 708,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 703,\n "IMPLEMENTED_NOT_PLANNED": 493,\n "IMPLEMENTED_NOT_DOCUMENTED": 476,\n "PLANNED_NOT_IMPLEMENTED": 4\n }\n }\n },\n {\n "repository": "subactor/platform",\n "commit": "3e96573d587cb664741849ceba205bf303b9f418",\n "status": "succeeded",\n "runId": "20260731T065848Z-3863e97d",\n "elapsedSeconds": 6,\n "graphFingerprint": "1c4166dd1b7b7789d06693a224b5d816963c4bdee5b026a5e1145861c60f786d",\n "records": 10628,\n "relations": 11002,\n "topics": 688,\n "alignedTopics": 25,\n "declaredRecords": 1177,\n "observedRecords": 9309,\n "implementationCoveragePercent": 5.9,\n "plannedCodePercent": 9.3,\n "documentedCodePercent": 8.9,\n "warnings": 1,\n "diagnostics": {\n "total": 1271,\n "info": 185,\n "warning": 993,\n "review_required": 93,\n "blocking": 0,\n "byCode": {\n "UNLINKED_RECORD": 780,\n "IMPLEMENTED_NOT_DOCUMENTED": 185,\n "IMPLEMENTED_NOT_PLANNED": 177,\n "CHANGELOG_WITHOUT_IMPLEMENTATION": 93,\n "PLANNED_NOT_IMPLEMENTED": 36\n }\n }\n }\n ]\n}\n", "is_subdir": true}, {"name": "benchmark.json", "rel_path": "ticket-004/benchmark.json", "path": "ticket-004 / benchmark.json", "size": "3.3KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.cross-language-benchmark/v1",\n "description": "Cross-language intent-to-module pairs outside the current hand-written Polish topic dictionary.",\n "pairs": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false\n }\n ]\n}\n", "is_subdir": true}, {"name": "e5-prefixed-results.json", "rel_path": "ticket-004/e5-prefixed-results.json", "path": "ticket-004 / e5-prefixed-results.json", "size": "3.8KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-experiment/v1",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "dimensions": 384,\n "pairCount": 12,\n "positiveCount": 6,\n "negativeCount": 6,\n "minimumPositive": 0.759374,\n "maximumNegative": 0.835202,\n "separation": -0.075828,\n "loadSeconds": 4.041,\n "totalSeconds": 4.228,\n "results": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true,\n "score": 0.759374\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false,\n "score": 0.752184\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true,\n "score": 0.837574\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false,\n "score": 0.8046\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true,\n "score": 0.86764\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false,\n "score": 0.824159\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true,\n "score": 0.830392\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false,\n "score": 0.815187\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true,\n "score": 0.779611\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false,\n "score": 0.768394\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true,\n "score": 0.847803\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false,\n "score": 0.835202\n }\n ]\n}\n", "is_subdir": true}, {"name": "e5-results.json", "rel_path": "ticket-004/e5-results.json", "path": "ticket-004 / e5-results.json", "size": "3.8KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-experiment/v1",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "dimensions": 384,\n "pairCount": 12,\n "positiveCount": 6,\n "negativeCount": 6,\n "minimumPositive": 0.774453,\n "maximumNegative": 0.847799,\n "separation": -0.07334600000000002,\n "loadSeconds": 53.587,\n "totalSeconds": 53.817,\n "results": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true,\n "score": 0.774453\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false,\n "score": 0.772987\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true,\n "score": 0.854882\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false,\n "score": 0.827473\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true,\n "score": 0.885202\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false,\n "score": 0.837666\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true,\n "score": 0.840172\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false,\n "score": 0.828043\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true,\n "score": 0.785471\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false,\n "score": 0.781325\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true,\n "score": 0.867364\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false,\n "score": 0.847799\n }\n ]\n}\n", "is_subdir": true}, {"name": "intent.json", "rel_path": "ticket-019/intent.json", "path": "ticket-019 / intent.json", "size": "547B", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schema": "new-project.intent/v2",\n "ticket": "ticket-019",\n "summary": "Publish the Python SDK as the root todo2code package",\n "workstream": "sdk",\n "allowedPaths": [\n "pyproject.toml",\n "goal.yaml",\n "sdk/python/pyproject.toml",\n "sdk/python/README.md",\n "Makefile",\n "project/ticket-019/**",\n "TODO.md",\n "project/TICKETS.md"\n ],\n "forbiddenPaths": ["project/ticket-*/user-*.md"],\n "stacks": ["node", "python"],\n "dependsOn": ["ticket-018"],\n "conflictsWith": ["ticket-018"],\n "integrationTicket": null\n}\n", "is_subdir": true}, {"name": "intent.json", "rel_path": "ticket-018/intent.json", "path": "ticket-018 / intent.json", "size": "769B", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schema": "new-project.intent/v2",\n "ticket": "ticket-018",\n "summary": "Adopt deterministic governance policy-as-code with concurrent workstreams and an attested Koru code-review gate",\n "workstream": "governance",\n "allowedPaths": [\n ".governance/**",\n ".github/workflows/**",\n "AGENTS.md",\n "Makefile",\n "README.md",\n "TODO.md",\n "project.sh",\n "project.bat",\n "project/TICKETS.md",\n "project/governance-check.sh",\n "project/governance-check.bat",\n "project/new-ticket.sh",\n "project/readme.sh",\n "project/ticket-018/**"\n ],\n "forbiddenPaths": [\n "project/ticket-*/user-*.md"\n ],\n "stacks": [\n "node",\n "python",\n "docker"\n ],\n "dependsOn": [],\n "conflictsWith": [],\n "integrationTicket": null\n}\n", "is_subdir": true}, {"name": "intent.json", "rel_path": "ticket-022/intent.json", "path": "ticket-022 / intent.json", "size": "543B", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schema": "new-project.intent/v2",\n "ticket": "ticket-022",\n "summary": "Git evidence for umbrella workspaces",\n "workstream": "extractors",\n "allowedPaths": [\n "src/extractors/git.ts",\n "test/diff-git-umbrella.test.ts",\n "project/ticket-022/**",\n "TODO.md",\n "project/TICKETS.md"\n ],\n "forbiddenPaths": [\n "project/ticket-*/manager-*.md",\n "project/ticket-*/user-*.md",\n "project/ticket-*/dev-*.md"\n ],\n "stacks": ["node", "docker"],\n "dependsOn": [],\n "conflictsWith": [],\n "integrationTicket": null\n}\n", "is_subdir": true}, {"name": "intent.json", "rel_path": "ticket-020/intent.json", "path": "ticket-020 / intent.json", "size": "690B", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schema": "new-project.intent/v2",\n "ticket": "ticket-020",\n "summary": "Role-bound trusted intake with CQRS ES Protobuf MCP and A2A",\n "workstream": "interfaces",\n "allowedPaths": [\n "src/communication/**",\n "src/interfaces/**",\n "src/cli.ts",\n "test/communication*.test.ts",\n "test/cli*.test.ts",\n "test/mcp*.test.ts",\n "test/a2a*.test.ts",\n "project/ticket-020/**",\n "TODO.md",\n "project/TICKETS.md"\n ],\n "forbiddenPaths": [\n "project/ticket-*/manager-*.md",\n "project/ticket-*/user-*.md",\n "project/ticket-*/dev-*.md"\n ],\n "stacks": ["node", "python", "docker"],\n "dependsOn": [],\n "conflictsWith": [],\n "integrationTicket": null\n}\n", "is_subdir": true}, {"name": "iteration-01.json", "rel_path": "ticket-004/iteration-01.json", "path": "ticket-004 / iteration-01.json", "size": "1.7KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.language-matching-iteration/v1",\n "iteration": 1,\n "decision": "reject-production-matcher-retain-benchmark",\n "synthetic": {\n "languages": [\n "pl",\n "de",\n "es",\n "fr"\n ],\n "positivePairs": 6,\n "negativePairs": 6,\n "models": {\n "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2@86741b4e3f5cb7765a600d3a3d55a0f6a6cb443d": {\n "minimumPositive": 0.673289,\n "maximumNegative": 0.732568,\n "separation": -0.059279,\n "pairwiseCorrect": 5\n },\n "intfloat/multilingual-e5-small@f470c6a1a906014160ece1968c484b275f0396de": {\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "minimumPositive": 0.759374,\n "maximumNegative": 0.835202,\n "separation": -0.075828,\n "pairwiseCorrect": 6,\n "minimumPairwiseMargin": 0.00719\n }\n }\n },\n "platform": {\n "commit": "3e96573d587cb664741849ceba205bf303b9f418",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "moduleAggregates": 133,\n "actionableTargetlessDeclarations": 66,\n "forwardThreshold": {\n "minimumScore": 0.75,\n "minimumMargin": 0.01,\n "selected": 6,\n "newCandidates": 2,\n "acceptedNewCandidates": 0\n },\n "reciprocalThreshold": {\n "minimumScore": 0.75,\n "minimumForwardMargin": 0.01,\n "minimumReverseMargin": 0.01,\n "selected": 1,\n "newCandidates": 0\n }\n },\n "goldV2": {\n "crossLanguageCases": 7,\n "expectedRelations": 6,\n "satisfiedRelations": 0,\n "forbiddenPairs": 6,\n "forbiddenViolations": 0,\n "gatedPrecision": 1,\n "gatedRecall": 1\n }\n}\n", "is_subdir": true}, {"name": "iteration-01.json", "rel_path": "ticket-002/iteration-01.json", "path": "ticket-002 / iteration-01.json", "size": "4.1KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.external-benchmark-iteration/v1",\n "iteration": 1,\n "target": "non-actionable changelog mechanics",\n "changedFiles": [\n "src/graph/changelog-signal.ts",\n "src/graph/diagnostics.ts",\n "test/graph.test.ts"\n ],\n "invariants": {\n "graphFingerprintsUnchanged": true,\n "goldV2Precision": 1,\n "goldV2Recall": 1,\n "goldV2ForbiddenViolations": 0\n },\n "totals": {\n "beforeDiagnostics": 17363,\n "afterDiagnostics": 16300,\n "removedDiagnostics": 1063,\n "beforeChangelogWithoutImplementation": 2877,\n "afterChangelogWithoutImplementation": 1853,\n "removedChangelogWithoutImplementation": 1024,\n "beforeUnlinkedRecord": 5783,\n "afterUnlinkedRecord": 5744,\n "removedUnlinkedRecord": 39\n },\n "repositories": [\n {\n "repository": "semcod/code2llm",\n "runId": "20260731T070702Z-9c821450",\n "graphFingerprint": "2e57056bf75fc5ef5dead16dd990f56082a6e184f86ed4995f5607a48bd9e732",\n "beforeDiagnostics": 4700,\n "afterDiagnostics": 4225,\n "beforeReviewRequired": 1411,\n "afterReviewRequired": 955,\n "beforeChangelogWithoutImplementation": 1411,\n "afterChangelogWithoutImplementation": 955,\n "beforeUnlinkedRecord": 1332,\n "afterUnlinkedRecord": 1313\n },\n {\n "repository": "semcod/domd",\n "runId": "20260731T070725Z-26c1f092",\n "graphFingerprint": "9df7e187f82b4ce8028c22938642bf2746ba0fe123ddc26386efa1a6916e6f68",\n "beforeDiagnostics": 2109,\n "afterDiagnostics": 2097,\n "beforeReviewRequired": 105,\n "afterReviewRequired": 99,\n "beforeChangelogWithoutImplementation": 105,\n "afterChangelogWithoutImplementation": 99,\n "beforeUnlinkedRecord": 779,\n "afterUnlinkedRecord": 773\n },\n {\n "repository": "semcod/pactfix",\n "runId": "20260731T070731Z-ab868903",\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "beforeDiagnostics": 664,\n "afterDiagnostics": 664,\n "beforeReviewRequired": 48,\n "afterReviewRequired": 48,\n "beforeChangelogWithoutImplementation": 48,\n "afterChangelogWithoutImplementation": 48,\n "beforeUnlinkedRecord": 217,\n "afterUnlinkedRecord": 217\n },\n {\n "repository": "semcod/code2logic",\n "runId": "20260731T070714Z-9a108669",\n "graphFingerprint": "722f90e806be667f271eb393b523f771cae18cc61912416c5f4d88c9125f01e7",\n "beforeDiagnostics": 4680,\n "afterDiagnostics": 4678,\n "beforeReviewRequired": 121,\n "afterReviewRequired": 120,\n "beforeChangelogWithoutImplementation": 121,\n "afterChangelogWithoutImplementation": 120,\n "beforeUnlinkedRecord": 1504,\n "afterUnlinkedRecord": 1503\n },\n {\n "repository": "semcod/code2docs",\n "runId": "20260731T070652Z-c9867ada",\n "graphFingerprint": "4598fbe9eec85d61f1290a4db5c672bc3923df29d7e9db80923671b7fb3fb36f",\n "beforeDiagnostics": 1555,\n "afterDiagnostics": 1420,\n "beforeReviewRequired": 396,\n "afterReviewRequired": 269,\n "beforeChangelogWithoutImplementation": 396,\n "afterChangelogWithoutImplementation": 269,\n "beforeUnlinkedRecord": 463,\n "afterUnlinkedRecord": 455\n },\n {\n "repository": "semcod/redup",\n "runId": "20260731T070735Z-58dcf97a",\n "graphFingerprint": "ed0359f98ed4e18f103a3751543f3e08a4accecc1be730633446fc63f4db3087",\n "beforeDiagnostics": 2384,\n "afterDiagnostics": 1945,\n "beforeReviewRequired": 703,\n "afterReviewRequired": 269,\n "beforeChangelogWithoutImplementation": 703,\n "afterChangelogWithoutImplementation": 269,\n "beforeUnlinkedRecord": 708,\n "afterUnlinkedRecord": 703\n },\n {\n "repository": "subactor/platform",\n "runId": "20260731T070740Z-e130d916",\n "graphFingerprint": "1c4166dd1b7b7789d06693a224b5d816963c4bdee5b026a5e1145861c60f786d",\n "beforeDiagnostics": 1271,\n "afterDiagnostics": 1271,\n "beforeReviewRequired": 93,\n "afterReviewRequired": 93,\n "beforeChangelogWithoutImplementation": 93,\n "afterChangelogWithoutImplementation": 93,\n "beforeUnlinkedRecord": 780,\n "afterUnlinkedRecord": 780\n }\n ]\n}\n", "is_subdir": true}, {"name": "iteration-01.json", "rel_path": "ticket-003/iteration-01.json", "path": "ticket-003 / iteration-01.json", "size": "4.0KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.external-benchmark-iteration/v1",\n "iteration": 1,\n "target": "exact Update <file> changelog bookkeeping",\n "runtimeBaseCommit": "18cc21b",\n "invariants": {\n "graphFingerprintsUnchanged": true,\n "goldV2Precision": 1,\n "goldV2Recall": 1,\n "goldV2ForbiddenViolations": 0\n },\n "totals": {\n "beforeDiagnostics": 16280,\n "afterDiagnostics": 15545,\n "removedDiagnostics": 735,\n "beforeChangelogWithoutImplementation": 1853,\n "afterChangelogWithoutImplementation": 1306,\n "removedChangelogWithoutImplementation": 547,\n "beforeUnlinkedRecord": 5728,\n "afterUnlinkedRecord": 5540,\n "removedUnlinkedRecord": 188\n },\n "repositories": [\n {\n "repository": "semcod/code2llm",\n "beforeRunId": "20260731T072152Z-fb1ab530",\n "afterRunId": "20260731T072927Z-898d6edc",\n "graphFingerprint": "bd57f05a14c3abca5ebcbb95a6ad9b3fbb47ff40f656846c5b4857fd5ecde407",\n "beforeDiagnostics": 4224,\n "afterDiagnostics": 3826,\n "beforeChangelogWithoutImplementation": 955,\n "afterChangelogWithoutImplementation": 650,\n "beforeUnlinkedRecord": 1312,\n "afterUnlinkedRecord": 1219\n },\n {\n "repository": "semcod/domd",\n "beforeRunId": "20260731T072221Z-f577ffe7",\n "afterRunId": "20260731T072950Z-828d57a8",\n "graphFingerprint": "a9d2d5eb1287b7cb69ce7cdd3aa1a77078c6e7860e96be2a602a1c0858d6e0bd",\n "beforeDiagnostics": 2096,\n "afterDiagnostics": 2096,\n "beforeChangelogWithoutImplementation": 99,\n "afterChangelogWithoutImplementation": 99,\n "beforeUnlinkedRecord": 772,\n "afterUnlinkedRecord": 772\n },\n {\n "repository": "semcod/pactfix",\n "beforeRunId": "20260731T072226Z-0fb2f8b8",\n "afterRunId": "20260731T072955Z-557f34ae",\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "beforeDiagnostics": 664,\n "afterDiagnostics": 664,\n "beforeChangelogWithoutImplementation": 48,\n "afterChangelogWithoutImplementation": 48,\n "beforeUnlinkedRecord": 217,\n "afterUnlinkedRecord": 217\n },\n {\n "repository": "semcod/code2logic",\n "beforeRunId": "20260731T072209Z-30215e36",\n "afterRunId": "20260731T072939Z-9b5cf1f2",\n "graphFingerprint": "c6e9f7a0671dc9b4e0c0f3fad5c5dcf1319ba674ba55bbafcc22b0caa908e6af",\n "beforeDiagnostics": 4678,\n "afterDiagnostics": 4656,\n "beforeChangelogWithoutImplementation": 120,\n "afterChangelogWithoutImplementation": 109,\n "beforeUnlinkedRecord": 1503,\n "afterUnlinkedRecord": 1492\n },\n {\n "repository": "semcod/code2docs",\n "beforeRunId": "20260731T072143Z-a3208b84",\n "afterRunId": "20260731T072918Z-da0094d2",\n "graphFingerprint": "83dcfa7a5b21ca7714b9546bef4baead7ef197e936a0b61088bde2cb1c275643",\n "beforeDiagnostics": 1420,\n "afterDiagnostics": 1241,\n "beforeChangelogWithoutImplementation": 269,\n "afterChangelogWithoutImplementation": 127,\n "beforeUnlinkedRecord": 455,\n "afterUnlinkedRecord": 418\n },\n {\n "repository": "semcod/redup",\n "beforeRunId": "20260731T072230Z-6a2d832d",\n "afterRunId": "20260731T073000Z-92d5870f",\n "graphFingerprint": "b3a582ffa178ee307157461e348b51757f4e726eadd809cbfa3dc8e8b143442f",\n "beforeDiagnostics": 1945,\n "afterDiagnostics": 1818,\n "beforeChangelogWithoutImplementation": 269,\n "afterChangelogWithoutImplementation": 184,\n "beforeUnlinkedRecord": 703,\n "afterUnlinkedRecord": 661\n },\n {\n "repository": "subactor/platform",\n "beforeRunId": "20260731T072237Z-6cab0835",\n "afterRunId": "20260731T073006Z-1a2ec448",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "beforeDiagnostics": 1253,\n "afterDiagnostics": 1244,\n "beforeChangelogWithoutImplementation": 93,\n "afterChangelogWithoutImplementation": 89,\n "beforeUnlinkedRecord": 766,\n "afterUnlinkedRecord": 761\n }\n ]\n}\n", "is_subdir": true}, {"name": "minilm-results.json", "rel_path": "ticket-004/minilm-results.json", "path": "ticket-004 / minilm-results.json", "size": "3.8KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-experiment/v1",\n "model": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",\n "revision": "86741b4e3f5cb7765a600d3a3d55a0f6a6cb443d",\n "dimensions": 384,\n "pairCount": 12,\n "positiveCount": 6,\n "negativeCount": 6,\n "minimumPositive": 0.673289,\n "maximumNegative": 0.732568,\n "separation": -0.05927899999999997,\n "loadSeconds": 76.031,\n "totalSeconds": 76.38,\n "results": [\n {\n "id": "pl-queue-retry-backoff-positive",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-retry-backoff.ts",\n "expected": true,\n "score": 0.824391\n },\n {\n "id": "pl-queue-priority-hard-negative",\n "language": "pl",\n "intent": "Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem",\n "module": "declare src/queue/task-priority-sort.ts",\n "expected": false,\n "score": 0.732568\n },\n {\n "id": "de-auth-token-expiry-positive",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/auth-token-expiry-validator.ts",\n "expected": true,\n "score": 0.673289\n },\n {\n "id": "de-auth-role-hard-negative",\n "language": "de",\n "intent": "Abgelaufene Authentifizierungs-Token mΓΌssen vor dem Zugriff abgelehnt werden",\n "module": "declare src/security/user-role-permission-registry.ts",\n "expected": false,\n "score": 0.595357\n },\n {\n "id": "es-document-cache-hash-positive",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/document-content-hash-cache.ts",\n "expected": true,\n "score": 0.675315\n },\n {\n "id": "es-ast-cache-hard-negative",\n "language": "es",\n "intent": "La cachΓ© de documentos debe invalidarse cuando cambia el hash del contenido",\n "module": "declare src/cache/ast-symbol-cache.ts",\n "expected": false,\n "score": 0.687232\n },\n {\n "id": "fr-participant-identity-positive",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/participant-identity-registry.ts",\n "expected": true,\n "score": 0.674234\n },\n {\n "id": "fr-ticket-status-hard-negative",\n "language": "fr",\n "intent": "Le registre doit vΓ©rifier l'identitΓ© de chaque participant avant l'enregistrement",\n "module": "declare src/communication/ticket-status-registry.ts",\n "expected": false,\n "score": 0.640753\n },\n {\n "id": "pl-job-timeout-positive",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-timeout-cancellation.ts",\n "expected": true,\n "score": 0.744144\n },\n {\n "id": "pl-job-order-hard-negative",\n "language": "pl",\n "intent": "Harmonogram powinien przerywaΔ‡ zadania po przekroczeniu limitu czasu",\n "module": "declare src/scheduler/job-order-planner.ts",\n "expected": false,\n "score": 0.656533\n },\n {\n "id": "es-secret-redaction-positive",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/secret-redaction.ts",\n "expected": true,\n "score": 0.757345\n },\n {\n "id": "es-audit-export-hard-negative",\n "language": "es",\n "intent": "Los secretos deben eliminarse del registro de auditorΓ­a antes de guardarlo",\n "module": "declare src/audit/report-export.ts",\n "expected": false,\n "score": 0.601622\n }\n ]\n}\n", "is_subdir": true}, {"name": "platform-e5-ranking.json", "rel_path": "ticket-004/platform-e5-ranking.json", "path": "ticket-004 / platform-e5-ranking.json", "size": "75.5KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-ranking-experiment/v1",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "graphSha256": "a83609ffc91d13278b1bd9936e915d50b9dc349373e73c61d0c0a90315d9084a",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "minimumScore": 0.75,\n "minimumMargin": 0.01,\n "moduleCount": 133,\n "declarationCount": 66,\n "selectedCount": 6,\n "newCandidateCount": 2,\n "elapsedSeconds": 5.271,\n "rankings": [\n {\n "recordId": "INT-DOC-008eb31efc8f4dfca38b",\n "sourceKind": "document",\n "sourcePath": "docs/API_ORG_CORE.md",\n "modality": "required",\n "text": "KaΕΌde wywoΕ‚anie wymaga `idempotency_key`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.84097\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.83026\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.828326\n }\n ],\n "margin": 0.01071,\n "selected": true,\n "addsNewCandidate": true\n },\n {\n "recordId": "INT-DOC-019b1be685d528779c3f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "`communication.founder.reply` wiΔ…ΕΌe ΕΊrΓ³dΕ‚owy `PLF-NNN`, status i correlation z autoryzowanym wΔ…tkiem. Odbiorca musi byΔ‡ rΓ³wny `FOUNDER_EMAIL`; prΓ³ba podmiany koΕ„czy siΔ™ `founder_reply_recipient_mismatch` przed wysyΕ‚kΔ…. `In-Reply-To` i `References` pochodzΔ… wyΕ‚Δ…cznie z zachowanej korelacji, a nagΕ‚Γ³wki sΔ… czyszczone ze znakΓ³w sterujΔ…cych.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.841888\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841289\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840961\n }\n ],\n "margin": 0.000599,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-025e3568780cbedcfa6d",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Principal maszyny musi wczeΕ›niej istnieΔ‡ w rejestrze dostΔ™pu z kontraktem `aql:contract/v1`. Rejestr i kompilator AQL obsΕ‚ugujΔ… `machine`, `service` oraz `provider`; token moΕΌe byΔ‡ wydany dopiero dla aktywnego, zarejestrowanego principal. Pozwala to rotowaΔ‡ lub uniewaΕΌniaΔ‡ credential niezaleΕΌnie od authority zapisanej w ticketach.",\n "currentModuleIds": [\n "INT-AST-932d9e7b7fc499ee5051"\n ],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.833554\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.832712\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83265\n }\n ],\n "margin": 0.000842,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-13c1c72b5787468a471c",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECTS_AND_IMPORTS.md",\n "modality": "required",\n "text": "Katalog musi znajdowaΔ‡ siΔ™ wewnΔ…trz `PROJECT_IMPORT_ROOT`. Importer stosuje:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.840472\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.839076\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.838046\n }\n ],\n "margin": 0.001396,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fd58d53d2745e829d14",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "3. Link pilnej decyzji wymaga HTTPS, hosta `SUBACTOR_PUBLIC_HOST`, dokΕ‚adnej Ε›cieΕΌki `/founder/action`, portu domyΕ›lnego oraz braku query/hash przed dodaniem jednorazowego tokenu.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.861952\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.853653\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.85238\n }\n ],\n "margin": 0.008299,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fe25da1a7826ae30433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`resume` automatycznie deleguje ticket do aktora zapisanego w kontrakcie i ustawia stan `ready`. `defer` zachowuje `waiting_input`. `cancel` zamyka ticket jako `canceled`, bez tworzenia faΕ‚szywego completion receipt. KaΕΌda opcja musi mieΔ‡ dokΕ‚adnie jeden skutek; wartoΕ›ci formularza i tabela skutkΓ³w sΔ… walidowane jako zbiory rΓ³wnowaΕΌne.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-22f285d9ae741064ff39",\n "path": "scripts/normalize-active-ticket-routes.mjs",\n "score": 0.82912\n },\n {\n "recordId": "INT-AST-b8788dcd3e0b418d0ac5",\n "path": "scripts/audit-ticket-definition-of-done.mjs",\n "score": 0.828759\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.828404\n }\n ],\n "margin": 0.000361,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-21bec78de30ca0dfa826",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Wynik LLM zawsze zaczyna jako `proposed`. Model nie moΕΌe sam podnieΕ›Δ‡ go do `accepted`, `ready`, `verified` ani `done`. Awaria, timeout, brak modelu lub niepoprawny JSON nie uruchamia deterministycznego parsera NL. Powstaje jawny stan `waiting_input`/`llm_interpretation_unavailable`, bez decyzji i bez mutacji.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.843129\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.840151\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.838721\n }\n ],\n "margin": 0.002978,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-25eabc74e38b81737c1f",\n "sourceKind": "document",\n "sourcePath": "docs/TESTQL_PROJECT_GATES.md",\n "modality": "required",\n "text": "Wersja developerska przechowuje podstawowe rekordy `evidence`, `test_suites`, `test_runs`, `outcomes` i hash OQL. W produkcji naleΕΌy dodaΔ‡ podpisy, trwaΕ‚Δ… bazΔ™ i retencjΔ™.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.833963\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.826495\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.826081\n }\n ],\n "margin": 0.007468,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2994619a281ce0c038fe",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_OBSERVABILITY.md",\n "modality": "required",\n "text": "Endpoint tworzenia klucza jest konfigurowany przez `PLESK_API_KEY_CREATE_PATH`. JeΕΌeli dana wersja Pleska wymaga MFA, CAPTCHA albo jednorazowej zgody, browser agent utworzy ticket `waiting_input`; mechanizmy bezpieczeΕ„stwa nie sΔ… obchodzone.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.860015\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.859964\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.856131\n }\n ],\n "margin": 5.1e-05,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2ca381a36c715ea44bac",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "System nie moΕΌe wywnioskowaΔ‡ tych danych z nazwy `Subactor` ani domeny Foundera. SΔ… to decyzje biznesowe/prawne. Adres i marka `prototypowanie.pl` mogΔ… byΔ‡ uΕΌyte jako kontekst, ale nie zastΔ™pujΔ… prawnej nazwy strony umowy.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.829453\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.827468\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.826652\n }\n ],\n "margin": 0.001985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2dbfe16e760f4d35c9e0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder jest korzeniem odpowiedzialnoΕ›ci. Kontrakt bez pola `principal` naleΕΌy do `human:founder`, a praca bez pokrycia trafia do kolejki foundera i jest notyfikowana na `founder@localhost`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.851962\n },\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.851016\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.848556\n }\n ],\n "margin": 0.000946,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-326545ec5f8d681ae88a",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Ticket publikacji z blockerem `mutation_gate_disabled` albo `founder_publish_approval_required` nie moΕΌe przerzucaΔ‡ na Foundera technicznego polecenia β€žwykonaj dry-run i oceΕ„ plan_hash”. Przed utworzeniem e-maila Control wybiera wyΕ‚Δ…cznie zadeklarowany proces URI o identyfikatorze `dry-run`, `human_approval=false` i `payload.apply=false`, wykonuje go jako `project-operator-bot` i zapisuje ograniczony receipt:",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.848469\n },\n {\n "recordId": "INT-AST-6df68049deb2ff430a49",\n "path": "scripts/create-inbound-email-secret-link.mjs",\n "score": 0.846583\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.843954\n }\n ],\n "margin": 0.001886,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-35c3fec8a2fa4ed7790b",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "| Docker BuildKit nie moΕΌe kopiowaΔ‡ plikΓ³w przez symlink wychodzΔ…cy poza kontekst buildu | obrazy po spΕ‚aszczeniu nie budowaΕ‚yby siΔ™ mimo poprawnych Ε›cieΕΌek na hoΕ›cie | Compose uΕΌywa kanonicznych repozytoriΓ³w jako kontekstΓ³w oraz jawnych `additional_contexts`; Dockerfile assembly naleΕΌΔ… do `platform/docker` |",\n "currentModuleIds": [\n "INT-AST-07bc79de0391fa296e7a",\n "INT-AST-1c6bb4bfd86ba09512b5",\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-29de31f162b50811f891",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-bf0bfd7598586ad009c9",\n "INT-AST-c9ad46e56a172df67338",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-f2588e9e2e79005e6e0e",\n "INT-AST-f40c7cca2b0be0281cb8",\n "INT-AST-f7460573b485ef9218bf",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.85972\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.845449\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.844077\n }\n ],\n "margin": 0.014271,\n "selected": true,\n "addsNewCandidate": true\n },\n {\n "recordId": "INT-DOC-36a129beb520f95c6b3a",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontroler nie przechowuje sekretΓ³w, nie zmienia DNS/TLS i nie wΕ‚Δ…cza mutation gates. Produkcyjny apply nadal wymaga podpisanego grantu zwiΔ…zanego z dry-run `plan_hash` i jawnej operacji Foundera.",\n "currentModuleIds": [\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-ad4c73e93b22f06e0fc4"\n ],\n "top": [\n {\n "recordId": "INT-AST-ad4c73e93b22f06e0fc4",\n "path": "packages/founder-cli/src/apply-grant.mjs",\n "score": 0.856689\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.842309\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.8423\n }\n ],\n "margin": 0.01438,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3a0e329ea4f412cd49f1",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "3. UtwΓ³rz indywidualne konto Basic Auth. Plik haseΕ‚ musi znajdowaΔ‡ siΔ™ poza `httpdocs`:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.842441\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.841794\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.837173\n }\n ],\n "margin": 0.000647,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3b67ff4d3d16f1c25ea7",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "recommended",\n "text": "`hr-bridge` nadal ma lokalne implementacje `plesk.*`, `email.send`, `slack.send`, `teams.send`, `calendar.ics.create` i `task.create`. Migracja powinna przebiegaΔ‡ nastΔ™pujΔ…co:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.847169\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.846942\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.845283\n }\n ],\n "margin": 0.000227,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-48df7879b921b8bcf5e4",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_TEST_PLAN.md",\n "modality": "required",\n "text": "rzeczywisty apply wymaga osobnego ticketu URI Process i grantu zwiΔ…zanego z `plan_hash`.",\n "currentModuleIds": [\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.854757\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.853594\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.853075\n }\n ],\n "margin": 0.001163,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4c3be8c6dc220976cc53",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`domain` musi byΔ‡ peΕ‚nΔ… publicznΔ… nazwΔ… DNS, nie `localhost` ani adresem IP;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.839013\n },\n {\n "recordId": "INT-AST-c51776bea8cc5bf2583c",\n "path": "test/deploy-public-pages.test.mjs",\n "score": 0.836738\n },\n {\n "recordId": "INT-AST-bdaf4f7c21b3a3912ef3",\n "path": "scripts/find-free-network.mjs",\n "score": 0.834026\n }\n ],\n "margin": 0.002275,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4f9db52d56bd0026823b",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "required",\n "text": "`urirun-connector-subactor` udostΔ™pnia obecnie wiele schematΓ³w przez ogΓ³lny `process/command/dispatch`. Najpierw naleΕΌy rozdzieliΔ‡ go wewnΔ™trznie na pakiety `organization`, `contractor/recruitment`, `site-generator` i `testql`. Osobne publiczne repozytorium ma sens dopiero wtedy, gdy moduΕ‚ ma wΕ‚asny kontrakt URI, schematy wejΕ›cia/wyjΕ›cia, testy, wersjonowanie i moΕΌe byΔ‡ wdraΕΌany niezaleΕΌnie.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-792da796f1b4b26b12da",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.849456\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.846713\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.840765\n }\n ],\n "margin": 0.002743,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5149d3861e55a958b08e",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`run_preflight` β€” musi wskazywaΔ‡ konkretny `process_id`; wykonawca nadal weryfikuje, ΕΌe jest to niezmieniajΔ…cy produkcji proces `dry-run`,",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.855529\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.852303\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.846205\n }\n ],\n "margin": 0.003226,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5224f52434cd4e13e790",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_EMAIL_ONE_CLICK_ACTIONS.md",\n "modality": "required",\n "text": "Powiadomienie `email_action_required` nie wymaga juΕΌ rΔ™cznego kopiowania numeru ticketu. KaΕΌdy e-mail zawiera:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.851227\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.847184\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.842789\n }\n ],\n "margin": 0.004043,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-598734e7c12787b3e6ad",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "`FOUNDER_ACCESS_SCOPES` musi zawieraΔ‡ `vault:reveal`",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.860331\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.845534\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.84493\n }\n ],\n "margin": 0.014797,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5bfd8fc288d0e3e3e3d9",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "Rejestr wybiera najnowszΔ… zgodnΔ… wersjΔ™ `process.vN`; nie naleΕΌy kodowaΔ‡ wersji w kontrolerze domenowym. KaΕΌda Ε›cieΕΌka najpierw tworzy dedykowany ticket Planfile z AQL/EQL/OQL/URI. Dopiero pΓ³ΕΊniej wykonuje `email.send`.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-12cf897f5148c62cb27c",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-b8788dcd3e0b418d0ac5"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.861178\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.850183\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.850166\n }\n ],\n "margin": 0.010995,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-6f640680ab497d1d553f",\n "sourceKind": "document",\n "sourcePath": "docs/INTEGRATION_ADAPTERS.md",\n "modality": "required",\n "text": "Nie trzeba zmieniaΔ‡ istniejΔ…cych modeli AQL, jeΕ›li korzystajΔ… z ogΓ³lnego `notification.send`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.826191\n },\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.824924\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.823401\n }\n ],\n "margin": 0.001267,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-718b7f44fe9f4539da66",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Interpretacji NL, wyboru intencji, klasyfikacji decyzji ani uzupeΕ‚niania brakujΔ…cych pΓ³l nie wolno realizowaΔ‡ regexami, tablicΔ… sΕ‚Γ³w kluczowych, punktacjΔ… lub innΔ… heurystykΔ…. JeΕΌeli LLM nie zwrΓ³ci poprawnego structured output, system zatrzymuje operacjΔ™ jako `llm_interpretation_unavailable`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.83227\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.830631\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.828476\n }\n ],\n "margin": 0.001639,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73621239e97df9af3e7a",\n "sourceKind": "document",\n "sourcePath": "docs/CONNECTOR_LAN_ARCHITECTURE.md",\n "modality": "required",\n "text": "DomyΕ›lny executor ma tylko dedykowany wolumen `/workspace`; nie montuje `/`, `/var/run/docker.sock` ani trybu `privileged`. Konektory wymagajΔ…ce sprzΔ™tu naleΕΌy wΕ‚Δ…czaΔ‡ osobno:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.844471\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.843603\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.843361\n }\n ],\n "margin": 0.000868,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73a881368c3a9fe2b0f4",\n "sourceKind": "document",\n "sourcePath": "docs/SESSION_RECOVERY_AND_MODULARIZATION_2026-07-21.md",\n "modality": "required",\n "text": "2. `platform/components/*` sΔ… osobnymi checkoutami tych samych repozytoriΓ³w, lecz katalog nadrzΔ™dny je ignoruje. ZwykΕ‚y `git status` w `platform` ukrywa ich zmiany. Publikacja musi traktowaΔ‡ checkout uruchomieniowy jako kanoniczny, rebase'owaΔ‡ go na `origin/main`, a dopiero potem synchronizowaΔ‡ dodatkowe klony.",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-429740c646b555806b8b",\n "INT-AST-8ed40f8ed8b18102cb3d",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-f7460573b485ef9218bf"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.859558\n },\n {\n "recordId": "INT-AST-28ecc726b3af01b6d912",\n "path": "scripts/link-flat-workspace.mjs",\n "score": 0.851344\n },\n {\n "recordId": "INT-AST-f7460573b485ef9218bf",\n "path": "scripts/check-component-drift.mjs",\n "score": 0.848807\n }\n ],\n "margin": 0.008214,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-767dd0d952dd7f6c09c1",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "certyfikat `founder.subactor.com` musi odpowiadaΔ‡ domenie, zanim moΕΌna uΕΌyΔ‡ go jako bezpiecznego wejΕ›cia. Odczyt z 2026-07-21 pokazuje CNAME `founder.subactor.com -> subactor.github.io` oraz certyfikat GitHub `*.github.io`, ktΓ³ry nie obejmuje nazwy Foundera. Dlatego sama zmiana certyfikatu nr 311 w Plesk nie naprawi obecnego ruchu: najpierw trzeba wybraΔ‡ docelowy hosting. Dla Pleska naleΕΌy zmieniΔ‡ DNS na jego serwer, utworzyΔ‡ host/subdomenΔ™ i wydaΔ‡ lub przypisaΔ‡ certyfikat obejmujΔ…cy `founder.subactor.com`. Dla GitHub Pages naleΕΌy skonfigurowaΔ‡ tΔ™ nazwΔ™ jako custom domain i poczekaΔ‡ na wΕ‚aΕ›ciwy certyfikat. Dopiero potem wykonuje siΔ™ niezaleΕΌnΔ… weryfikacjΔ™ strict TLS.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.846098\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.838802\n },\n {\n "recordId": "INT-AST-34dd3d4f9ce437b8da87",\n "path": "packages/capability-preflight/src/preflight.mjs",\n "score": 0.838685\n }\n ],\n "margin": 0.007296,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7da4ea8c34d708aa977d",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "recommended",\n "text": "RΔ™czny cykl kontrolera wykonaΕ‚ dwa gotowe tickety, ale etap `queue_execution` trwaΕ‚ okoΕ‚o 70 s. NiezaleΕΌne kroki jednego ticketu sΔ… nadal wykonywane sekwencyjnie. Bezpieczna rΓ³wnolegΕ‚oΕ›Δ‡ powinna byΔ‡ wyliczana z DAG `depends_on` i ograniczana budΕΌetem connectora.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.83197\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.827962\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.826695\n }\n ],\n "margin": 0.004008,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7e6497c757ff8d20f249",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Dla pytaΕ„ typu `ticket.decision` e-mail umieszcza po kaΕΌdej odpowiedzi osobny link `#token=…&answer=…`. Fragment nie jest wysyΕ‚any w ΕΌΔ…daniu HTTP ani zapisywany w logach serwera. Link wybiera wyΕ‚Δ…cznie wartoΕ›Δ‡ istniejΔ…cΔ… w zamkniΔ™tym katalogu formularza i zmienia etykietΔ™ przycisku na β€žPotwierdΕΊ tΔ™ decyzję”. Wymagane pozostaje Ε›wiadome potwierdzenie na stronie: zwykΕ‚y skaner linkΓ³w pocztowych nie moΕΌe zuΕΌyΔ‡ tokenu ani zmieniΔ‡ lifecycle ticketu przez GET.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.848592\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.846701\n },\n {\n "recordId": "INT-AST-0e3f72c26d8f6ea35f80",\n "path": "scripts/backfill-ticket-definition-of-done.mjs",\n "score": 0.845006\n }\n ],\n "margin": 0.001891,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-814fd7b2a90e4fd7f349",\n "sourceKind": "document",\n "sourcePath": "docs/SUBACTOR_MULTI_REPO_MIGRATION.md",\n "modality": "required",\n "text": "After component repositories are published, `platform` records them as external source checkouts. Verification must include:",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.87058\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.86265\n },\n {\n "recordId": "INT-AST-f54cfcb46e60ea2daf22",\n "path": "test/platform.test.js",\n "score": 0.861889\n }\n ],\n "margin": 0.00793,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-81f213d607d4a9e6d773",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder moΕΌe delegowaΔ‡ bez kontraktu nadrzΔ™dnego. Inna osoba moΕΌe tworzyΔ‡ dalsze delegacje tylko wtedy, gdy poda `parent_contract_id`, jest podmiotem aktywnego kontraktu nadrzΔ™dnego, a ten kontrakt dopuszcza operacjΔ™ `autonomy.contract.delegate`. Bot nie moΕΌe sam rozszerzaΔ‡ swoich uprawnieΕ„.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.82498\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.820146\n },\n {\n "recordId": "INT-AST-9c6e38ddf867cc10a0c0",\n "path": "packages/founder-cli/tests/founder.test.mjs",\n "score": 0.818133\n }\n ],\n "margin": 0.004834,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-874b23309a57fba88bb0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_BROWSER_VAULT.md",\n "modality": "required",\n "text": "API wymaga `Authorization: Bearer ...`. DomyΕ›lnie tokenem wewnΔ™trznym jest `BRIDGE_INTROSPECTION_SECRET`; moΕΌna ustawiΔ‡ osobny `BROWSER_AGENT_SERVICE_TOKEN`. Klucz szyfrowania domyΕ›lnie korzysta z `INTEGRATION_SECRET_KEY`; produkcyjnie zalecany jest osobny `BROWSER_AGENT_VAULT_KEY` przechowywany poza repozytorium.",\n "currentModuleIds": [\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.837148\n },\n {\n "recordId": "INT-AST-0a117640892c43195f42",\n "path": "scripts/init-secrets.mjs",\n "score": 0.835999\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.835911\n }\n ],\n "margin": 0.001149,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88df94ec3f62b969e433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "To nie jest przeglΔ…darka caΕ‚ego sejfu. Ticket musi z gΓ³ry wskazywaΔ‡ wpis, origin i pole (`password`, `username` albo `api_key`). Ani sekret, ani token linku nie sΔ… zapisywane w tickecie, audycie Control lub wyniku CLI.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.856613\n },\n {\n "recordId": "INT-AST-9e7b169cb0dcf86f226a",\n "path": "scripts/create-cloudflare-secret-link.mjs",\n "score": 0.855406\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.850217\n }\n ],\n "margin": 0.001207,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88ebbac4e76e7fa6acc6",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`id` musi byΔ‡ unikalnym identyfikatorem kebab-case;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.835302\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.834452\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.833188\n }\n ],\n "margin": 0.00085,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b209aa7dc2e722b4dd7",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_DAILY_DIGEST.md",\n "modality": "recommended",\n "text": "Awaria nie uruchamia lokalnego fallbacku SMTP. Ponowienie nastΔ™puje po `FOUNDER_DAILY_DIGEST_RETRY_MS` i uΕΌywa tego samego ticketa oraz klucza idempotencji, wiΔ™c nie powinno wysΕ‚aΔ‡ drugiej wiadomoΕ›ci po czΔ™Ε›ciowej awarii.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.834571\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.829515\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829102\n }\n ],\n "margin": 0.005056,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b7042e2696ff6f23051",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Token wymaga `plans:approve`. Control nie przyjmuje principal w body β€” odczytuje go z uwierzytelnionej toΕΌsamoΕ›ci, a nastΔ™pnie sprawdza osobne przypisanie authority w tickecie. DziΔ™ki temu scope tokenu nie staje siΔ™ globalnym prawem zatwierdzania. Dozwolone decyzje to `approve`, `defer` i `reject`; kaΕΌda jest zapisywana w audycie wraz z principal i metodΔ… uwierzytelnienia.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.834053\n },\n {\n "recordId": "INT-AST-d79aa26ea931af33f0d6",\n "path": "scripts/configure-remediation-planner.mjs",\n "score": 0.832855\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829247\n }\n ],\n "margin": 0.001198,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8d7022906b9a1e65b9ec",\n "sourceKind": "document",\n "sourcePath": "docs/DEVELOPMENT_OPENROUTER.md",\n "modality": "required",\n "text": "Gateway jest domyΕ›lnie publikowany tylko na `127.0.0.1` i wymaga lokalnego `LLM_GATEWAY_SERVICE_TOKEN`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.840702\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.839761\n },\n {\n "recordId": "INT-AST-ebdfa3628e9c4e8432e6",\n "path": "scripts/llm-status.mjs",\n "score": 0.839585\n }\n ],\n "margin": 0.000941,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-958ddb1db2512381cc5f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "recommended",\n "text": "Founder nie powinien znaΔ‡ stanΓ³w kolejki, wybieraΔ‡ `reassign` ani wpisywaΔ‡ komend lifecycle. Planfile pozostaje wewnΔ™trznym ΕΊrΓ³dΕ‚em stanu i dowodΓ³w, a interakcjΔ™ czΕ‚owieka obsΕ‚uguje deklaratywny kontrakt `subactor.interactive-form.v1` lub jego zgodne rozszerzenie `subactor.interactive-form.v2`. Control interpretuje skutek odpowiedzi, a bezstanowe repozytorium `views/` renderuje wyΕ‚Δ…cznie projekcjΔ™ HTML.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.852536\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.849854\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.848442\n }\n ],\n "margin": 0.002682,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-9c3fc3cb3825c7092c7f",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_LIVE.md",\n "modality": "required",\n "text": "Mock Plesk implementuje endpoint publikacji bez dodatkowych zmian. W trybie live Ε›cieΕΌka `PLESK_SITE_PUBLISH_PATH` musi wskazywaΔ‡ endpoint udostΔ™pniony przez konkretnΔ… instalacjΔ™ Plesk, rozszerzenie panelu albo kontrolowany adapter CLI. Nie naleΕΌy zakΕ‚adaΔ‡, ΕΌe niestandardowa Ε›cieΕΌka `/api/v2/sites/publish` istnieje w kaΕΌdej instalacji.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-f2c14a1e840818e82b47"\n ],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.846759\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.844142\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.839924\n }\n ],\n "margin": 0.002617,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-acc70bcd3285163c8a83",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "Nazwa uΕΌytkownika musi byΔ‡ identyczna z `worker.http_basic_user` w JSON. Runtime odrzuca rΓ³wnieΕΌ poprawnie uwierzytelnione konto przypisane do innego pracownika.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841455\n },\n {\n "recordId": "INT-AST-cbabaecd2615f3b68a2c",\n "path": "test/recruitment-workflow.test.mjs",\n "score": 0.837079\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.836195\n }\n ],\n "margin": 0.004376,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-b966966b4a3a222cdab4",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Control ponownie waliduje wynik, sprawdza scope, wykonuje wskazane odczyty i przekazuje do drugiej fazy LLM wyΕ‚Δ…cznie krΓ³tkie, zatwierdzone fakty. OdpowiedΕΊ ma kontrakt `subactor.founder-grounded-answer/v1` i musi wskazaΔ‡ `fact_refs`. Model nie otrzymuje authority, dowolnego filtra, URI ani surowych obiektΓ³w.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-33ed799f815097a2ebcb",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-27cef449f964a294ffcd",\n "path": "scripts/lib/json-schema-subset.mjs",\n "score": 0.83752\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.837417\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837069\n }\n ],\n "margin": 0.000103,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ba509d6ee6ec15b626b8",\n "sourceKind": "document",\n "sourcePath": "docs/ORGANIZATION_OS_ARCHITECTURE.md",\n "modality": "required",\n "text": "Claim jest ponownie walidowany przed zmianΔ… stanu. ZakoΕ„czenie wymaga receiptΓ³w krokΓ³w i completion receipt z `verified_by`; sam HTTP 2xx nie wystarcza.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.863786\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.863029\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.85533\n }\n ],\n "margin": 0.000757,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c0464135791a8ed38c66",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "ŚcieΕΌka hosta jest montowana do kontenera tylko do odczytu. Zmiana `SUBACTOR_PROJECTS_PATH` wymaga zgodnoΕ›ci wartoΕ›ci w `.env` z bind-mountem Compose.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2e5029d3b3ab1ba50c91",\n "INT-AST-48dfdd4791e461e90b73",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-76fb17f792a499e351d3",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-b7fda5399edec3c1acb1",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-ebdfa3628e9c4e8432e6"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.872004\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.867679\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.862333\n }\n ],\n "margin": 0.004325,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c515505dcb1f9e834ef1",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "**Dopasowanie reguΕ‚ to AND, nie OR.** `ruleMatchesTicket` wymaga speΕ‚nienia **wszystkich** wypeΕ‚nionych kryteriΓ³w. Dodanie `uri_prefixes_any` do reguΕ‚y, ktΓ³ra ma juΕΌ `labels_any`, **zawΔ™ΕΌa** jΔ… β€” ticket musi mieΔ‡ etykietΔ™ *oraz* URI. ReguΕ‚y URI muszΔ… byΔ‡ osobnymi wpisami z pustymi pozostaΕ‚ymi kryteriami.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.856836\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.854146\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.853856\n }\n ],\n "margin": 0.00269,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c72a940082e5281fdd16",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_EMAIL.md",\n "modality": "required",\n "text": "`REAL_SYSTEM_EMAIL` okreΕ›la prawdziwΔ… skrzynkΔ™ systemu, a `DEMO_SYSTEM_EMAIL` nadawcΔ™ uΕΌywanego wyΕ‚Δ…cznie przez Mailpit i testy. `SYSTEM_EMAIL` wskazuje aktywnΔ… toΕΌsamoΕ›Δ‡ foundera, administratora i supervisora. `EMAIL_IDENTITY_MODE=real` wymaga zgodnoΕ›ci `SYSTEM_EMAIL` z `REAL_SYSTEM_EMAIL`; tryb `demo` przeΕ‚Δ…cza jΔ… na `DEMO_SYSTEM_EMAIL`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.843144\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840485\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.838475\n }\n ],\n "margin": 0.002659,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ce10b816225eeeea1aef",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "JeΕΌeli node wymaga auth, `lenovo.token_file` ma wskazywaΔ‡ lokalny plik zawierajΔ…cy token; token nie jest wersjonowany ani zapisywany w artefakcie. Automat wykonuje readiness i otwiera formularz tylko na istniejΔ…cej, uwierzytelnionej powierzchni browser/CDP. Founder weryfikuje pola i publikuje.",\n "currentModuleIds": [\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dd4ad46cd453fe2ef337",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.843646\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.842754\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.842372\n }\n ],\n "margin": 0.000892,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-cf53c018b86f82f3967f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "`principal` wskazuje osobΔ™ albo bota, np. `{\\"kind\\":\\"bot\\",\\"id\\":\\"it-provisioner-bot\\"}`. Ticket utworzony w ramach takiego kontraktu otrzymuje tego samego wykonawcΔ™ i kolejkΔ™. Sam routing nie udaje wykonania: bot musi mieΔ‡ rzeczywisty adapter lub proces URIrun, ktΓ³ry odbierze ticket i zapisze dowΓ³d rezultatu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.85194\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.847934\n }\n ],\n "margin": 0.000246,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d0f2d64cdf114aecb081",\n "sourceKind": "document",\n "sourcePath": "docs/RELCom_INTEGRATION.md",\n "modality": "required",\n "text": "Nie kopiuj tokenΓ³w, danych testowych ani mock Pleska. Produkcyjny `plan-registry` powinien pozostaΔ‡ ΕΊrΓ³dΕ‚em prawdy i wymagaΔ‡ `SUBACTOR_ADMIN_TOKEN`.",\n "currentModuleIds": [\n "INT-AST-7fa98cd51c5167b57fa2"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.852756\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.85208\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.848715\n }\n ],\n "margin": 0.000676,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d8cc038eab8108dffbd7",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontrola dokumentΓ³w prawnych jest jakoΕ›ciowa, nie tylko nazwowa. Akceptowane sΔ… pliki `.md`, `.html`, `.htm`, `.txt` i `.pdf`. KaΕΌdy wymagany dokument musi mieΔ‡ co najmniej 200 bajtΓ³w/znakΓ³w, a pliki tekstowe zawierajΔ…ce `TODO`, `do uzupeΕ‚nienia` albo `placeholder` sΔ… traktowane jako niekompletne. Wymagane kategorie to: polityka prywatnoΕ›ci, cookies, dane administratora, zasady formularza kontaktowego i informacja o statusie pilotaΕΌu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.827941\n },\n {\n "recordId": "INT-AST-167bbd84e4e4afe736e9",\n "path": "test/capability-preflight.test.mjs",\n "score": 0.823662\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.822936\n }\n ],\n "margin": 0.004279,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d9088f27e0bd7ac5d51b",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "Jaki publiczny adres IP lub nazwa hosta ingressu ma obsΕ‚ugiwaΔ‡ `founder.subactor.com`? Bez tej informacji nie naleΕΌy zmieniaΔ‡ rekordu DNS ani deklarowaΔ‡, ΕΌe publiczny link dziaΕ‚a. Po uzyskaniu odpowiedzi trzeba rΓ³wnieΕΌ potwierdziΔ‡, czy kolejka Planfile ma byΔ‡ publikowana na tej samej domenie, czy pod osobnym, uwierzytelnionym adresem.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.844263\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837775\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.832502\n }\n ],\n "margin": 0.006488,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-dce58b4c336ad1c53826",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "required",\n "text": "W rejestrze lifecycle `digital_twin_profile` ma status `partial` i `autonomy.enabled=false`. Portret moΕΌe byΔ‡ uΕΌywany do decyzji routingowej, ale nie moΕΌe autonomicznie migrowaΔ‡ siebie ani modyfikowaΔ‡ praw, dopΓ³ki luki taksonomii specjalizacji i jakoΕ›ci wynikΓ³w nie zostanΔ… domkniΔ™te.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.8306\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.825245\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.821944\n }\n ],\n "margin": 0.005355,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e5d909b9cb997225241b",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`schema` musi mieΔ‡ wartoΕ›Δ‡ `subactor.projects/v1`;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.865702\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.861173\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.856483\n }\n ],\n "margin": 0.004529,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e907e7c7a7d55704ca51",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_QUEUE_CONTROLLER.md",\n "modality": "required",\n "text": "KaΕΌdy cykl ponownie bada ticket, jeΕΌeli ma Process Envelope v2, naleΕΌy do wΕ‚Δ…czonego bota i trafiΕ‚ do `waiting_input` z bΕ‚Δ™dem `readiness_preflight:*`. Kontroler nie promuje ticketΓ³w ludzkich, legacy, z aktywnym `blocked-by:*` ani z zadeklarowanym blockerem. Kandydat przechodzi ponownie przez aktualne rejestry aktorΓ³w i exact URI. Dopiero zielony wynik zmienia stan na `ready`.",\n "currentModuleIds": [\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.834894\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.834087\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.832743\n }\n ],\n "margin": 0.000807,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ef47ae9fb56681714214",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "OdpowiedΕΊ e-mail moΕΌe zawieraΔ‡ wyΕ‚Δ…cznie `TAK`, `NIE`, `ODROCZ` lub `PΓ“ΕΉNIEJ`, jeΕΌeli temat zachowuje znacznik `[URGENT:PLF-N]` wygenerowany przez system. Nadal akceptowane sΔ… jawne formy `APPROVE PLF-N`, `REJECT PLF-N` i `DEFER PLF-N`. Nadawca przechodzi istniejΔ…cΔ… autoryzacjΔ™ kontaktu i kontraktu AQL. Klasa principal nie nadaje globalnego wyjΔ…tku: rΓ³wnieΕΌ `human:founder` musi byΔ‡ zwiΔ…zany z ticketem przez `assigned_to`, etykietΔ™ `authority:`, `approver:`, `principal:` albo jawnΔ… capability decyzyjnΔ… AQL.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-2f146f1cc195dd96c6f4",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dc1dcce0faf40419b64e",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.836239\n },\n {\n "recordId": "INT-AST-2ad0a72220a446c0fe88",\n "path": "packages/founder-cli/src/ask.mjs",\n "score": 0.836008\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.834528\n }\n ],\n "margin": 0.000231,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-efe140f5619e37a96d82",\n "sourceKind": "document",\n "sourcePath": "docs/SECRET_INTAKE_PROCESS_PACKS.md",\n "modality": "required",\n "text": "KaΕΌdy ticket zawiera komplet AQL/EQL/OQL/URI. LLM moΕΌe wybraΔ‡ proces i wypeΕ‚niΔ‡ ograniczony slot `provider`, ale nie moΕΌe wybraΔ‡ transportu, wpisu sejfu ani wygenerowaΔ‡ URI.",\n "currentModuleIds": [\n "INT-AST-5d19be2a9b2f6eb9c00c"\n ],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.840829\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.839737\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.839105\n }\n ],\n "margin": 0.001092,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-f48ad72c3cd1e900e80f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_CONTROLLER_CONTINUATION_PLAN.md",\n "modality": "required",\n "text": "Kontroler nie moΕΌe promowaΔ‡, wykonywaΔ‡ ani zamykaΔ‡ ticketu bez wspieranej wersji kontraktu, kompletnego envelope v2, aktywnego aktora, live exact URI, uprawnieΕ„ AQL, oczekiwaΕ„ EQL i braku aktualnego blockera. Brak bezpiecznej Ε›cieΕΌki pozostaje widocznym `waiting_input`; przypomnienie nie nadaje authority i nie odnawia tokenu czΔ™Ε›ciej niΕΌ pozwala lifecycle artefaktu.",\n "currentModuleIds": [\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.833423\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.830379\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.830257\n }\n ],\n "margin": 0.003044,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fb082dd22afc2a7434e5",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "PowΓ³d jest strukturalny, nie awaryjny: kolejka autonomiczna wykonuje wyΕ‚Δ…cznie tickety w stanie wykonywalnym, a praktycznie caΕ‚y backlog stoi na `waiting_input`. Licznik `executable` opisuje tΔ™ kolejkΔ™, a nie Ε›cieΕΌkΔ™ delegowania β€” dlatego oba wskaΕΊniki mogΔ… siΔ™ rozjeΕΌdΕΌaΔ‡ i **nie naleΕΌy czytaΔ‡ `executable: 0` jako awarii kontrolera**.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.857835\n },\n {\n "recordId": "INT-AST-c74d93ff12a626f5e8df",\n "path": "test/ticket-auditor-audit-window.test.mjs",\n "score": 0.849431\n },\n {\n "recordId": "INT-AST-419698c412dc2105ea07",\n "path": "test/ticket-auditor-selection.test.mjs",\n "score": 0.845601\n }\n ],\n "margin": 0.008404,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fdb89ea01f0b0eaa5628",\n "sourceKind": "document",\n "sourcePath": "docs/ENV_CONFIGURATION.md",\n "modality": "required",\n "text": "4. Kod serwisΓ³w nie moΕΌe uΕΌywaΔ‡ bezpoΕ›rednio `process.env.VAR`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.854812\n },\n {\n "recordId": "INT-AST-0ccec610937016ed5ee4",\n "path": "scripts/migrate-env.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.851052\n }\n ],\n "margin": 0.003118,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fea4537ba7aa1ca8a381",\n "sourceKind": "document",\n "sourcePath": "docs/INBOUND_EMAIL_AUTHORIZATION.md",\n "modality": "required",\n "text": "The default authentication policy is `strict`. `contract-only` exists solely for isolated local tests and must not be used for a real mailbox.",\n "currentModuleIds": [\n "INT-AST-167bbd84e4e4afe736e9",\n "INT-AST-576fc1c342f93d1fcef2",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-bcd8179169d840bc205e"\n ],\n "top": [\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83973\n },\n {\n "recordId": "INT-AST-42da0c70f37348edd281",\n "path": "test/active-ticket-route-normalization.test.mjs",\n "score": 0.837595\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.836975\n }\n ],\n "margin": 0.002135,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-180a8388572a6ea7a824",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Resolve Plesk `subscription_domain_limit_unknown`, DNS and TLS before production apply.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.869481\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.859953\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.859809\n }\n ],\n "margin": 0.009528,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-5c003c3825645e675e46",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision `urirun-connector-twilio-voice`: vault credentials, caller number, destination/consent policy and signed status callback.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a00b21088f556fc59477",\n "path": "scripts/validate-urirun-connectors-audit.mjs",\n "score": 0.878721\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.873161\n },\n {\n "recordId": "INT-AST-170732522e9a08fc4777",\n "path": "scripts/configure-system-email-vault.mjs",\n "score": 0.858164\n }\n ],\n "margin": 0.00556,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-9b79f780a672f6add271",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Deploy one authenticated portal for `contracts.subactor.com` and `chat.subactor.com`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-9868e7332a3017885a0f",\n "path": "config/connector-capabilities/preflight.mjs",\n "score": 0.866502\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.864586\n },\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.86286\n }\n ],\n "margin": 0.001916,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-b7058854b8ae3d810e17",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Rotate the scoped autonomy-chat control token before 2026-08-18.",\n "currentModuleIds": [\n "INT-AST-edc170e805da7985926b"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.866802\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.84412\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.843419\n }\n ],\n "margin": 0.022682,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-d00584ed9e9dbbb233b5",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Remove duplicate urirun connector discovery and repair optional connector dependencies.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.871638\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.86949\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.867432\n }\n ],\n "margin": 0.002148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-db792516a8944c2e7692",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision live SMTP/IMAP vault entries and verify founder e-mail round trip.",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.86519\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.864205\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.861663\n }\n ],\n "margin": 0.000985,\n "selected": false,\n "addsNewCandidate": false\n }\n ]\n}\n", "is_subdir": true}, {"name": "platform-e5-reciprocal-ranking.json", "rel_path": "ticket-004/platform-e5-reciprocal-ranking.json", "path": "ticket-004 / platform-e5-reciprocal-ranking.json", "size": "79.7KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.embedding-ranking-experiment/v1",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "graphSha256": "a83609ffc91d13278b1bd9936e915d50b9dc349373e73c61d0c0a90315d9084a",\n "model": "intfloat/multilingual-e5-small",\n "revision": "f470c6a1a906014160ece1968c484b275f0396de",\n "queryPrefix": "query: ",\n "passagePrefix": "passage: ",\n "minimumScore": 0.75,\n "minimumMargin": 0.01,\n "moduleCount": 133,\n "declarationCount": 66,\n "selectedCount": 1,\n "newCandidateCount": 0,\n "elapsedSeconds": 4.453,\n "rankings": [\n {\n "recordId": "INT-DOC-008eb31efc8f4dfca38b",\n "sourceKind": "document",\n "sourcePath": "docs/API_ORG_CORE.md",\n "modality": "required",\n "text": "KaΕΌde wywoΕ‚anie wymaga `idempotency_key`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.84097\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.83026\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.828326\n }\n ],\n "margin": 0.01071,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-019b1be685d528779c3f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "`communication.founder.reply` wiΔ…ΕΌe ΕΊrΓ³dΕ‚owy `PLF-NNN`, status i correlation z autoryzowanym wΔ…tkiem. Odbiorca musi byΔ‡ rΓ³wny `FOUNDER_EMAIL`; prΓ³ba podmiany koΕ„czy siΔ™ `founder_reply_recipient_mismatch` przed wysyΕ‚kΔ…. `In-Reply-To` i `References` pochodzΔ… wyΕ‚Δ…cznie z zachowanej korelacji, a nagΕ‚Γ³wki sΔ… czyszczone ze znakΓ³w sterujΔ…cych.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.841888\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841289\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840961\n }\n ],\n "margin": 0.000599,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002108,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-025e3568780cbedcfa6d",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Principal maszyny musi wczeΕ›niej istnieΔ‡ w rejestrze dostΔ™pu z kontraktem `aql:contract/v1`. Rejestr i kompilator AQL obsΕ‚ugujΔ… `machine`, `service` oraz `provider`; token moΕΌe byΔ‡ wydany dopiero dla aktywnego, zarejestrowanego principal. Pozwala to rotowaΔ‡ lub uniewaΕΌniaΔ‡ credential niezaleΕΌnie od authority zapisanej w ticketach.",\n "currentModuleIds": [\n "INT-AST-932d9e7b7fc499ee5051"\n ],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.833554\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.832712\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83265\n }\n ],\n "margin": 0.000842,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003979,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-13c1c72b5787468a471c",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECTS_AND_IMPORTS.md",\n "modality": "required",\n "text": "Katalog musi znajdowaΔ‡ siΔ™ wewnΔ…trz `PROJECT_IMPORT_ROOT`. Importer stosuje:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.840472\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.839076\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.838046\n }\n ],\n "margin": 0.001396,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003483,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fd58d53d2745e829d14",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "3. Link pilnej decyzji wymaga HTTPS, hosta `SUBACTOR_PUBLIC_HOST`, dokΕ‚adnej Ε›cieΕΌki `/founder/action`, portu domyΕ›lnego oraz braku query/hash przed dodaniem jednorazowego tokenu.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.861952\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.853653\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.85238\n }\n ],\n "margin": 0.008299,\n "reciprocalTopOne": true,\n "reverseMargin": 0.007306,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-1fe25da1a7826ae30433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`resume` automatycznie deleguje ticket do aktora zapisanego w kontrakcie i ustawia stan `ready`. `defer` zachowuje `waiting_input`. `cancel` zamyka ticket jako `canceled`, bez tworzenia faΕ‚szywego completion receipt. KaΕΌda opcja musi mieΔ‡ dokΕ‚adnie jeden skutek; wartoΕ›ci formularza i tabela skutkΓ³w sΔ… walidowane jako zbiory rΓ³wnowaΕΌne.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-22f285d9ae741064ff39",\n "path": "scripts/normalize-active-ticket-routes.mjs",\n "score": 0.82912\n },\n {\n "recordId": "INT-AST-b8788dcd3e0b418d0ac5",\n "path": "scripts/audit-ticket-definition-of-done.mjs",\n "score": 0.828759\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.828404\n }\n ],\n "margin": 0.000361,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006642,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-21bec78de30ca0dfa826",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Wynik LLM zawsze zaczyna jako `proposed`. Model nie moΕΌe sam podnieΕ›Δ‡ go do `accepted`, `ready`, `verified` ani `done`. Awaria, timeout, brak modelu lub niepoprawny JSON nie uruchamia deterministycznego parsera NL. Powstaje jawny stan `waiting_input`/`llm_interpretation_unavailable`, bez decyzji i bez mutacji.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.843129\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.840151\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.838721\n }\n ],\n "margin": 0.002978,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-25eabc74e38b81737c1f",\n "sourceKind": "document",\n "sourcePath": "docs/TESTQL_PROJECT_GATES.md",\n "modality": "required",\n "text": "Wersja developerska przechowuje podstawowe rekordy `evidence`, `test_suites`, `test_runs`, `outcomes` i hash OQL. W produkcji naleΕΌy dodaΔ‡ podpisy, trwaΕ‚Δ… bazΔ™ i retencjΔ™.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.833963\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.826495\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.826081\n }\n ],\n "margin": 0.007468,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2994619a281ce0c038fe",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_OBSERVABILITY.md",\n "modality": "required",\n "text": "Endpoint tworzenia klucza jest konfigurowany przez `PLESK_API_KEY_CREATE_PATH`. JeΕΌeli dana wersja Pleska wymaga MFA, CAPTCHA albo jednorazowej zgody, browser agent utworzy ticket `waiting_input`; mechanizmy bezpieczeΕ„stwa nie sΔ… obchodzone.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.860015\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.859964\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.856131\n }\n ],\n "margin": 5.1e-05,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002844,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2ca381a36c715ea44bac",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "System nie moΕΌe wywnioskowaΔ‡ tych danych z nazwy `Subactor` ani domeny Foundera. SΔ… to decyzje biznesowe/prawne. Adres i marka `prototypowanie.pl` mogΔ… byΔ‡ uΕΌyte jako kontekst, ale nie zastΔ™pujΔ… prawnej nazwy strony umowy.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.829453\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.827468\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.826652\n }\n ],\n "margin": 0.001985,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-2dbfe16e760f4d35c9e0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder jest korzeniem odpowiedzialnoΕ›ci. Kontrakt bez pola `principal` naleΕΌy do `human:founder`, a praca bez pokrycia trafia do kolejki foundera i jest notyfikowana na `founder@localhost`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.851962\n },\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.851016\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.848556\n }\n ],\n "margin": 0.000946,\n "reciprocalTopOne": true,\n "reverseMargin": 0.002108,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-326545ec5f8d681ae88a",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Ticket publikacji z blockerem `mutation_gate_disabled` albo `founder_publish_approval_required` nie moΕΌe przerzucaΔ‡ na Foundera technicznego polecenia β€žwykonaj dry-run i oceΕ„ plan_hash”. Przed utworzeniem e-maila Control wybiera wyΕ‚Δ…cznie zadeklarowany proces URI o identyfikatorze `dry-run`, `human_approval=false` i `payload.apply=false`, wykonuje go jako `project-operator-bot` i zapisuje ograniczony receipt:",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.848469\n },\n {\n "recordId": "INT-AST-6df68049deb2ff430a49",\n "path": "scripts/create-inbound-email-secret-link.mjs",\n "score": 0.846583\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.843954\n }\n ],\n "margin": 0.001886,\n "reciprocalTopOne": false,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-35c3fec8a2fa4ed7790b",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "| Docker BuildKit nie moΕΌe kopiowaΔ‡ plikΓ³w przez symlink wychodzΔ…cy poza kontekst buildu | obrazy po spΕ‚aszczeniu nie budowaΕ‚yby siΔ™ mimo poprawnych Ε›cieΕΌek na hoΕ›cie | Compose uΕΌywa kanonicznych repozytoriΓ³w jako kontekstΓ³w oraz jawnych `additional_contexts`; Dockerfile assembly naleΕΌΔ… do `platform/docker` |",\n "currentModuleIds": [\n "INT-AST-07bc79de0391fa296e7a",\n "INT-AST-1c6bb4bfd86ba09512b5",\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-29de31f162b50811f891",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-bf0bfd7598586ad009c9",\n "INT-AST-c9ad46e56a172df67338",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-f2588e9e2e79005e6e0e",\n "INT-AST-f40c7cca2b0be0281cb8",\n "INT-AST-f7460573b485ef9218bf",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.85972\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.845449\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.844077\n }\n ],\n "margin": 0.014271,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-36a129beb520f95c6b3a",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontroler nie przechowuje sekretΓ³w, nie zmienia DNS/TLS i nie wΕ‚Δ…cza mutation gates. Produkcyjny apply nadal wymaga podpisanego grantu zwiΔ…zanego z dry-run `plan_hash` i jawnej operacji Foundera.",\n "currentModuleIds": [\n "INT-AST-271f3ac4314857a8b631",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-ad4c73e93b22f06e0fc4"\n ],\n "top": [\n {\n "recordId": "INT-AST-ad4c73e93b22f06e0fc4",\n "path": "packages/founder-cli/src/apply-grant.mjs",\n "score": 0.856689\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.842309\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.8423\n }\n ],\n "margin": 0.01438,\n "reciprocalTopOne": true,\n "reverseMargin": 0.008705,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3a0e329ea4f412cd49f1",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "3. UtwΓ³rz indywidualne konto Basic Auth. Plik haseΕ‚ musi znajdowaΔ‡ siΔ™ poza `httpdocs`:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.842441\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.841794\n },\n {\n "recordId": "INT-AST-e3cff82dc01d34518b78",\n "path": "scripts/lib/audit-log-window.mjs",\n "score": 0.837173\n }\n ],\n "margin": 0.000647,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006114,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-3b67ff4d3d16f1c25ea7",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "recommended",\n "text": "`hr-bridge` nadal ma lokalne implementacje `plesk.*`, `email.send`, `slack.send`, `teams.send`, `calendar.ics.create` i `task.create`. Migracja powinna przebiegaΔ‡ nastΔ™pujΔ…co:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.847169\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.846942\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.845283\n }\n ],\n "margin": 0.000227,\n "reciprocalTopOne": true,\n "reverseMargin": 0.003968,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-48df7879b921b8bcf5e4",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_TEST_PLAN.md",\n "modality": "required",\n "text": "rzeczywisty apply wymaga osobnego ticketu URI Process i grantu zwiΔ…zanego z `plan_hash`.",\n "currentModuleIds": [\n "INT-AST-22f285d9ae741064ff39",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-d67629284ccbd55accc2"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.854757\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.853594\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.853075\n }\n ],\n "margin": 0.001163,\n "reciprocalTopOne": false,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4c3be8c6dc220976cc53",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`domain` musi byΔ‡ peΕ‚nΔ… publicznΔ… nazwΔ… DNS, nie `localhost` ani adresem IP;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.839013\n },\n {\n "recordId": "INT-AST-c51776bea8cc5bf2583c",\n "path": "test/deploy-public-pages.test.mjs",\n "score": 0.836738\n },\n {\n "recordId": "INT-AST-bdaf4f7c21b3a3912ef3",\n "path": "scripts/find-free-network.mjs",\n "score": 0.834026\n }\n ],\n "margin": 0.002275,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005475,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-4f9db52d56bd0026823b",\n "sourceKind": "document",\n "sourcePath": "docs/performance-gui-connectors-audit-2026-07-16.md",\n "modality": "required",\n "text": "`urirun-connector-subactor` udostΔ™pnia obecnie wiele schematΓ³w przez ogΓ³lny `process/command/dispatch`. Najpierw naleΕΌy rozdzieliΔ‡ go wewnΔ™trznie na pakiety `organization`, `contractor/recruitment`, `site-generator` i `testql`. Osobne publiczne repozytorium ma sens dopiero wtedy, gdy moduΕ‚ ma wΕ‚asny kontrakt URI, schematy wejΕ›cia/wyjΕ›cia, testy, wersjonowanie i moΕΌe byΔ‡ wdraΕΌany niezaleΕΌnie.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-792da796f1b4b26b12da",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.849456\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.846713\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.840765\n }\n ],\n "margin": 0.002743,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001523,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5149d3861e55a958b08e",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "`run_preflight` β€” musi wskazywaΔ‡ konkretny `process_id`; wykonawca nadal weryfikuje, ΕΌe jest to niezmieniajΔ…cy produkcji proces `dry-run`,",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.855529\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.852303\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.846205\n }\n ],\n "margin": 0.003226,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5224f52434cd4e13e790",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_EMAIL_ONE_CLICK_ACTIONS.md",\n "modality": "required",\n "text": "Powiadomienie `email_action_required` nie wymaga juΕΌ rΔ™cznego kopiowania numeru ticketu. KaΕΌdy e-mail zawiera:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.851227\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.847184\n },\n {\n "recordId": "INT-AST-2f146f1cc195dd96c6f4",\n "path": "scripts/audit-ticket-governance.mjs",\n "score": 0.842789\n }\n ],\n "margin": 0.004043,\n "reciprocalTopOne": false,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-598734e7c12787b3e6ad",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "`FOUNDER_ACCESS_SCOPES` musi zawieraΔ‡ `vault:reveal`",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.860331\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.845534\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.84493\n }\n ],\n "margin": 0.014797,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003874,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-5bfd8fc288d0e3e3e3d9",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_COMMUNICATION_PROCESS_PACKS.md",\n "modality": "required",\n "text": "Rejestr wybiera najnowszΔ… zgodnΔ… wersjΔ™ `process.vN`; nie naleΕΌy kodowaΔ‡ wersji w kontrolerze domenowym. KaΕΌda Ε›cieΕΌka najpierw tworzy dedykowany ticket Planfile z AQL/EQL/OQL/URI. Dopiero pΓ³ΕΊniej wykonuje `email.send`.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-12cf897f5148c62cb27c",\n "INT-AST-1b24f96cd4dbff614cc0",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-b8788dcd3e0b418d0ac5"\n ],\n "top": [\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.861178\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.850183\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.850166\n }\n ],\n "margin": 0.010995,\n "reciprocalTopOne": true,\n "reverseMargin": 0.004768,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-6f640680ab497d1d553f",\n "sourceKind": "document",\n "sourcePath": "docs/INTEGRATION_ADAPTERS.md",\n "modality": "required",\n "text": "Nie trzeba zmieniaΔ‡ istniejΔ…cych modeli AQL, jeΕ›li korzystajΔ… z ogΓ³lnego `notification.send`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.826191\n },\n {\n "recordId": "INT-AST-12cf897f5148c62cb27c",\n "path": "test/intent-packs.test.mjs",\n "score": 0.824924\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.823401\n }\n ],\n "margin": 0.001267,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-718b7f44fe9f4539da66",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Interpretacji NL, wyboru intencji, klasyfikacji decyzji ani uzupeΕ‚niania brakujΔ…cych pΓ³l nie wolno realizowaΔ‡ regexami, tablicΔ… sΕ‚Γ³w kluczowych, punktacjΔ… lub innΔ… heurystykΔ…. JeΕΌeli LLM nie zwrΓ³ci poprawnego structured output, system zatrzymuje operacjΔ™ jako `llm_interpretation_unavailable`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.83227\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.830631\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.828476\n }\n ],\n "margin": 0.001639,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003979,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73621239e97df9af3e7a",\n "sourceKind": "document",\n "sourcePath": "docs/CONNECTOR_LAN_ARCHITECTURE.md",\n "modality": "required",\n "text": "DomyΕ›lny executor ma tylko dedykowany wolumen `/workspace`; nie montuje `/`, `/var/run/docker.sock` ani trybu `privileged`. Konektory wymagajΔ…ce sprzΔ™tu naleΕΌy wΕ‚Δ…czaΔ‡ osobno:",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.844471\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.843603\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.843361\n }\n ],\n "margin": 0.000868,\n "reciprocalTopOne": true,\n "reverseMargin": 0.001157,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-73a881368c3a9fe2b0f4",\n "sourceKind": "document",\n "sourcePath": "docs/SESSION_RECOVERY_AND_MODULARIZATION_2026-07-21.md",\n "modality": "required",\n "text": "2. `platform/components/*` sΔ… osobnymi checkoutami tych samych repozytoriΓ³w, lecz katalog nadrzΔ™dny je ignoruje. ZwykΕ‚y `git status` w `platform` ukrywa ich zmiany. Publikacja musi traktowaΔ‡ checkout uruchomieniowy jako kanoniczny, rebase'owaΔ‡ go na `origin/main`, a dopiero potem synchronizowaΔ‡ dodatkowe klony.",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912",\n "INT-AST-429740c646b555806b8b",\n "INT-AST-8ed40f8ed8b18102cb3d",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-a03fbcaf0d05b6cb3367",\n "INT-AST-f7460573b485ef9218bf"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.859558\n },\n {\n "recordId": "INT-AST-28ecc726b3af01b6d912",\n "path": "scripts/link-flat-workspace.mjs",\n "score": 0.851344\n },\n {\n "recordId": "INT-AST-f7460573b485ef9218bf",\n "path": "scripts/check-component-drift.mjs",\n "score": 0.848807\n }\n ],\n "margin": 0.008214,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-767dd0d952dd7f6c09c1",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "certyfikat `founder.subactor.com` musi odpowiadaΔ‡ domenie, zanim moΕΌna uΕΌyΔ‡ go jako bezpiecznego wejΕ›cia. Odczyt z 2026-07-21 pokazuje CNAME `founder.subactor.com -> subactor.github.io` oraz certyfikat GitHub `*.github.io`, ktΓ³ry nie obejmuje nazwy Foundera. Dlatego sama zmiana certyfikatu nr 311 w Plesk nie naprawi obecnego ruchu: najpierw trzeba wybraΔ‡ docelowy hosting. Dla Pleska naleΕΌy zmieniΔ‡ DNS na jego serwer, utworzyΔ‡ host/subdomenΔ™ i wydaΔ‡ lub przypisaΔ‡ certyfikat obejmujΔ…cy `founder.subactor.com`. Dla GitHub Pages naleΕΌy skonfigurowaΔ‡ tΔ™ nazwΔ™ jako custom domain i poczekaΔ‡ na wΕ‚aΕ›ciwy certyfikat. Dopiero potem wykonuje siΔ™ niezaleΕΌnΔ… weryfikacjΔ™ strict TLS.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.846098\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.838802\n },\n {\n "recordId": "INT-AST-34dd3d4f9ce437b8da87",\n "path": "packages/capability-preflight/src/preflight.mjs",\n "score": 0.838685\n }\n ],\n "margin": 0.007296,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7da4ea8c34d708aa977d",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "recommended",\n "text": "RΔ™czny cykl kontrolera wykonaΕ‚ dwa gotowe tickety, ale etap `queue_execution` trwaΕ‚ okoΕ‚o 70 s. NiezaleΕΌne kroki jednego ticketu sΔ… nadal wykonywane sekwencyjnie. Bezpieczna rΓ³wnolegΕ‚oΕ›Δ‡ powinna byΔ‡ wyliczana z DAG `depends_on` i ograniczana budΕΌetem connectora.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-1c6bb4bfd86ba09512b5",\n "path": "test/control-safe-start.test.mjs",\n "score": 0.83197\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.827962\n },\n {\n "recordId": "INT-AST-0ae86359bdbeb34a808c",\n "path": "test/control-execute-once.test.mjs",\n "score": 0.826695\n }\n ],\n "margin": 0.004008,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001157,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-7e6497c757ff8d20f249",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Dla pytaΕ„ typu `ticket.decision` e-mail umieszcza po kaΕΌdej odpowiedzi osobny link `#token=…&answer=…`. Fragment nie jest wysyΕ‚any w ΕΌΔ…daniu HTTP ani zapisywany w logach serwera. Link wybiera wyΕ‚Δ…cznie wartoΕ›Δ‡ istniejΔ…cΔ… w zamkniΔ™tym katalogu formularza i zmienia etykietΔ™ przycisku na β€žPotwierdΕΊ tΔ™ decyzję”. Wymagane pozostaje Ε›wiadome potwierdzenie na stronie: zwykΕ‚y skaner linkΓ³w pocztowych nie moΕΌe zuΕΌyΔ‡ tokenu ani zmieniΔ‡ lifecycle ticketu przez GET.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.848592\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.846701\n },\n {\n "recordId": "INT-AST-0e3f72c26d8f6ea35f80",\n "path": "scripts/backfill-ticket-definition-of-done.mjs",\n "score": 0.845006\n }\n ],\n "margin": 0.001891,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005594,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-814fd7b2a90e4fd7f349",\n "sourceKind": "document",\n "sourcePath": "docs/SUBACTOR_MULTI_REPO_MIGRATION.md",\n "modality": "required",\n "text": "After component repositories are published, `platform` records them as external source checkouts. Verification must include:",\n "currentModuleIds": [\n "INT-AST-28ecc726b3af01b6d912"\n ],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.87058\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.86265\n },\n {\n "recordId": "INT-AST-f54cfcb46e60ea2daf22",\n "path": "test/platform.test.js",\n "score": 0.861889\n }\n ],\n "margin": 0.00793,\n "reciprocalTopOne": true,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-81f213d607d4a9e6d773",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "Founder moΕΌe delegowaΔ‡ bez kontraktu nadrzΔ™dnego. Inna osoba moΕΌe tworzyΔ‡ dalsze delegacje tylko wtedy, gdy poda `parent_contract_id`, jest podmiotem aktywnego kontraktu nadrzΔ™dnego, a ten kontrakt dopuszcza operacjΔ™ `autonomy.contract.delegate`. Bot nie moΕΌe sam rozszerzaΔ‡ swoich uprawnieΕ„.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.82498\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.820146\n },\n {\n "recordId": "INT-AST-9c6e38ddf867cc10a0c0",\n "path": "packages/founder-cli/tests/founder.test.mjs",\n "score": 0.818133\n }\n ],\n "margin": 0.004834,\n "reciprocalTopOne": false,\n "reverseMargin": 0.013658,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-874b23309a57fba88bb0",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_BROWSER_VAULT.md",\n "modality": "required",\n "text": "API wymaga `Authorization: Bearer ...`. DomyΕ›lnie tokenem wewnΔ™trznym jest `BRIDGE_INTROSPECTION_SECRET`; moΕΌna ustawiΔ‡ osobny `BROWSER_AGENT_SERVICE_TOKEN`. Klucz szyfrowania domyΕ›lnie korzysta z `INTEGRATION_SECRET_KEY`; produkcyjnie zalecany jest osobny `BROWSER_AGENT_VAULT_KEY` przechowywany poza repozytorium.",\n "currentModuleIds": [\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.837148\n },\n {\n "recordId": "INT-AST-0a117640892c43195f42",\n "path": "scripts/init-secrets.mjs",\n "score": 0.835999\n },\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.835911\n }\n ],\n "margin": 0.001149,\n "reciprocalTopOne": false,\n "reverseMargin": 0.013658,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88df94ec3f62b969e433",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_VAULT_REVEAL.md",\n "modality": "required",\n "text": "To nie jest przeglΔ…darka caΕ‚ego sejfu. Ticket musi z gΓ³ry wskazywaΔ‡ wpis, origin i pole (`password`, `username` albo `api_key`). Ani sekret, ani token linku nie sΔ… zapisywane w tickecie, audycie Control lub wyniku CLI.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-a4a1c7ea87551da3dc42",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.856613\n },\n {\n "recordId": "INT-AST-9e7b169cb0dcf86f226a",\n "path": "scripts/create-cloudflare-secret-link.mjs",\n "score": 0.855406\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.850217\n }\n ],\n "margin": 0.001207,\n "reciprocalTopOne": false,\n "reverseMargin": 0.009517,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-88ebbac4e76e7fa6acc6",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`id` musi byΔ‡ unikalnym identyfikatorem kebab-case;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.835302\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.834452\n },\n {\n "recordId": "INT-AST-bf0bfd7598586ad009c9",\n "path": "test/production-compose.test.mjs",\n "score": 0.833188\n }\n ],\n "margin": 0.00085,\n "reciprocalTopOne": false,\n "reverseMargin": 0.000352,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b209aa7dc2e722b4dd7",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_DAILY_DIGEST.md",\n "modality": "recommended",\n "text": "Awaria nie uruchamia lokalnego fallbacku SMTP. Ponowienie nastΔ™puje po `FOUNDER_DAILY_DIGEST_RETRY_MS` i uΕΌywa tego samego ticketa oraz klucza idempotencji, wiΔ™c nie powinno wysΕ‚aΔ‡ drugiej wiadomoΕ›ci po czΔ™Ε›ciowej awarii.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.834571\n },\n {\n "recordId": "INT-AST-002e0c686cfeb6968b5e",\n "path": "scripts/create-system-email-secret-link.mjs",\n "score": 0.829515\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829102\n }\n ],\n "margin": 0.005056,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8b7042e2696ff6f23051",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "Token wymaga `plans:approve`. Control nie przyjmuje principal w body β€” odczytuje go z uwierzytelnionej toΕΌsamoΕ›ci, a nastΔ™pnie sprawdza osobne przypisanie authority w tickecie. DziΔ™ki temu scope tokenu nie staje siΔ™ globalnym prawem zatwierdzania. Dozwolone decyzje to `approve`, `defer` i `reject`; kaΕΌda jest zapisywana w audycie wraz z principal i metodΔ… uwierzytelnienia.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.834053\n },\n {\n "recordId": "INT-AST-d79aa26ea931af33f0d6",\n "path": "scripts/configure-remediation-planner.mjs",\n "score": 0.832855\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.829247\n }\n ],\n "margin": 0.001198,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006114,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-8d7022906b9a1e65b9ec",\n "sourceKind": "document",\n "sourcePath": "docs/DEVELOPMENT_OPENROUTER.md",\n "modality": "required",\n "text": "Gateway jest domyΕ›lnie publikowany tylko na `127.0.0.1` i wymaga lokalnego `LLM_GATEWAY_SERVICE_TOKEN`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.840702\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.839761\n },\n {\n "recordId": "INT-AST-ebdfa3628e9c4e8432e6",\n "path": "scripts/llm-status.mjs",\n "score": 0.839585\n }\n ],\n "margin": 0.000941,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-958ddb1db2512381cc5f",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "recommended",\n "text": "Founder nie powinien znaΔ‡ stanΓ³w kolejki, wybieraΔ‡ `reassign` ani wpisywaΔ‡ komend lifecycle. Planfile pozostaje wewnΔ™trznym ΕΊrΓ³dΕ‚em stanu i dowodΓ³w, a interakcjΔ™ czΕ‚owieka obsΕ‚uguje deklaratywny kontrakt `subactor.interactive-form.v1` lub jego zgodne rozszerzenie `subactor.interactive-form.v2`. Control interpretuje skutek odpowiedzi, a bezstanowe repozytorium `views/` renderuje wyΕ‚Δ…cznie projekcjΔ™ HTML.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.852536\n },\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.849854\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.848442\n }\n ],\n "margin": 0.002682,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-9c3fc3cb3825c7092c7f",\n "sourceKind": "document",\n "sourcePath": "docs/PLESK_LIVE.md",\n "modality": "required",\n "text": "Mock Plesk implementuje endpoint publikacji bez dodatkowych zmian. W trybie live Ε›cieΕΌka `PLESK_SITE_PUBLISH_PATH` musi wskazywaΔ‡ endpoint udostΔ™pniony przez konkretnΔ… instalacjΔ™ Plesk, rozszerzenie panelu albo kontrolowany adapter CLI. Nie naleΕΌy zakΕ‚adaΔ‡, ΕΌe niestandardowa Ε›cieΕΌka `/api/v2/sites/publish` istnieje w kaΕΌdej instalacji.",\n "currentModuleIds": [\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-f2c14a1e840818e82b47"\n ],\n "top": [\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.846759\n },\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.844142\n },\n {\n "recordId": "INT-AST-501c17e4bf9663cd6131",\n "path": "scripts/run-local-e2e.mjs",\n "score": 0.839924\n }\n ],\n "margin": 0.002617,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005475,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-acc70bcd3285163c8a83",\n "sourceKind": "document",\n "sourcePath": "docs/WORKER_CONTRACT_PORTAL.md",\n "modality": "required",\n "text": "Nazwa uΕΌytkownika musi byΔ‡ identyczna z `worker.http_basic_user` w JSON. Runtime odrzuca rΓ³wnieΕΌ poprawnie uwierzytelnione konto przypisane do innego pracownika.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.841455\n },\n {\n "recordId": "INT-AST-cbabaecd2615f3b68a2c",\n "path": "test/recruitment-workflow.test.mjs",\n "score": 0.837079\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.836195\n }\n ],\n "margin": 0.004376,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-b966966b4a3a222cdab4",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_OPERATIONAL_DSL_LAYERS.md",\n "modality": "required",\n "text": "Control ponownie waliduje wynik, sprawdza scope, wykonuje wskazane odczyty i przekazuje do drugiej fazy LLM wyΕ‚Δ…cznie krΓ³tkie, zatwierdzone fakty. OdpowiedΕΊ ma kontrakt `subactor.founder-grounded-answer/v1` i musi wskazaΔ‡ `fact_refs`. Model nie otrzymuje authority, dowolnego filtra, URI ani surowych obiektΓ³w.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2847b0cb1f6a2d4045ae",\n "INT-AST-33ed799f815097a2ebcb",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-27cef449f964a294ffcd",\n "path": "scripts/lib/json-schema-subset.mjs",\n "score": 0.83752\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.837417\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837069\n }\n ],\n "margin": 0.000103,\n "reciprocalTopOne": false,\n "reverseMargin": 0.00486,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ba509d6ee6ec15b626b8",\n "sourceKind": "document",\n "sourcePath": "docs/ORGANIZATION_OS_ARCHITECTURE.md",\n "modality": "required",\n "text": "Claim jest ponownie walidowany przed zmianΔ… stanu. ZakoΕ„czenie wymaga receiptΓ³w krokΓ³w i completion receipt z `verified_by`; sam HTTP 2xx nie wystarcza.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.863786\n },\n {\n "recordId": "INT-AST-22e72147fec8b9d55ff1",\n "path": "scripts/verify-layered-system.mjs",\n "score": 0.863029\n },\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.85533\n }\n ],\n "margin": 0.000757,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003148,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c0464135791a8ed38c66",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "ŚcieΕΌka hosta jest montowana do kontenera tylko do odczytu. Zmiana `SUBACTOR_PROJECTS_PATH` wymaga zgodnoΕ›ci wartoΕ›ci w `.env` z bind-mountem Compose.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-1564314c4c5c8b304c27",\n "INT-AST-170732522e9a08fc4777",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2e5029d3b3ab1ba50c91",\n "INT-AST-48dfdd4791e461e90b73",\n "INT-AST-501c17e4bf9663cd6131",\n "INT-AST-6669cdeb59d2dd1b01e0",\n "INT-AST-6bee94aa65ae666378c2",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-76fb17f792a499e351d3",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-b7fda5399edec3c1acb1",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-ebdfa3628e9c4e8432e6"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.872004\n },\n {\n "recordId": "INT-AST-76fb17f792a499e351d3",\n "path": "scripts/init-env.mjs",\n "score": 0.867679\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.862333\n }\n ],\n "margin": 0.004325,\n "reciprocalTopOne": true,\n "reverseMargin": 0.006814,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c515505dcb1f9e834ef1",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "**Dopasowanie reguΕ‚ to AND, nie OR.** `ruleMatchesTicket` wymaga speΕ‚nienia **wszystkich** wypeΕ‚nionych kryteriΓ³w. Dodanie `uri_prefixes_any` do reguΕ‚y, ktΓ³ra ma juΕΌ `labels_any`, **zawΔ™ΕΌa** jΔ… β€” ticket musi mieΔ‡ etykietΔ™ *oraz* URI. ReguΕ‚y URI muszΔ… byΔ‡ osobnymi wpisami z pustymi pozostaΕ‚ymi kryteriami.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.856836\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.854146\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.853856\n }\n ],\n "margin": 0.00269,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-c72a940082e5281fdd16",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_EMAIL.md",\n "modality": "required",\n "text": "`REAL_SYSTEM_EMAIL` okreΕ›la prawdziwΔ… skrzynkΔ™ systemu, a `DEMO_SYSTEM_EMAIL` nadawcΔ™ uΕΌywanego wyΕ‚Δ…cznie przez Mailpit i testy. `SYSTEM_EMAIL` wskazuje aktywnΔ… toΕΌsamoΕ›Δ‡ foundera, administratora i supervisora. `EMAIL_IDENTITY_MODE=real` wymaga zgodnoΕ›ci `SYSTEM_EMAIL` z `REAL_SYSTEM_EMAIL`; tryb `demo` przeΕ‚Δ…cza jΔ… na `DEMO_SYSTEM_EMAIL`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-224e8700618a854f6bc0",\n "path": "scripts/lib/layered-system-readiness.mjs",\n "score": 0.843144\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.840485\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.838475\n }\n ],\n "margin": 0.002659,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006823,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ce10b816225eeeea1aef",\n "sourceKind": "document",\n "sourcePath": "docs/FLAT_WORKSPACE_AND_LINKEDIN_INTERNSHIP_2026-07-21.md",\n "modality": "required",\n "text": "JeΕΌeli node wymaga auth, `lenovo.token_file` ma wskazywaΔ‡ lokalny plik zawierajΔ…cy token; token nie jest wersjonowany ani zapisywany w artefakcie. Automat wykonuje readiness i otwiera formularz tylko na istniejΔ…cej, uwierzytelnionej powierzchni browser/CDP. Founder weryfikuje pola i publikuje.",\n "currentModuleIds": [\n "INT-AST-1af39de912ce9b7c9440",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-ad4c73e93b22f06e0fc4",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dd4ad46cd453fe2ef337",\n "INT-AST-e4fca5fce4f74af1b8ec",\n "INT-AST-fd47cb1953b5ccae0760"\n ],\n "top": [\n {\n "recordId": "INT-AST-1af39de912ce9b7c9440",\n "path": "packages/founder-cli/src/config.mjs",\n "score": 0.843646\n },\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.842754\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.842372\n }\n ],\n "margin": 0.000892,\n "reciprocalTopOne": false,\n "reverseMargin": 0.003483,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-cf53c018b86f82f3967f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMY_CONTRACTS.md",\n "modality": "required",\n "text": "`principal` wskazuje osobΔ™ albo bota, np. `{\\"kind\\":\\"bot\\",\\"id\\":\\"it-provisioner-bot\\"}`. Ticket utworzony w ramach takiego kontraktu otrzymuje tego samego wykonawcΔ™ i kolejkΔ™. Sam routing nie udaje wykonania: bot musi mieΔ‡ rzeczywisty adapter lub proces URIrun, ktΓ³ry odbierze ticket i zapisze dowΓ³d rezultatu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.85194\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.847934\n }\n ],\n "margin": 0.000246,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001135,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d0f2d64cdf114aecb081",\n "sourceKind": "document",\n "sourcePath": "docs/RELCom_INTEGRATION.md",\n "modality": "required",\n "text": "Nie kopiuj tokenΓ³w, danych testowych ani mock Pleska. Produkcyjny `plan-registry` powinien pozostaΔ‡ ΕΊrΓ³dΕ‚em prawdy i wymagaΔ‡ `SUBACTOR_ADMIN_TOKEN`.",\n "currentModuleIds": [\n "INT-AST-7fa98cd51c5167b57fa2"\n ],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.852756\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.85208\n },\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.848715\n }\n ],\n "margin": 0.000676,\n "reciprocalTopOne": false,\n "reverseMargin": 0.009517,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d8cc038eab8108dffbd7",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "Kontrola dokumentΓ³w prawnych jest jakoΕ›ciowa, nie tylko nazwowa. Akceptowane sΔ… pliki `.md`, `.html`, `.htm`, `.txt` i `.pdf`. KaΕΌdy wymagany dokument musi mieΔ‡ co najmniej 200 bajtΓ³w/znakΓ³w, a pliki tekstowe zawierajΔ…ce `TODO`, `do uzupeΕ‚nienia` albo `placeholder` sΔ… traktowane jako niekompletne. Wymagane kategorie to: polityka prywatnoΕ›ci, cookies, dane administratora, zasady formularza kontaktowego i informacja o statusie pilotaΕΌu.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-5aacf092cd20dfecaeac",\n "path": "test/documentation-plan-audit.test.mjs",\n "score": 0.827941\n },\n {\n "recordId": "INT-AST-167bbd84e4e4afe736e9",\n "path": "test/capability-preflight.test.mjs",\n "score": 0.823662\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.822936\n }\n ],\n "margin": 0.004279,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006114,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-d9088f27e0bd7ac5d51b",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_LINKS_AUDIT_AND_REFACTOR_2026-07-21.md",\n "modality": "required",\n "text": "Jaki publiczny adres IP lub nazwa hosta ingressu ma obsΕ‚ugiwaΔ‡ `founder.subactor.com`? Bez tej informacji nie naleΕΌy zmieniaΔ‡ rekordu DNS ani deklarowaΔ‡, ΕΌe publiczny link dziaΕ‚a. Po uzyskaniu odpowiedzi trzeba rΓ³wnieΕΌ potwierdziΔ‡, czy kolejka Planfile ma byΔ‡ publikowana na tej samej domenie, czy pod osobnym, uwierzytelnionym adresem.",\n "currentModuleIds": [\n "INT-AST-3b7d8bf9b45b36aeae19",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.844263\n },\n {\n "recordId": "INT-AST-7fa98cd51c5167b57fa2",\n "path": "scripts/send-founder-magic-link.mjs",\n "score": 0.837775\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.832502\n }\n ],\n "margin": 0.006488,\n "reciprocalTopOne": false,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-dce58b4c336ad1c53826",\n "sourceKind": "document",\n "sourcePath": "docs/DIGITAL_TWIN_ROUTER_ORCHESTRATOR.md",\n "modality": "required",\n "text": "W rejestrze lifecycle `digital_twin_profile` ma status `partial` i `autonomy.enabled=false`. Portret moΕΌe byΔ‡ uΕΌywany do decyzji routingowej, ale nie moΕΌe autonomicznie migrowaΔ‡ siebie ani modyfikowaΔ‡ praw, dopΓ³ki luki taksonomii specjalizacji i jakoΕ›ci wynikΓ³w nie zostanΔ… domkniΔ™te.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-e78d096476327aa23b1e",\n "path": "scripts/build-urirun-registry.py",\n "score": 0.8306\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.825245\n },\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.821944\n }\n ],\n "margin": 0.005355,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002985,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e5d909b9cb997225241b",\n "sourceKind": "document",\n "sourcePath": "docs/PROJECT_RECONCILIATION_CONTROLLER.md",\n "modality": "required",\n "text": "`schema` musi mieΔ‡ wartoΕ›Δ‡ `subactor.projects/v1`;",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9a4f2ce56264112037c7",\n "path": "packages/founder-cli/bin/subactor.mjs",\n "score": 0.865702\n },\n {\n "recordId": "INT-AST-3b7d8bf9b45b36aeae19",\n "path": "scripts/deploy-public-pages.mjs",\n "score": 0.861173\n },\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.856483\n }\n ],\n "margin": 0.004529,\n "reciprocalTopOne": true,\n "reverseMargin": 0.011471,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-e907e7c7a7d55704ca51",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_QUEUE_CONTROLLER.md",\n "modality": "required",\n "text": "KaΕΌdy cykl ponownie bada ticket, jeΕΌeli ma Process Envelope v2, naleΕΌy do wΕ‚Δ…czonego bota i trafiΕ‚ do `waiting_input` z bΕ‚Δ™dem `readiness_preflight:*`. Kontroler nie promuje ticketΓ³w ludzkich, legacy, z aktywnym `blocked-by:*` ani z zadeklarowanym blockerem. Kandydat przechodzi ponownie przez aktualne rejestry aktorΓ³w i exact URI. Dopiero zielony wynik zmienia stan na `ready`.",\n "currentModuleIds": [\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-f40c7cca2b0be0281cb8",\n "path": "scripts/audit-active-ticket-routes.mjs",\n "score": 0.834894\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.834087\n },\n {\n "recordId": "INT-AST-87d5a6d7c8c4dfef9468",\n "path": "scripts/lib/process-ticket.mjs",\n "score": 0.832743\n }\n ],\n "margin": 0.000807,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001362,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-ef47ae9fb56681714214",\n "sourceKind": "document",\n "sourcePath": "docs/FOUNDER_URGENT_ACTIONS.md",\n "modality": "required",\n "text": "OdpowiedΕΊ e-mail moΕΌe zawieraΔ‡ wyΕ‚Δ…cznie `TAK`, `NIE`, `ODROCZ` lub `PΓ“ΕΉNIEJ`, jeΕΌeli temat zachowuje znacznik `[URGENT:PLF-N]` wygenerowany przez system. Nadal akceptowane sΔ… jawne formy `APPROVE PLF-N`, `REJECT PLF-N` i `DEFER PLF-N`. Nadawca przechodzi istniejΔ…cΔ… autoryzacjΔ™ kontaktu i kontraktu AQL. Klasa principal nie nadaje globalnego wyjΔ…tku: rΓ³wnieΕΌ `human:founder` musi byΔ‡ zwiΔ…zany z ticketem przez `assigned_to`, etykietΔ™ `authority:`, `approver:`, `principal:` albo jawnΔ… capability decyzyjnΔ… AQL.",\n "currentModuleIds": [\n "INT-AST-002e0c686cfeb6968b5e",\n "INT-AST-0fad4a78463ccc53e942",\n "INT-AST-265fdb5b302eb0e66e36",\n "INT-AST-2ad0a72220a446c0fe88",\n "INT-AST-2f146f1cc195dd96c6f4",\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-6df68049deb2ff430a49",\n "INT-AST-7fa98cd51c5167b57fa2",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-94306c69b189da79195a",\n "INT-AST-9e7b169cb0dcf86f226a",\n "INT-AST-ac2e2bd1273cfb5ac662",\n "INT-AST-c633e264e7f6b083e783",\n "INT-AST-dc1dcce0faf40419b64e",\n "INT-AST-dd4ad46cd453fe2ef337"\n ],\n "top": [\n {\n "recordId": "INT-AST-e8add6c9c5592524640f",\n "path": "packages/founder-cli/src/lifecycle.mjs",\n "score": 0.836239\n },\n {\n "recordId": "INT-AST-2ad0a72220a446c0fe88",\n "path": "packages/founder-cli/src/ask.mjs",\n "score": 0.836008\n },\n {\n "recordId": "INT-AST-4ad37ba491a05a6daa0b",\n "path": "scripts/sync-intent-pack-derived.mjs",\n "score": 0.834528\n }\n ],\n "margin": 0.000231,\n "reciprocalTopOne": false,\n "reverseMargin": 0.002108,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-efe140f5619e37a96d82",\n "sourceKind": "document",\n "sourcePath": "docs/SECRET_INTAKE_PROCESS_PACKS.md",\n "modality": "required",\n "text": "KaΕΌdy ticket zawiera komplet AQL/EQL/OQL/URI. LLM moΕΌe wybraΔ‡ proces i wypeΕ‚niΔ‡ ograniczony slot `provider`, ale nie moΕΌe wybraΔ‡ transportu, wpisu sejfu ani wygenerowaΔ‡ URI.",\n "currentModuleIds": [\n "INT-AST-5d19be2a9b2f6eb9c00c"\n ],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.840829\n },\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.839737\n },\n {\n "recordId": "INT-AST-75ecc71e18412a3f8214",\n "path": "test/ticket-llm-context.test.mjs",\n "score": 0.839105\n }\n ],\n "margin": 0.001092,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005594,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-f48ad72c3cd1e900e80f",\n "sourceKind": "document",\n "sourcePath": "docs/AUTONOMOUS_CONTROLLER_CONTINUATION_PLAN.md",\n "modality": "required",\n "text": "Kontroler nie moΕΌe promowaΔ‡, wykonywaΔ‡ ani zamykaΔ‡ ticketu bez wspieranej wersji kontraktu, kompletnego envelope v2, aktywnego aktora, live exact URI, uprawnieΕ„ AQL, oczekiwaΕ„ EQL i braku aktualnego blockera. Brak bezpiecznej Ε›cieΕΌki pozostaje widocznym `waiting_input`; przypomnienie nie nadaje authority i nie odnawia tokenu czΔ™Ε›ciej niΕΌ pozwala lifecycle artefaktu.",\n "currentModuleIds": [\n "INT-AST-34dd3d4f9ce437b8da87",\n "INT-AST-932d9e7b7fc499ee5051",\n "INT-AST-f2588e9e2e79005e6e0e"\n ],\n "top": [\n {\n "recordId": "INT-AST-a3826288f0454d74eaa7",\n "path": "scripts/audit-documentation-plans.mjs",\n "score": 0.833423\n },\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.830379\n },\n {\n "recordId": "INT-AST-271f3ac4314857a8b631",\n "path": "scripts/run-controller-cycle.mjs",\n "score": 0.830257\n }\n ],\n "margin": 0.003044,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001135,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fb082dd22afc2a7434e5",\n "sourceKind": "document",\n "sourcePath": "docs/SYSTEM_STATE_2026-07-24.md",\n "modality": "required",\n "text": "PowΓ³d jest strukturalny, nie awaryjny: kolejka autonomiczna wykonuje wyΕ‚Δ…cznie tickety w stanie wykonywalnym, a praktycznie caΕ‚y backlog stoi na `waiting_input`. Licznik `executable` opisuje tΔ™ kolejkΔ™, a nie Ε›cieΕΌkΔ™ delegowania β€” dlatego oba wskaΕΊniki mogΔ… siΔ™ rozjeΕΌdΕΌaΔ‡ i **nie naleΕΌy czytaΔ‡ `executable: 0` jako awarii kontrolera**.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-9e4b0f271e9279c9d60e",\n "path": "scripts/lib/ticket-lifecycle.mjs",\n "score": 0.857835\n },\n {\n "recordId": "INT-AST-c74d93ff12a626f5e8df",\n "path": "test/ticket-auditor-audit-window.test.mjs",\n "score": 0.849431\n },\n {\n "recordId": "INT-AST-419698c412dc2105ea07",\n "path": "test/ticket-auditor-selection.test.mjs",\n "score": 0.845601\n }\n ],\n "margin": 0.008404,\n "reciprocalTopOne": true,\n "reverseMargin": 0.005594,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fdb89ea01f0b0eaa5628",\n "sourceKind": "document",\n "sourcePath": "docs/ENV_CONFIGURATION.md",\n "modality": "required",\n "text": "4. Kod serwisΓ³w nie moΕΌe uΕΌywaΔ‡ bezpoΕ›rednio `process.env.VAR`.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.854812\n },\n {\n "recordId": "INT-AST-0ccec610937016ed5ee4",\n "path": "scripts/migrate-env.mjs",\n "score": 0.851694\n },\n {\n "recordId": "INT-AST-5d0ae2203807472c3612",\n "path": "scripts/run-controller-once.mjs",\n "score": 0.851052\n }\n ],\n "margin": 0.003118,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006814,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-DOC-fea4537ba7aa1ca8a381",\n "sourceKind": "document",\n "sourcePath": "docs/INBOUND_EMAIL_AUTHORIZATION.md",\n "modality": "required",\n "text": "The default authentication policy is `strict`. `contract-only` exists solely for isolated local tests and must not be used for a real mailbox.",\n "currentModuleIds": [\n "INT-AST-167bbd84e4e4afe736e9",\n "INT-AST-576fc1c342f93d1fcef2",\n "INT-AST-6e8a1d4ad536d4cc9567",\n "INT-AST-bcd8179169d840bc205e"\n ],\n "top": [\n {\n "recordId": "INT-AST-ce3060272624f87da997",\n "path": "test/process-ticket.test.mjs",\n "score": 0.83973\n },\n {\n "recordId": "INT-AST-42da0c70f37348edd281",\n "path": "test/active-ticket-route-normalization.test.mjs",\n "score": 0.837595\n },\n {\n "recordId": "INT-AST-59742984dd7ae51fd03b",\n "path": "test/active-ticket-route-audit.test.mjs",\n "score": 0.836975\n }\n ],\n "margin": 0.002135,\n "reciprocalTopOne": false,\n "reverseMargin": 0.005786,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-180a8388572a6ea7a824",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Resolve Plesk `subscription_domain_limit_unknown`, DNS and TLS before production apply.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-265fdb5b302eb0e66e36",\n "path": "scripts/create-plesk-secret-link.mjs",\n "score": 0.869481\n },\n {\n "recordId": "INT-AST-c0a9741500d2830c1f34",\n "path": "scripts/lib/production-environment.mjs",\n "score": 0.859953\n },\n {\n "recordId": "INT-AST-1564314c4c5c8b304c27",\n "path": "scripts/bootstrap-plesk-api-key.mjs",\n "score": 0.859809\n }\n ],\n "margin": 0.009528,\n "reciprocalTopOne": true,\n "reverseMargin": 0.009517,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-5c003c3825645e675e46",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision `urirun-connector-twilio-voice`: vault credentials, caller number, destination/consent policy and signed status callback.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-a00b21088f556fc59477",\n "path": "scripts/validate-urirun-connectors-audit.mjs",\n "score": 0.878721\n },\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.873161\n },\n {\n "recordId": "INT-AST-170732522e9a08fc4777",\n "path": "scripts/configure-system-email-vault.mjs",\n "score": 0.858164\n }\n ],\n "margin": 0.00556,\n "reciprocalTopOne": true,\n "reverseMargin": 0.018359,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-9b79f780a672f6add271",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Deploy one authenticated portal for `contracts.subactor.com` and `chat.subactor.com`.",\n "currentModuleIds": [\n "INT-AST-94306c69b189da79195a"\n ],\n "top": [\n {\n "recordId": "INT-AST-9868e7332a3017885a0f",\n "path": "config/connector-capabilities/preflight.mjs",\n "score": 0.866502\n },\n {\n "recordId": "INT-AST-e5bd0b88590a365b8624",\n "path": "config/intent-packs/registry.mjs",\n "score": 0.864586\n },\n {\n "recordId": "INT-AST-6bee94aa65ae666378c2",\n "path": "scripts/configure-plesk-admin-vault.mjs",\n "score": 0.86286\n }\n ],\n "margin": 0.001916,\n "reciprocalTopOne": true,\n "reverseMargin": 0.015824,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-b7058854b8ae3d810e17",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Rotate the scoped autonomy-chat control token before 2026-08-18.",\n "currentModuleIds": [\n "INT-AST-edc170e805da7985926b"\n ],\n "top": [\n {\n "recordId": "INT-AST-edc170e805da7985926b",\n "path": "scripts/configure-autonomy-chat.mjs",\n "score": 0.866802\n },\n {\n "recordId": "INT-AST-3fc6d08576a55c11d9e1",\n "path": "test/rotate-platform-secrets.test.mjs",\n "score": 0.84412\n },\n {\n "recordId": "INT-AST-fd47cb1953b5ccae0760",\n "path": "scripts/rotate-platform-secrets.mjs",\n "score": 0.843419\n }\n ],\n "margin": 0.022682,\n "reciprocalTopOne": true,\n "reverseMargin": 0.013658,\n "selected": true,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-d00584ed9e9dbbb233b5",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Remove duplicate urirun connector discovery and repair optional connector dependencies.",\n "currentModuleIds": [],\n "top": [\n {\n "recordId": "INT-AST-792da796f1b4b26b12da",\n "path": "scripts/audit-urirun-connectors.mjs",\n "score": 0.871638\n },\n {\n "recordId": "INT-AST-1b24f96cd4dbff614cc0",\n "path": "test/build-urirun-registry.test.mjs",\n "score": 0.86949\n },\n {\n "recordId": "INT-AST-e346dd734bf80bf3ee67",\n "path": "scripts/run-post-deploy-project-check.mjs",\n "score": 0.867432\n }\n ],\n "margin": 0.002148,\n "reciprocalTopOne": false,\n "reverseMargin": 0.001523,\n "selected": false,\n "addsNewCandidate": false\n },\n {\n "recordId": "INT-TODO-db792516a8944c2e7692",\n "sourceKind": "todo",\n "sourcePath": "TODO.md",\n "modality": "required",\n "text": "Provision live SMTP/IMAP vault entries and verify founder e-mail round trip.",\n "currentModuleIds": [\n "INT-AST-c633e264e7f6b083e783"\n ],\n "top": [\n {\n "recordId": "INT-AST-94306c69b189da79195a",\n "path": "scripts/validate-env.mjs",\n "score": 0.86519\n },\n {\n "recordId": "INT-AST-c633e264e7f6b083e783",\n "path": "scripts/create-founder-vault-reveal-link.mjs",\n "score": 0.864205\n },\n {\n "recordId": "INT-AST-6669cdeb59d2dd1b01e0",\n "path": "scripts/configure-inbound-email-vault.mjs",\n "score": 0.861663\n }\n ],\n "margin": 0.000985,\n "reciprocalTopOne": false,\n "reverseMargin": 0.006814,\n "selected": false,\n "addsNewCandidate": false\n }\n ]\n}\n", "is_subdir": true}, {"name": "sample.json", "rel_path": "ticket-003/sample.json", "path": "ticket-003 / sample.json", "size": "144.3KB", "icon": "πŸ“‹", "type": "json", "type_name": "JSON", "content": "{\n "schemaVersion": "t2c.changelog-audit/v1",\n "generatedAt": "2026-07-31T00:00:00.000Z",\n "selectionPolicy": {\n "description": "Round-robin over lexical target-class:action strata, then stable record ID.",\n "perRepositoryLimit": 24,\n "targetClassPrecedence": [\n "ticket",\n "path",\n "symbol",\n "none"\n ]\n },\n "classificationPolicy": {\n "version": 1,\n "labels": {\n "non_actionable_file_update": "Exact Update <file> bookkeeping with no behavioral statement.",\n "non_actionable_file_summary": "Opaque chore summary naming only a file count.",\n "roadmap_not_release": "Unchecked Markdown task embedded in a changelog.",\n "substantive_or_unverified": "Behavioral, compatibility, test or documentation claim that still needs evidence."\n }\n },\n "repositories": [\n {\n "repository": "semcod__code2docs",\n "commit": "c738aff7bd51670104e144ae19b657fd3915565d",\n "runId": "20260731T072143Z-a3208b84",\n "graphFingerprint": "83dcfa7a5b21ca7714b9546bef4baead7ef197e936a0b61088bde2cb1c275643",\n "records": 6717,\n "relations": 35468,\n "residualFindings": 269,\n "residualLabelCounts": {\n "non_actionable_file_update": 142,\n "substantive_or_unverified": 127\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__code2llm",\n "commit": "b297d600ae7d923ce22730bc90c6cd330ec7e243",\n "runId": "20260731T072152Z-fb1ab530",\n "graphFingerprint": "bd57f05a14c3abca5ebcbb95a6ad9b3fbb47ff40f656846c5b4857fd5ecde407",\n "records": 16899,\n "relations": 41758,\n "residualFindings": 955,\n "residualLabelCounts": {\n "non_actionable_file_update": 305,\n "roadmap_not_release": 15,\n "substantive_or_unverified": 635\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__code2logic",\n "commit": "ba93489b56f51af31206671a1f55ab860bb725c2",\n "runId": "20260731T072209Z-30215e36",\n "graphFingerprint": "c6e9f7a0671dc9b4e0c0f3fad5c5dcf1319ba674ba55bbafcc22b0caa908e6af",\n "records": 21423,\n "relations": 16933,\n "residualFindings": 120,\n "residualLabelCounts": {\n "non_actionable_file_update": 11,\n "roadmap_not_release": 15,\n "substantive_or_unverified": 94\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__domd",\n "commit": "b6c5ad24f2f2da386a2e3e5bad05433184f54c58",\n "runId": "20260731T072221Z-f577ffe7",\n "graphFingerprint": "a9d2d5eb1287b7cb69ce7cdd3aa1a77078c6e7860e96be2a602a1c0858d6e0bd",\n "records": 10611,\n "relations": 7484,\n "residualFindings": 99,\n "residualLabelCounts": {\n "substantive_or_unverified": 99\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__pactfix",\n "commit": "daf301a9e23d65cd341ffa2d6c0a6cfe728e651d",\n "runId": "20260731T072226Z-0fb2f8b8",\n "graphFingerprint": "9c2d15fc76b8585f8ae68dbd7b9f518c6cf819fce841b5178c9797e5d7d25b69",\n "records": 5161,\n "relations": 3917,\n "residualFindings": 48,\n "residualLabelCounts": {\n "non_actionable_file_summary": 1,\n "substantive_or_unverified": 47\n },\n "sampledFindings": 24\n },\n {\n "repository": "semcod__redup",\n "commit": "a175fb0a80b54fcda4bf5cd34c8b087fe9472608",\n "runId": "20260731T072230Z-6a2d832d",\n "graphFingerprint": "b3a582ffa178ee307157461e348b51757f4e726eadd809cbfa3dc8e8b143442f",\n "records": 7204,\n "relations": 19259,\n "residualFindings": 269,\n "residualLabelCounts": {\n "non_actionable_file_update": 85,\n "substantive_or_unverified": 184\n },\n "sampledFindings": 24\n },\n {\n "repository": "subactor__platform",\n "commit": "3e96573d587cb664741849ceba205bf303b9f418",\n "runId": "20260731T072237Z-6cab0835",\n "graphFingerprint": "ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d",\n "records": 10628,\n "relations": 11424,\n "residualFindings": 93,\n "residualLabelCounts": {\n "non_actionable_file_update": 4,\n "substantive_or_unverified": 89\n },\n "sampledFindings": 24\n }\n ],\n "summary": {\n "residualFindings": 1853,\n "residualLabelCounts": {\n "non_actionable_file_summary": 1,\n "non_actionable_file_update": 547,\n "roadmap_not_release": 30,\n "substantive_or_unverified": 1275\n },\n "residualLabelRepositories": {\n "non_actionable_file_summary": [\n "semcod__pactfix"\n ],\n "non_actionable_file_update": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__redup",\n "subactor__platform"\n ],\n "roadmap_not_release": [\n "semcod__code2llm",\n "semcod__code2logic"\n ],\n "substantive_or_unverified": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__domd",\n "semcod__pactfix",\n "semcod__redup",\n "subactor__platform"\n ]\n },\n "sampledFindings": 168,\n "labelCounts": {\n "non_actionable_file_summary": 1,\n "non_actionable_file_update": 28,\n "roadmap_not_release": 6,\n "substantive_or_unverified": 133\n },\n "labelRepositories": {\n "non_actionable_file_summary": [\n "semcod__pactfix"\n ],\n "non_actionable_file_update": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__redup",\n "subactor__platform"\n ],\n "roadmap_not_release": [\n "semcod__code2logic"\n ],\n "substantive_or_unverified": [\n "semcod__code2docs",\n "semcod__code2llm",\n "semcod__code2logic",\n "semcod__domd",\n "semcod__pactfix",\n "semcod__redup",\n "subactor__platform"\n ]\n }\n },\n "sample": [\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-007a432c09e33ae77b31",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "feat(tests): add tests for code analysis engine",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 12,\n "end": 12\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-041d83cf1bb5dc3b899d",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix string-concat issues (ticket-cdf62d0c)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 152,\n "end": 152\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-07b36978a72254ca951c",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.pyqual/pipeline.db); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .pyqual/pipeline.db",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n ".pyqual/pipeline.db"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 312,\n "end": 312\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-00590852c29ac35cfe4e",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (code2docs/project/dashboard.html); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update code2docs/project/dashboard.html",\n "target": {\n "paths": [\n "code2docs/project/dashboard.html"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "code2docs/project/dashboard.html"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 372,\n "end": 372\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-023fcbd1900e940d5196",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (tests/project/analysis.json); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update tests/project/analysis.json",\n "target": {\n "paths": [\n "tests/project/analysis.json"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "tests/project/analysis.json"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 678,\n "end": 678\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-32b6196132311a07042d",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Update TICKET",\n "target": {\n "paths": [],\n "symbols": [\n "TICKET"\n ],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 915,\n "end": 915\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0480b5421d7c5547f189",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix ai-boilerplate issues (ticket-7de2f0bc)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-7"\n ],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 226,\n "end": 226\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-18b8460f056f069bcc61",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "fix: repair syntax errors and module-level definitions",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 11,\n "end": 11\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-1517319ed93be089166f",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix wildcard-imports issues (ticket-c9e8e515)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 126,\n "end": 126\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-122bda82ce2140c4257f",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.gitignore); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .gitignore",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.30"\n ]\n },\n "trackedPathOwners": [\n ".gitignore"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 76,\n "end": 76\n }\n },\n "metadata": {\n "version": "3.0.30",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-047a98d95499e06a933b",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (project/project.yaml); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update project/project.yaml",\n "target": {\n "paths": [\n "project/project.yaml"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "project/project.yaml"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 538,\n "end": 538\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-037289616a91154777a0",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (tests/project/project.yaml); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update tests/project/project.yaml",\n "target": {\n "paths": [\n "tests/project/project.yaml"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "tests/project/project.yaml"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 411,\n "end": 411\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-3f10ab6e2d79275e2202",\n "stratum": "symbol:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (TODO.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update TODO.md",\n "target": {\n "paths": [],\n "symbols": [\n "TODO"\n ],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "TODO.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 305,\n "end": 305\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0c50ef140dfdcaec5137",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix llm-generated-code issues (ticket-3dd60300)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-3"\n ],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 244,\n "end": 244\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-aa77ec5c1a453d43e224",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "docs: regenerate documentation",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 8,\n "end": 8\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-153a9eedc9a3badc2543",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix relative-imports issues (ticket-b5156dbd)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 143,\n "end": 143\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-12327418fe16f96aa3e8",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.gitignore); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .gitignore",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n ".gitignore"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 808,\n "end": 808\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0683d30858be70c27880",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (code2docs/project/context.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update code2docs/project/context.md",\n "target": {\n "paths": [\n "code2docs/project/context.md"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "code2docs/project/context.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 586,\n "end": 586\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-0398d74e08f68b09acfe",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (tests/project/dashboard.html); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update tests/project/dashboard.html",\n "target": {\n "paths": [\n "tests/project/dashboard.html"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "tests/project/dashboard.html"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 430,\n "end": 430\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-913277007c6044bb88bf",\n "stratum": "symbol:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (CHANGELOG.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update CHANGELOG.md",\n "target": {\n "paths": [],\n "symbols": [\n "CHANGELOG"\n ],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [\n "CHANGELOG.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 303,\n "end": 303\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-1356c7ab3e3a12a78f1d",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix relative-imports issues (ticket-80fa29e7)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-80"\n ],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 145,\n "end": 145\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-dd5e1cd15a4dea921111",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "docs(docs): add markdown output",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 6,\n "end": 6\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-1907d230d65dd07b5ba5",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix unused-imports issues (ticket-e0f2ff98)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.28"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 148,\n "end": 148\n }\n },\n "metadata": {\n "version": "3.0.28",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2docs",\n "recordId": "INT-CHANGELOG-14ec3463be6026cb6c61",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (code2docs/templates/readme.md.j2); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update code2docs/templates/readme.md.j2",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "3.0.31"\n ]\n },\n "trackedPathOwners": [\n "code2docs/templates/readme.md.j2"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 64,\n "end": 64\n }\n },\n "metadata": {\n "version": "3.0.31",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0d270ce5476cbd971d60",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Initial project structure",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3334,\n "end": 3334\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0738cc3774b9ec8ddfb6",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "**Setup**: Updated setup.py and pyproject.toml with new name",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2935,\n "end": 2935\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-04f9cc09cd33d1d0811e",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix relative-imports issues (ticket-f36da736)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 1376,\n "end": 1376\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-033e144a42ed113b5de4",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (debug/.code2flow_cache/__init___563e1960e3f8fe02.pkl); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "update debug/.code2flow_cache/__init___563e1960e3f8fe02.pkl",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3223,\n "end": 3223\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-25c546008701d419870f",\n "stratum": "none:remove",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "remove",\n "text": "**`optimization/`** (1590L dead code) β€” 4 files, zero external imports",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2915,\n "end": 2915\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Removed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0362f0aa535e6aa4d408",\n "stratum": "none:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (test_prompt/root/analysis.toon); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update test_prompt/root/analysis.toon",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [\n "test_prompt/root/analysis.toon"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2342,\n "end": 2342\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-1326ad7579fd87e571b4",\n "stratum": "path:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "`examples/litellm/` β€” code2llm + LiteLLM Python automation",\n "target": {\n "paths": [\n "examples/litellm"\n ],\n "symbols": [\n "LiteLLM"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2863,\n "end": 2863\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-5a7c0208748441b0ed4b",\n "stratum": "path:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "LLMPromptExporter now outputs `context.md` by default",\n "target": {\n "paths": [\n "context.md"\n ],\n "symbols": [\n "context.md",\n "LLMPromptExporter"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3071,\n "end": 3071\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-69fccb36d67f6aa41e3d",\n "stratum": "path:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "`_SKIP_DIR_NAMES` blanket-excluded any directory named exactly `lib`, `lib64`, `include`, `bin`, or `share` from analysis, regardless of location. These are common legitimate source directory names (Ruby gems keep all source in `lib/`, PlatformIO/Arduino firmware projects keep custom libraries in `lib/`, C/C++ projects keep headers in `include/`, Node packages ship CLI entrypoints in `bin/`), so real code was silently dropped from the analysis. The entries were also redundant: virtualenv directories are already fully pruned via the `venv`/`.venv`/`env`/`.env` entries, and `site-packages` remains excluded directly.",\n "target": {\n "paths": [\n "bin",\n "lib"\n ],\n "symbols": [\n "_SKIP_DIR_NAMES",\n "bin",\n "CLI",\n "env",\n "include",\n "lib",\n "lib64",\n "PlatformIO",\n "share",\n "venv"\n ],\n "tickets": [],\n "versions": [\n "0.5.170"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 104,\n "end": 110\n }\n },\n "metadata": {\n "version": "0.5.170",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0190963b4ae7a6521047",\n "stratum": "path:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (.planfile/.koru/nfo-events.jsonl); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update .planfile/.koru/nfo-events.jsonl",\n "target": {\n "paths": [\n ".planfile/.koru/nfo-events.jsonl"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.154"\n ]\n },\n "trackedPathOwners": [\n ".planfile/.koru/nfo-events.jsonl"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 324,\n "end": 324\n }\n },\n "metadata": {\n "version": "0.5.154",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-1b64c0434baadae69464",\n "stratum": "path:test",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (test_dynamic/root/context.md); it makes no behavioral implementation claim.",\n "action": "test",\n "text": "Update test_dynamic/root/context.md",\n "target": {\n "paths": [\n "test_dynamic/root/context.md"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [\n "test_dynamic/root/context.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2319,\n "end": 2319\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-04b8e5da810f6edf8f04",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "`--format context` β€” generate context.md (LLM narrative)",\n "target": {\n "paths": [],\n "symbols": [\n "LLM"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3065,\n "end": 3065\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-2271f83cd10dedcdb834",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "**Structural Refactoring** β€” 9 high-CC functions split into focused helpers:",\n "target": {\n "paths": [],\n "symbols": [\n "CC"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2846,\n "end": 2846\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0e20ed711e7a07b20012",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Human-readable node IDs (e.g. `core__ProjectAnalyzer_analyze`) instead of hashes",\n "target": {\n "paths": [],\n "symbols": [\n "core__ProjectAnalyzer_analyze",\n "IDs"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2887,\n "end": 2887\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-004e32ce7a04dd631cc0",\n "stratum": "symbol:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (SUMR.json); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update SUMR.json",\n "target": {\n "paths": [],\n "symbols": [\n "SUMR"\n ],\n "tickets": [],\n "versions": [\n "0.5.121"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 998,\n "end": 998\n }\n },\n "metadata": {\n "version": "0.5.121",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-80fca22b9324bf837b62",\n "stratum": "symbol:remove",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "remove",\n "text": "**`visualizers/`** (150L dead code) β€” never imported from CLI or other modules",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2916,\n "end": 2916\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Removed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-018dece31f6435cdc31f",\n "stratum": "ticket:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix unused-imports issues (ticket-660b3f81)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [\n "TICKET-660"\n ],\n "versions": [\n "0.1.10"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 578,\n "end": 578\n }\n },\n "metadata": {\n "version": "0.1.10",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0f4c94d2db19355291f2",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Modules, imports, signatures, type information",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3050,\n "end": 3050\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-18617cda6e84a813b11f",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Purpose: \\"understand the system to rebuild it\\"",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3072,\n "end": 3072\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-052def3dac8407406f1d",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fix string-concat issues (ticket-e62394c5)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 1450,\n "end": 1450\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-03809423828c9bd21d76",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (context.md); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "Update context.md",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [\n "calls_output/context.md",\n "context.md",\n "project/batch_1/context.md",\n "project/context.md",\n "project/root/context.md",\n "project/test_python_only_examples/context.md",\n "project_calls_test/context.md",\n "test_dynamic/batch_1/context.md",\n "test_dynamic/context.md",\n "test_dynamic/root/context.md",\n "test_dynamic2/batch_1/context.md",\n "test_dynamic2/context.md",\n "test_dynamic2/root/context.md",\n "test_metrics/batch_1/context.md",\n "test_metrics/context.md",\n "test_metrics/root/context.md",\n "test_prompt/batch_1/context.md",\n "test_prompt/context.md",\n "test_prompt/root/context.md"\n ],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2242,\n "end": 2242\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Docs"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-0fa67f02b2b3bc99ea0c",\n "stratum": "none:test",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "test",\n "text": "all tests passing (17/17)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3122,\n "end": 3122\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Test"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-1cdb3440bf24066341af",\n "stratum": "path:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "`examples/shell-llm/` β€” code2llm + aider / llm / sgpt integration",\n "target": {\n "paths": [\n "examples/shell-llm"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 2862,\n "end": 2862\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2llm",\n "recordId": "INT-CHANGELOG-6bc960ae574072f22679",\n "stratum": "path:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "**Renamed `llm_prompt.md` β†’ `context.md`** β€” LLM narrative context",\n "target": {\n "paths": [\n "context.md",\n "llm_prompt.md"\n ],\n "symbols": [\n "context.md",\n "LLM",\n "llm_prompt.md"\n ],\n "tickets": [],\n "versions": [\n "0.5.105"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 3070,\n "end": 3070\n }\n },\n "metadata": {\n "version": "0.5.105",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-040ee3f3a2db29a5ebac",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Keyword matching with weighted scoring",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 122,\n "end": 122\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-002748ad2ef518479544",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "refactor(goal): code analysis engine",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 13,\n "end": 13\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-9b3f62f06c9e4d937f81",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Parallel processing pickle compatibility issues",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 189,\n "end": 189\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-0d8aef8cc675a876443d",\n "stratum": "none:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Integration with Git for diff analysis",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 217,\n "end": 217\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.4.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-04fd361ca057623214db",\n "stratum": "symbol:add",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "add",\n "text": "[ ] Support for additional languages (JavaScript, TypeScript)",\n "target": {\n "paths": [],\n "symbols": [\n "JavaScript",\n "TypeScript"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 213,\n "end": 213\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.3.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-08f42da84f60807ed95c",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "refactor(goal): CLI interface improvements",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 14,\n "end": 14\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-234fb71d07ff9a0ef1a0",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Import errors in CLI module",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 187,\n "end": 187\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-061661c552d47775aa89",\n "stratum": "symbol:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Custom pattern definition via YAML",\n "target": {\n "paths": [],\n "symbols": [\n "YAML"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 218,\n "end": 218\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.4.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-06bbe4e218e0fc383199",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Configurable include/exclude patterns",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 104,\n "end": 104\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-079941d830c0897d4138",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "feat(goal): deep code analysis engine with 7 supporting modules",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 5,\n "end": 5\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-fe53dd76398239df8c40",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Attribute mismatches between models and exporters",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 188,\n "end": 188\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-1823c8f942da75202a99",\n "stratum": "none:release",\n "label": "non_actionable_file_update",\n "rationale": "Names only the updated file (debug/.code2flow_cache/__init___092c164e1ea3ed2a.pkl); it makes no behavioral implementation claim.",\n "action": "release",\n "text": "update debug/.code2flow_cache/__init___092c164e1ea3ed2a.pkl",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.1"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 72,\n "end": 72\n }\n },\n "metadata": {\n "version": "0.2.1",\n "category": "Other"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-1acd7ec0e5b03bd166f3",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Complete API documentation",\n "target": {\n "paths": [],\n "symbols": [\n "API"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 174,\n "end": 174\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-11b35738afd546050d83",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Enhanced type hints for better IDE support",\n "target": {\n "paths": [],\n "symbols": [\n "IDE"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 183,\n "end": 183\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-402ce8711ede42fa1de2",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "FlowEdge attribute access (condition -> conditions)",\n "target": {\n "paths": [],\n "symbols": [\n "FlowEdge"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 190,\n "end": 190\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-198fdb6a3f363a257f3b",\n "stratum": "symbol:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] VS Code extension",\n "target": {\n "paths": [],\n "symbols": [\n "VS"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 212,\n "end": 212\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.3.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-0ba858ac3aa35d64a4df",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "**Pipeline Integration (4a-4e)**",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 133,\n "end": 133\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-1b2f48d6897f60cd0567",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Refactored monolithic flow.py into modular package structure",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 181,\n "end": 181\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-259a2416825cfdf8df5a",\n "stratum": "none:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Advanced pattern detection (factory, singleton, observer)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 210,\n "end": 210\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 0.3.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-218b12b8bfb2e02d90a4",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Automatic PNG generation from Mermaid files",\n "target": {\n "paths": [],\n "symbols": [\n "PNG"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 154,\n "end": 154\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-45ba4613581ef189a617",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated setup.py for PyPI publication readiness",\n "target": {\n "paths": [],\n "symbols": [\n "PyPI"\n ],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 184,\n "end": 184\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-436b19b2fdc1c36f80e4",\n "stratum": "symbol:release",\n "label": "roadmap_not_release",\n "rationale": "Unchecked Markdown denotes planned work, not a released implementation claim.",\n "action": "release",\n "text": "[ ] Performance optimizations for 100k+ LOC projects",\n "target": {\n "paths": [],\n "symbols": [\n "LOC"\n ],\n "tickets": [],\n "versions": [\n "Future"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 226,\n "end": 226\n }\n },\n "metadata": {\n "version": "Future",\n "category": "Planned for 1.0.0"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-0d784351fc177548b285",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Cross-language fuzzy matching",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.2.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 141,\n "end": 141\n }\n },\n "metadata": {\n "version": "0.2.0",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__code2logic",\n "recordId": "INT-CHANGELOG-2b6233f63df1c1d90ce8",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "feat(config): deep code analysis engine with 6 supporting modules",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 4,\n "end": 4\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-03c6c12104e1588e73c9",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Pattern-based file inclusion/exclusion",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 82,\n "end": 82\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-006c4c43eb21d009b3f5",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Improved error handling in command detection",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.41"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 55,\n "end": 55\n }\n },\n "metadata": {\n "version": "2.2.41",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-1f28ff4213e6819e9c67",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Resolved build issues with package versioning",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.50"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 42,\n "end": 42\n }\n },\n "metadata": {\n "version": "2.2.50",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-06ea63574a858804df0a",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "**Bundler**: Ruby gem management",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 120,\n "end": 120\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Supported Parsers"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-dcdf05e948c6d085ad37",\n "stratum": "path:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for JavaScript/Node.js projects (package.json, npm scripts)",\n "target": {\n "paths": [\n "JavaScript/Node.js"\n ],\n "symbols": [\n "JavaScript"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 70,\n "end": 70\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-56dbf101a0a6cd4eede1",\n "stratum": "path:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Configuration file support (`.domd.yaml`)",\n "target": {\n "paths": [\n ".domd.yaml"\n ],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Roadmap"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 209,\n "end": 209\n }\n },\n "metadata": {\n "version": "Roadmap",\n "category": "Upcoming Features (v0.2.0)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-22e184819c81a9506b1e",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Comprehensive CLI interface with dry-run mode",\n "target": {\n "paths": [],\n "symbols": [\n "CLI"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 80,\n "end": 80\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-9ca67cc23d78bc49f158",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated version to 2.2.41 for PyPI publication",\n "target": {\n "paths": [],\n "symbols": [\n "PyPI"\n ],\n "tickets": [],\n "versions": [\n "2.2.41"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 54,\n "end": 54\n }\n },\n "metadata": {\n "version": "2.2.41",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-346e0c2677e96bb808a5",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "**JavaScript**: package.json scripts, npm/yarn/pnpm installations",\n "target": {\n "paths": [],\n "symbols": [\n "JavaScript"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 112,\n "end": 112\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Supported Parsers"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-083e44ba3563c8ccdd84",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for Docker (Dockerfile, docker-compose.yml)",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 73,\n "end": 73\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-7d67b9be120a51f35315",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Enhanced documentation structure and readability",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.41"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 56,\n "end": 56\n }\n },\n "metadata": {\n "version": "2.2.41",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-22fe6e6bf391de6da44d",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Interactive fix mode",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Roadmap"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 212,\n "end": 212\n }\n },\n "metadata": {\n "version": "Roadmap",\n "category": "Upcoming Features (v0.2.0)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-087c77659da9ca4f8510",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Discussions: https://github.com/wronai/domd/discussions",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Support"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 243,\n "end": 243\n }\n },\n "metadata": {\n "version": "Support",\n "category": "Long-term Goals (v1.0.0+)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-303bf9b297fc5636d210",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for build systems (Makefile, CMakeLists.txt, Gradle, Maven)",\n "target": {\n "paths": [],\n "symbols": [\n "CMakeLists"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 72,\n "end": 72\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-9702895f07211c45762c",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Stable API",\n "target": {\n "paths": [],\n "symbols": [\n "API"\n ],\n "tickets": [],\n "versions": [\n "Roadmap"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 226,\n "end": 226\n }\n },\n "metadata": {\n "version": "Roadmap",\n "category": "Long-term Goals (v1.0.0+)"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-2d3bb5683e287b5653b2",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "**0.0.1** - Project setup and structure",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.0.1",\n "Version"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 159,\n "end": 159\n }\n },\n "metadata": {\n "version": "Version",\n "category": "Added in 0.0.1"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-24715491b42e23c0333b",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Suggested fix actions for common issues",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 128,\n "end": 128\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Output Features"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-157440dc7139fcbb686d",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Type hints throughout codebase",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 95,\n "end": 95\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Technical Details"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-39c81dc2ec39b325b244",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Support for other languages (PHP, Ruby, Rust, Go)",\n "target": {\n "paths": [],\n "symbols": [\n "PHP"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 75,\n "end": 75\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-bac803460974b381a72c",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "`domd --format json` - JSON output",\n "target": {\n "paths": [],\n "symbols": [\n "JSON"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 106,\n "end": 106\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Example Commands"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-419965defb31b2acbbd5",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "**2.2.41** - Web interface and documentation improvements",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.41",\n "Version"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 157,\n "end": 157\n }\n },\n "metadata": {\n "version": "Version",\n "category": "Added in 0.0.1"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-4b2d992b057d695b58be",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Fixed version inconsistency across the codebase",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "2.2.50"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 41,\n "end": 41\n }\n },\n "metadata": {\n "version": "2.2.50",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-23bc61d3c447b474697e",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Code formatting with Black",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 138,\n "end": 138\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Quality Assurance"\n }\n },\n {\n "repository": "semcod__domd",\n "recordId": "INT-CHANGELOG-45f150ec71926e19fc4b",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "CI/CD pipeline configuration",\n "target": {\n "paths": [],\n "symbols": [\n "CD",\n "CI"\n ],\n "tickets": [],\n "versions": [\n "0.1.0"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 86,\n "end": 86\n }\n },\n "metadata": {\n "version": "0.1.0",\n "category": "Features Added in 0.1.0"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-06b81bb57751459895c4",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Multi-language support for 20+ formats",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 50,\n "end": 50\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-138ace557665dca1b887",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated git commit helper",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 62,\n "end": 62\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-0d452579f528cb0ab62a",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Missing fix comments for bash analysis",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 31,\n "end": 31\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-03b4de2c7477f55e32f4",\n "stratum": "none:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "Docker sandbox testing documentation",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 42,\n "end": 42\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Improved"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-1d0f0c2527f1fa778a7d",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Share via URL feature",\n "target": {\n "paths": [],\n "symbols": [\n "URL"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 48,\n "end": 48\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-4fecb38757995b6a40c3",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated PYPI.md documentation",\n "target": {\n "paths": [],\n "symbols": [\n "PYPI"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 12,\n "end": 12\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-72529c9f2e1377fcbaac",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "E2E test stability improvements",\n "target": {\n "paths": [],\n "symbols": [\n "E2E"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 33,\n "end": 33\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-6d99ee5393b0a775d452",\n "stratum": "symbol:release",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "release",\n "text": "API documentation with all endpoints (`/api/analyze`, `/api/health`, `/api/snippet`)",\n "target": {\n "paths": [],\n "symbols": [\n "API"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 39,\n "end": 39\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Improved"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-06bfbedc79c4aa6604e8",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "History tracking for all fixes",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 46,\n "end": 46\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-1953c1c87e68cf630253",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Refactored Docker Compose and Kubernetes analyzers",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 11,\n "end": 11\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-35808c1e9b8eb40dc3d3",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Basic syntax highlighting",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 56,\n "end": 56\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-0f187af78faebbbbf9b9",\n "stratum": "none:release",\n "label": "non_actionable_file_summary",\n "rationale": "Opaque file-count bookkeeping provides no behavior to ground.",\n "action": "release",\n "text": "chore: update 6 files",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 93,\n "end": 93\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "From Source"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-53b2e841c946a1b0148c",\n "stratum": "symbol:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "refactor: introduce new DSL (refactoring with new DSL)",\n "target": {\n "paths": [],\n "symbols": [\n "DSL"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 90,\n "end": 90\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "From Source"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-f4076a9818a0c35fb0fe",\n "stratum": "symbol:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated Playwright E2E test configuration",\n "target": {\n "paths": [],\n "symbols": [\n "E2E"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 17,\n "end": 17\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-a6ab4708788d7fc9c56b",\n "stratum": "symbol:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Initial UI responsiveness issues",\n "target": {\n "paths": [],\n "symbols": [\n "UI"\n ],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 55,\n "end": 55\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Fixed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-0d1456c0762fb6678aae",\n "stratum": "none:add",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "add",\n "text": "Jenkinsfile support for pipeline analysis",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 21,\n "end": 21\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Added"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-2a5ac33f3fed647982db",\n "stratum": "none:change",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "change",\n "text": "Updated sandbox test scripts",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unreleased"\n ]\n },\n "trackedPathOwners": [],\n "source": {\n "path": "CHANGELOG.md",\n "lines": {\n "start": 61,\n "end": 61\n }\n },\n "metadata": {\n "version": "Unreleased",\n "category": "Changed"\n }\n },\n {\n "repository": "semcod__pactfix",\n "recordId": "INT-CHANGELOG-477dbb5b08683c4e4342",\n "stratum": "none:fix",\n "label": "substantive_or_unverified",\n "rationale": "Contains a behavior, compatibility, quality or documentation claim that still requires evidence review.",\n "action": "fix",\n "text": "Clear input functionality",\n "target": {\n "paths": [],\n "symbols": [],\n "tickets": [],\n "versions": [\n "Unr\n\n... [truncated - file too large]", "is_subdir": true}, {"name": "AI-Codex.md", "rel_path": "ticket-001/AI-Codex.md", "path": "ticket-001 / AI-Codex.md", "size": "797B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI Agent)\n\n- **Ticket**: ticket-001\n- **Status**: DONE\n\n## Assigned Instructions\n\nPrzygotowaΔ‡ repozytorium w organizacji `semcod`, tworzΔ…c wyΕ‚Δ…cznie obowiΔ…zkowy bootstrap z `wellmanifest/new-project` oraz katalog `docs/`.\n\n## Implementation Plan\n\n1. ZweryfikowaΔ‡ zasady i wymagane pliki.\n2. UtworzyΔ‡ minimalny bootstrap w repozytorium docelowym.\n3. ZweryfikowaΔ‡ strukturΔ™, stan GitHub i Docker.\n4. ZatrzymaΔ‡ pracΔ™ przed tworzeniem kodu i oczekiwaΔ‡ na akceptacjΔ™ uΕΌytkownika.\n\n## Actual Changes Made\n\n- Utworzono wymagane dokumenty projektu i ticketu.\n- Dodano wymagane pliki Docker, skrypty projektowe i szablony.\n- Utworzono pusty katalog `docs/`.\n\n## Blockers & Open Items\n\n- Silnik Docker musi zostaΔ‡ uruchomiony przed walidacjΔ… konfiguracji kontenerowej.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-006/README.md", "path": "ticket-006 / README.md", "size": "3.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 006: Canonical structured-output conformance\n\n- **ID**: ticket-006\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nMake structured LLM responses fail with precise, auditable contract diagnostics\nand remove drift between the response schema sent to a provider, the published\nJSON Schema and runtime validation. Start with the experimental semantic\nreranker because ticket-005 measured three different provider violations on a\ntracked repository.\n\nExecutable implementation belongs in `src/`, regression coverage in `test/`\nand optional live reproducers in `scripts/research/`. This ticket directory is\nlimited to governance, decisions, logs and captured evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: One canonical structural definition supplies or verifies the\n provider response schema, published JSON Schema and TypeScript-facing shape.\n- [x] AC-02: Runtime validation reports the exact failing property and response\n identity without persisting source payloads or secrets.\n- [x] AC-03: Wrong envelope names, missing decisions, string/percent confidence,\n unknown fields and invalid verdict/reason combinations fail closed.\n- [x] AC-04: No implicit coercion and no fallback to raw retrieval; any\n corrective retry is bounded, audited and retains both response identities.\n- [x] AC-05: Offline tests cover conforming and non-conforming providers without\n network access.\n- [x] AC-06: A clean tracked-repository live check compares at least two\n explicitly identified provider/model routes before any production retention.\n- [x] AC-07: The deterministic linker, CLI, MCP and A2A remain unchanged unless\n the quality and privacy gates pass.\n- [x] AC-08: Full verification, both gold versions, examples, dependency audit\n and smoke gates pass.\n- [x] AC-09: No executable source is stored under `project/ticket-006`.\n\n## Non-goals\n\n- Accepting provider output by renaming fields or coercing values.\n- Lowering evidence or citation requirements.\n- Enabling semantic reranking by default.\n- Editing a human-owned participant file from the agent process.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n- [`../ticket-005/audit.md`](../ticket-005/audit.md)\n\n## Approval\n\n- **Decision**: approved to investigate and continue subsequent todo2code\n tickets\n- **Evidence**: current user instruction\n- **Date**: 2026-07-31\n\nThe agent deliberately does not materialize that decision as a human-authored\nparticipant file. A human or trusted intake boundary must do so.\n\n## Conclusion\n\nThe conformance hardening is retained; semantic production enablement remains\nrejected. The provider schema, runtime validator and TypeScript shape now share\none internal definition, while full verification checks it against the\npublished result schema. Diagnostics identify the exact property plus provider,\nresolved model and response ID without retaining the raw response.\n\nNeither tested route met the contract. `qwen/qwen3.7-plus` produced three\ndifferent envelope/type violations in ticket-005.\n`qwen/qwen3.7-flash` added the forbidden property\n`response.decisions[0].decision`. Both failed before graph mutation. No\nreranker was exported or enabled.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-019/README.md", "path": "ticket-019 / README.md", "size": "3.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 019: Publish the Python SDK as the root todo2code package\n\n- **ID**: ticket-019\n- **Owner**: unresolved:human\n- **Status**: PLAN\n- **Workflow state**: WAIT_FOR_APPROVAL\n- **Created**: 2026-08-01\n\n## Goal and scope\n\nPublish the dependency-free Python SDK from the repository root as the PyPI\ndistribution `todo2code`. The root `pyproject.toml` becomes the single Python\npackage manifest, while `sdk/python/pyproject.toml` is removed. The distribution\ncontains only the existing `todo2code` package and `todo2code_sdk` compatibility\nmodule; it does not embed the TypeScript runtime or the rest of the repository.\n\nThe user selected the root distribution name `todo2code`, removal of the nested\nmanifest and an SDK-only package. Python artifacts will coexist with the\nTypeScript build under `dist/`: `python -m build` does not clean that directory,\nand the Goal publish command remains restricted to\n`dist/todo2code-{version}*`.\n\n`goal.yaml` must declare the Python project type and version the root manifest.\nThe existing `make python-wheel` target must build from the root after removal\nof the nested manifest. That Makefile path overlaps active ticket-018, so\nimplementation must wait until ticket-018 releases the path or an approved\nintegration route resolves the conflict.\n\n## Planned changed paths\n\n- `pyproject.toml`: root PEP 517/PEP 621 package metadata and setuptools mapping\n to `sdk/python`.\n- `goal.yaml`: add the Python strategy to the project and move versioning from\n the nested manifest to `pyproject.toml`.\n- `sdk/python/pyproject.toml`: remove the superseded nested manifest.\n- `sdk/python/README.md`: update root installation/build examples and artifact\n names.\n- `Makefile`: make `python-wheel` build the root distribution.\n- `TODO.md`, `project/TICKETS.md` and `project/ticket-019/**`: governance and\n acceptance evidence only.\n\n## Acceptance criteria\n\n- [ ] AC-01: A human owner approves this exact scope before build metadata is\n changed.\n- [ ] AC-02: `python -m build` at the repository root produces\n `todo2code-.tar.gz` and `todo2code--py3-none-any.whl`\n without deleting the TypeScript contents already present in `dist/`.\n- [ ] AC-03: The wheel contains only the `todo2code` package, the\n `todo2code_sdk` compatibility module and required distribution metadata;\n it does not contain repository application sources or generated TS files.\n- [ ] AC-04: `sdk/python/pyproject.toml` is removed and root/local installation\n instructions use the root `pyproject.toml` without breaking\n `make python-wheel`.\n- [ ] AC-05: `goal info` detects both Node.js and Python, version synchronization\n targets the root manifest, and `goal --dry-run -a` selects the bounded\n `twine upload dist/todo2code-{version}*` publication command.\n- [ ] AC-06: `twine check` passes for both artifacts and a clean virtual\n environment can import `todo2code` and `todo2code_sdk` with the expected\n version and no third-party runtime dependencies.\n- [ ] AC-07: Existing application verification and SDK examples remain green;\n no unrelated ticket-018 or local worktree changes are modified or\n attributed to this ticket.\n\n## Participants\n\n- Human participant: unresolved; no user-* file was created by this script.\n- Agent participant: [ai-codex.md](ai-codex.md)\n\n## Approval boundary\n\n- Current state: `PLAN / WAIT_FOR_APPROVAL`.\n- Required response from: `unresolved:human`.\n- Chat approval authorizes implementation for this session but is not trusted\n merge evidence; the repository still requires its external governance gate.\n- Even after approval, the `Makefile` overlap with active ticket-018 must be\n released or explicitly routed before implementation begins.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-013/README.md", "path": "ticket-013 / README.md", "size": "1.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 013: Compare qualified Live LLM models\n\n- **ID**: ticket-013\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nRun the same six-stage `require-llm` contract check against benchmark-qualified\nOpenRouter models and determine whether any is a better todo2code default than\nthe measured `google/gemini-3.6-flash` baseline.\n\nThis directory contains governance and redacted evidence only. Runtime code\nbelongs under `src/` and operational scripts under `scripts/` if a measured\nfailure requires an implementation change.\n\n## Acceptance criteria\n\n- [x] AC-01: Every candidate is currently available and advertises\n `structured_outputs`.\n- [x] AC-02: Gemini 3 Flash Preview receives a complete six-stage live attempt.\n- [x] AC-03: Codestral 2508 receives a complete six-stage live attempt.\n- [x] AC-04: DeepSeek V4 Pro receives a bounded live attempt; crossing the\n 900-second run budget is recorded as a failed candidate, not retried away.\n- [x] AC-05: Results compare stage success, fallback/degradation, latency,\n tokens and cost against Gemini 3.6 Flash.\n- [x] AC-06: The selected default or retained baseline is justified by measured\n evidence; no model is promoted from catalog metadata alone.\n- [x] AC-07: Documentation and validation gates pass before push to `main`.\n- [x] AC-08: Unrelated `nlp2uri.yaml` remains uncommitted.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-005/README.md", "path": "ticket-005 / README.md", "size": "4.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 005: Audited cross-language reranking\n\n- **ID**: ticket-005\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nEvaluate a two-stage cross-language linking path: semantic retrieval may create\nonly a bounded candidate list, while a separate structured reranker must cite\nrepository-owned evidence and may abstain. Retain a production change only when\nit closes the six current cross-language gold gaps, preserves every forbidden\npair and improves coverage on an additional tracked repository.\n\nExecutable implementation belongs in `src/` and regression coverage in\n`test/`. Optional experiment reproducers belong in `scripts/research/`.\nThis ticket directory is limited to governance, inputs, captured outputs,\ndecisions and logs.\n\nThe approved continuation adds a prerequisite communication audit: verify that\nthe governance-standard `user-*` and `ai-*` files are converted into distinct\nhuman/agent Intent DSL records, compare their intent, and identify the\nparticipant who must respond when scope, polarity or coverage diverges.\n\n## Acceptance criteria\n\n- [x] AC-01: Define a versioned candidate and reranker contract with explicit\n model/provider identity, score, cited record IDs and abstention reason.\n- [x] AC-02: Keep network/model calls outside the synchronous deterministic\n `linkIntentRecords` boundary and preserve the current offline default.\n- [x] AC-03: Candidate generation is bounded and cannot create a relation by\n itself.\n- [x] AC-04: The reranker accepts a candidate only with repository-owned\n evidence; unsupported, ambiguous and multi-module statements abstain.\n- [x] AC-05: Gold v2 cross-language recall rises from 0/6 to 6/6 while all six\n cross-language forbidden pairs and all existing hard negatives remain clean.\n- [ ] AC-06: A tracked repository outside the ticket-004 primary pair shows\n improved implementation coverage without a manually rejected new relation.\n- [ ] AC-07: Any dependency or provider is pinned, licensed, security-reviewed,\n cacheable and optional; no private or untracked source is transmitted.\n- [x] AC-08: Full verification, both gold versions, examples, dependency audit,\n CLI/MCP/A2A smoke and Docker validation pass.\n- [x] AC-09: If the quality boundary is not met, reject the candidate without a\n production semantic rule and preserve the measured failure.\n- [x] AC-10: No executable source is stored under `project/ticket-005`.\n- [x] AC-11: Governance-standard `user-*` and `ai-*` files are recognized\n without front matter, while ticket specifications and generated evidence are\n not misclassified as participant communication.\n- [x] AC-12: Communication analysis reports an explicit response owner for\n missing response, human-agent conflict and agent work outside the human\n request.\n\n## Non-goals\n\n- Growing the hand-written Polish dictionary.\n- Lowering the three-topic lexical floor.\n- Treating embedding similarity as implementation evidence.\n- Enabling provider-dependent behavior by default.\n- Choosing one module for a genuinely multi-module requirement.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user instruction to handle the next todo2code tickets and audit\n `user-*`/`ai-*` Intent DSL divergence\n- **Date**: 2026-07-31\n\n## Conclusion\n\nThe communication prerequisite is retained. Governance `user-*` and `ai-*`\nsections become distinct human/agent Intent DSL records, and each detected\ndivergence names the role and participant who must respond.\n\nThe semantic production candidate is rejected. Captured gold decisions satisfy\n6/6 expected cross-language pairs with zero forbidden pairs, but three live\nOpenRouter attempts on the clean tracked `subactor/platform` snapshot failed\nthe structured contract before any relation could be materialized. The\nprovider first omitted `decisions`, then returned `judgments`, and finally\nreturned an invalid non-numeric confidence. Consequently AC-06 and AC-07 were\nnot demonstrated. The deterministic linker remains unchanged, and the\nexperimental reranker is not exported from the package, CLI, MCP or A2A.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-018/README.md", "path": "ticket-018 / README.md", "size": "14.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 018: Enforce new-project governance as policy-as-code\n\n- **ID**: ticket-018\n- **Owner**: unresolved:human\n- **Status**: IN_PROGRESS\n- **Workflow state**: WAIT_FOR_APPROVAL\n- **Created**: 2026-08-01\n\n## Goal and scope\n\nTurn `wellmanifest/new-project` from documentation-only guidance into a\ndeterministic policy-as-code standard, then adopt that standard in `todo2code`.\nThe gate must make intent visible before implementation: after a completed\nticket, a new multi-step code change requires a new plan-only ticket and a\nseparate human approval before source, test, build or CI implementation files\nmay be changed.\n\nThis ticket covers two coordinated repositories:\n\n- `wellmanifest/new-project`: machine-readable governance contract, validator,\n stable `GOV-*` diagnostics, reusable GitHub Actions workflow, stack profiles,\n tests and documentation. No ticket, task file or execution log will be\n created in the read-only Governance Hub.\n- `semcod/todo2code`: pinned adoption metadata, persistent `AGENTS.md`, local\n wrappers/hooks where appropriate, required governance CI job and\n deterministic semantic validation. Existing unrelated/concurrent worktree\n changes remain outside this ticket.\n\nThe implementation will not treat an agent-edited Markdown field as trusted\nhuman approval. GitHub PR review/CODEOWNERS is the merge-time trust boundary;\nlocal validation reports approval as unverified when no trusted CI context is\navailable.\n\nThe evolved scope also supports safe parallel work by several humans or agents\nwithout splitting the repository prematurely. `todo2code` remains one modular\nrepository, but tickets are assigned to declared workstreams such as\n`core-dsl`, `extractors`, `llm`, `runtime`, `interfaces`, `sdk`, `governance`\nand `integration`. At most one active implementation ticket is allowed per\nworkstream, and active tickets may not claim overlapping write paths. Explicit\ndependency and conflict edges replace implicit coordination; cross-workstream\ncontract changes require an integration ticket instead of silently widening an\nexisting ticket.\n\n## Planned changed paths\n\n- Governance Hub: manifest/schema, validator and tests, reusable workflow,\n stack profiles, templates/scripts, policy documentation and version notes.\n- `todo2code`: `.governance/**`, `AGENTS.md`, governance workflow integration,\n package/Make targets only where required, and ticket-018-owned governance\n records.\n- Application source changes are excluded unless a focused test proves they\n are necessary for the deterministic `todo2code` governance command.\n\n## Planned multi-agent contract\n\n- Extend the manifest with named workstreams, owned path patterns and a policy\n for active-ticket limits, overlap rejection and integration work.\n- Version the ticket intent contract with `workstream`, `dependsOn`,\n `conflictsWith` and optional `integrationTicket`, while retaining an explicit\n migration path for existing v1 tickets.\n- Validate unknown workstreams, overlapping active scopes, dependency cycles,\n unfinished prerequisites, incompatible tickets and missing integration\n routing through stable `GOV-*` diagnostics.\n- Keep branch/worktree isolation and a merge queue as CI/repository controls;\n do not infer that a local filesystem lock is a trusted distributed lock.\n- Preserve deterministic enforcement. LLM analysis may explain a divergence,\n but cannot classify it away or approve a scope expansion.\n\n## Planned Koru code-review extension\n\nThe user requested automated code review through Koru. The implementation will\nadd a read-only GitHub check named `koru / code-review`, run for pull requests\nand explicit historical-review dispatches. It will pin Koru 0.1.444 and Vallm\n0.1.94, select only changed supported source files, and let Koru execute one\nbounded Vallm review round. The review combines deterministic syntax,\ncomplexity and security checks with an OpenRouter semantic judge supplied by\nthe existing organization-level `OPENROUTER_API_KEY` secret.\n\nThe workflow will never use `pull_request_target`, check out untrusted code\nwith a write-capable token, modify source, auto-fix, commit, push or submit a\nGitHub `APPROVE` review. A missing secret or semantic-provider failure is an\nexplicit non-passing outcome rather than a silent deterministic fallback.\nForked pull requests therefore require a trusted maintainer rerun in a safe\ncontext instead of receiving organization secrets.\n\nThe machine-readable report will be bound to repository, base SHA, head SHA,\ntool versions and verdict, uploaded as a CI artifact and covered by a GitHub\nartifact attestation. A repository ruleset will require both the existing\ngovernance check and `koru / code-review`; the Koru attestation is independent\nread-only review evidence, not evidence that the implementation author or this\nagent self-approved.\n\n## Acceptance criteria\n\n- [x] AC-01: A human approves this understanding and execution checklist before\n any implementation file is changed.\n- [x] AC-02: A versioned machine-readable manifest and schema define ticket,\n approval, ownership, scope, Docker, evidence and stack requirements.\n- [x] AC-03: A dependency-light deterministic validator emits documented stable\n `GOV-*` codes with message, affected paths/evidence and remediation, plus\n machine-readable JSON/SARIF output where applicable.\n- [x] AC-04: The validator rejects code changes without a preceding active and\n approved ticket, multiple active tickets, malformed tickets, out-of-scope\n paths, agent edits of `user-*.md`, executable files in ticket directories,\n manifest drift, missing Docker declarations and forbidden secrets/paths.\n- [x] AC-05: Approval provenance is checked against a trusted GitHub review\n boundary in CI; local or Markdown-only approval is never presented as a\n cryptographically trusted fact.\n- [ ] AC-06: A centrally maintained reusable GitHub workflow is pinned by\n immutable revision and documented together with the required repository\n ruleset/CODEOWNERS settings.\n- [x] AC-07: Stack profiles provide appropriate gates for Node, Python, Go,\n Rust, Java, Docker, frontend E2E and infrastructure repositories without\n silently claiming unavailable tools.\n- [x] AC-08: `todo2code` adopts the manifest lock, persistent agent instructions\n and a governance CI gate; its existing offline application and Docker E2E\n checks remain operational.\n- [x] AC-09: Central validator fixture tests demonstrate both allowed and denied\n state transitions, including the exact ticket-017 DONE -> ticket-018 PLAN\n sequence used here.\n- [x] AC-10: Relevant checks run in Docker where required, raw evidence is\n recorded, diffs are reviewed and no commit or push occurs unless requested.\n- [x] AC-11: The manifest defines named workstreams, their path ownership,\n per-workstream active-ticket limits and a fail-closed overlap policy.\n- [x] AC-12: The versioned intent schema represents workstream, dependencies,\n conflicts and integration routing without invalidating archived v1\n tickets or silently upgrading their meaning.\n- [x] AC-13: Stable diagnostics reject unknown workstreams, two active tickets\n in one workstream, overlapping active write scopes, dependency cycles,\n unfinished prerequisites and unresolved cross-workstream changes.\n- [x] AC-14: Fixture tests cover safe parallel tickets and every rejection\n above, including path patterns whose apparent non-overlap still resolves\n to a shared concrete file.\n- [x] AC-15: CI validates every active intent together, emits JSON/SARIF\n evidence and documents worktree/branch isolation, CODEOWNERS and merge\n queue requirements without treating those local declarations as trusted\n server configuration.\n- [x] AC-16: `todo2code` adopts the workstream map and demonstrates at least\n two parallel non-overlapping intents plus one rejected overlap in Docker.\n- [ ] AC-17: Existing application and Docker E2E checks still pass; unrelated\n concurrent changes in `.env.example`, `src/`, `test/` and\n `tests/fixtures/` are neither modified nor attributed to this ticket.\n- [x] AC-18: A human approves the Koru review design, bounded scope and\n AC-18..AC-25 before the workflow or repository rules are changed.\n- [x] AC-19: A pinned pull-request/workflow-dispatch job exposes the stable\n required-check name `koru / code-review` and resolves exact base/head\n SHAs without evaluating a merge-ambiguous working tree.\n- [x] AC-20: Koru 0.1.444 runs exactly one read-only Vallm 0.1.94 review round\n over changed supported source files; auto-fix, commit, push and mutable\n dependency versions are absent.\n- [x] AC-21: Deterministic syntax/complexity/security checks and semantic\n LLM-as-judge review fail closed on findings, missing credentials,\n malformed output or provider failure, with no secret value in logs.\n- [x] AC-22: The structured report records repository, base/head SHA, selected\n files, tool/model versions and verdict, is uploaded with fixed retention,\n and receives GitHub artifact provenance attestation.\n- [x] AC-23: The workflow uses least-privilege read permissions, never uses\n `pull_request_target`, and treats fork PRs without secrets as requiring a\n trusted rerun rather than exposing organization credentials.\n- [x] AC-24: A repository ruleset requires `governance / enforce` and\n `koru / code-review`, blocks direct updates to `main`, dismisses stale\n evidence after new commits and cannot be bypassed by the implementation\n agent.\n- [x] AC-25: Workflow syntax, local Koru/Vallm probes, negative failure paths,\n `npm run verify`, governance and relevant Docker checks pass; the\n pre-existing ticket-019 findings remain separately attributed.\n\n## Participants\n\n- Human participant: unresolved; no user-* file was created by this script.\n- Agent participant: [ai-codex.md](ai-codex.md)\n\n## Risks and constraints\n\n- Git hooks are bypassable and therefore cannot be the final authority; branch\n protection or organization rulesets must require the server-side check.\n- A workflow stored only in the target repository can be weakened in the same\n pull request; the design must pin central code and document external required\n workflow/ruleset enforcement.\n- The current Governance Hub `project.sh` installs unpinned latest packages on\n the host and suppresses some failures. It must not be used as evidence that\n strict, reproducible governance already exists.\n- `todo2code` currently has a large dirty worktree with concurrent changes.\n Implementation must use path-specific diffs and must not rewrite or attribute\n unrelated files to ticket-018.\n- Live LLM behavior is nondeterministic and provider-dependent. It may produce\n advisory findings but cannot be a required merge gate.\n\n## Validation result and publication blockers\n\nThe multi-workstream extension was explicitly approved by the user in chat on\n2026-08-01. The results below describe the already executed 0.7.0 baseline and\nremain historical evidence, not evidence for AC-11..AC-17.\n\n- Central scaffolder and validator fixtures pass, including allowed/denied\n approval, ownership, scope, executable-ticket content, manifest integrity and\n commit-order cases.\n- Target-scoped governance validation passes locally and in the offline Docker\n image. Negative probes return the expected stable codes.\n- Docker E2E core passes 328 tests with 7 explicit optional-toolchain skips;\n Docker E2E full passes 328/328 with zero skips, both gold datasets, CLI, MCP,\n A2A and all five SDK examples.\n- A concurrent human commit `5f1f4bd` included the ticket, governance adoption\n and unrelated runtime work in one commit. Validation against its parent fails\n with `GOV-INTENT-003` because `intent.json` was not present in an ancestor and\n `GOV-SCOPE-001` for eight paths outside ticket-018.\n- The central 0.7.0 working tree has not been committed or published, so the\n target lock honestly records `publicationStatus: uncommitted` and cannot yet\n reference an immutable central workflow revision.\n- Repository Ruleset/CODEOWNERS configuration is external state and remains\n unverified. A trusted GitHub owner/team must be selected without guessing.\n- `new-project` 0.8.0 central schema, fixture and catalog checks pass. The\n catalog contains 27 stable codes and exactly covers every emitted `GOV-*`\n finding. Target manifest/intent Draft 2020-12 validation and its scoped\n governance gate pass.\n- Docker workstream E2E accepts two active, non-overlapping `core-dsl` and `sdk`\n tickets, then rejects their concrete overlap on `src/core/graph.ts` with\n `GOV-WORKSTREAM-004`.\n- Fresh core E2E passes; the focused Node result is 329 tests, 322 passed, zero\n failed and 7 optional-toolchain skips.\n- AC-17 remains blocked outside this governance diff. Concurrent commit\n `9928699` changed `sdk/rust/Cargo.toml` from 0.5.0 to 0.5.1 while the ignored\n local `sdk/rust/Cargo.lock` still records 0.5.0. `make e2e-full` therefore\n stops at `cargo fetch --locked` with exit 101 before the full tests start.\n Resolving it belongs to the `sdk`/`integration` workstream and requires its\n own approved ticket; ticket-018 does not rewrite or claim that artifact.\n- Pull request #1 ran `koru / code-review` successfully as run `30703151199`.\n Its `t2c.koru-code-review/v1` report binds base `06a2faa`, head `4cfd2f9`,\n the pinned tool/model versions and an empty supported-source set. The report\n was uploaded for 14 days and has a GitHub Sigstore provenance attestation.\n- Historical dispatch `30703292661` exercised the live semantic path over\n `src/comparison/workspace.ts` and `test/workspace.test.ts`. Koru rejected\n both files with exit 1; the required check failed while report construction,\n artifact upload and attestation still succeeded. The attested report digest\n is `sha256:fa0f4d0c1f780bb8d21f56ca74d8ae901e184fb4996f9e84832a87846adfc1d8`.\n No credential value appears in the workflow output.\n- Repository ruleset `20186914` is staged with no bypass actors and\n `current_user_can_bypass: never`. It targets the default branch, requires a\n pull request, dismisses stale review evidence, rejects deletion/force-push,\n and requires strict `governance / enforce` plus `koru / code-review` checks.\n Enforcement remains disabled only until this bootstrap evidence commit is\n merged; AC-24 is not claimed until the rule is activated and queried back.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-004/README.md", "path": "ticket-004 / README.md", "size": "4.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 004: Language-independent topic matching\n\n- **ID**: ticket-004\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nReplace further growth of the hand-written Polish-to-English topic dictionary\nwith a reviewable language-independent matching path. Start from a multilingual\ngold benchmark, compare feasible strategies, and integrate only a strategy that\nimproves cross-language recall without weakening exact-target evidence or the\nprecision-oriented capability-topic boundary.\n\nThe primary measured repositories are `todo2code` and `subactor/platform`.\nThe unchanged seven-repository corpus from tickets 002 and 003 remains the\nregression corpus if a candidate implementation is retained.\n\n## Acceptance criteria\n\n- [x] AC-01: The existing known gap and at least five new cross-language cases\n cover multiple capabilities, inflections and hard negatives.\n- [x] AC-02: The benchmark reports cross-language positives separately from\n same-language capability-topic and exact-target quality.\n- [x] AC-03: At least two feasible strategies are evaluated for determinism,\n runtime/dependency cost, auditability, cacheability and offline behavior.\n- [x] AC-04: Any retained matcher carries explicit evidence in the relation\n basis and cannot silently masquerade as an exact token match.\n- [x] AC-05: A candidate is retained only if it closes the current known gap,\n preserves all hard negatives and leaves gold v1/v2 quality perfect.\n- [x] AC-06: The retained candidate improves aligned coverage on\n `subactor/platform` without reducing it on `todo2code`; otherwise the\n experiment closes without a production semantic change.\n- [x] AC-07: Full verification, SDK examples, smoke, dependency audit and\n Docker validation pass; the local Java skip is allowed only because required\n CI supplies JDK 17.\n- [x] AC-08: Commands, measurements, rejected approaches and remaining risks\n are preserved under this ticket and summarized in `docs/READINESS.md`.\n\n## Non-goals\n\n- Extending `POLISH_TOPIC_ALIASES` with another domain vocabulary batch.\n- Lowering the current three-topic floor merely to raise recall.\n- Sending source code or private/untracked repository content to a provider.\n- Making offline CI depend on a network model.\n- Treating semantic similarity as implementation evidence without recording\n its origin and score.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`audit.md`](audit.md)\n- [`benchmark.json`](benchmark.json)\n- [`scripts/research/evaluate-embedding-pairs.py`](../../scripts/research/evaluate-embedding-pairs.py)\n- [`minilm-results.json`](minilm-results.json)\n- [`e5-results.json`](e5-results.json)\n- [`e5-prefixed-results.json`](e5-prefixed-results.json)\n- [`scripts/research/rank-intent-graph-embeddings.py`](../../scripts/research/rank-intent-graph-embeddings.py)\n- [`platform-e5-ranking.json`](platform-e5-ranking.json)\n- [`platform-e5-reciprocal-ranking.json`](platform-e5-reciprocal-ranking.json)\n- [`iteration-01.md`](iteration-01.md)\n- [`iteration-01.json`](iteration-01.json)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user message `kontynuuj`, following the explicit recommendation\n to address matching beyond the hand-written dictionary\n- **Date**: 2026-07-31\n\n## Conclusion\n\nRaw multilingual embeddings are not safe enough to become graph evidence.\nMiniLM ranked 5/6 synthetic pairs correctly. E5 ranked 6/6, but its positive\nand negative score ranges overlap; on the tracked platform graph it proposed\ntwo new links and manual review rejected both. Reciprocal top-1 removed the\nfalse positives but added no coverage.\n\nNo production matcher was retained. The accepted library change is an explicit\ncross-language gold cohort with six known positive gaps and six gated nearby\nwrong modules. Full verification passed with 244 tests (243 pass, one local\nJDK skip), both gold versions, five SDKs, dependency audit, CLI/MCP/A2A and\nDocker smoke.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-017/README.md", "path": "ticket-017 / README.md", "size": "3.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 017: Audit and repair confirmed todo2code errors\n\n- **ID**: ticket-017\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-08-01\n\n## Goal and scope\n\nAudit the current `todo2code` workspace, reproduce concrete failures and repair\nonly defects confirmed by tests or deterministic before/after evidence. Preserve\nthe concurrent baseline and keep implementation outside this ticket.\n\nInitial confirmed candidates are:\n\n- `t2c pipeline --help` executes a pipeline and writes artifacts instead of\n displaying help or returning a non-mutating usage result;\n- Polish prohibition wording such as `Agentowi zabrania siΔ™ ...` can be assigned\n positive polarity by documentation extraction and create a false\n `CONFLICTING_INTENT` against an equivalent TODO prohibition;\n- commit `1ebad96` (published concurrently while this plan was being prepared)\n implements shared Markdown path resolution and `create` versus `modify`\n planning; it needs independent validation for correctness, bounds and\n regressions before this ticket relies on it.\n- the repository needs reproducible Docker E2E environments: a fast core suite\n and a full language-toolchain suite with stable `T2C-E2E-*` failure codes.\n\nThe untracked `nlp2uri.yaml` and all unrelated worktree changes remain outside\nthis ticket unless a test proves they are required for one of the defects above.\n\n## Acceptance criteria\n\n- [x] AC-01: A human approves this understanding and checklist before source edits.\n- [x] AC-02: Concurrent baseline commit `1ebad96` is reviewed and not overwritten\n or attributed to this ticket.\n- [x] AC-03: Every repaired failure has a focused regression test and a stable,\n actionable error or diagnostic code/message where applicable.\n- [x] AC-04: `pipeline --help` is demonstrably non-mutating.\n- [x] AC-05: Equivalent Polish prohibitions no longer create a false\n `CONFLICTING_INTENT`, without weakening genuine conflict detection.\n- [x] AC-06: Shared Markdown path resolution and `create`/`modify` plans are\n deterministic, repository-bounded and correct for existing, missing,\n ambiguous and escaping paths.\n- [x] AC-07: Full offline verification, gold evaluation and relevant examples\n pass in the project Docker environment.\n- [x] AC-08: A deterministic before/after run on the Governance Hub clears the\n identified false conflict and records any remaining diagnostics honestly.\n- [x] AC-09: Documentation, changelog and error-code references match the final\n behavior; no auto-apply, commit or push occurs without a separate request.\n\n- [x] AC-10: `make e2e-core` runs the deterministic core E2E gate in an isolated\n Docker image whose workspace agrees with `T2C_ROOT`.\n- [x] AC-11: `make e2e-full` adds Go, JDK 17, Rust and PHP, exercises all five SDK\n examples and does not silently skip the required Java adapter test.\n- [x] AC-12: E2E failures emit a documented stable code, failing step and\n remediation while preserving the underlying command output.\n\nBoth E2E suites passed on 2026-08-01. The full suite ran 318 tests with zero\nfailures and zero skips, both versioned gold benchmarks, all protocol smoke\nchecks and all five SDK examples.\n\n## Participants\n\n- Human participant: unresolved; no user-* file was created by this script.\n- Agent participant: [ai-codex.md](ai-codex.md)\n\n## Risks\n\n- The branch changed concurrently during planning; validation must pin and report\n the exact reviewed HEAD.\n- Generated `dist/` may not match source until an approved build is completed.\n- Large-repository path scans can introduce performance or ignore-scope\n regressions if their bounds are not tested.\n- A polarity fix that is too broad could hide real contradictions.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-001/README.md", "path": "ticket-001 / README.md", "size": "901B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 001: Bootstrap repozytorium todo2code\n\n- **ID**: ticket-001\n- **Owner**: semcod\n- **Status**: DONE\n- **Created**: 2026-07-29\n\n## Goal & Scope\n\nPrzygotowaΔ‡ repozytorium `semcod/todo2code` bez kodu aplikacji. Zakres obejmuje wyΕ‚Δ…cznie pliki wymagane przez `wellmanifest/new-project` oraz pusty katalog `docs/`.\n\n## Acceptance Criteria\n\n- [x] ObowiΔ…zkowe pliki bootstrapu znajdujΔ… siΔ™ w docelowym katalogu projektu.\n- [x] Istnieje katalog `docs/`.\n- [x] Nie utworzono kodu aplikacji ani plikΓ³w wykraczajΔ…cych poza wskazany zakres.\n- [x] UΕΌytkownik zaakceptowaΕ‚ opis intencji i `TODO.md`.\n- [x] Repozytorium `semcod/todo2code` istnieje na GitHubie.\n\n## Risks & Considerations\n\n- Walidacja Docker jest zablokowana, poniewaΕΌ silnik Docker nie dziaΕ‚a.\n- Zakres funkcjonalny i docelowa architektura nie sΔ… jeszcze okreΕ›lone; nie naleΕΌy ich zgadywaΔ‡.\n\n## Participants\n\n- `AI-Codex.md`\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-014/README.md", "path": "ticket-014 / README.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 014: Distinguish path presence from implemented intent\n\n- **ID**: ticket-014\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nPrevent a TODO capability from becoming `aligned` merely because its declared\ntarget file already contains unrelated AST facts. Compare the semantic intent\n(action/object/topics/symbol) with evidence inside the target before claiming\nimplementation, then expose unresolved ambiguity to the appropriate human or\nagent instead of silently choosing.\n\nRuntime implementation belongs under `src/`; this directory contains only the\nticket contract and redacted evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: A real fixture reproduces the false alignment: retry/backoff aimed\n at an existing queue file produces no `PLANNED_NOT_IMPLEMENTED` plan.\n- [x] AC-02: Gold contains the existing-path/unrelated-capability case and a\n positive existing-path/implemented-capability control.\n- [x] AC-03: Path evidence alone cannot close a capability-bearing declaration;\n a symbol or sufficiently specific topic match is also required.\n- [x] AC-04: Ambiguous evidence abstains and names who must answer; runtime never\n edits a human-owned `user-*` record to manufacture consent.\n- [x] AC-05: Koru discovery creates tickets only for remaining grounded gaps,\n and re-analysis closes the targeted diagnostic after a verified patch.\n- [x] AC-06: Gold, full verification and cross-repository regression pass.\n\n## Participants\n\n- Human policy owner: `unresolved:human` only when ambiguity or autonomous-risk\n policy needs a decision.\n- Technical evidence/fix owner: [`ai-codex.md`](ai-codex.md).\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-007/README.md", "path": "ticket-007 / README.md", "size": "2.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 007: Explicit unresolved response routing\n\n- **ID**: ticket-007\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nEnsure every communication divergence names a concrete respondent or an\nexplicit unresolved-role sentinel. The measured regression case is ticket-006:\nan agent-only ticket correctly requires a human response but currently emits\nan empty `responseRequiredFrom` array.\n\nExecutable implementation belongs in `src/`, regression coverage in `test/`\nand public behavior documentation in `docs/`. This directory contains only\ngovernance, decisions, logs and captured evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: `responseRequiredFrom` is never empty for a communication issue.\n- [x] AC-02: A missing human respondent is represented as\n `unresolved:human`; a missing agent respondent as `unresolved:agent`.\n- [x] AC-03: Known participant IDs retain priority and are never replaced by a\n sentinel.\n- [x] AC-04: Rendering and diagnostic projection expose the sentinel without\n converting it into an identity claim.\n- [x] AC-05: Tests reproduce an agent-only ticket and cover both resolved and\n unresolved routing.\n- [x] AC-06: No `user-*` file or participant registry entry is created by the\n agent.\n- [x] AC-07: Full offline verification and gold evaluation pass.\n- [x] AC-08: No executable source is stored under `project/ticket-007`.\n\n## Non-goals\n\n- Guessing a person from repository ownership, display names or Git history.\n- Dispatching an external notification.\n- Creating human-owned governance evidence from the agent process.\n- Changing communication severity or semantic conflict detection.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Approval\n\n- **Decision**: approved to continue subsequent todo2code tickets\n- **Evidence**: current user instruction\n- **Date**: 2026-07-31\n\nThe agent records the existence of the instruction but does not materialize it\nas human-authored participant content.\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Conclusion\n\nIssue construction now fills an otherwise empty route with a role-specific\nsentinel. The real ticket-006 audit changed three human-required issues from an\nempty list to `unresolved:human`; no participant was inferred. Offline tests,\nboth gold versions and all five SDK examples pass.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-009/README.md", "path": "ticket-009 / README.md", "size": "2.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 009: Canonical structured-response contracts\n\n- **ID**: ticket-009\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nGenerate the OpenRouter JSON Schema and the TypeScript runtime parser from one\ncanonical response contract at every production LLM boundary. Provider output\nmust fail closed instead of being silently coerced into a different intent.\n\nExecutable implementation belongs under `src/` and tests under `test/`. This\nticket directory contains only governance and evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: A reusable typed contract builder emits JSON Schema and parses the\n same supported constraints at runtime.\n- [x] AC-02: Every production structured OpenRouter response is parsed through\n its canonical contract before fields are read.\n- [x] AC-03: Unknown/missing properties, invalid enums, bounds, patterns and\n uniqueness constraints fail with a precise response path.\n- [x] AC-04: Grounding and cross-field semantic checks remain a separate,\n explicit validation stage.\n- [x] AC-05: Published document response schema is generated from and tested\n against its runtime contract.\n- [x] AC-06: Invalid provider output is retried or visibly degraded according\n to the stage policy; it is never silently normalized into another intent.\n- [x] AC-07: Full repository verification and gold/example gates pass.\n- [x] AC-08: Documentation records the contract boundary and measured drift.\n- [x] AC-09: The completed change is committed and pushed to `main`.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n\n## Result\n\nSeven production OpenRouter boundaries now use `chatStructuredWithMetadata`;\nthe repository gate found zero raw JSON calls outside the client. Provider\nschema and runtime parsing share one typed contract, while grounding remains a\nseparate evidence check. The implementation was published as `d0fc143`.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-008/README.md", "path": "ticket-008 / README.md", "size": "2.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 008: Cross-repository governance standard hardening\n\n- **ID**: ticket-008\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nUpstream the measured todo2code governance findings into\n`wellmanifest/new-project`: keep human and agent intent separately typed, make\nmissing ownership explicit, prevent executable code in ticket directories and\navoid collisions between ticket indexes and generated analysis artifacts.\n\nImplementation belongs to the governance hub's policies, templates, scripts\nand tests. This ticket directory contains only governance and captured evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: The target standard never auto-creates `user-*` for an agent.\n- [x] AC-02: Agent plans carry explicit participant ID, role, ticket and typed\n sections understood by todo2code.\n- [x] AC-03: Missing human ownership remains `unresolved:human` and produces a\n non-empty response route during communication analysis.\n- [x] AC-04: Ticket indexing uses `project/TICKETS.md` and preserves an\n analysis-owned `project/README.md`.\n- [x] AC-05: A second ticket is rejected while an unfinished ticket exists.\n- [x] AC-06: Traversal and malformed CLI arguments fail closed.\n- [x] AC-07: Ticket directories are documented as governance/evidence only.\n- [x] AC-08: Isolated shell tests and the todo2code integration check pass.\n- [x] AC-09: Changes are committed and pushed to both `main` branches.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- Upstream commit: `wellmanifest/new-project@72e5f6c`\n\n## Conclusion\n\nThe upstream 0.6.0 standard now matches the ownership behavior measured by\ntodo2code. Its generated agent plan is parsed as agent intent, it invents no\nhuman participant, and the missing approval owner is routed as\n`unresolved:human`. The hub itself remains free of task tickets.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-002/README.md", "path": "ticket-002 / README.md", "size": "3.9KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 002: Cross-repository semantic hardening\n\n- **ID**: ticket-002\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nTest todo2code deterministically on a fixed, reviewable corpus of external\nrepositories, derive evidence-backed failure categories, and improve the\nlibrary one measured defect at a time.\n\nThe initial corpus is:\n\n- `semcod/code2llm`\n- `semcod/domd`\n- `semcod/pactfix`\n- `semcod/code2logic`\n- `semcod/code2docs`\n- `semcod/redup`\n- `subactor/platform`\n\nEvery repository run must use an isolated detached worktree at a recorded\ncommit. The benchmark must not modify an external repository or consume its\nprivate and untracked files.\n\n## Acceptance criteria\n\n- [x] AC-01: The baseline records repository commit, graph fingerprint, record\n and relation counts, topic status, implementation/documentation coverage,\n diagnostic counts, warnings and elapsed time for at least five external\n repositories.\n- [x] AC-02: Results use the same documented deterministic command and document\n selection policy, with repository-specific exceptions recorded explicitly.\n- [x] AC-03: At least one repeated semantic failure is demonstrated on external\n evidence and represented by a focused gold or unit regression test before\n its implementation changes.\n- [x] AC-04: Each library change is evaluated independently against gold v2 and\n the external corpus; improvements and regressions are both reported.\n- [x] AC-05: The selected improvement raises its target metric on at least two\n external repositories, or is rejected with a documented reason, without\n reducing gold precision/recall or introducing forbidden-pair violations.\n- [x] AC-06: `npm run verify`, relevant smoke tests and Docker validation pass;\n the Java test may only be skipped locally when the required CI job remains\n verified.\n- [x] AC-07: Conclusions, raw command output, changed files, remaining risks and\n follow-up candidates are preserved in this ticket.\n\n## Risks and mitigations\n\n- External worktrees may be dirty or contain secrets. Only detached tracked\n commits are analyzed; private and untracked files are excluded.\n- Repository sizes and document sets differ. Absolute counts are never\n compared without recording the input policy.\n- A broad synonym rule may raise recall by destroying precision. A hard\n negative is required before changing semantic matching.\n- Provider-dependent runs would make the baseline unstable and potentially\n costly. The primary corpus is offline; live LLM work is a separate result.\n- `project/README.md` is also generated by the current analysis workflow.\n Ticket indexing must be preserved or explicitly reconciled before running\n `project.sh`.\n- Parallel agents or builds can race on `dist/`. Validation must run from a\n stable worktree without another build writing the same output directory.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`baseline.md`](baseline.md)\n- [`baseline.json`](baseline.json)\n- [`iteration-01.md`](iteration-01.md)\n- [`iteration-01.json`](iteration-01.json)\n- [`iteration-02.md`](iteration-02.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user message `kontynuuj`\n- **Date**: 2026-07-31\n\n## Conclusion\n\nIteration 01 is accepted. It reduced false `review_required` findings on five\nexternal repositories without changing any graph fingerprint or gold metric.\nIteration 02 fixed a tracked-evidence false positive in the generated-analysis\nisolation gate while retaining the original untracked-input hard negative.\nThe next iteration should be a separate approved ticket: either broaden\ncross-language semantic evidence beyond the hand-written PLβ†’EN dictionary, or\nsample and classify the remaining 1,853 actionable changelog findings before\nchanging linker policy.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-012/README.md", "path": "ticket-012 / README.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 012: Reliable live structured-output model\n\n- **ID**: ticket-012\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nReplace the opaque `openrouter/auto-beta` default with an explicit model that\nadvertises structured-output support, retain rejected-response metadata in\nstage audits, and make the live history include the run just recorded.\n\nExecutable implementation belongs under `src/` and `scripts/`; tests under\n`test/`. This directory contains governance and evidence only.\n\n## Acceptance criteria\n\n- [x] AC-01: The selected model is present in the current OpenRouter model API\n and advertises `structured_outputs`.\n- [x] AC-02: Invalid JSON or runtime-contract responses retain response ID,\n resolved model, provider, tokens and cost when OpenRouter supplied them.\n- [x] AC-03: NL, Markdown, documentation and communication stage failures\n propagate rejected-response metadata into their audits.\n- [x] AC-04: The persisted and rendered live history includes the current run\n without double-counting rewrites.\n- [x] AC-05: Offline tests cover invalid response metadata and current-history\n accounting.\n- [x] AC-06: Full verify, gold v1/v2 and SDK examples pass.\n- [x] AC-07: A paid six-stage `require-llm` run is attempted with the explicit\n model and its exact outcome is documented.\n- [x] AC-08: Documentation is updated and changes are pushed to `main` without\n committing unrelated `nlp2uri.yaml`.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-011/README.md", "path": "ticket-011 / README.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 011: AST-grounded NL symbol resolution\n\n- **ID**: ticket-011\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nResolve explicit NL symbol targets against observed AST declarations without\nguessing between modules. Make `AMBIGUOUS_REQUIREMENT` prescribe the exact field\nand candidate path that a human must add or correct.\n\nExecutable implementation belongs under `src/` and tests under `test/`. This\nticket directory contains only governance and evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: AST symbol declarations are indexed by normalized qualified and\n leaf aliases with their observed source paths.\n- [x] AC-02: A short symbol owned by one source path remains exact evidence.\n- [x] AC-03: A short symbol owned by several paths does not select all of them.\n- [x] AC-04: An explicit path or qualified symbol selects exactly one matching\n owner; a conflicting path does not create symbol evidence.\n- [x] AC-05: A not-yet-implemented symbol stays unresolved without being called\n ambiguous.\n- [x] AC-06: Ambiguity diagnostics list candidate paths and prescribe\n `target.path`; known `missingFields` prescribe concrete edits.\n- [x] AC-07: File names and all-caps prose are not emitted as implicit code\n symbols, while explicit backticked/qualified symbols remain supported.\n- [x] AC-08: Gold v2 includes unique, ambiguous-hard-negative and explicit-path\n symbol cases with separate exact-target accounting.\n- [x] AC-09: Full verification, gold v1/v2 and all SDK examples pass.\n- [x] AC-10: Documentation is updated and the completed change is pushed to\n `main` without committing unrelated `nlp2uri.yaml`.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n\n## Result\n\nNL↔AST symbol evidence is now limited to a unique observed owner or an\nexplicitly selected path. Ambiguous and conflicting symbols abstain and produce\nan actionable diagnostic with candidate paths. The implementation was\ncommitted and published to `main` as `25df74a`.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-022/README.md", "path": "ticket-022 / README.md", "size": "6.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 022: Git evidence for umbrella workspaces\n\n- **ID**: ticket-022\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-08-01\n\n## Goal and scope\n\nAllow the existing deterministic Git extractor to analyze an umbrella directory\nwhose children are independent Git repositories. Today the Subactor root is not\nitself a work tree, so the pipeline emits `Git repository not available` and\nloses the history of 41 repository roots that supply its code.\n\nThe extractor will discover bounded, nested repository roots, extract each\nhistory independently and express changed paths relative to the umbrella root.\nIt remains read-only and does not add an executor, ticket publisher, MCP/A2A\nmutation, checkout, fetch, commit or push operation.\n\n## Planned behavior\n\n1. Preserve target-path, commit ordering and count behavior for a root that is\n already one Git repository, apart from the added repository provenance and\n audited extractor-version increment.\n2. When the root is not a repository, walk real directories in deterministic\n order, without following symlinks. Stop descending as soon as a repository\n root is found so vendored/worktree repositories inside it are not counted.\n3. Bound discovery to 100 repositories and four concurrent repository readers;\n report truncation and per-repository failures without hiding successful\n evidence from other repositories.\n4. Interpret `count` per discovered repository. Prefix changed and previous\n paths with the repository path relative to the umbrella root so they align\n with AST, TODO and documentation paths in the shared graph.\n5. Record the repository-relative root in metadata and bump deterministic Git\n extraction provenance from `t2c/git@1` to `t2c/git@2`.\n6. Add isolated regression tests for nested repositories, path collisions,\n nested-repository pruning, symlink refusal, empty histories and the unchanged\n single-repository contract.\n7. Repeat the deterministic Subactor pipeline and compare Git record count,\n warnings, graph links and downstream diagnostics against the ticket-021\n baseline.\n\n## Acceptance criteria\n\n- [x] AC-01: A human approves this exact plan before source or test edits.\n- [x] AC-02: A normal single Git repository retains unprefixed target paths and\n the requested commit ordering/count.\n- [x] AC-03: An umbrella root discovers every bounded top-level/nested repository\n exactly once and does not follow symlinks or descend into a discovered repo.\n- [x] AC-04: Same-named files from different repositories receive distinct,\n umbrella-relative paths and stable record IDs.\n- [x] AC-05: One empty or unreadable repository produces a scoped warning while\n evidence from healthy siblings remains available.\n- [x] AC-06: Discovery and extraction are deterministic and bounded; no analyzed\n repository or its Git state is modified.\n- [x] AC-07: Focused tests, `npm run verify`, `make governance` and Docker smoke\n pass or report only independently owned pre-existing governance findings.\n- [x] AC-08: A comparable Subactor run replaces the root-level Git-unavailable\n warning with grounded child-repository history and does not regress the\n autonomy-safety result from ticket-021.\n\n## Participants\n\n- Human participant: unresolved; no human-owned file was created.\n- Agent participant: [ai-codex.md](ai-codex.md)\n\n## Approval boundary\n\n- Current state: `DONE / COMPLETE`.\n- Approval evidence: user response `zatwierdzam ticket 022 i kolejne` on\n 2026-08-01 after the exact bounded plan was presented. This approves ticket\n 022; future unknown scopes still require their own concrete plan.\n- Chat approval permits interactive implementation only. Protected merge still\n requires independent GitHub review or signed attestation.\n\n## Risks and stop conditions\n\n- `src/pipeline/**`, CLI, MCP/A2A, core schemas/types, package/build files and\n Subactor repositories are outside this ticket.\n- Repository discovery must not cross the supplied root or follow symlinks.\n- If correct behavior requires a new public option or schema field, stop and\n create an integration ticket rather than widening this scope.\n\n## Implementation and validation result\n\n- A root that is already a Git work tree still emits unprefixed paths in newest\n first commit order. The extractor provenance is now `t2c/git@2` and records\n `metadata.repositoryRoot` (`.` for a single repository).\n- A non-Git umbrella uses deterministic breadth-first discovery bounded to 100\n repositories and 10,000 directories. It excludes common generated/vendor\n roots, refuses symlinked directories and `.git` markers, stops below every\n discovered checkout and reads four repositories concurrently while retaining\n stable output order.\n- Changed and previous rename paths are namespaced relative to the umbrella.\n Per-repository short/empty-history and read failures are scoped warnings;\n healthy siblings remain available.\n- Focused Git tests: 5/5 PASS. Full `npm run verify`: 338 tests discovered,\n 337 passed, one explicit missing-JDK skip, zero failures. `make docker-smoke`:\n PASS.\n- Comparable Subactor pipeline: 326 commits from 39 member repositories and\n 2,697 namespaced changed paths. The other two raw `.git` directories observed\n by recursive `find` are correctly pruned inside an already discovered\n `vendor`/coding-agent `work` checkout.\n- Same-snapshot control without Git had 133,043 records, 294,423 relations and\n 14,396 diagnostics. With Git it has 133,369 records, 336,215 relations and\n 14,121 diagnostics: +326 records, +41,792 relations and 275 fewer diagnostics.\n 268 of 326 commit records link to other evidence; 58 remain explicitly\n unlinked. Git exposes 169 implemented-but-undocumented findings and clears\n 442 unlinked-record findings plus two planned-not-implemented findings.\n- Composing this graph with ticket-021's planner produces 44 plans, including\n 43 remediation-oriented `Resolve` plans and zero unsafe inverted plans.\n- `make governance` reports no ticket-022 finding. The global gate remains\n blocked only by the four inherited ticket-018/019 findings, so protected\n merge/push remains blocked pending their reconciliation and independent review.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-020/README.md", "path": "ticket-020 / README.md", "size": "9.9KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 020: Role-bound trusted intake with CQRS, ES, Protobuf, MCP and A2A\n\n- **ID**: ticket-020\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: COMPLETE\n- **Created**: 2026-08-01\n\n## Goal and scope\n\nImplement a deterministic trusted-intake boundary which binds every captured\nhuman message to a verified stable participant, a persistent governance role\n(`manager`, `user` or `dev`) and one ticket. The assignment is stored in a\nrepository-level participant registry, so it remains stable across tickets.\nFilename prefixes are projections of verified identity and role; they are never\naccepted as identity evidence by themselves.\n\nThe boundary will expose one domain contract through a Python shell CLI, the\nexisting TypeScript CLI, MCP tools and an A2A skill. All transports call the\nsame command/query handlers and return the same stable diagnostic codes. The\nrequired decision path is deterministic and does not call an LLM.\n\nThe implementation uses CQRS and event sourcing:\n\n- commands validate authorization and append immutable domain events;\n- queries read deterministic projections and never mutate state;\n- event streams use optimistic concurrency, idempotency keys and a SHA-256\n integrity chain;\n- a trusted projection writer materializes human-owned\n `manager-*`, `user-*` and `dev-*` Markdown views;\n- rejected commands return structured diagnostics and do not write human\n content or secret payloads.\n\nThe canonical transport envelope is Protobuf. Strict JSON Schemas validate the\nJSON representation and command payloads. TypeScript and dependency-free\nPython codecs support the limited wire types used by the envelope and are\nchecked against shared golden vectors.\n\nThis interfaces ticket owns only `src/communication/**`, `src/interfaces/**`,\n`src/cli.ts` and matching interface tests. It will not change package,\ntop-level schema, Docker, SDK or documentation paths. If such a shared path is\nproved necessary, work stops and a separate integration ticket is planned and\napproved instead of widening this scope.\n\n## Role and authority model\n\n`kind` and `governanceRole` are separate fields. Humans have a stable\n`participant-id` and one primary governance role; agents retain an `agent:*`\nidentity and cannot acquire a human role. Roles grant explicit capabilities,\nnot implicit inheritance:\n\n- `manager`: assign participants/tickets, approve plans and accept outcomes;\n- `user`: submit requirements and accept business behaviour;\n- `dev`: make/review technical decisions and operate an AI from an IDE;\n- every human role may submit its own message through trusted intake;\n- combined duties require explicit grants rather than treating one role as all\n lower roles.\n\nRole changes are versioned commands authorized by the configured manager or a\ntrusted intake policy. Historical role files are migration evidence only and\ncannot silently change the registry.\n\n## Planned contracts\n\nCommands include `RegisterParticipant`, `BindExternalIdentity`, `AssignRole`,\n`CaptureMessage`, `RebuildProjection` and `VerifyEventStream`. Queries include\n`ResolveParticipant`, `GetRole`, `GetTicketConversation`, `GetCommandStatus`\nand `ValidateProjection`.\n\nEvents include `ParticipantRegistered`, `ExternalIdentityBound`,\n`GovernanceRoleAssigned`, `MessageCaptured` and `ProjectionRebuilt`. Rejected\ncommands produce a sanitized audit result, not a successful domain event.\n\nThe response envelope contains at least: schema version, message ID,\ncorrelation/causation IDs, authenticated principal, aggregate ID, expected and\nactual stream versions, idempotency key, timestamp, payload hash, diagnostic\ncode, remediation and retryability.\n\n## Acceptance criteria\n\n- [x] AC-01: A human approves this understanding, scope and checklist before\n any implementation path is changed.\n- [x] AC-02: Participant registry v2 has strict schemas separating\n `human|agent` kind, stable identity, `manager|user|dev` governance role,\n verified external principals and explicit capability grants.\n- [x] AC-03: Identity resolution uses exact verified principal identifiers;\n display names and role-prefixed filenames are never sufficient evidence.\n- [x] AC-04: CQRS command and query handlers are transport-independent and\n reject commands with missing identity, authority, ticket binding or\n expected stream version.\n- [x] AC-05: The event store is append-only, atomic and replayable, with\n optimistic concurrency, idempotency and a verifiable SHA-256 hash chain.\n- [x] AC-06: A deterministic projection maps a verified human to exactly one\n `manager-*`, `user-*` or `dev-*` file per ticket and detects projection\n drift without overwriting untrusted content.\n- [x] AC-07: Only a trusted intake capability may create or update human role\n projections; an AI/agent command fails closed and cannot self-approve.\n- [x] AC-08: Strict JSON Schemas reject unknown fields and version every\n registry, command, query, event, result and diagnostic payload.\n- [x] AC-09: A versioned `.proto` contract defines the canonical envelope and\n command/query/event variants; TypeScript and Python round trips match\n byte-level golden vectors and preserve unknown-field compatibility.\n- [x] AC-10: A dependency-free Python CLI supports participant resolution,\n role assignment, message capture, validation, event verification/replay\n and projection rebuild, with stable JSON output and documented exits.\n- [x] AC-11: The existing TypeScript CLI exposes equivalent commands and calls\n the same application handlers as MCP and A2A.\n- [x] AC-12: MCP exposes typed intake/resolve/validate/query tools, maps domain\n diagnostics deterministically and declares mutating-tool annotations.\n- [x] AC-13: A2A exposes a versioned governed-intake skill, accepts JSON and\n Protobuf data parts, preserves correlation/idempotency metadata and maps\n rejections to deterministic task outcomes.\n- [x] AC-14: Stable `T2C-INTAKE-*` diagnostics cover unknown/unverified actor,\n role mismatch, unauthorized command, filename mismatch, version conflict,\n duplicate request, broken chain, invalid schema/wire data, secret input,\n unsafe path, projection drift and storage failure, each with remediation.\n- [x] AC-15: Secret scanning, size limits, path confinement, symlink defense,\n payload hashing and sanitized logs run before persistent human content is\n written; rejected secret text is not copied to the event stream.\n- [x] AC-16: Legacy `user-*` remains readable; migration to role-bound v2 is\n explicit, dry-runnable and conflict-producing when history is ambiguous.\n- [x] AC-17: Tests prove role persistence across tickets, role-change\n authorization, filename spoof rejection, agent-write rejection,\n concurrency conflicts, idempotent replay and deterministic rebuild.\n- [x] AC-18: CLI, MCP, A2A and cross-language Protobuf contract tests run in\n Docker without live providers or LLM calls and produce no real human\n participant file in the repository.\n- [x] AC-19: Existing CLI/MCP/A2A and communication tests remain green; every\n failure is reported with its stable code and no unrelated dirty path is\n modified or attributed to this ticket.\n\n## Participants\n\n- Human participant: unresolved; no human role file was created by the agent.\n- Agent participant: [ai-codex.md](ai-codex.md)\n\n## Approval record\n\nThe user explicitly instructed the agent to implement (\"wdraΕΌaj\") in chat on\n2026-08-01 after the agent restated that ticket-020 and AC-01..AC-19 required\nexplicit approval. This authorizes the interactive `EDIT` phase only; it is\nnot trusted merge evidence.\n\n## Risks and stop conditions\n\n- IDE/CLI clients that do not expose an authenticated hook cannot be claimed as\n automatically captured; they require a wrapper or provider-specific adapter.\n- Filesystem compare-and-append coordinates one checkout, not distributed\n worktrees. Git/CI detects divergent event versions before merge.\n- Adding a Protobuf/runtime package, modifying `package.json`, Docker files,\n top-level `schemas/**` or documentation requires a separate integration\n ticket, dependency/license review and fresh approval.\n- SDK/Python packaging paths remain outside this ticket and are untouched.\n- The branch now inherits committed policy 0.8.0 and its workstream-aware\n validator; remaining governance findings, if any, must be attributed to an\n actual dependency, conflict, ownership or scope violation rather than a\n repository-wide single-ticket limit.\n\n## Implementation and validation result\n\n- Added a strict registry v2, typed command/query/result contracts, the stable\n `T2C-INTAKE-*` diagnostic catalog and Draft 2020-12 schemas.\n- Added an append-only event-per-version store with optimistic concurrency,\n idempotency, exclusive append locking, replay and a verified SHA-256 chain.\n- Added trusted human projection materialization, role/filename drift checks,\n secret and size rejection, root/symlink confinement and dry-run legacy\n migration conflict reporting. No real human projection was written here.\n- Added dependency-free TypeScript and Python Protobuf codecs with golden-byte\n parity and unknown-field preservation, plus explicit command/query/event and\n result variants in `governed-intake.proto`.\n- Added TypeScript and Python CLI parity, typed MCP tools and an A2A skill.\n A2A binds intake identity to the authenticated bearer-derived principal,\n rejects unauthenticated bootstrap and preserves JSON/Protobuf result modes.\n- `npm run verify`: PASS, 335 tests, 334 passed, 1 explicit missing-JDK skip,\n 0 failed.\n- `make e2e-core`: PASS in network-isolated Docker; 335 tests, 328 passed,\n 7 explicit optional-toolchain skips, both gold datasets, CLI, MCP, A2A and\n available SDK examples passed.\n- `make governance` under policy 0.8.0 returns only the remaining independent\n findings owned by ticket-019 (`GOV-DEPENDENCY-002`, `GOV-CONFLICT-001`,\n `GOV-WORKSTREAM-003`, `GOV-WORKSTREAM-004`). Ticket-020 itself no longer\n contributes to a single-ticket or overlap violation.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-010/README.md", "path": "ticket-010 / README.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 010: Incremental extraction cache\n\n- **ID**: ticket-010\n- **Owner**: unresolved:human\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nCache deterministic AST extraction and Markdown chunking by source content hash\nso repeated analysis of large repositories does not repeat unchanged work.\nProvider responses remain live and are never stored by this cache.\n\nExecutable implementation belongs under `src/` and tests under `test/`. This\nticket directory contains only governance and evidence.\n\n## Acceptance criteria\n\n- [x] AC-01: TypeScript AST entries are cached per source path and content hash.\n- [x] AC-02: External AST adapters are cached per complete language manifest,\n executable selection and file-size limit.\n- [x] AC-03: Documentation chunks are cached per path, content hash, chunk size\n and algorithm version without caching LLM responses.\n- [x] AC-04: Cache entries have a versioned envelope, validated namespace/key\n and atomic same-directory writes.\n- [x] AC-05: Missing, corrupt, invalid and unwritable cache state fails open to\n authoritative extraction; warning-bearing external results are not retained.\n- [x] AC-06: Cold/warm output is identical and changing one input invalidates\n only its content-addressed entry.\n- [x] AC-07: Cache telemetry is returned outside Intent DSL and does not alter\n graph records or fingerprints.\n- [x] AC-08: Measurements cover todo2code and at least two other repositories.\n- [x] AC-09: Full repository verification and gold/example gates pass.\n- [x] AC-10: Documentation is updated and the completed change is pushed to\n `main` without unrelated worktree changes.\n\n## Participants\n\n- Human scope: current conversation; no agent-authored `user-*` file.\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n\n## Result\n\nDeterministic extraction now reuses validated content-addressed entries while\nsource records remain authoritative. A warm run avoids unchanged TypeScript\nparsing and successful external-toolchain startup; Markdown reuse stops before\nthe provider boundary. The implementation was committed as `f1d9334`.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-015/README.md", "path": "ticket-015 / README.md", "size": "1.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 015: Preserve compound intent in code-change titles\n\n- **ID**: ticket-015\n- **Owner**: agent:codex\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nPrevent a secondary verb in a compound TODO from producing lossy and duplicated\ncode-change titles such as `Implement Implement ... and it ...`.\n\nRuntime implementation belongs under `src/`; this directory contains only the\nticket contract and redacted evidence.\n\n## Acceptance criteria\n\n- [x] A regression test reproduces the title emitted by the Koru PLF-003 flow.\n- [x] The title preserves both the leading action and the secondary clause.\n- [x] Ordinary concise object titles remain unchanged.\n- [x] Focused tests, the real deterministic fixture and all repository gates pass.\n\n## Participants\n\n- Technical evidence/fix owner: [`ai-codex.md`](ai-codex.md).\n- No human response is required; the source intent is unambiguous and unchanged.\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-003/README.md", "path": "ticket-003 / README.md", "size": "3.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 003: Residual changelog diagnostic audit\n\n- **ID**: ticket-003\n- **Owner**: tom-sapletta-com\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nAudit the `CHANGELOG_WITHOUT_IMPLEMENTATION` findings that remain after\nticket-002, classify a deterministic cross-repository sample, and change the\nlibrary only when the sample demonstrates one repeated false-positive class\nthat can be removed without treating unsupported release claims as evidence.\n\nThe unchanged corpus is:\n\n- `semcod/code2llm`\n- `semcod/domd`\n- `semcod/pactfix`\n- `semcod/code2logic`\n- `semcod/code2docs`\n- `semcod/redup`\n- `subactor/platform`\n\nExternal inputs remain detached tracked-only worktrees at the commits recorded\nby ticket-002.\n\n## Acceptance criteria\n\n- [x] AC-01: A current deterministic run is recorded for all seven repositories\n using tracked `18cc21b` plus the explicit ticket-002 diagnostic patch only.\n- [x] AC-02: A deterministic stratified sample covers every repository and at\n least 100 residual `CHANGELOG_WITHOUT_IMPLEMENTATION` findings.\n- [x] AC-03: Every sampled finding has a review label, rationale and enough\n source/target context to reproduce the classification.\n- [x] AC-04: A code change is attempted only for a false-positive class present\n in at least two repositories with at least 20 sampled examples; otherwise the\n hypothesis is rejected and the ticket closes without semantic changes.\n- [x] AC-05: A focused hard-negative regression is observed failing before any\n implementation change.\n- [x] AC-06: The unchanged corpus demonstrates an improvement in at least two\n repositories, with stable graph fingerprints and no loss in gold v2 quality.\n- [x] AC-07: Full verify, examples, smoke, dependency audit and Docker validation\n pass; the local Java skip remains allowed only because CI requires JDK.\n- [x] AC-08: Results, raw commands, changed files and the next ranked hypothesis\n are preserved under this ticket and summarized in `docs/READINESS.md`.\n\n## Non-goals\n\n- Broad capability-topic linking for changelog prose.\n- Suppressing old or unverifiable behavioral claims merely to lower counts.\n- Using an LLM to label the primary audit sample.\n- Mutating or reading untracked content from external repositories.\n- Combining unrelated semantic heuristics in one A/B result.\n\n## Participants\n\n- [`user-tom-sapletta-com.md`](user-tom-sapletta-com.md)\n- [`ai-codex.md`](ai-codex.md)\n\n## Evidence\n\n- [`preprompt.md`](preprompt.md)\n- [`audit.md`](audit.md)\n- [`sample.json`](sample.json)\n- [`scripts/research/audit-changelog-sample.mjs`](../../scripts/research/audit-changelog-sample.mjs)\n- [`iteration-01.md`](iteration-01.md)\n- [`iteration-01.json`](iteration-01.json)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n- [`changelog.md`](changelog.md)\n\n## Approval\n\n- **Decision**: approved\n- **Evidence**: user message `kontynuuj`, following the ticket-002 conclusion\n- **Date**: 2026-07-31\n\n## Conclusion\n\nThe evidence supports one narrow correction: exact `Update ` bookkeeping\nwithout behavioral wording is not an unsupported implementation claim. The\nchange removed 547 `CHANGELOG_WITHOUT_IMPLEMENTATION` findings and 188\nsecondary `UNLINKED_RECORD` warnings across five repositories. All seven graph\nfingerprints stayed identical, gold v2 stayed perfect and the full offline\nvalidation suite passed.\n\nThe 1,306 remaining findings are intentionally retained: 1,275 are substantive\nor unverified claims, 30 are roadmap entries and one is a file-summary entry.\nThe next ranked hypothesis is to model unchecked roadmap entries through\nexplicit lifecycle/extractor semantics in a separate ticket, rather than hide\nthem with another changelog text filter.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-016/README.md", "path": "ticket-016 / README.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 016: First-class PHP syntax evidence\n\n- **ID**: ticket-016\n- **Owner**: agent:codex\n- **Status**: DONE\n- **Workflow state**: DONE\n- **Created**: 2026-07-31\n\n## Goal and scope\n\nReplace the explicit PHP unsupported-language warning with deterministic,\nsource-grounded syntax facts without adding a Composer dependency to the core.\n\nRuntime implementation belongs under `src/` and `php/`; this directory holds\nonly the ticket contract and redacted evidence.\n\n## Acceptance criteria\n\n- [x] PHP namespace, imports, types, functions, methods and calls become facts.\n- [x] Source selection uses the repository ignore matcher and manifest cache.\n- [x] No matching files avoid starting PHP; missing PHP and parse errors fail open.\n- [x] The adapter is visible in config, manifests, `doctor` and the public API.\n- [x] A controlled external-repository A/B demonstrates the semantic effect.\n- [x] Full verification, both gold datasets and all examples pass.\n\n## Participants\n\n- Technical evidence and implementation: [`ai-codex.md`](ai-codex.md).\n- No human semantic decision is required; this ticket adds observed evidence.\n\n## Evidence\n\n- [`audit.md`](audit.md)\n- [`ai-codex-logs.txt`](ai-codex-logs.txt)\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-006/ai-codex.md", "path": "ticket-006 / ai-codex.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-006\n- **Status**: DONE\n- **Workflow state**: DONE\n\n## Understanding\n\nTicket-005 proved that merely sending JSON Schema does not guarantee provider\nconformance. The next step is contract fidelity and diagnostics, not semantic\nthreshold tuning.\n\n## Plan\n\n1. Inventory duplicated provider, published and runtime response definitions.\n2. Add failing tests for every live violation observed in ticket-005.\n3. Introduce the smallest canonical structural source and precise validator.\n4. Keep semantic contracts internal and all network calls opt-in.\n5. Run offline gates before any additional paid live comparison.\n6. Compare two explicit provider/model routes only on a clean tracked snapshot.\n7. Retain no production path unless both protocol and quality boundaries pass.\n\n## Guardrails\n\n- No field renaming or numeric coercion.\n- No raw provider payload in logs.\n- No untracked repository content.\n- No executable file under this ticket.\n\n## Current state\n\n- Added one internal structural source for the TypeScript response shape,\n OpenRouter JSON Schema and exact runtime validation.\n- Added a full-verification drift test against the published reranker decision\n schema.\n- Added fail-closed diagnostics for the observed `judgments` envelope,\n non-numeric confidence and invalid verdict/reason combinations.\n- Error text includes provider, resolved model and response ID, but never the\n raw provider payload or API key.\n- Focused offline tests pass 5/5.\n- The tracked live comparison rejected both Plus and Flash; Flash added an\n unknown `decision` property to an otherwise structured decision.\n- All release gates pass. The hardening is retained, while semantic production\n enablement remains rejected.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-019/ai-codex.md", "path": "ticket-019 / ai-codex.md", "size": "2.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-019\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe user wants `goal -a` to publish the existing dependency-free Python SDK as\nthe root PyPI distribution `todo2code`. They selected one root manifest, removal\nof `sdk/python/pyproject.toml`, and an SDK-only artifact. The root project must\nstill remain a Node.js application; Goal therefore needs to detect both stacks.\n\nThe shared `dist/` directory is acceptable when handled append-only. TypeScript\nuses paths below `dist/src`, while Python build writes two top-level archive\nfiles. Publication is already bounded to `dist/todo2code-{version}*`, so neither\nthe JavaScript tree nor unrelated artifacts are passed to Twine.\n\nRemoving the nested manifest requires migrating `make python-wheel` from\n`pip wheel ./sdk/python` to the repository root. `Makefile` is currently in the\nallowed scope of active governance ticket-018; editing it from ticket-019 would\nviolate the non-overlap contract.\n\n## Execution plan\n\n1. Obtain explicit human approval for ticket-019 and resolve the Makefile scope\n conflict with ticket-018.\n2. Add root PEP 517/621 metadata mapping `todo2code` and `todo2code_sdk` from\n `sdk/python`, preserving Apache-2.0 metadata and Python >=3.10.\n3. Update Goal's project types/version file, remove the nested manifest, migrate\n the wheel target and correct SDK installation/build documentation.\n4. Seed `dist/` with a sentinel TypeScript file, run an isolated root build and\n prove the sentinel survives.\n5. Inspect wheel/sdist member lists, run `twine check`, install the wheel into a\n clean virtual environment and verify imports/version/dependency metadata.\n6. Run Goal detection and `goal --dry-run -a`, then the repository verification,\n SDK examples and governance checks.\n7. Record evidence without publishing, committing or pushing unless separately\n requested.\n\n## Actual changes\n\n- None; waiting for approval.\n\n## Blockers\n\n- Human approval is required before implementation.\n- Active ticket-018 currently claims `Makefile`; ticket-019 cannot safely\n migrate `make python-wheel` until that overlap is released or routed through\n an approved integration ticket.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-013/ai-codex.md", "path": "ticket-013 / ai-codex.md", "size": "918B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-013\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Verify current structured-output support and prices.\n2. Run identical 6/6 Live checks for Gemini 3 Flash Preview, Codestral 2508\n and DeepSeek V4 Pro.\n3. Compare each result with the Gemini 3.6 Flash baseline.\n4. Retain or change the default only on complete measured evidence.\n\n## Outcome\n\nCodestral 2508 is the measured default. Gemini 3 Flash Preview is the fallback\ncandidate. DeepSeek V4 Pro is rejected for exceeding the complete-run budget.\nThe external-repository run additionally caused bounded Markdown batch\nconcurrency; no validation rule or schema was relaxed.\n\n## Safety\n\nThe user explicitly authorized live comparison. Each run keeps the existing\n$0.50 total cost ceiling and 15-minute total latency ceiling. Provider output\nremains fail-closed and redacted in reports.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-005/ai-codex.md", "path": "ticket-005 / ai-codex.md", "size": "5.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-005\n- **Status**: DONE\n- **Workflow state**: DONE\n\n## Understanding\n\nTicket-004 proved that multilingual similarity is useful for ordering\ncandidates but unsafe as relation evidence. The next candidate therefore\nseparates recall from acceptance: retrieval finds a small shortlist, while an\naudited reranker must explain an accepted module using repository-owned\nevidence or abstain.\n\nBefore introducing another semantic stage, the current communication boundary\nmust be measured. The governance standard names participants through\n`user-` and `ai-` files; those records must remain distinct\nfrom ticket specifications and must produce an actionable response owner when\nhuman and agent intent diverge.\n\n## Execution plan\n\n1. Audit `user-*`/`ai-*` extraction and communication analysis on current\n todo2code tickets.\n2. Add red regressions for participant filename recognition, evidence-file\n exclusion and response ownership.\n3. Implement the minimal deterministic communication correction.\n4. Re-run the corrected analysis on todo2code and external tracked projects.\n5. Specify the candidate, decision, provenance and abstention contracts.\n6. Add red contract tests and cross-language gold projection fixtures.\n7. Implement the optional orchestration boundary outside the deterministic\n linker.\n8. Evaluate a constrained reranker on the six gold positives and negatives.\n9. Run tracked A/B on `todo2code`, `subactor/platform` and one additional\n repository selected from the existing seven-repository corpus.\n10. Manually review every newly proposed relation.\n11. Retain the implementation only if every precision and coverage criterion\n passes; otherwise remove it and retain the evidence.\n12. Run the full release validation and update readiness documentation.\n\n## Planned code locations\n\n- `src/`: public contracts and optional orchestration.\n- `test/`: contract, hard-negative and integration tests.\n- `evaluation/gold/`: versioned evaluation fixtures if the schema requires it.\n- `scripts/research/`: optional manually invoked reproducer only.\n- `project/ticket-005/`: specifications, logs, captured results and decisions\n only.\n\n## Risks\n\n- A reranker may restate semantic similarity without adding evidence.\n- Candidate text may bias a model into selecting a module instead of\n abstaining.\n- Multi-module requirements may be incorrectly collapsed to one module.\n- Provider-dependent evaluation may be nondeterministic or unavailable.\n- Curated gold projections may overfit six examples without improving a real\n repository.\n\n## Guardrails\n\n- No relation from retrieval score alone.\n- No silent fallback from an unavailable reranker to raw embeddings.\n- No network-dependent default or offline-CI requirement.\n- No external untracked content.\n- No executable files under the ticket directory.\n\n## Actual changes\n\n- Initialized the reviewable plan only.\n- No linker behavior has changed.\n- Owner approved execution and added the `user-*`/`ai-*` divergence audit.\n- Added section-aware conversion in `src/extractors/communication.ts` for\n governance participant files and excluded ticket evidence plus raw\n `ai-*-logs.txt` from the participant channel.\n- Added explicit response ownership in `src/communication/analyzer.ts` to every\n communication issue and a separate issue for an agent claim about an\n unconfirmed human decision.\n- Added migration warnings for unstructured participant files in\n `src/extractors/communication.ts`, normalized filename identities, ignored\n numeric Markdown markers and recognized bare filenames as repository paths\n in `src/core/text.ts`.\n- Prevented opposite statements about two explicit, different files from\n becoming a false intent conflict.\n- Tested historical `wellmanifest/new-project` prompts and agent analyses in a\n read-only migration captured by `project/ticket-005/audit.md`. Correct\n `request`/`message` typing produced zero issues for Opus; GPT retained three\n unanswered prompt fragments and no false file conflict.\n- Focused communication, NL, pipeline and task-synthesis tests pass.\n- Added versioned, bounded candidate and reranker result contracts in\n `src/semantic/reranker.ts`. Retrieval alone cannot mutate a graph; an\n accepted result must cite exact repository-owned evidence, and ambiguity or\n multi-module scope abstains.\n- Added a strict tracked-snapshot network boundary and a research reproducer\n under `scripts/research/`; no executable source was added to the ticket.\n- Added captured gold reranking fixtures to\n `evaluation/gold/v2/dataset.json`: 6/6 expected cross-language relations,\n 0/6 forbidden violations and one hard-negative abstention.\n- Ran three live attempts on clean `subactor/platform` commit `3e96573`;\n provider output violated the structured contract each time, so no relation\n or coverage change was accepted.\n- Removed reranker exports from the public package in `src/index.ts`. The\n deterministic linker, CLI, MCP and A2A remain unchanged.\n\n## Blockers\n\n- The evaluated provider/model does not reliably honor the structured result\n contract, and no real-repository coverage improvement was demonstrated. This\n blocks production retention but does not block closing the rejected\n experiment.\n\n## Conclusion\n\nRetain the communication correction and offline evidence contracts. Reject the\nlive semantic production path until a provider-pinned candidate passes the\nsame real-repository boundary.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-018/ai-codex.md", "path": "ticket-018 / ai-codex.md", "size": "10.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-018\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe user wants `new-project` to control the operating logic of both humans and\nagents rather than merely describe it. A multi-step change must have auditable\nintent, bounded scope and acceptance criteria in a target-repository ticket\nbefore implementation. Once a ticket is complete, the next change receives the\nnext ticket number. Follow-up work reuses an unfinished ticket. Human-owned\nparticipant files remain outside agent control.\n\nThe enforcement model needs layered trust: fast local feedback, deterministic\nCI policy checks, stack-specific verification and repository rules that prevent\nmerging around those checks. `todo2code` can compare declared intent with the\nactual diff, but offline deterministic outputβ€”not an LLM responseβ€”must decide\nthe required gate.\n\nThe follow-up request extends this model for concurrent agents whose local\nintentions may diverge but compose into a larger long-term capability. The\nproject should not be split into repositories yet. Instead, the governance\ncontract will model independent workstreams, non-overlapping write scopes and a\nticket dependency DAG. Divergence that changes a shared contract is routed to\nan explicit integration ticket and fresh approval; it is never absorbed by\nretroactively widening one agent's scope.\n\nThe current follow-up asks Koru to provide automated code review. This is a\nread-only second-AI boundary: Koru orchestrates pinned Vallm checks for the\nexact PR diff, produces a commit-bound attested report, and exposes a required\nGitHub status. It may reject a change but may not edit it, push it or impersonate\na human `APPROVE` review.\n\nCurrent verified baseline:\n\n- Docker CLI and engine are available; engine version reported `29.1.3`.\n- `ticket-017` is `DONE`, so `project/new-ticket.sh` correctly created\n `ticket-018` in `PLAN / WAIT_FOR_APPROVAL`.\n- the copied ticket scripts in `todo2code` match the Governance Hub by SHA-256,\n but are not yet published in the current HEAD;\n- the current `todo2code` CI tests the application and optional live provider,\n but has no governance job and no persistent `AGENTS.md`;\n- no trusted human participant identity is available, so ownership remains\n `unresolved:human`.\n\n## Execution plan\n\n1. Stop at the plan-only boundary and obtain explicit human approval.\n2. In the Governance Hub, define a versioned JSON contract and JSON Schema,\n stable diagnostic catalog and stack-profile contract without creating any\n ticket/task/log there.\n3. Implement a deterministic validator with text, JSON and SARIF reporting;\n validate repository structure, ticket state, actor ownership, approval\n provenance inputs, manifest drift, diff scope, Docker and stack evidence.\n4. Add fixture-driven allow/deny tests and a pinned reusable GitHub Actions\n workflow with least-privilege permissions.\n5. Replace unsafe governance automation behavior relevant to the gate (unpinned\n host installs, swallowed validator failures) with a reproducible validation\n entry point, while preserving unrelated analysis generators.\n6. Adopt the pinned governance contract in `todo2code`: add `.governance/`, a\n persistent `AGENTS.md`, local commands and the required CI integration.\n7. Connect deterministic `todo2code` intent-vs-diff analysis as an additional\n gate or evidence producer; keep live LLM checks advisory/opt-in.\n8. Run central governance fixtures, target manifest checks, negative probes,\n application verification and Docker E2E. Record raw command output here and\n map every failure to a stable code/remediation.\n9. Review path-specific diffs, update acceptance evidence and report uncommitted\n status. Do not commit or push without a separate user request.\n10. Return to `PLAN / WAIT_FOR_APPROVAL` for the multi-workstream scope\n evolution before changing schemas, validators, CI or documentation. The\n user explicitly approved AC-11..AC-17 in chat; transition to `EDIT`.\n11. Add manifest and intent contracts for named workstreams, path ownership,\n dependency/conflict edges and explicit integration routing, with a\n deliberate v1 migration policy.\n12. Extend deterministic validation and stable diagnostics for per-workstream\n active-ticket limits, concrete path overlap, cycles, unmet dependencies and\n missing integration tickets.\n13. Add positive and negative central fixtures, then adopt the workstream map\n in `todo2code` and prove parallel non-overlap plus rejected overlap.\n14. Validate in Docker, run existing E2E gates, review only ticket-018 paths and\n preserve all concurrent application changes.\n15. Return to `PLAN / WAIT_FOR_APPROVAL` for the Koru review extension before\n changing workflows or external rules; record AC-18..AC-25 and the current\n tool/secret/ruleset baseline.\n16. Add a least-privilege `pull_request` plus `workflow_dispatch` workflow with\n stable check name `koru / code-review`, exact base/head resolution and\n immutable action/tool pins.\n17. Use Koru 0.1.444 loop mode for one read-only Vallm 0.1.94 round over changed\n supported source files, with deterministic and OpenRouter semantic checks.\n18. Generate a sanitized structured review report, upload it with bounded\n retention and create a GitHub provenance attestation bound to the reviewed\n commit.\n19. Exercise passing and failing review probes, missing-secret/provider failure,\n workflow validation, existing Node/Docker gates and scoped governance.\n20. Configure a `main` ruleset requiring governance and Koru review only after\n the check exists; verify direct pushes and stale evidence are rejected.\n\n## Actual changes\n\n- Created only the plan scaffold for `ticket-018` and updated the project-level\n ticket index/checklist. No implementation, source, test or CI file was\n changed for ticket-018.\n- The user explicitly approved ticket-018 in chat after reviewing the plan;\n implementation is now authorized. Merge-time trust remains an external CI\n concern and is not claimed by this record.\n- Implemented `wellmanifest/new-project` 0.7.0 policy-as-code: versioned\n manifest/intent schemas, diagnostic catalog, stack profiles, dependency-light\n validator, wrappers, safe `project.sh` entry point, fixture suite, reusable\n workflow and enforcement documentation.\n- Updated the ticket scaffolder to create JSON-safe `intent.json` before code.\n- Adopted the package in `todo2code` through `.governance/`, SHA-256 lock,\n `AGENTS.md`, Make/preflight commands and the `governance / enforce` CI job.\n- Kept LLM findings outside the required decision path. All required governance\n checks are deterministic.\n- Did not create or edit any `user-*.md` file.\n- Implemented `new-project` 0.8.0 workstream coordination, intent v2,\n dependency/conflict/integration validation, 27-code catalog coverage,\n multi-active CI routing and manager/developer/two-AI operating guidance.\n- Adopted eight workstreams in `todo2code` and synchronized the managed\n validator, schemas, diagnostics and scaffolder with updated SHA-256 lock\n evidence.\n- Preserved archived v1 readability while requiring every active ticket under\n manifest v2 to migrate explicitly and receive fresh approval.\n- Observed a concurrently created ticket-019 in the `sdk` workstream. It is\n non-overlapping and remains untouched; the final whole-workspace gate accepts\n ticket-018 (`governance`) and ticket-019 (`sdk`) as parallel PLAN/VALIDATION\n records while routing this implementation diff uniquely to ticket-018.\n- Planned only the Koru code-review extension requested by the user. Verified\n published Koru 0.1.444 and Vallm 0.1.94, an organization-level OpenRouter\n secret visible to this repository, and the absence of branch protection,\n rulesets or an existing PR review for commit `06a2faa`. No workflow, source,\n test, external ruleset or human-owned file was changed in this plan phase.\n- After explicit approval, added `.github/workflows/koru-code-review.yml` with\n immutable action pins, exact base/head selection, changed-source filtering,\n one Koru/Vallm round, fail-closed credential handling, structured evidence,\n bounded artifact retention and GitHub provenance attestation. The job is\n read-only with respect to repository contents and cannot approve or mutate a\n pull request.\n- Published the workflow through pull request #1 after the Koru check, Node\n verification and Java adapter passed. The unrelated deterministic governance\n failure remains assigned to ticket-019.\n- Exercised the real OpenRouter semantic path through historical dispatch\n `30703292661`. Koru/Vallm rejected two TypeScript files and propagated a\n failing required check while preserving an attested, commit-bound report.\n- Staged repository ruleset `20186914` with no bypass actors, strict governance\n and Koru status checks, mandatory pull requests, stale-evidence dismissal and\n force-push/deletion prevention. It remains disabled solely for the final\n bootstrap evidence merge and will be activated afterward.\n\n## Blockers\n\n- `GOV-INTENT-003`: concurrent commit `5f1f4bd` placed the ticket intent and\n implementation in the same commit; correcting this requires an authorized\n history/commit split.\n- `GOV-SCOPE-001`: the same commit contains eight implementation/generated\n paths not allowed by ticket-018. They must be routed to their actual ticket,\n not retroactively claimed here.\n- Central `new-project` 0.7.0 is uncommitted/unpublished, so no honest immutable\n reusable-workflow SHA exists yet.\n- AC-17: concurrent commit `9928699` bumped the Rust SDK manifest to 0.5.1, but\n the ignored local Cargo lock still identifies the root package as 0.5.0.\n Official full Docker E2E fails closed at `cargo fetch --locked` (exit 101).\n Fixing or tracking that lock is an `sdk`/`integration` change outside this\n ticket's approved governance workstream.\n\n## Approval boundary\n\n- Current state: `IN_PROGRESS / EDIT` for approved AC-18..AC-25. AC-11..AC-16 are\n implemented; AC-17 and the earlier publication/external blockers remain open.\n- Required response from: `unresolved:human`.\n- The user explicitly approved AC-18..AC-25 in chat. This authorizes the\n implementation workflow but is not itself merge-time review evidence.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-004/ai-codex.md", "path": "ticket-004 / ai-codex.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-004\n- **Status**: COMPLETE\n- **Workflow state**: DONE\n\n## Understanding\n\nThe current known gap is not evidence that the three-topic threshold should be\nlowered. It demonstrates that lexical topic equality cannot bridge arbitrary\nlanguages. The experiment must separate semantic projection from graph scoring\nand preserve its provenance.\n\n## Execution plan\n\n1. Expand multilingual gold coverage and classify positive and negative pairs.\n2. Map the synchronous linker, public API, pipeline configuration and cache\n boundaries.\n3. Compare local embedding, provider translation/projection and injected\n precomputed-topic strategies.\n4. Add a red contract test for the selected architecture.\n5. Implement one bounded candidate only if it remains auditable and optional.\n6. Run gold and controlled repository A/B.\n7. Complete full validation and readiness documentation.\n\n## Guardrails\n\n- No additional domain dictionary as the principal solution.\n- No network call from `linkIntentRecords`.\n- No provider output accepted without runtime validation.\n- No private or untracked external inputs.\n- No unrelated generated-analysis rewrite.\n\n## Actual changes\n\n- Initialized the approved ticket.\n- Added a 12-pair, four-language embedding benchmark and evaluated two pinned\n local multilingual models.\n- Demonstrated overlapping positive/negative cosine ranges and two rejected\n false-positive candidates on the tracked platform graph.\n- Demonstrated that reciprocal top-1 restores precision in the sample but adds\n no coverage.\n- Rejected a production matcher and expanded gold v2 with a separately reported\n cross-language cohort: six known positives and six forbidden negatives.\n- Passed full verification (244 tests, 243 pass, one local JDK skip), gold\n v1/v2, five SDK examples, dependency audit, CLI/MCP/A2A and Docker smoke.\n- Updated readiness evidence and closed the ticket without adding an unsafe\n semantic relation rule.\n- After user review, moved both executable experiment reproducers out of the\n ticket directory into `scripts/research/`; benchmark inputs and captured\n results remain ticket evidence.\n\n## Blockers\n\n- None.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-017/ai-codex.md", "path": "ticket-017 / ai-codex.md", "size": "3.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-017\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe user wants confirmed defects in `todo2code` repaired, not a speculative\nrewrite. Path-resolution and code-change planning work that was initially\nuncommitted was published concurrently as commit `1ebad96`; the first\nresponsibility is to review and validate that new baseline rather than duplicate\nor overwrite it. Three concrete defect candidates already have command or graph\nevidence: mutating `pipeline --help`, false Polish prohibition polarity, and\npotentially incomplete path/action planning behavior.\n\nSuccess means reproducible failing cases become passing regression tests while\nthe existing diagnostic schema stays stable and actionable. Pipeline success\nmust not be confused with zero blocking diagnostics.\n\n## Execution plan\n\n1. Wait for explicit human approval of this ticket and the root checklist.\n2. Run `project.sh` in safe workspace-analysis mode and inspect generated reports.\n3. Reproduce the three candidate defects with isolated fixtures and capture the\n baseline results.\n4. Review commit `1ebad96` and any subsequent branch movement, separating usable\n baseline behavior from defects without reverting unrelated work.\n5. Implement minimal fixes and focused tests for confirmed failures only.\n6. Audit the canonical diagnostic/error-code surface and make new failures\n machine-actionable without changing established codes unnecessarily.\n7. Run focused tests, full offline verification, gold datasets and examples in\n Docker.\n8. Re-run deterministic validation on the Governance Hub and compare diagnostics.\n9. Add isolated core/full Docker E2E images, Compose services, stable error codes\n and operator documentation; validate both environments.\n10. Update owned ticket evidence, TODO, docs and changelog with exact results.\n\n## Actual changes\n\n- Added the required missing governance bootstrap scripts copied verbatim from\n the Governance Hub.\n- Reviewed and preserved concurrent baseline `1ebad96`.\n- Made command-local help non-mutating before configuration and dispatch.\n- Extended deterministic Polish prohibition detection to active `zabrania`\n forms and covered both the text helper and documentation extraction.\n- Bounded the shared Markdown path resolver against absolute and parent escapes,\n including heading-derived scopes.\n- Verified focused tests, the full offline suite, gold v2/v1 and examples on the\n host and in the project Docker image.\n- Compared identical tracked Governance Hub snapshots before and after the fix:\n false `CONFLICTING_INTENT` 1 -> 0; total diagnostics remained 183 because the\n corrected requirement is now honestly reported as planned but unimplemented.\n- Refreshed the generated analysis from the current tracked-file overlay without\n consuming unrelated untracked `nlp2uri.yaml`.\n- Added and validated isolated Docker E2E `core` and full-toolchain suites with\n stable `T2C-E2E-*` failure codes. The full image includes the native linker\n needed by Cargo and finished with 318/318 tests, zero skips and five SDK\n examples.\n\n## Blockers\n\n- None. All ticket acceptance criteria are complete.\n\n## Concurrent baseline boundary\n\nThe following paths were modified before ticket-017 and published concurrently\nas commit `1ebad96`; they are baseline work, not changes made by this ticket:\n\n- `src/extractors/changelog.ts`\n- `src/extractors/markdown.ts`\n- `src/extractors/todo.ts`\n- `src/pipeline/run.ts`\n- `src/services/actions.ts`\n- `src/synthesis/code-change-plan.ts`\n- `test/code-change-plan.test.ts`\n- `test/markdown.test.ts`\n- `src/extractors/markdown-paths.ts`\n\nThe untracked `nlp2uri.yaml` remains unrelated and must not be edited.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-014/ai-codex.md", "path": "ticket-014 / ai-codex.md", "size": "708B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-014\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Preserve the real retry/backoff reproduction as a gold negative.\n2. Separate file-location evidence from capability-implementation evidence.\n3. Require a semantic corroborator before an existing path closes a plan.\n4. Re-run Koru discovery and the cross-repository census.\n\n## Responsibility boundary\n\nThe agent can implement and test the fail-closed matcher. A human response is\nneeded only when two plausible implementations remain or when autonomous\nexecution policy would be broadened; the agent must not create or rewrite a\nhuman-owned declaration to resolve either case.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-007/ai-codex.md", "path": "ticket-007 / ai-codex.md", "size": "776B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-007\n- **Role**: agent\n\n## Understanding\n\nCommunication analysis must not emit an empty response route when it knows the\nrequired role. Missing identity is a first-class unresolved state, not\npermission to infer or manufacture a person.\n\n## Execution plan\n\n1. Reproduce the agent-only ticket case in an offline test.\n2. Centralize fallback routing at communication-issue construction.\n3. Preserve known stable participant IDs.\n4. Document the sentinel contract and update readiness evidence.\n5. Run focused tests, gold evaluation and the full offline verification gate.\n\n## Ownership boundary\n\nDo not create or edit a human-owned `user-*` file. Do not create a participant\nregistry entry on behalf of the repository owner.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-009/ai-codex.md", "path": "ticket-009 / ai-codex.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-009\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe provider schema, TypeScript assumptions and runtime checks currently form\nseparate contracts. Their drift can either crash late or silently reinterpret\nthe provider response. One structural definition must govern both sides.\n\n## Execution plan\n\n1. Measure every production structured-response boundary and its current drift.\n2. Add a small dependency-free canonical schema/parser builder.\n3. Migrate all production OpenRouter response contracts.\n4. Preserve grounding and semantic invariants as explicit second-stage checks.\n5. Run all deterministic gates, document the result and publish `main`.\n\n## Blockers\n\n- None for the approved scope.\n\n## Actual changes\n\n- Added the dependency-free `StructuredSchema` builder and typed error with\n rejected-response metadata.\n- Migrated all seven production OpenRouter response boundaries.\n- Removed task/NL coercion of invalid provider enums, percentages and keys.\n- Added drift gates for production calls and the published document schema.\n- Updated the DSL, readiness, validation, test report, status and backlog.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-008/ai-codex.md", "path": "ticket-008 / ai-codex.md", "size": "749B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-008\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe governance hub must encode ownership and unresolved state in a form that\ntodo2code can audit without guessing identities or treating evidence as dialog.\n\n## Execution plan\n\n1. Validate the upstream ticket scope and ownership contract.\n2. Harden scripts and role-specific templates outside this ticket directory.\n3. Test active-ticket reuse, namespace isolation and todo2code interoperability.\n\n## Actual changes\n\n- Published `wellmanifest/new-project` 0.6.0 at commit `72e5f6c`.\n- Added the non-conflicting `project/TICKETS.md` index in todo2code.\n\n## Blockers\n\n- None for the completed deterministic scope.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-002/ai-codex.md", "path": "ticket-002 / ai-codex.md", "size": "4.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-002\n- **Status**: COMPLETE\n- **Workflow state**: DONE\n\n## Understanding of the task\n\nThe objective is not merely to prove that todo2code completes on other\nrepositories. The work must establish whether its semantic conclusions remain\nuseful outside its own codebase, identify recurring causes of weak coverage or\nfalse diagnostics, and improve the library only where repeated measurements\njustify the change.\n\n## Included scope\n\n1. Create isolated detached worktrees for the recorded external commits.\n2. Run one normalized offline pipeline and reality report per repository.\n3. Persist a compact machine-readable baseline and a reviewed Markdown report\n under this ticket.\n4. Compare relation classes, diagnostics, unsupported languages, topic status\n and coverage rather than relying on record count alone.\n5. Review representative false positives and false negatives.\n6. Select the highest-impact shared defect that can be fixed without accepting\n ungrounded evidence.\n7. Add gold/unit coverage, implement one correction and rerun the same corpus.\n8. Record the delta and either retain or reject the correction.\n\n## Excluded scope\n\n- Mutating, committing or cleaning external repositories.\n- Reading private or untracked external inputs.\n- Tuning a threshold only to improve headline coverage.\n- Provider-dependent LLM calls in the primary baseline.\n- Adding a new dependency without a separate license and security review.\n- Implementing several semantic heuristics in one unmeasurable batch.\n\n## Execution plan\n\n### Phase 1 β€” reproducible baseline\n\n1. Verify stable todo2code and Docker validation commands.\n2. Define the shared document/task/communication policy and explicit\n repository exceptions.\n3. Analyze the seven verified repositories at recorded detached commits.\n4. Store per-repository JSON metrics, warnings and sampled diagnostic evidence.\n\n### Phase 2 β€” evidence review\n\n5. Rank recurring gaps by frequency, severity and affected repositories.\n6. Separate extractor, target-resolution, linker, diagnostics and\n unsupported-language failures.\n7. Choose one defect with evidence in at least two repositories.\n\n### Phase 3 β€” one controlled improvement\n\n8. Add a gold or focused unit regression, including a nearby negative.\n9. Implement the smallest deterministic correction.\n10. Run gold v2, focused tests and the unchanged external corpus.\n11. Keep the change only if the target metric improves without a measured\n precision regression.\n\n### Phase 4 β€” validation and conclusions\n\n12. Run the complete stable validation matrix and Docker checks.\n13. Update ticket evidence, changelog, acceptance criteria and readiness\n conclusions.\n14. Present the next ranked improvement as a separate continuation decision.\n\n## Candidate hypotheses, not decisions\n\n- PL documentation to EN identifiers is still a measured `knownGap`.\n- Changelog claims may lack implementation evidence because topic matching\n intentionally excludes changelog records.\n- Configuration-only evidence may overstate `aligned`.\n- Unsupported PHP and other languages may dominate reality gaps in some\n repositories.\n\nThe baseline decides which hypothesis is addressed first.\n\n## Approval gate\n\nApproved by the user's `kontynuuj` message on 2026-07-31 under `P-CORE-008`.\nExecution may proceed within the recorded scope.\n\n## Actual changes\n\n- Initialized the standard ticket structure and project-level TODO entry.\n- Verified Docker availability and the seven candidate repositories.\n- Verified ticket formatting, absence of local absolute paths and compatibility\n with the generated-analysis guard.\n- Ran the normalized deterministic pipeline successfully on all seven detached,\n tracked-only external worktrees.\n- Preserved the complete baseline in `baseline.json` and its reviewed summary\n in `baseline.md`.\n- Selected non-actionable changelog mechanics as the first controlled defect:\n it repeats across the corpus, but can be corrected without pretending that\n ungrounded release claims have implementation evidence.\n- Added a focused red/green regression and a narrow changelog-signal classifier.\n- Evaluated only this patch on the unchanged external corpus: graph fingerprints\n remained stable, gold v2 stayed perfect, and false review-required findings\n fell by 1,024 across five repositories.\n- Added an independent red/green correction for generated-analysis verification:\n tracked audit quotations no longer masquerade as private input consumption,\n while newly introduced untracked references remain blocked.\n\n## Unfinished items and blockers\n\n- No blocker inside ticket scope. Remaining library gaps are listed in\n `docs/READINESS.md`; they require separate controlled iterations.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-012/ai-codex.md", "path": "ticket-012 / ai-codex.md", "size": "1.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-012\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\n`openrouter/auto-beta` returned syntactically valid JSON with one incomplete NL\nrecord. Runtime rejection was correct, but failure handling discarded the\nresolved model and usage metadata. The live report also summarized history\nbefore appending the current run.\n\n## Execution plan\n\n1. Select an explicit model advertising `structured_outputs`.\n2. Preserve metadata across structured parse and stage failure boundaries.\n3. Record current-run history before rendering the audit summary.\n4. Add regression tests and pass all offline gates.\n5. Run the real six-stage check and publish the measured result.\n\n## Blockers\n\n- None; the user explicitly authorized trying another paid live model.\n\n## Result\n\nQwen and GPT-5.4 Mini were rejected after bounded correction. Gemini 3.6 Flash\npassed the complete six-stage `require-llm` pipeline. The default now names\nthat model explicitly; stage-specific overrides remain supported.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-011/ai-codex.md", "path": "ticket-011 / ai-codex.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-011\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe linker already compares symbol aliases, but it treats a shared leaf as\nproof even when several files declare it. This can turn an ambiguous request\ninto several implementation relations and hide the absence of a selected\ntarget. Resolution must use observed AST ownership and abstain on ties.\n\n## Execution plan\n\n1. Census symbol ownership and current NL extraction noise.\n2. Add an AST-backed symbol-resolution index used by linking and diagnostics.\n3. Preserve unique/qualified/path-selected matches and reject ambiguous or\n conflicting matches.\n4. Make missing-field actions concrete and reduce false symbol candidates.\n5. Add unit and gold hard-negative cases, verify and publish `main`.\n\n## Blockers\n\n- None for the deterministic scope.\n\n## Actual changes\n\n- Added a graph symbol-resolution index over AST declarations.\n- Gated NL↔AST shared-symbol evidence on unique ownership or explicit path.\n- Added candidate-aware ambiguity/conflict diagnostics.\n- Removed file names and all-caps prose from implicit symbol extraction.\n- Added six focused resolver tests and three gold linking cases.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-022/ai-codex.md", "path": "ticket-022 / ai-codex.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-022\n---\n# Participant: codex\n\n## Understanding\n\nSubactor is an umbrella directory containing many independent repositories.\nThe current extractor exits after `git rev-parse` fails at the umbrella root,\nso downstream intent/reality analysis has no Git evidence. The repair belongs\ninside the deterministic Git extractor and must not broaden todo2code into an\nexecutor.\n\n## Execution plan\n\n1. Wait for explicit approval and move to `EDIT`.\n2. Add failing tests for bounded repository discovery and path namespacing.\n3. Refactor the extractor into single-repository extraction plus deterministic\n umbrella orchestration.\n4. Run focused tests, full verification, governance and Docker smoke.\n5. Repeat the Subactor pipeline and record measured evidence.\n6. Stop before merge/push without independent protected review.\n\n## Current state\n\nThe user approved ticket-022 with `zatwierdzam ticket 022 i kolejne` after the\nexact plan was presented. Implementation and validation are complete within\n`intent.json`; state is `BLOCKED / VALIDATION` only because the repository-wide\ngovernance gate retains the inherited ticket-018/019 findings.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-020/ai-codex.md", "path": "ticket-020 / ai-codex.md", "size": "7.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-020\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nThe user wants role-aware communication to become enforceable rather than a\nfilename convention. A previously verified user must keep the same role in\nlater tickets, and a message submitted through an IDE or CLI must be attributed\nto that stable identity and written only by a trusted intake boundary.\n\nThe extension must be fully machine-validatable and actionable. Therefore one\ndomain model will serve the TypeScript CLI, a Python shell CLI, MCP and A2A.\nCQRS isolates mutations from queries. Event sourcing provides append-only\nhistory, replay and evidence. Protobuf is the canonical transport envelope;\nstrict JSON Schemas validate its JSON/payload views. Required validation is\noffline and deterministic; an LLM has no role in identity, authorization,\nschema, integrity or acceptance decisions.\n\nThe model does not infer a simple `manager > user > dev` permission chain.\nThese are primary responsibility roles with explicit capabilities. A manager\ndoes not silently gain developer rights, and a developer does not gain manager\napproval rights. Additional duties require explicit, auditable grants.\n\nCurrent verified baseline:\n\n- Docker CLI and engine are available; engine version is `29.1.3`.\n- participant registry v1 supports only `human|agent` and exact external\n identifiers; it has no governance-role persistence.\n- communication filename inference understands `user|human` and `ai|agent`,\n but not `manager|dev` without explicit metadata.\n- existing CLI, MCP and A2A share action services but have no trusted message\n intake command or append-only participant-role event store.\n- ticket-018 (`governance`) is blocked in validation and ticket-019 (`sdk`) is\n waiting for approval; this distinct `interfaces` scope does not claim their\n implementation paths.\n\n## Architectural decisions\n\n1. `participant-id` is the aggregate identity. Authenticated provider/IDE/CLI\n principals are exact aliases bound by events; names are presentation only.\n2. Human `governanceRole` and participant `kind` are independent. Agents can\n request/query but cannot receive a trusted human projection capability.\n3. Commands are accepted only with correlation, causation, idempotency,\n authenticated-principal and expected-version metadata.\n4. Successful mutations append immutable events before rebuilding projections.\n Rejections return sanitized `T2C-INTAKE-*` diagnostics and append no secret\n or spoofed human message.\n5. A human role Markdown file is a rebuildable view, not the identity source.\n Its front matter binds stable participant, role, ticket and projection hash.\n6. The limited Protobuf envelope uses deterministic varint and\n length-delimited fields plus a JSON payload validated by a matching schema.\n TypeScript/Python golden vectors prevent codec drift without adding a\n runtime dependency in this ticket.\n\n## Execution plan\n\n1. Wait for explicit human approval and move ticket-020 to `EDIT` without\n treating the Markdown status as trusted merge approval.\n2. Define versioned registry, capability, command/query/event/result and\n diagnostic schemas under the interfaces module, plus the canonical `.proto`\n envelope and stable diagnostic catalog.\n3. Upgrade participant identity validation with v1 read compatibility and an\n explicit v2 migration result; do not infer role from historical filenames.\n4. Implement the CQRS application boundary, authorization matrix and exact\n principal resolver.\n5. Implement an event-per-version filesystem store with exclusive creation,\n expected-version checks, idempotency index, integrity chain, replay and\n deterministic projection verification.\n6. Implement the trusted projection writer with atomic writes, root/symlink\n confinement, secret/size checks and manager/user/dev filename validation.\n7. Add TypeScript and dependency-free Python Protobuf envelope codecs and\n shared golden test vectors.\n8. Add Python and TypeScript CLI commands with the same result schema, stable\n exits, dry-run/JSON modes and no ambient identity guessing.\n9. Expose the application handlers through MCP tools and the A2A\n governed-intake skill; keep protocol errors distinct from domain rejection.\n10. Add positive and negative tests in temporary repositories, including two\n tickets for the same developer, spoofing, role mutation, duplicate command,\n concurrent version, broken chain, secret rejection and projection rebuild.\n11. Run governance and relevant Docker E2E checks, record sanitized raw\n evidence, review only ticket-020-owned paths and report any shared-path need\n rather than widening scope.\n\n## Planned reaction contract\n\n- validation/schema input: stable diagnostic and CLI exit `2`;\n- identity/authorization rejection: exit `3`;\n- version/idempotency conflict: exit `4`, retryability declared explicitly;\n- event/projection integrity failure: exit `5`;\n- atomic storage failure: exit `6`;\n- unsupported protocol/schema version: exit `7`;\n- MCP returns the same structured diagnostic in `structuredContent`;\n- A2A completes the task only for accepted commands and emits a deterministic\n rejected/failed outcome for domain or protocol errors respectively.\n\n## Actual changes\n\n- The user explicitly approved implementation with \"wdraΕΌaj\" after the agent\n requested approval of ticket-020 and AC-01..AC-19.\n- Transitioned the ticket to `IN_PROGRESS / EDIT` in an isolated\n `ticket-020-role-bound-intake` worktree.\n- Implemented strict intake contracts, registry v2 compatibility, deterministic\n diagnostics, a hash-chained event store, authorization/capability decisions,\n trusted projections and dry-run legacy conflict detection under\n `src/communication/**`.\n- Implemented TypeScript/Python Protobuf codecs, strict JSON Schemas, a Python\n shell CLI, TypeScript CLI commands, MCP tools and A2A JSON/Protobuf parity\n under the approved interface paths.\n- Bound A2A intake identity to the authenticated bearer-derived principal and\n rejected unauthenticated bootstrap; removed caller-controlled trusted-prefix\n authority discovered during security review.\n- Added focused role persistence, spoofing, agent rejection, concurrency,\n idempotency, hash-chain, secret, projection, CLI, MCP, A2A and cross-language\n golden-vector tests. No human-owned role file was changed in this repository.\n- Completed Node and network-isolated Docker core verification with zero test\n failures.\n\n## Blockers\n\n- The branch was refreshed to committed policy 0.8.0. Safe parallel tickets\n 018 (`governance`) and 020 (`interfaces`) are accepted. The global gate now\n fails only on ticket-019's explicit conflict/unmet dependency on ticket-018,\n paths outside `sdk` and overlapping `Makefile` claim; no finding names\n ticket-020.\n- Trusted merge evidence will still require an independent protected review or\n signed attestation; chat approval authorizes only the interactive edit phase.\n\n## Approval boundary\n\n- Current state: `BLOCKED / VALIDATION`.\n- Interactive implementation was approved by the human operator on 2026-08-01.\n- Protected merge approval remains unresolved and cannot be self-attested.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-010/ai-codex.md", "path": "ticket-010 / ai-codex.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-010\n---\n# Participant: codex (AI agent)\n\n## Understanding\n\nAST parsing and Markdown chunking are deterministic but repeated for every run.\nTheir cache keys must bind every input that can change output, while cached data\nmust be treated as disposable acceleration rather than evidence.\n\n## Execution plan\n\n1. Map AST adapters, document chunking and output-directory boundaries.\n2. Add a shared versioned cache with atomic writes and fail-open recovery.\n3. Cache TypeScript per file, external adapters per source manifest and chunks\n per document.\n4. Prove cold/warm equivalence, invalidation, corruption recovery and provider\n isolation.\n5. Benchmark tracked snapshots, update repository evidence and publish `main`.\n\n## Blockers\n\n- Live provider calls are outside this ticket; documentation-cache tests use a\n local structured-response stub and explicitly verify calls are not cached.\n\n## Actual changes\n\n- Added the dependency-free `ContentCache` under `src/core/`.\n- Added cache telemetry to AST and documentation extraction results.\n- Added per-file TypeScript and Markdown keys plus per-manifest external AST\n keys.\n- Added cold/warm, invalidation, corruption, bypass and external-toolchain tests.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-015/ai-codex.md", "path": "ticket-015 / ai-codex.md", "size": "595B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-015\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Pin the malformed compound-action title in a focused unit test.\n2. Preserve source text only when the inferred object visibly retains a leading\n imperative, signalling that a secondary verb was removed.\n3. Re-run the real retry/backoff fixture and validation gates.\n\n## Responsibility boundary\n\nThis is a deterministic rendering defect with an unchanged, explicit human\nintent. It is owned by the technical executor and requires no fabricated\n`user-*` response.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-003/ai-codex.md", "path": "ticket-003 / ai-codex.md", "size": "2.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: Codex (AI agent)\n\n- **Ticket**: ticket-003\n- **Status**: COMPLETE\n- **Workflow state**: DONE\n\n## Understanding\n\nThe remaining changelog count is not itself a defect. It mixes old release\nclaims, unverifiable claims, extractor artifacts and potentially repeated false\npositives. This iteration must review a stable sample before selecting any\nbehavior change.\n\n## Execution plan\n\n1. Build a clean runtime from tracked `18cc21b`.\n2. Apply only the ticket-002 changelog diagnostic patch.\n3. Re-run the unchanged seven-repository corpus.\n4. Select a deterministic stratified sample from residual findings.\n5. Label the sample with explicit, reviewable rules.\n6. Rank false-positive classes by repository spread and count.\n7. Add one red regression and nearby hard negatives for the leading safe class.\n8. Implement and evaluate one correction, or reject the hypothesis.\n9. Run full validation and update readiness evidence.\n\n## Guardrails\n\n- A release claim is not implementation evidence merely because its words\n resemble a module.\n- Historical age alone does not make a diagnostic false.\n- Missing AST support is reported as incomplete evidence, not silently ignored.\n- Current unrelated and generated workspace changes are excluded from the A/B\n runtime.\n\n## Actual changes\n\n- Initialized and approved the ticket from the continuation message.\n- Re-ran the unchanged corpus successfully from tracked `18cc21b` plus only the\n ticket-002 diagnostic patch.\n- Built and reviewed a deterministic 168-record stratified sample.\n- Selected exact file-only update bookkeeping: 28 sampled and 547 total\n findings across five repositories.\n- Added a red/green regression with behavioral hard negatives.\n- Re-ran the corpus with only this correction: removed 547 review findings and\n 188 secondary unlinked warnings while every graph fingerprint stayed stable.\n- Passed full verification, five SDK examples, the production dependency\n audit, CLI/MCP/A2A smoke checks and Docker smoke. The suite reported 242\n tests: 241 passed, none failed and the local Java fixture was skipped because\n this environment has no JDK; required CI supplies JDK 17.\n- Updated readiness evidence and closed the ticket with 1,306 deliberately\n retained residual findings.\n- After user review, moved the executable audit reproducer out of the ticket\n directory into `scripts/research/`; the ticket now contains evidence only.\n\n## Blockers\n\n- None.\n", "is_subdir": true}, {"name": "ai-codex.md", "rel_path": "ticket-016/ai-codex.md", "path": "ticket-016 / ai-codex.md", "size": "585B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "---\nparticipant-id: agent:codex\nparticipant: codex\nrole: agent\nticket: ticket-016\n---\n# Participant: codex (AI agent)\n\n## Plan\n\n1. Add a dependency-free PHP helper and common-envelope adapter.\n2. Test positive facts, no-source skip, missing runtime and invalid syntax.\n3. Run an isolated before/after pipeline on a PHP-bearing semcod repository.\n4. Record exact evidence and run repository gates.\n\n## Responsibility boundary\n\nThe adapter records syntax observations only. It does not infer user intent or\nclaim that token parsing exposes every semantic property of a complete PHP AST.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-006/audit.md", "path": "ticket-006 / audit.md", "size": "2.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 006 audit\n\n## Retained hardening\n\n- canonical internal response definition:\n `src/semantic/reranker-response.ts`;\n- shared verdict/reason values and compatibility rule:\n `src/semantic/reranker.ts`;\n- provider call uses that schema directly;\n- published decision schema is checked for drift in the full test suite;\n- runtime rejects unknown/missing properties, wrong scalar types, invalid IDs,\n blank strings and contradictory verdict/reason pairs without coercion;\n- error diagnostics contain only the failing path and\n provider/model/response ID.\n\n## Provider comparison\n\nBoth routes used the same six-candidate top-1 shortlist from the clean tracked\n`subactor/platform` commit\n`3e96573d587cb664741849ceba205bf303b9f418`.\n\n| Requested route | Result |\n|---|---|\n| `qwen/qwen3.7-plus` | rejected in ticket-005: missing `decisions`, renamed `judgments`, then invalid confidence |\n| `qwen/qwen3.7-flash` | rejected: `response.decisions[0] contains unknown properties: decision` |\n\nThe Flash response identity was\n`Alibaba/qwen/qwen3.7-flash/gen-1785490219-noOw2NdfoPMqC6dLf7x6`.\nNo raw provider response is stored. No relation was materialized by either\nroute.\n\n## Communication ownership follow-up\n\nThe final ticket has 13 agent records and deliberately no agent-authored human\nfile. Analysis raises three `AGENT_WORK_OUTSIDE_REQUEST` warnings with\n`responseRequiredRole=human`, but `responseRequiredFrom=[]` because no human\nparticipant record exists. The role is correct; the concrete routing target is\nunresolved.\n\nThis must not be \"fixed\" by having an agent create `user-*`. A later ticket\nshould either route through a trusted participant/owner registry or emit an\nexplicit unresolved-human sentinel and migration issue.\n\n## Gates\n\n- `npm run verify`: 252 tests, 251 pass, 0 fail, 1 local JDK skip;\n- gold v2 and v1: PASS;\n- gold v2: captured reranker 6/6, zero forbidden violations, one abstention;\n- examples: 227 records, 97 relations, five SDKs: PASS;\n- dependency audit: 0 vulnerabilities;\n- CLI, MCP, A2A and Docker smoke: PASS.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-013/audit.md", "path": "ticket-013 / audit.md", "size": "2.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 013 audit\n\n## Baseline\n\n`google/gemini-3.6-flash`: PASS 6/6, 125,486 ms, 177,953 tokens,\n$0.412363, no fallback or degradation.\n\n## Candidate screening\n\n| Model | Structured output | Prompt / completion per 1M | Context |\n|---|---|---:|---:|\n| `google/gemini-3-flash-preview` | yes | $0.50 / $3.00 | 1,048,576 |\n| `mistralai/codestral-2508` | yes | $0.30 / $0.90 | 256,000 |\n| `deepseek/deepseek-v4-pro` | yes | $0.435 / $0.87 | 1,048,576 |\n\n## Live results\n\n| Model | Result | Time | Tokens | Cost | Fallback |\n|---|---:|---:|---:|---:|---:|\n| `google/gemini-3.6-flash` (fresh baseline) | PASS 6/6 | 106,700 ms | not recorded in comparison summary | $0.342992 | no |\n| `google/gemini-3-flash-preview` | PASS 6/6 | 64,064 ms | 116,604 | $0.076411 | no |\n| `mistralai/codestral-2508` | PASS 6/6 | 57,129 ms | 118,920 | $0.037994 | no |\n| `deepseek/deepseek-v4-pro` | FAIL | >900,000 ms | no manifest | unmeasured | no result |\n\nCodestral was about 1.87Γ— faster and 9.0Γ— cheaper than the fresh Gemini 3.6\nbaseline. Gemini 3 Flash Preview was about 1.67Γ— faster and 4.49Γ— cheaper.\nDeepSeek was stopped at the declared run budget rather than allowed to hang.\n\n## Cross-repository result\n\nThe first real repository run exposed sequential Markdown batches. On\n`weekly`, Codestral enriched 161 records in six requests but needed 218,741 ms.\nBounded concurrency of three preserved response/record audit order and reduced\nthe same run to 53,362 ms (4.1Γ— faster), with no degradation. The previously\ntimeouting `nlp2uri` then completed 619 records in 20 requests in 194,750 ms,\n176,797 tokens and $0.08588244. A large deterministic `algitex` scan completed\n2,643 Markdown records and the full pipeline in 9.4 seconds.\n\n## Decision\n\nPromote `mistralai/codestral-2508` to the explicit default. Keep\n`google/gemini-3-flash-preview` as the first fallback/reference candidate.\nThe selection is operational: contract adherence, latency and cost are\nmeasured; semantic quality still remains bounded by runtime validators and the\noffline gold suite.\n\nThe live runner now enforces its total budget by aborting provider requests;\nit also refuses to reuse a failed manifest older than the current attempt.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-005/audit.md", "path": "ticket-005 / audit.md", "size": "3.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 005 audit\n\n## Decision\n\nReject the live cross-language reranker as a production feature. Retain the\noffline contracts, schemas, tests, captured gold fixtures and research\nreproducer. Do not export or enable the reranker through the package, linker,\nCLI, MCP or A2A.\n\n## Communication audit\n\nThe final ticket produced 51 `codex` records and 4 `tom-sapletta-com` records\nafter section-aware conversion. There are no blocking polarity conflicts. The\nfinal issue ownership is:\n\n- 7 `AGENT_CLAIM_WITHOUT_EVIDENCE` findings require `codex` to attach commit or\n test evidence (the current implementation is intentionally uncommitted);\n- 1 `AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED` finding requires\n `tom-sapletta-com` to record or reject the approval in the human-owned file;\n- 8 `AGENT_WORK_OUTSIDE_REQUEST` warnings require `tom-sapletta-com` to record\n or reject the detailed scope that currently exists only in the conversation.\n\nThe agent may correct its seven evidence claims, but must not edit the\nhuman-owned participant file to silence the other nine findings.\n\nHistorical read-only material from `wellmanifest/new-project` commit\n`2b9e3c9` showed why a filename-only migration is unsafe:\n\n- plain rename to `user-*`/`ai-*`: zero records and owner-specific migration\n warnings;\n- typed Opus request/message sections: 9 human + 58 agent records, zero issues;\n- typed GPT56Luna request/message sections: 9 human + 72 agent records, three\n unmatched request fragments and no false conflict between different files.\n\n## Offline reranker result\n\nGold v2 uses captured, structured decisions through the same runtime\nvalidators:\n\n- expected cross-language relations: 6/6;\n- forbidden cross-language relations: 0/6 violations;\n- accepted: 6;\n- abstained hard-negative cases: 1;\n- deterministic linker remains 0/6 and unchanged.\n\n## Live tracked-repository result\n\n- repository: `subactor/platform`;\n- clean commit: `3e96573d587cb664741849ceba205bf303b9f418`;\n- current graph fingerprint:\n `250df4ff83f456fb371278d4a0c2cf17dd025582b6865a0cb2f01bd469fd1dd0`;\n- retrieval: the pinned multilingual E5 ranking captured by ticket 004;\n- bounded payload: six reciprocal selected declarations, initially top-3\n (18 candidates), then top-1 (6 candidates);\n- model: `qwen/qwen3.7-plus`;\n- declared evaluation revision: `qwen3.7-plus@2026-07-31`;\n- privacy boundary: clean HEAD required; every projected declaration and module\n path had to be tracked; generated graph and result paths stayed outside the\n worktree.\n\nThree live attempts failed closed:\n\n1. top-3 returned a JSON value without a `decisions` array;\n2. top-1 returned the top-level key `judgments` instead of `decisions`;\n3. top-1, after an explicit key instruction, returned at least one\n `confidence` outside the required numeric 0..1 contract.\n\nNo accepted result artifact exists because invalid provider output is not\npromoted into `t2c.semantic-rerank/v1`. No relation was created, no coverage\nmetric changed, and the two false embedding candidates from ticket 004 were\nnot silently accepted.\n\n## Validation\n\n- `npm run verify`: 251 tests, 250 pass, 0 fail, 1 local JDK skip;\n- isolated `CLI watch` retry: 3/3 pass after one full-suite timing failure;\n- gold v2 and v1: PASS;\n- examples: 227 records, 97 relations, five SDKs: PASS;\n- `npm audit --omit=dev`: 0 vulnerabilities;\n- CLI, MCP, A2A and Docker smoke: PASS.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-004/audit.md", "path": "ticket-004 / audit.md", "size": "5.0KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Language-independent topic matching audit\n\n## Baseline\n\nThe current linker creates capability-topic evidence from at least three\nshared normalized tokens. This is deterministic and precision-oriented, but a\nhand-written Polish-to-English alias table is the only cross-language bridge.\n\nThe existing gold known gap:\n\n- declaration: `Kolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem`\n- module: `src/queue/task-retry-backoff.ts`\n- expected: `evidenced_by`\n- current result: no relation\n\n## Decision questions\n\n1. Can a strategy bridge languages without repository-specific vocabulary?\n2. Can its evidence be distinguished from lexical and exact-target evidence?\n3. Can offline tests exercise the contract without a provider dependency?\n4. Can production use be bounded, cached and explicitly configured?\n5. Does repository-level coverage improve without hard-negative regressions?\n\n## Candidate strategies\n\n| Strategy | Quality hypothesis | Main risk | Initial status |\n| --- | --- | --- | --- |\n| Local multilingual embeddings | Semantic bridge without sending text away | model size, native/runtime cost | investigate |\n| Provider translation/topic projection | Reuses audited model boundary | network, cost, nondeterminism | investigate |\n| Injected precomputed topic projections | Clean deterministic linker contract | projection source still required | investigate as architecture |\n\n## Sources and constraints\n\n- Transformers.js supports server-side feature extraction, filesystem caching\n and disabling remote model loading after a model is installed:\n .\n- OpenRouter exposes a batch embeddings endpoint, but it is authenticated,\n network-bound provider behavior:\n .\n- `intfloat/multilingual-e5-small` supports 94 languages, has 384 dimensions,\n requires `query:`/`passage:` prefixes and warns that absolute cosine values\n cluster high:\n .\n- The pinned local E5 weights are about 471 MB before quantization. A compatible\n Transformers.js ONNX artifact offers an int8 file of about 118 MB:\n .\n\n## Synthetic benchmark\n\n[`benchmark.json`](benchmark.json) contains six positive and six nearby\nnegative pairs in Polish, German, Spanish and French. The model revisions are\npinned in the result artifacts.\n\n| Model | Positive minimum | Negative maximum | Global separation | Pairwise ranking |\n| --- | ---: | ---: | ---: | ---: |\n| multilingual MiniLM | 0.673289 | 0.732568 | -0.059279 | 5/6 |\n| multilingual E5, no role prefixes | 0.774453 | 0.847799 | -0.073346 | 6/6 |\n| multilingual E5, query/passage prefixes | 0.759374 | 0.835202 | -0.075828 | 6/6 |\n\nThere is no safe global cosine threshold. E5 ranks every paired positive above\nits nearby negative, but the smallest margin is only 0.007190 after applying\nthe model's required role prefixes.\n\n## Repository experiment\n\nThe tracked `subactor/platform` graph contains 133 module aggregates and 66\nactionable targetless declarations (`todo`, or documentation with\n`required`/`recommended` modality). The E5 prototype compared every declaration\nto every module.\n\nAt score 0.75 and forward margin 0.01:\n\n- 6 declarations passed;\n- 4 already had the selected module among current graph evidence;\n- 2 proposed new candidates;\n- both new candidates were rejected on review.\n\nOne rejected pair linked `KaΕΌde wywoΕ‚anie wymaga idempotency_key` to\n`scripts/build-urirun-registry.py`. The other picked a post-deploy check for a\nmulti-module Docker BuildKit statement that already touched thirteen modules.\n\nAdding reciprocal top-1 and a reverse 0.01 margin retained one existing,\ncorrect TODO link and proposed **zero** new candidates. This precision guard is\nuseful, but it cannot improve coverage on the measured repository.\n\n## Strategy decision\n\n| Strategy | Determinism/offline | Audit and cache | Measured decision |\n| --- | --- | --- | --- |\n| Raw local embedding threshold | pinned and offline after a 118–471 MB model download | model/revision and vector cache can be explicit | reject: no global separation and two platform false positives |\n| Reciprocal local top-1 | pinned and offline after download | explicit score, margins and model identity | reject for production: safe sample added no coverage |\n| OpenRouter embedding/translation | network and provider dependent | batchable and cacheable, but provider output needs a new audited stage | reject as default; no paid/live repository call in this ticket |\n| Injected precomputed projections | deterministic linker boundary | clean provenance contract | defer: plumbing alone does not solve projection quality |\n\nNo semantic matcher is retained. The library improvement in this ticket is a\nlarger, separately reported cross-language gold cohort: six known positive gaps\nand six gated hard negatives. Future candidates now have to improve that cohort\nwithout hiding behind same-language capability-topic quality.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-014/audit.md", "path": "ticket-014 / audit.md", "size": "2.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 014 audit\n\n## Reproduction\n\nFixture declaration:\n\n`Implement bounded exponential retry backoff in src/retry.py and verify it in tests/test_retry.py.`\n\n`src/retry.py` contained only an `enqueue` function. The pipeline emitted no\n`PLANNED_NOT_IMPLEMENTED` diagnostic and no code-change plan because the shared\npath was accepted as sufficient alignment. Changing only the target to the\nmissing `src/retry_backoff.py` immediately produced one grounded plan, which\nKoru converted to `PLF-001`.\n\n## Koru control\n\nThe isolated end-to-end control later produced `PLF-002`, Codestral returned a\nhash-bound unified diff, Koru verified it in a worktree and committed it on\n`koru/run-6e596247e153` (`1809ea5`). Re-running todo2code on that branch cleared\nthe targeted `PLANNED_NOT_IMPLEMENTED` diagnostic. This proves the transport;\nit does not excuse the original false alignment on an existing file.\n\n## Semantic gate and autonomous replay\n\nThe linker still records `shared_path + module_coverage` because the relation\nis useful for navigation, but diagnostics no longer treats it as implementation\nof a capability. Topics requested by the declaration are compared with the\naggregate's extracted `metadata.capabilities`; path-derived and structural edit\nwords do not count. A symbol, capability overlap, accepted semantic rerank or\ngrounded similarity to a concrete fact/commit can close the declaration. A\npure file-creation declaration remains compatible with exact path evidence.\n\nThe original existing-path fixture was replayed after the fix. todo2code raised\none `PLANNED_NOT_IMPLEMENTED`, generated one code-change plan and Koru created\n`PLF-003`. Koru required a unified diff, ran `PYTHONPATH=. pytest -q`, and\ncommitted the verified patch as `55a8b15` on\n`koru/run-35477cccef16`. Independent verification reported 6/6 tests and a\nsecond todo2code run produced zero plans for the target intent. The accepted\nrelations carried `capability_overlap:2`/`module_topic:4` for `src/retry.py`\nand `capability_overlap:1` for its test.\n\n## Cross-repository regression\n\nFresh deterministic runs succeeded on `weekly`, `nlp2uri` and `algitex`.\nThey reported respectively 1/10/3 `PLANNED_NOT_IMPLEMENTED`, 9/12/5 total\ncode-change plans, 58/152/139 capability-overlap relations and retained\n40/54/202 path-only module relations as navigation evidence. No repository\ncrashed and no generated artifact was written into its worktree.\n\nAmbiguous human intent continues through the existing communication contract:\n`responseRequiredRole` plus a known participant or `unresolved:human`. The\nruntime does not create or rewrite `user-*`. A missing implementation with a\nclear target is instead labelled for the technical executor in the diagnostic\naction, so it does not unnecessarily block on a human decision.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-007/audit.md", "path": "ticket-007 / audit.md", "size": "1.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 007 audit\n\n## Measured case\n\nThe tracked `project/ticket-006` contains agent communication and deliberately\nhas no agent-authored human participant file or participant registry entry.\n\n| Measure | Before | After |\n|---|---:|---:|\n| Communication issues | 3 | 3 |\n| Required role `human` | 3 | 3 |\n| Empty `responseRequiredFrom` | 3 | 0 |\n| `unresolved:human` routes | 0 | 3 |\n| Invented human identities | 0 | 0 |\n\nThe issue count, severity and semantic classification did not change. Only the\npreviously empty routing state became explicit.\n\n## Regression coverage\n\n- Agent-only ticket: `AGENT_WORK_OUTSIDE_REQUEST` routes to\n `unresolved:human`.\n- Human-only ticket: `REQUEST_WITHOUT_AGENT_RESPONSE` routes to\n `unresolved:agent`.\n- Existing mixed-participant fixtures retain their actual participant IDs.\n- Markdown rendering and diagnostic projection retain the sentinel.\n\n## Gates\n\n- `npm run verify`: PASS β€” 253 tests, 252 pass, 1 JDK skip.\n- `npm run evaluate:gold`: PASS β€” gold v2 unchanged at required quality.\n- `npm run evaluate:gold:v1`: PASS.\n- `npm run examples:check`: PASS β€” five SDKs.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-009/audit.md", "path": "ticket-009 / audit.md", "size": "1.8KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 009 audit\n\n## Before\n\n| Boundary | Provider schema | Runtime behavior |\n|---|---|---|\n| NL extraction | manual | unchecked generic followed by field coercion |\n| Document extraction | manual + separately published JSON | unchecked generic |\n| Markdown enrichment | manual | separate permissive type guard |\n| Communication enrichment | manual | separate permissive type guards |\n| Summary | manual | separate hand-written assertions |\n| Task synthesis | manual | coercion of enums, arrays and percentages |\n| Semantic reranker | manual | separate exact validator |\n\nGrounding checks are intentionally stronger than JSON Schema and remain a\nsecond stage: referenced record, diagnostic, candidate and response-local keys\nmust exist in the exact input context.\n\n## After\n\n| Gate | Result |\n|---|---|\n| Production structured calls | 7 canonical / 0 raw JSON |\n| Runtime constraints | exact keys, type, enum, bounds, pattern, array size, uniqueness |\n| Rejected-response provenance | provider/model/response ID retained |\n| Published document schema | generated, drift check PASS |\n| `npm run verify` | 256 tests: 255 pass, 0 fail, 1 JDK skip |\n| Module boundary | 98 modules, 453 imports, 0 cycles |\n| Gold v2 / v1 | 100% required gates / PASS |\n| Examples | 5 SDK, PASS |\n| Publication | `d0fc143` pushed to `origin/main` |\n\n## Intent boundary\n\nStructural invalidity is no longer interpreted. Values such as `\"90%\"`,\n`\"issue\"`, `\"high\"`, blank local keys and out-of-vocabulary actions are\nrejected and enter the stage's retry/fallback policy. Repository grounding is\nstill checked after parsing. A conflict between human-owned and agent-owned\ntyped intent remains routed to the owner of the required role; this contract\ndoes not authorize an agent to edit `user-*` on the human's behalf.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-008/audit.md", "path": "ticket-008 / audit.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 008 audit\n\n## Before\n\n- `new-ticket.sh` accepted `--users` but did not consistently materialize the\n documented structure.\n- Documentation claimed automatic `user-*` generation despite the rule that an\n agent must not write human-owned content.\n- `readme.sh` assumed ownership of `project/README.md`, colliding with the\n generated analysis namespace used by todo2code.\n- Participant templates mixed human instructions, agent plans and completion\n claims without explicit role metadata.\n- The index update silently depended on Python and reported success even if its\n replacement failed.\n\n## After\n\n| Gate | Result |\n|---|---|\n| Human files generated by scaffolder | 0 |\n| Generated agent identity | `agent:codex` / `agent` |\n| Missing human route in todo2code | `unresolved:human` |\n| Existing analysis `project/README.md` | byte-for-byte preserved |\n| Active second ticket without override | rejected, exit 3 |\n| Index traversal | rejected, exit 2 |\n| Repeated index generation | idempotent |\n| Machine-local `file:///` documentation links | 0 |\n\n## Publication\n\n- `wellmanifest/new-project@72e5f6c` on `main`.\n- Version `0.6.0` with policy DSL versions 7/5.\n- Existing unrelated staged `.gitignore` and `rompt.txt` were excluded from the\n upstream commit and remain owned by their original author.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-012/audit.md", "path": "ticket-012 / audit.md", "size": "2.8KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 012 audit\n\n## Initial live failure\n\nRun `20260731T141822Z-136712ee` failed after 48,865 ms in\n`naturalLanguageExtraction`. `openrouter/auto-beta` returned `records[5]`\nwithout `confidence`, `basis`, `target`, `sourceLines` and `text`.\n\nThe validator correctly failed closed. Two observability defects remained:\n\n1. `StructuredResponseError.responseMetadata` was discarded by NL and other\n direct extraction fallback boundaries, leaving model/token/cost as unknown.\n2. The audit summarized history before appending its own record, so rendered\n history lagged the persisted file by one run.\n\n## Model selection\n\nOpenRouter's model API was queried on 2026-07-31. Every candidate below\nadvertised `structured_outputs`.\n\n| Model | Result |\n|---|---|\n| `deepseek/deepseek-v4-flash` | no schema violation; request hit the old 120,000 ms client timeout |\n| `qwen/qwen3.7-plus` | NL and Markdown passed; documentation and communication violated their schemas twice |\n| `openai/gpt-5.4-mini` | violated NL schema twice, including after receiving the exact schema in the corrective prompt |\n| `google/gemini-3.6-flash` | **PASS 6/6**, 125,486 ms, 177,953 tokens, $0.412363 |\n\nThe DeepSeek attempt exposed a local configuration contradiction: live allowed\n300,000 ms per stage while the client aborted each request after 120,000 ms.\nThe live runner now raises its request/document timeout to at least the stage\nbudget without shortening a larger explicit override.\n\nThe first Qwen run also exposed inconsistent recovery: task synthesis and\nsummary had a bounded corrective attempt, while NL, Markdown, documentation\nand communication failed on their first contract miss. All four direct\nextractors now allow exactly one correction, quote the rejection and the exact\nJSON Schema, and validate the second response identically. Both attempts stay\nin the audit. A second invalid response still aborts `require-llm`.\n\n## Passing live run\n\n| Stage | Latency | Tokens | Cost |\n|---|---:|---:|---:|\n| natural language | 16,199 ms | 3,192 | $0.021540 |\n| Markdown | 13,529 ms | 3,048 | $0.018246 |\n| documentation | 32,080 ms | 14,759 | $0.064613 |\n| communication | 10,836 ms | 3,348 | $0.019662 |\n| task synthesis | 38,516 ms | 85,659 | $0.176686 |\n| summary | 14,326 ms | 61,947 | $0.111616 |\n\nResult: `PASS`, six of six stages, no fallback or degradation, total\n125,486 ms and $0.412363. Audit schema: `t2c.live-contract-check/v2`.\n\n## Verification\n\nFocused structured-output tests: 39/39 PASS. `npm run verify`: 286 tests,\n285 pass, one local JDK skip; 101 modules, 470 internal imports, no cycles;\n7 structured and 0 raw production calls. Gold v1/v2: 100% required metrics.\nFive SDK examples: PASS with shared fingerprint `1dacf2edc8d603a2`.\n\nImplementation and documentation were pushed to `main` in `11348c0`.\nUnrelated staged `nlp2uri.yaml` was explicitly excluded and remains user-owned.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-011/audit.md", "path": "ticket-011 / audit.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 011 audit\n\n## Before\n\n- `shared_symbol` compared aliases pairwise and did not count AST owners.\n- A short NL symbol declared in two modules could link to both modules.\n- `AMBIGUOUS_REQUIREMENT` repeated field names but gave no field-specific edit.\n- Backticked `manifest.json`/`latest.json` and plain `LLM`, `TODO`, `CHANGELOG`\n could enter `target.symbols`; `CHANGELOG` found an unrelated AST owner.\n\n## Repository census\n\n| Repository | AST records | Leaf aliases with multiple source owners |\n|---|---:|---:|\n| todo2code | 15,607 | 155 |\n| subactor-improvement | 865 | 2 (`spawn`, `summarize`) |\n| wellmanifest/new-project | 0 | 0 (documentation-only repository) |\n\nOn todo2code's tracked `TASK.md`, implicit symbol candidates fell from 7 to 2.\nThe five removed values were file names or all-caps prose; the remaining\n`TensorFlow` and `TypeScript` are unresolved product/code names and therefore\ncreate neither AST evidence nor an ambiguity claim.\n\n## Resolution contract\n\n| State | Link behavior | Diagnostic behavior |\n|---|---|---|\n| one AST path | allow exact `shared_symbol` evidence | no ambiguity |\n| several AST paths | abstain unless path/qualifier selects one | list candidates; request `target.path` |\n| explicit path conflicts | abstain | list observed locations; request path correction |\n| no AST declaration | no symbol evidence | ordinary planned-not-implemented, not ambiguity |\n\n## Verification\n\n| Gate | Result |\n|---|---|\n| `npm run verify` | PASS β€” 277 tests, 276 pass, 0 fail, 1 JDK skip |\n| Module boundary | PASS β€” 101 modules, 467 imports, 0 cycles |\n| No-LLM boundary | PASS β€” 9 entrypoints across 34 modules |\n| Resolver tests | PASS β€” 6/6 unique, ambiguous, path, qualified, conflict and missing-fields cases |\n| Gold v2 | PASS β€” extraction 21/21, linking 18/18 (10 exact-target, 8 capability-topic), diagnostics 11/11 |\n| Gold v1 | PASS β€” legacy dataset remains 100% |\n| Examples | PASS β€” 5 SDK, graph fingerprint `1dacf2edc8d603a2` |\n| Publication | implementation `25df74a` on `main`; unrelated `nlp2uri.yaml` excluded |\n\nThe examples graph fell from 101 to 91 relations while preserving 227 records.\nThe removed edges are the intended effect of abstaining from ambiguous NL↔AST\nsymbol ownership; all versioned gold expectations remain perfect.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-010/audit.md", "path": "ticket-010 / audit.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 010 audit\n\n## Cache contract\n\n| Property | Decision |\n|---|---|\n| Location | `/cache/v1//.json` |\n| Key | stable hash of namespace and output-relevant inputs |\n| TypeScript | source path + content hash + extractor identity |\n| External AST | ordered path/content manifest + executable + byte limit |\n| Documentation | source path + content hash + chunk size + algorithm identity |\n| Provider output | deliberately not cached |\n| Corruption/I/O | recompute; cache errors do not fail extraction |\n| Writes | same-directory temporary file followed by atomic rename |\n| Warning results | external adapter warnings are not cached |\n\n## Tracked-snapshot benchmark\n\nSingle local run on 2026-07-31; times are directional wall-clock measurements,\nnot a stable performance gate. External AST adapters were disabled to isolate\nthe per-file TypeScript/JavaScript cache. Documentation measured the production\nchunk algorithm and cache contract without making provider requests.\n\n| Repository | Workload | Cold | Warm | Warm hits | Output |\n|---|---:|---:|---:|---:|---|\n| semcod/todo2code | 15,062 AST records | 1398.4 ms | 442.1 ms | 169/169 | identical |\n| subactor-improvement | 751 AST records | 49.2 ms | 16.8 ms | 11/11 | identical |\n| wellmanifest/new-project | 26 Markdown files / 28 chunks | 10.1 ms | 7.2 ms | 26/26 | identical chunk count |\n| semcod/todo2code | 111 Markdown files / 161 chunks | 76.0 ms | 45.1 ms | 111/111 | identical chunk count |\n| subactor-improvement | 2 Markdown files / 2 chunks | 1.9 ms | 1.3 ms | 2/2 | identical chunk count |\n\nThe new-project result also shows the limit of this optimization: a small,\ndocumentation-only repository gains little absolute time. The cache matters\nmost for repositories with many AST inputs or repeated documentation analysis.\n\n## Verification\n\n| Gate | Result |\n|---|---|\n| Exact `f1d9334` snapshot | `npm run verify`: 261 tests, 260 pass, 1 JDK skip |\n| Module boundary | 99 modules, 462 imports, 0 cycles |\n| Cache tests | 5/5: cold/warm, invalidation, corruption, bypass, external adapter and provider isolation |\n| Gold v2 / v1 | 100% required gates / PASS |\n| Examples | 5 SDK, PASS |\n| Integrated local `main` | 270 tests, 269 pass, 1 JDK skip; includes the adjacent scheduled-live-check commit |\n| Publication | implementation `f1d9334` on `main` |\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-015/audit.md", "path": "ticket-015 / audit.md", "size": "1.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 015 audit\n\n## Cause\n\nThe compound source said `Implement ... and verify it ...`. The deterministic\naction classifier selected `validate` because `verify` has higher table\nprecedence than `implement`. `inferObject` then removed `verify` from the middle and\nleft `Implement ... and it ...`; `titleFor` unconditionally prepended another\n`Implement`.\n\n## Fix\n\n`titleFor` keeps its concise `Implement ` projection for normal records.\nWhen the inferred object still begins with an imperative, it instead uses the\nlossless source statement (without terminal punctuation). This is a narrow,\nauditable indication that object inference removed a different clause verb.\n\n## Evidence\n\nThe focused suite passed 18/18. The full repository gate passed with 300 tests\n(299 pass, 1 local JDK skip), both gold datasets remained at 100%, and\n`examples:check` passed with unchanged SDK fingerprints. Re-running the\noriginal existing-path fixture\nproduced:\n\n`Implement bounded exponential retry backoff in src/retry.py and verify it in tests/test_retry.py`\n\nThe underlying record text, targets and diagnostic remained unchanged.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-003/audit.md", "path": "ticket-003 / audit.md", "size": "2.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Residual changelog audit\n\n## Current corpus\n\nThe runtime is tracked `18cc21b` plus only the ticket-002 changelog diagnostic\npatch. All seven unchanged external commits completed with `succeeded`.\n\n| Repository | Records | Relations | Residual findings | Sample |\n| --- | ---: | ---: | ---: | ---: |\n| semcod/code2llm | 16,899 | 41,758 | 955 | 24 |\n| semcod/domd | 10,611 | 7,484 | 99 | 24 |\n| semcod/pactfix | 5,161 | 3,917 | 48 | 24 |\n| semcod/code2logic | 21,423 | 16,933 | 120 | 24 |\n| semcod/code2docs | 6,717 | 35,468 | 269 | 24 |\n| semcod/redup | 7,204 | 19,259 | 269 | 24 |\n| subactor/platform | 10,628 | 11,424 | 93 | 24 |\n\n## Sampling policy\n\nThe sample is deterministic: records are grouped by\n`target-class:action`, sorted by stable record ID inside each group, and\nselected round-robin over lexically sorted groups. The limit is 24 per\nrepository, producing 168 reviewed records.\n\nEvery sample row in [`sample.json`](sample.json) preserves repository, record\nID, stratum, text, targets, tracked path owners, source lines, label and\nrationale.\n[`scripts/research/audit-changelog-sample.mjs`](../../scripts/research/audit-changelog-sample.mjs)\nreproduces selection and classification from run artifacts.\n\n## Classification\n\n| Class | Sample | Full deterministic census | Repositories | Decision |\n| --- | ---: | ---: | ---: | --- |\n| Exact `Update ` bookkeeping | 28 | 547 | 5 | selected |\n| Opaque `chore: update N files` | 1 | 1 | 1 | reject: insufficient spread |\n| Unchecked roadmap item in changelog | 6 | 30 | 2 | defer: extractor lifecycle issue |\n| Substantive or still unverified claim | 133 | 1,275 | 7 | retain diagnostic |\n\nManual review of all 35 sampled non-substantive rows confirmed the labels.\nRepresentative selected examples include:\n\n- `Update README.md`\n- `Update scripts/run-testql-environment.sh`\n- `Update tests/project/analysis.json`\n- `Update uv.lock`\n- `update debug/.code2flow_cache/...pkl`\n\nThese rows assert only that a file changed. They do not state a behavior that\nan implementation-gap diagnostic can ground. By contrast, the following must\nremain actionable:\n\n- `Update src/runtime.ts to reject invalid tokens`\n- `Updated authentication in src/runtime.ts`\n- `Update support for Dockerfile parsing`\n- `Added Jenkinsfile support for deployment pipelines`\n\n## Selected correction\n\nTreat only an exact, single-token `Update ` entry as non-actionable\nrelease bookkeeping. A token must look like a path, dotfile, filename with an\nextension, or a conventional extensionless repository file. Any additional\nwords keep the claim actionable.\n\nThis is a diagnostics signal correction. It does not create evidence, alter the\ngraph, or broadly link changelog prose to modules.\n", "is_subdir": true}, {"name": "audit.md", "rel_path": "ticket-016/audit.md", "path": "ticket-016 / audit.md", "size": "1.5KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket 016 audit\n\n## Boundary\n\nThe host has PHP 8.4 but no `ext-ast`. Pulling a Composer parser into the Node\ncore would add a second dependency graph. The adapter therefore uses PHP's\nbuilt-in `token_get_all` with `TOKEN_PARSE`: syntax errors are real parser\nerrors, while the emitted evidence is accurately named `php_syntax_tokens`,\nnot a full AST.\n\nIt emits bounded source facts for namespace, `use`, class/interface/trait/enum,\nnamed function, qualified method and call sites. Identical calls on the same\nsource line collapse to one semantic fact. Paths come from the same ignore\nmatcher as the other adapters and cross the helper boundary through a private\nmanifest.\n\n## External A/B\n\nBoth deterministic pipelines read the same current `semcod/redsl` worktree and\nwrote disposable artifacts outside that worktree. All non-PHP external adapters\nwere disabled.\n\n| Metric | PHP disabled | PHP enabled | Delta |\n|---|---:|---:|---:|\n| Tracked PHP files discovered | 40 unsupported | 40 parsed | β€” |\n| Graph records | 2,128 | 4,255 | +2,127 |\n| Graph relations | 3,436 | 3,516 | +80 |\n| Warning diagnostics | 730 | 712 | -18 |\n| Code-change plans | 1 | 1 | 0 |\n| Extraction warnings | 1 unsupported-language | 0 | -1 |\n\nThe stable plan count matters: adding implementation evidence reduced false\nwarnings without hiding the remaining actionable plan.\n\nThe repository gate passed with 304 tests (303 pass, 1 local JDK skip), both\ngold datasets stayed at 100%, and `examples:check` passed for all five SDKs.\n", "is_subdir": true}, {"name": "baseline.md", "rel_path": "ticket-002/baseline.md", "path": "ticket-002 / baseline.md", "size": "2.8KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# External corpus baseline\n\nRuntime: todo2code 0.5.0 at\n`5f5ae5938ab77dcce474ba7abbd23686072776ec`.\n\nEach source was checked out as a detached, tracked-only worktree at the commit\nrecorded below. Runs were offline and deterministic: tracked `TASK.md`,\n`TODO.md` and `CHANGELOG.md` were selected when present, documents were limited\nto `README.md` and `docs/**/*.md`, communication and task synthesis were\ndisabled, and neither extraction nor summary used an LLM.\n\n| Repository | Commit | Time | Records | Relations | Topics aligned/all | Impl. | Plan | Docs | Diagnostics (I/W/R/B) | Warnings |\n| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | ---: |\n| semcod/code2llm | `b297d60` | 18 s | 16,899 | 41,747 | 107/628 | 59.4% | 43.7% | 31.4% | 912/2,377/1,411/0 | 9 |\n| semcod/domd | `b6c5ad2` | 5 s | 10,611 | 7,470 | 9/241 | 11.8% | 5.4% | 5.4% | 616/1,388/105/0 | 0 |\n| semcod/pactfix | `daf301a` | 5 s | 5,161 | 3,917 | 2/153 | 5.0% | 1.8% | 1.8% | 197/419/48/0 | 5 |\n| semcod/code2logic | `ba93489` | 12 s | 21,423 | 16,927 | 27/359 | 17.7% | 14.1% | 14.1% | 1,474/3,081/121/4 | 3 |\n| semcod/code2docs | `c738aff` | 9 s | 6,717 | 35,447 | 57/265 | 47.1% | 77.0% | 47.3% | 283/876/396/0 | 0 |\n| semcod/redup | `a175fb0` | 6 s | 7,204 | 19,173 | 62/277 | 49.2% | 55.9% | 10.8% | 476/1,205/703/0 | 0 |\n| subactor/platform | `3e96573` | 6 s | 10,628 | 11,002 | 25/688 | 5.9% | 9.3% | 8.9% | 185/993/93/0 | 1 |\n\n`I/W/R/B` means `info/warning/review_required/blocking`. Full commit hashes,\ngraph fingerprints and diagnostic distributions are in\n[`baseline.json`](baseline.json).\n\n## Warnings and explicit exceptions\n\n- `code2llm`, `pactfix` and `code2logic` contain deliberately invalid parser\n fixtures and/or unsupported PHP, Ruby or C# inputs.\n- Java extraction could not run for repositories containing Java because the\n clean runtime had no JDK. This is an explicit local exception; Java remains a\n required CI job.\n- `subactor/platform` has one configuration file above the shared 524,288-byte\n limit.\n- No repository-specific semantic options or thresholds were introduced.\n\n## Repeated defect selected for the first iteration\n\n`CHANGELOG_WITHOUT_IMPLEMENTATION` occurs in all seven repositories (2,877\nfindings in total). Sampling separates two classes:\n\n- substantive claims such as adding Jenkinsfile support or structured HR\n intent; these must remain reviewable when no implementation evidence exists;\n- release-note mechanics such as `Update project/calls.mmd`, placeholder\n sections and summaries like `... and 12 more files`; these are not behavioral\n claims and currently inflate both `CHANGELOG_WITHOUT_IMPLEMENTATION` and\n `UNLINKED_RECORD`.\n\nBroadly linking changelog prose to module topics would manufacture evidence for\nthe first class. The controlled change will instead classify only proven\nnon-actionable release-note mechanics and leave substantive claims unchanged.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-006/changelog.md", "path": "ticket-006 / changelog.md", "size": "1.1KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-006)\n\n## [0.1.0] - 2026-07-31\n\n- Initialized the canonical structured-output conformance ticket.\n- Preserved human-file ownership instead of fabricating a `user-*` record.\n- Entered `PLAN`; no implementation change yet.\n\n## [0.2.0] - 2026-07-31\n\n- Added the canonical semantic-reranker provider response definition and exact\n fail-closed runtime validator.\n- Added a drift gate against the published result schema.\n- Added offline regressions for wrong envelopes, non-numeric confidence and\n contradictory verdict/reason pairs.\n- Transitioned from `PLAN` to `TOOLS`; live two-route comparison remains open.\n\n## [0.3.0] - 2026-07-31\n\n- Compared `qwen/qwen3.7-plus` and `qwen/qwen3.7-flash` on the same clean\n tracked platform shortlist.\n- Rejected both routes before graph mutation; the new Flash diagnostic named\n the exact unknown `decision` property and response identity.\n- Passed full verification, both gold datasets, examples, dependency audit and\n CLI/MCP/A2A/Docker smoke.\n- Retained only contract hardening and closed the ticket without production\n semantic enablement.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-019/changelog.md", "path": "ticket-019 / changelog.md", "size": "410B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-019)\n\n## [0.1.0] - 2026-08-01\n\n- Initial governance scaffold created.\n- No human participant identity or content was generated.\n- Recorded the approved product choices: root `todo2code` distribution,\n SDK-only contents and removal of the nested Python manifest.\n- Declared the shared `dist/` coexistence strategy and the unresolved Makefile\n scope conflict with active ticket-018.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-013/changelog.md", "path": "ticket-013 / changelog.md", "size": "623B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-013)\n\n## [Unreleased]\n\n- Opened a controlled three-model Live LLM comparison against the Gemini 3.6\n Flash baseline.\n- Selected Codestral 2508 after a 6/6 run at 57,129 ms and $0.037994; Gemini 3\n Flash Preview also passed, while DeepSeek V4 Pro crossed the 900-second cap.\n- Added a real total-run cancellation signal and fresh-manifest guard.\n- Added bounded concurrent Markdown enrichment. The same `weekly` workload\n improved from 218,741 ms to 53,362 ms without changing audit order.\n- Verified Codestral on `weekly` and `nlp2uri`; kept all generated artifacts\n outside their worktrees.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-005/changelog.md", "path": "ticket-005 / changelog.md", "size": "1.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-005)\n\n## [0.1.0] - 2026-07-31\n\n- Initialized the audited cross-language reranking plan.\n- Made the source/evidence directory boundary explicit.\n- Entered `PLAN` and stopped before implementation for owner review.\n\n## [0.2.0] - 2026-07-31\n\n- Recorded owner approval without modifying the human participant file.\n- Added the governance-standard participant extraction and response-owner audit\n as a prerequisite to semantic reranking.\n- Transitioned from `PLAN` to `TOOLS`.\n\n## [0.3.0] - 2026-07-31\n\n- Recognized section-owned intent in `user-*` and `ai-*`.\n- Excluded ticket specifications, iterations, audits and agent logs from the\n participant channel.\n- Added `responseRequiredRole` and `responseRequiredFrom` to every detected\n divergence.\n- Added unconfirmed-human-decision detection without allowing the agent to\n modify the human-owned record.\n- Validated migration behavior against historical Opus and GPT56Luna material\n from `wellmanifest/new-project`.\n\n## [0.4.0] - 2026-07-31\n\n- Added bounded semantic candidate and grounded accept/reject/abstain contracts,\n JSON Schemas and offline regression tests.\n- Added captured gold decisions that recover 6/6 cross-language positives with\n zero forbidden-pair violations and one hard-negative abstention.\n- Restricted live evaluation to a clean tracked snapshot and moved the\n reproducer to `scripts/research/`.\n- Rejected the production candidate after three live\n `qwen/qwen3.7-plus` responses violated the structured contract before a\n relation could be created.\n- Removed semantic reranker exports from the public package and closed the\n ticket through the explicit rejection branch.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-018/changelog.md", "path": "ticket-018 / changelog.md", "size": "3.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-018)\n\n## [0.3.0] - 2026-08-04\n\n- Confirmed and recorded `koru / code-review` + `governance / enforce` as the\n required checks for the `main` ruleset `20186914`; enforced state is active,\n `current_user_can_bypass: never`, and bypass actors are empty.\n- Re-ran required evidence paths after deployment: PR-dispatch workflow syntax,\n positive and negative Koru probes, attestation upload path, workflow failure\n handling and local/CI verification commands now satisfy AC-24/AC-25.\n- Advanced `ticket-018` workflow state to `IN_PROGRESS / WAIT_FOR_APPROVAL` with\n AC-24 and AC-25 checked; AC-17 and the pre-existing `ticket-019` blockers\n remain tracked separately.\n\n## [0.2.0] - 2026-08-01\n\n- Evolved the plan for concurrent humans/agents: named workstreams,\n dependency/conflict edges, non-overlapping active write scopes and explicit\n integration tickets.\n- Returned the ticket to `PLAN / WAIT_FOR_APPROVAL`; no multi-workstream\n implementation file was changed and no new ticket was created.\n- The user explicitly approved the evolved plan; transitioned to\n `IN_PROGRESS / EDIT` before implementation.\n- Added and adopted `new-project` 0.8.0 workstream policy-as-code with intent\n v2, deterministic dependency/conflict/integration checks and stable codes.\n- Central fixtures, target schema/gate checks, Docker overlap probes and core\n E2E pass.\n- Transitioned to `BLOCKED` because concurrent Rust SDK version drift prevents\n official full E2E before tests; no out-of-scope Cargo artifact was rewritten.\n- Planned an AC-18..AC-25 extension for pinned Koru/Vallm pull-request review,\n fail-closed semantic validation, an attested review artifact and a required\n `main` ruleset; no CI or external repository setting changed in this phase.\n- Recorded explicit human approval of AC-18..AC-25 and transitioned to\n `IN_PROGRESS / EDIT` before changing CI or repository rules.\n- Added the pinned `koru / code-review` workflow with exact diff selection,\n one bounded semantic/security review round, structured evidence, artifact\n upload and GitHub provenance attestation.\n- Merged the workflow through pull request #1 after its attested Koru check and\n existing application checks passed.\n- Proved live semantic fail-closed behavior with dispatch `30703292661`: two\n source files were rejected, the job failed, and its report was still uploaded\n and attested.\n- Staged ruleset `20186914` without bypass actors for final activation after the\n bootstrap evidence merge.\n\n## [0.1.0] - 2026-08-01\n\n- Initial governance scaffold created.\n- No human participant identity or content was generated.\n- Recorded the policy-as-code scope, trust boundaries, planned paths, risks,\n acceptance criteria and implementation checklist.\n- Stopped before implementation pending explicit human approval.\n- Human explicitly approved ticket-018; transitioned from\n `WAIT_FOR_APPROVAL` to `EDIT` before implementation changes.\n- Added and tested central policy-as-code plus pinned target adoption.\n- Recorded successful central fixtures, scoped governance checks and Docker E2E\n core/full results.\n- Transitioned to `BLOCKED` after the gate rejected concurrent commit order and\n eight paths outside this ticket; no history rewrite or scope laundering was\n performed.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-004/changelog.md", "path": "ticket-004 / changelog.md", "size": "1.6KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-004)\n\n## [0.1.0] - 2026-07-31\n\n- Created the separately scoped language-independent matching experiment.\n- Recorded user continuation as approval.\n- Entered `TOOLS` with precision, provenance and offline-CI guardrails.\n\n## [0.2.0] - 2026-07-31\n\n- Added a multilingual synthetic benchmark with six positive and six nearby\n negative pairs across Polish, German, Spanish and French.\n- Evaluated pinned MiniLM and E5 models locally.\n- Rejected a global cosine threshold because positive and negative score ranges\n overlap.\n\n## [0.3.0] - 2026-07-31\n\n- Ranked 66 actionable targetless platform declarations against 133 module\n aggregates.\n- Rejected two new forward-threshold candidates during manual review.\n- Confirmed reciprocal top-1 removes the false positives but adds no coverage;\n no production matcher was retained.\n- Added a separately reported cross-language gold cohort with six known\n positives and six gated hard negatives; transitioned to `VERIFY`.\n\n## [0.4.0] - 2026-07-31\n\n- Passed 244 tests (243 pass, zero fail, one allowed local Java skip), gold\n v1/v2, all five SDK examples, dependency audit, CLI/MCP/A2A and Docker smoke.\n- Updated `READINESS.md`, `TEST_REPORT.md`, `VALIDATION.md` and `TODO.md`.\n- Closed the rejected matcher experiment in `DONE` without a production\n semantic rule.\n\n## [0.4.1] - 2026-07-31\n\n- Corrected repository layout after review: moved both executable embedding\n experiment reproducers from the ticket evidence directory to\n `scripts/research/`.\n- Preserved benchmark inputs, captured outputs and decisions in the ticket.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-017/changelog.md", "path": "ticket-017 / changelog.md", "size": "1.9KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-017)\n\n## [0.1.0] - 2026-08-01\n\n- Initial governance scaffold created.\n- No human participant identity or content was generated.\n- Recorded the audit scope, risks, pre-existing worktree boundary and acceptance\n criteria; implementation remains blocked on human approval.\n- User approved the plan and the ticket entered `IN_PROGRESS / TOOLS`.\n\n## [0.2.0] - 2026-08-01\n\n- Repaired non-mutating command help and Polish active-prohibition polarity with\n focused CLI, text and documentation regressions.\n- Audited concurrent path/action planning and bounded Markdown path resolution\n against absolute, Windows and parent traversal.\n- Passed 314 host tests (313 pass, one JDK skip) and 314 Docker tests (307 pass,\n seven optional-toolchain skips), gold v2/v1 at 100% gated precision/recall,\n and host plus Docker examples.\n- On `wellmanifest/new-project@72e5f6c`, removed the sole false\n `CONFLICTING_INTENT`; recorded all 183 remaining diagnostics rather than\n claiming a clean repository.\n- Refreshed `project/analysis.toon.yaml`; no commit, push or auto-apply occurred.\n- Continued the active ticket for the user-requested Docker E2E core/full\n environments; no new ticket or human-owned participant file was created.\n\n## [0.3.0] - 2026-08-01\n\n- Added isolated `e2e-core` and `e2e-full` Docker/Compose environments plus\n operator documentation and stable `T2C-E2E-*` failure codes.\n- Core E2E passed with 318 tests (311 pass, seven explicit optional-toolchain\n skips), both gold benchmarks, protocol smoke checks and core examples.\n- Full E2E passed with 318/318 tests and zero skips, both gold benchmarks,\n CLI/MCP/A2A smoke checks and shared fingerprints from all five SDK examples.\n- Added the native build toolchain required to link the Rust example after the\n first full run exposed the missing `cc` executable as `T2C-E2E-108`.\n- Marked ticket-017 `DONE`; no commit, push or auto-apply occurred.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-014/changelog.md", "path": "ticket-014 / changelog.md", "size": "672B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-014)\n\n## [Unreleased]\n\n- Recorded the existing-path/unrelated-capability false-alignment case found by\n the first autonomous Koru integration run.\n- Defined a fail-closed semantic corroboration requirement and response-owner\n boundary for the follow-up implementation.\n- Kept shared-path relations as navigation evidence while requiring a symbol,\n extracted capability, grounded concrete-fact similarity or accepted rerank\n before a capability-bearing declaration can become implemented.\n- Added gold negative/positive controls, fixed Intent-vs-Reality coverage, and\n completed the autonomous Koru replay through verified commit `55a8b15`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-007/changelog.md", "path": "ticket-007 / changelog.md", "size": "429B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-007)\n\n## [0.1.0] - 2026-07-31\n\n- Initial governance scaffold created.\n- Selected explicit unresolved-role sentinels as the fail-closed routing\n behavior.\n\n## [0.2.0] - 2026-07-31\n\n- Added role-specific fallback routes for otherwise empty respondent lists.\n- Covered agent-only and human-only tickets, rendering and diagnostics.\n- Closed the ticket after full offline verification and gold evaluation.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-009/changelog.md", "path": "ticket-009 / changelog.md", "size": "481B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-009)\n\n## [0.1.0] - 2026-07-31\n\n- Audited provider/runtime schema drift across all structured LLM stages.\n- Added one typed schema/parser source and migrated all seven production\n OpenRouter boundaries.\n- Replaced silent provider-value coercion with fail-closed retry/fallback.\n- Added production-call and published-schema drift gates.\n- Passed full verify, both gold datasets and all SDK examples.\n- Published the implementation to `main` as `d0fc143`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-008/changelog.md", "path": "ticket-008 / changelog.md", "size": "338B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-008)\n\n## [0.1.0] - 2026-07-31\n\n- Audited the governance hub against todo2code's communication contract.\n- Hardened upstream ticket scripts, templates, ownership rules and indexing.\n- Added an isolated cross-repository interoperability test.\n- Published upstream version 0.6.0 and recorded the evidence locally.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-002/changelog.md", "path": "ticket-002 / changelog.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-002)\n\n## [0.1.0] - 2026-07-31\n\n- Initialized the ticket from the `wellmanifest/new-project` governance\n standard.\n- Recorded the human instruction, Codex execution plan, acceptance criteria,\n risks and initial environment evidence.\n- Entered `WAIT_FOR_APPROVAL`; no source-code or external benchmark execution\n has started.\n\n## [0.2.0] - 2026-07-31\n\n- Recorded user approval (`kontynuuj`) and transitioned from\n `WAIT_FOR_APPROVAL` to `TOOLS`.\n\n## [0.3.0] - 2026-07-31\n\n- Ran the normalized offline pipeline successfully against seven detached,\n tracked-only external repositories.\n- Added `baseline.json` with machine-readable commits, fingerprints, counts,\n diagnostics, coverage and timings, plus `baseline.md` with reviewed results.\n- Transitioned to `ANALYSIS` and selected non-actionable release-note mechanics\n as the first independently measurable diagnostic defect.\n\n## [0.4.0] - 2026-07-31\n\n- Added a red/green regression that separates changelog bookkeeping from\n substantive release claims.\n- Added a narrow deterministic classifier for placeholders, compact file\n summaries and known generated analysis targets under `project/`.\n- Re-ran the unchanged seven-repository corpus from a clean runtime containing\n only this patch: removed 1,024 false `review_required` findings across five\n repositories, retained substantive findings, and kept every graph fingerprint\n unchanged.\n- Gold v2 remains perfect; transitioned to `VERIFY`.\n\n## [0.5.0] - 2026-07-31\n\n- Passed `npm run verify` (241 tests: 240 pass, 1 local JDK skip), gold v2,\n examples for five SDKs, CLI/MCP/A2A smoke, npm production audit and Docker\n smoke.\n- Updated readiness and validation documentation with the seven-repository\n baseline and controlled iteration result.\n- Completed all acceptance criteria and transitioned `VERIFY -> DONE`.\n\n## [0.6.0] - 2026-07-31\n\n- Reproduced a `project.sh` false positive caused by generated HTML quoting a\n tracked audit log that named an untracked file.\n- Added a red/green regression and taught generated-analysis verification to\n accept only references already present in tracked, non-generated text.\n- Kept the original hard negative for newly introduced untracked references.\n- Re-ran tracked-only `project.sh`, full verify (242 tests: 241 pass, one Java\n skip) and Docker smoke successfully.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-012/changelog.md", "path": "ticket-012 / changelog.md", "size": "509B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-012)\n\n## [Unreleased]\n\n- Replaced opaque live model routing with an explicit structured-output model.\n- Preserved provider metadata for rejected structured responses.\n- Included the current run in persisted and rendered live history.\n- Aligned live request timeout with the configured per-stage budget.\n- Added one strict, audited corrective attempt to NL, Markdown, documentation\n and communication extraction.\n- Selected `google/gemini-3.6-flash` after a measured 6/6 live pass.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-011/changelog.md", "path": "ticket-011 / changelog.md", "size": "523B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-011)\n\n## [0.1.0] - 2026-07-31\n\n- Added AST-grounded unique/ambiguous/conflicting symbol resolution for NL.\n- Replaced ambiguous multi-module symbol evidence with deterministic abstention.\n- Added field-specific fixes to `AMBIGUOUS_REQUIREMENT`.\n- Removed implicit file-name and all-caps prose symbols.\n- Extended gold v2 with exact-target symbol-resolution hard negatives.\n- Passed full verify, both gold datasets and all five SDK examples.\n- Published the implementation to `main` as `25df74a`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-022/changelog.md", "path": "ticket-022 / changelog.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Changelog β€” ticket-022\n\n## Planned\n\n- Discover bounded nested Git repositories below an umbrella root.\n- Namespace repository paths so Git evidence links to shared workspace paths.\n- Preserve single-repository extraction and read-only operation.\n- Validate against the real Subactor workspace.\n\n## Implemented\n\n- Split Git extraction into one-repository evidence collection and bounded,\n deterministic umbrella orchestration.\n- Added breadth-first real-directory discovery, repository/directory caps,\n symlink refusal, checkout pruning and stable four-reader concurrency.\n- Namespaced changed/renamed paths and recorded each repository-relative root.\n- Bumped deterministic Git provenance to `t2c/git@2`.\n- Added regressions for collision-safe paths, pruning, symlink refusal, empty\n repositories, rename paths, repeatability and the single-repository contract.\n\n## Validated\n\n- Focused tests, full Node verification and Docker smoke pass.\n- Subactor supplies 326 commit records from 39 member repositories; 82.2% link\n to other graph evidence and same-snapshot diagnostics fall by 275.\n- A composed check with ticket-021 preserves zero unsafe remediation plans.\n- The global governance gate remains blocked only by pre-existing ticket-018/019\n findings; ticket-022 is not merged or pushed.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-020/changelog.md", "path": "ticket-020 / changelog.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-020)\n\n## [0.1.0] - 2026-08-01\n\n- Initial governance scaffold created.\n- No human participant identity or content was generated.\n- Expanded the plan with role-bound trusted intake, CQRS/event sourcing,\n strict JSON Schema, Protobuf, Python/TypeScript CLI, MCP and A2A contracts.\n- Kept implementation in WAIT_FOR_APPROVAL and isolated from active\n governance and SDK workstreams.\n- Recorded the pre-existing ticket-019 governance findings without modifying\n that concurrent ticket.\n- Recorded explicit interactive approval and transitioned to `EDIT` in a\n dedicated implementation worktree.\n- Implemented role-bound CQRS/event sourcing, registry v2, strict schemas,\n deterministic diagnostics, projections and transport parity across both\n CLIs, MCP and A2A.\n- Added TypeScript/Python golden Protobuf compatibility and security/concurrency\n regression coverage.\n- Reached `VALIDATION`: application and Docker core gates pass; the first\n governance run was blocked by the inherited v0.7.0 single-ticket rule.\n- Refreshed the isolated implementation branch to the committed 0.8.0\n workstream baseline so parallel tickets are evaluated by scope and ownership\n instead of a repository-wide single-ticket rule.\n- Confirmed that 0.8.0 accepts tickets 018 and 020 concurrently; the remaining\n global findings belong only to ticket-019's declared dependency, conflict,\n ownership and overlap state.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-010/changelog.md", "path": "ticket-010 / changelog.md", "size": "468B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-010)\n\n## [0.1.0] - 2026-07-31\n\n- Added content-addressed AST and documentation-chunk caches.\n- Added fail-open validation, atomic writes and cache telemetry.\n- Added cold/warm, invalidation, corruption and provider-isolation tests.\n- Measured tracked snapshots of todo2code, new-project and\n subactor-improvement.\n- Passed exact-commit verify, both gold datasets and all SDK examples.\n- Published the implementation to `main` as `f1d9334`.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-015/changelog.md", "path": "ticket-015 / changelog.md", "size": "373B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-015)\n\n## [Unreleased]\n\n- Reproduced the lossy compound-action title from the autonomous Koru replay.\n- Preserved the source statement when inferred object text retains a leading\n imperative, without changing normal concise plan titles.\n- Kept all runtime code under `src/synthesis`; this folder contains governance\n and redacted evidence only.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-003/changelog.md", "path": "ticket-003 / changelog.md", "size": "1.7KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket changelog (ticket-003)\n\n## [0.1.0] - 2026-07-31\n\n- Created the separately scoped residual changelog audit.\n- Recorded user continuation as approval.\n- Entered `TOOLS` with a deterministic sampling and reject-unsafe-hypothesis\n policy.\n\n## [0.2.0] - 2026-07-31\n\n- Reproduced 1,853 residual findings on all seven current deterministic runs.\n- Added a reproducible 168-record stratified sample with labels and rationale.\n- Selected exact `Update ` bookkeeping: 28 sampled and 547 census records\n across five repositories.\n- Deferred roadmap checkboxes and retained 1,275 substantive or unverified\n claims; transitioned to `ANALYSIS`.\n\n## [0.3.0] - 2026-07-31\n\n- Added a red/green regression for exact file-only updates with behavioral hard\n negatives.\n- Added the minimal diagnostic-signal correction.\n- Removed 547 review-required findings and 188 secondary unlinked warnings\n across five repositories with 7/7 stable graph fingerprints.\n- Gold v2 remains perfect; transitioned to `VERIFY`.\n\n## [0.4.0] - 2026-07-31\n\n- Passed full verification: 242 tests, 241 passed, zero failed and one allowed\n local Java skip; module, LLM-boundary, environment, workflow and generated\n analysis checks also passed.\n- Passed all five SDK examples, the production dependency audit, CLI/MCP/A2A\n smoke checks and Docker smoke.\n- Updated `docs/READINESS.md`, recorded the next ranked roadmap-lifecycle\n hypothesis and transitioned from `VERIFY` to `DONE`.\n\n## [0.4.1] - 2026-07-31\n\n- Corrected repository layout after review: moved the executable audit\n reproducer from the ticket evidence directory to `scripts/research/`.\n- Preserved the ticket input, captured output and documentation in place.\n", "is_subdir": true}, {"name": "changelog.md", "rel_path": "ticket-016/changelog.md", "path": "ticket-016 / changelog.md", "size": "347B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket Changelog (ticket-016)\n\n## [Unreleased]\n\n- Added the PHP syntax helper and independently exported adapter.\n- Added environment, manifest and doctor visibility for the optional runtime.\n- Removed PHP from unsupported-language counts only while its adapter is enabled.\n- Verified the behavior with focused tests and a measured `redsl` A/B.\n", "is_subdir": true}, {"name": "iteration-01.md", "rel_path": "ticket-004/iteration-01.md", "path": "ticket-004 / iteration-01.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 01: multilingual embedding feasibility\n\n## Hypothesis\n\nA pinned multilingual sentence embedding can replace the hand-written\nPolish-to-English topic dictionary while preserving a precision-first boundary.\n\n## Evidence\n\n- Synthetic benchmark: 6 positives and 6 nearby hard negatives across four\n languages.\n- Local models: pinned multilingual MiniLM and multilingual E5.\n- Repository prototype: 66 actionable targetless declarations ranked against\n 133 module aggregates from the tracked `subactor/platform` graph\n `ae92ead72d35e88e`.\n\n## Result\n\nThe hypothesis is rejected in its raw form.\n\nMiniLM ranked one wrong module above the intended module. E5 ranked all six\nsynthetic positives correctly, but absolute positive and negative score ranges\noverlap. On the real repository, E5 with a 0.75 score and 0.01 margin proposed\ntwo new links; manual review rejected both. Reciprocal top-1 removed those\nfalse positives but also removed every new candidate, so coverage could not\nimprove.\n\n## Retained change\n\nNo production semantic relation rule is retained. Gold v2 now exposes\n`cross-language` as a separate cohort:\n\n- 6 positive relations remain measured known gaps;\n- 6 nearby wrong modules remain gated forbidden pairs;\n- same-language exact-target and capability-topic precision/recall stay\n independent.\n\nThis turns the language barrier from one Polish anecdote into a multi-language\nacceptance boundary without making offline CI provider-dependent.\n", "is_subdir": true}, {"name": "iteration-01.md", "rel_path": "ticket-002/iteration-01.md", "path": "ticket-002 / iteration-01.md", "size": "2.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 01: non-actionable changelog mechanics\n\n## Decision\n\nKeep the change. It removes release-note bookkeeping from implementation-gap\ndiagnostics without treating an unsupported release claim as implemented.\n\nThe new classifier ignores only:\n\n- explicit placeholder entries;\n- compact `... and N more files` continuation rows;\n- entries whose every target is a known generated analysis artifact under the\n reserved `project/` directory.\n\nOrdinary documentation updates, source updates, mixed target lists, unknown\nfiles under `project/`, and behavioral release statements remain actionable.\n\n## Controlled evaluation\n\nThe candidate was applied to a clean runtime based on the same\n`5f5ae5938ab77dcce474ba7abbd23686072776ec` commit as the baseline. No other\nworking-tree source changes were included. The external input policy and all\nseven detached commits remained unchanged.\n\n| Repository | Graph | CHANGELOG before β†’ after | Review before β†’ after | UNLINKED before β†’ after |\n| --- | --- | ---: | ---: | ---: |\n| semcod/code2llm | unchanged | 1,411 β†’ 955 | 1,411 β†’ 955 | 1,332 β†’ 1,313 |\n| semcod/domd | unchanged | 105 β†’ 99 | 105 β†’ 99 | 779 β†’ 773 |\n| semcod/pactfix | unchanged | 48 β†’ 48 | 48 β†’ 48 | 217 β†’ 217 |\n| semcod/code2logic | unchanged | 121 β†’ 120 | 121 β†’ 120 | 1,504 β†’ 1,503 |\n| semcod/code2docs | unchanged | 396 β†’ 269 | 396 β†’ 269 | 463 β†’ 455 |\n| semcod/redup | unchanged | 703 β†’ 269 | 703 β†’ 269 | 708 β†’ 703 |\n| subactor/platform | unchanged | 93 β†’ 93 | 93 β†’ 93 | 780 β†’ 780 |\n\nAcross the corpus, `CHANGELOG_WITHOUT_IMPLEMENTATION` fell by 1,024\n(2,877 β†’ 1,853) and the related unlinked warning fell by 39. The two\nrepositories dominated by substantive sampled claims (`pactfix` and\n`subactor/platform`) did not change. All graph fingerprints were identical.\n\n## Regression gates\n\n- The focused test was observed failing before the implementation and passing\n afterwards.\n- The nearby hard negatives preserve diagnostics for Jenkinsfile support,\n `docs/api.md`, and an unknown `project/custom-runtime.ts` source.\n- Gold v2 remains 100% precision and recall in every measured scope, with zero\n forbidden diagnostic violations and stable repeated runs.\n\nMachine-readable deltas and exact after-run IDs are in\n[`iteration-01.json`](iteration-01.json).\n", "is_subdir": true}, {"name": "iteration-01.md", "rel_path": "ticket-003/iteration-01.md", "path": "ticket-003 / iteration-01.md", "size": "1.5KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 01: exact file-update bookkeeping\n\n## Result\n\nKeep the change. An exact `Update ` row no longer creates an\nimplementation-gap or unlinked-record diagnostic. Additional wording keeps the\nrecord actionable.\n\n| Repository | Graph | Changelog before β†’ after | Unlinked before β†’ after |\n| --- | --- | ---: | ---: |\n| semcod/code2llm | unchanged | 955 β†’ 650 | 1,312 β†’ 1,219 |\n| semcod/domd | unchanged | 99 β†’ 99 | 772 β†’ 772 |\n| semcod/pactfix | unchanged | 48 β†’ 48 | 217 β†’ 217 |\n| semcod/code2logic | unchanged | 120 β†’ 109 | 1,503 β†’ 1,492 |\n| semcod/code2docs | unchanged | 269 β†’ 127 | 455 β†’ 418 |\n| semcod/redup | unchanged | 269 β†’ 184 | 703 β†’ 661 |\n| subactor/platform | unchanged | 93 β†’ 89 | 766 β†’ 761 |\n\nAcross the corpus:\n\n- `CHANGELOG_WITHOUT_IMPLEMENTATION`: 1,853 β†’ 1,306 (`-547`);\n- `UNLINKED_RECORD`: 5,728 β†’ 5,540 (`-188`);\n- all diagnostics: 16,280 β†’ 15,545 (`-735`);\n- graph fingerprints: unchanged in 7/7 repositories.\n\n`domd` and `pactfix` contained no selected file-only rows and therefore remained\nunchanged. Gold v2 stayed perfect before the full validation phase.\n\n## Precision boundaries\n\nSuppressed:\n\n- `Update src/runtime.ts`\n- `Update README.md`\n- `update debug/.cache/state.pkl`\n\nRetained:\n\n- `Update src/runtime.ts to reject invalid tokens`\n- `Updated authentication in src/runtime.ts`\n- `Update support for Dockerfile parsing`\n- `Added Jenkinsfile support for deployment pipelines`\n\nMachine-readable run IDs, fingerprints and deltas are in\n[`iteration-01.json`](iteration-01.json).\n", "is_subdir": true}, {"name": "iteration-02.md", "rel_path": "ticket-002/iteration-02.md", "path": "ticket-002 / iteration-02.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Iteration 02: tracked audit references in generated-analysis isolation\n\n## Trigger\n\nAfter `HEAD` advanced to `18cc21b`, a fresh tracked-only `project.sh` run\ngenerated `project/index.html` from the detached snapshot and then failed:\n\n```text\nproject/index.html references untracked input nlp2uri.yaml\n```\n\nThe generator had not read that private file. Its name was already present in\nthe committed ticket audit as captured `git status --short` output, and the\nHTML report quoted that tracked log.\n\n## Correction\n\nThe verifier now distinguishes:\n\n- a reference newly introduced by generated output β€” still rejected;\n- a filename already quoted by a tracked, non-generated source β€” accepted as\n tracked evidence, not proof that the untracked file was consumed.\n\nGenerated reports are excluded from the tracked-reference corpus so a stale\nreport cannot justify itself. Binary tracked files are also excluded.\n\n## Red/green evidence\n\nA focused regression first failed with 3/4 passing. After the correction all\n4/4 generated-analysis tests pass, including the original hard negative that\nrejects a newly introduced private input reference.\n\nThe complete tracked-only `project.sh` command then passed:\n\n```text\n{\"filesChecked\":18,\"untrackedInputsChecked\":6,\"status\":\"ok\"}\n```\n\nThe final `npm run verify` passed 242 tests (241 pass, one local Java skip) and\nDocker smoke passed after this change.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-006/preprompt.md", "path": "ticket-006 / preprompt.md", "size": "439B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-006\n- **Task title**: Canonical structured-output conformance\n- **Owner**: tom-sapletta-com\n- **Repository**: todo2code\n\nUse the governance layout established by `wellmanifest/new-project/project`.\nKeep implementation outside the ticket directory. Treat ticket-005's three\nlive schema violations as measured input, preserve fail-closed behavior and do\nnot weaken repository-evidence requirements.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-019/preprompt.md", "path": "ticket-019 / preprompt.md", "size": "285B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-019\n- **Task title**: Publish the Python SDK as the root todo2code package\n- **Created**: 2026-08-01T11:14:28Z\n\nKeep executable implementation outside this governance/evidence directory.\nRead a human-owned user-*.md file only when one exists.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-013/preprompt.md", "path": "ticket-013 / preprompt.md", "size": "374B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-013\n- **Task title**: Compare qualified Live LLM models\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nUse the models that satisfy the OpenRouter and llm-code-benchmark screening\ncriteria, then measure whether they perform better in todo2code Live LLM.\nKeep the full `require-llm` contract and existing cost/time gates.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-005/preprompt.md", "path": "ticket-005 / preprompt.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-005)\n\n- **Task title**: Audited cross-language reranking\n- **Created**: 2026-07-31\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements\n\n1. Use retrieval only to produce a bounded shortlist.\n2. Require a separate structured decision with explicit abstention.\n3. Ground every accepted decision in repository-owned records, paths, symbols\n or capability terms.\n4. Preserve exact-target precedence and the deterministic offline linker.\n5. Record provider/model/revision, input hashes, scores and cited evidence.\n6. Cache model-derived output by content and model identity.\n7. Evaluate tracked snapshots only; never transmit untracked or private data.\n8. Reject the approach unless it clears gold and real-repository precision\n gates.\n9. Store executable source outside `project/ticket-*`.\n\n## Referenced evidence\n\n- `project/ticket-004/iteration-01.md`\n- `project/ticket-004/audit.md`\n- `evaluation/gold/v2/dataset.json`\n- `src/graph/linker.ts`\n- `src/core/text.ts`\n- `docs/READINESS.md`\n\n## Approval boundary\n\nInitialization records the user's request to continue, but implementation waits\nfor review of `README.md` and `ai-codex.md` as required by `P-CORE-008`.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-018/preprompt.md", "path": "ticket-018 / preprompt.md", "size": "667B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-018\n- **Task title**: Enforce new-project governance as policy-as-code\n- **Created**: 2026-08-01T09:54:58Z\n\nKeep executable implementation outside this governance/evidence directory.\nRead a human-owned user-*.md file only when one exists.\n\nThe user requested automated code review using Koru. Plan a read-only, pinned\nand attested pull-request check which cannot mutate source or self-approve,\nuses the existing organization OpenRouter secret only in the safe\n`pull_request` context, fails closed, and becomes a required `main` ruleset\ncheck. Stop again in `WAIT_FOR_APPROVAL` before editing CI or external\nrepository rules.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-004/preprompt.md", "path": "ticket-004 / preprompt.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-004)\n\n- **Task title**: Language-independent topic matching\n- **Created**: 2026-07-31\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements\n\n1. Preserve the precision-first exact-target and three-topic contracts.\n2. Measure multilingual behavior independently from same-language linking.\n3. Compare strategies before choosing an implementation.\n4. Keep the primary offline gates deterministic and provider-independent.\n5. Record model/provider identity and scores for any model-derived evidence.\n6. Cache expensive projections by content and model identity.\n7. Analyze only tracked snapshots of external repositories.\n8. Reject an approach that improves headline coverage by violating hard\n negatives or obscuring evidence origin.\n\n## Referenced evidence\n\n- `docs/READINESS.md`\n- `evaluation/gold/v2/dataset.json`\n- `project/ticket-002/iteration-02.md`\n- `project/ticket-003/iteration-01.md`\n- `src/core/text.ts`\n- `src/graph/linker.ts`\n- `src/diff/reality.ts`\n\n## Approval boundary\n\nThe user's `kontynuuj` message approves this separately recorded semantic\nexperiment. It does not approve provider-dependent default behavior, external\ndeployment, or changes to the governance repository.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-017/preprompt.md", "path": "ticket-017 / preprompt.md", "size": "1.4KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-017\n- **Task title**: Audit and repair confirmed todo2code errors\n- **Created**: 2026-08-01T09:15:46Z\n\nKeep executable implementation outside this governance/evidence directory.\nRead a human-owned user-*.md file only when one exists.\n\n## Technical directives\n\n- Treat concurrent commit `1ebad96` and any later branch movement as external\n input; review HEAD and diffs again immediately before edits.\n- Do not touch `user-*`, `nlp2uri.yaml` or unrelated source changes.\n- After approval, run the repository analysis automation against the workspace\n without applying `prefact` and read its generated reports.\n- Reproduce each defect before changing source and add the smallest focused test.\n- Preserve deterministic/offline operation and the canonical `DiagnosticCode`\n contract; new operational errors must have stable codes and actionable text.\n- Use the project Docker environment for authoritative verification.\n- Re-run the Governance Hub analysis outside its worktree so validation does not\n create artifacts in the read-only policy repository.\n- Keep production `Dockerfile`/A2A Compose behavior unchanged; put test-only\n toolchains and commands in dedicated E2E files.\n- Bake the source into E2E images instead of bind-mounting mutable host state.\n- Set both `WORKDIR` and `T2C_ROOT` to `/workspace` so SDK/A2A relative roots are\n resolved consistently.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-014/preprompt.md", "path": "ticket-014 / preprompt.md", "size": "382B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-014\n- **Task title**: Distinguish path presence from implemented intent\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nAdd a negative semantic control for a planned capability aimed at an existing\nfile whose AST does not implement that capability. Prefer abstention and an\nexplicit response owner over a false `aligned` result.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-007/preprompt.md", "path": "ticket-007 / preprompt.md", "size": "432B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-007\n- **Task title**: Explicit unresolved response routing\n- **Owner**: tom-sapletta-com\n- **Repository**: todo2code\n\nUse the governance layout established by `wellmanifest/new-project/project`.\nKeep implementation outside the ticket directory. Close the measured\nticket-006 routing gap without inventing a participant, creating a human-owned\nfile or guessing identity from a display name.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-009/preprompt.md", "path": "ticket-009 / preprompt.md", "size": "456B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-009\n- **Task title**: Canonical structured-response contracts\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nReplace manually duplicated OpenRouter schemas and runtime validation with one\ntyped canonical contract per response boundary. Reject provider drift without\ncoercing intent, preserve grounding as a second validation layer, and keep all\nexecutable implementation outside this ticket directory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-008/preprompt.md", "path": "ticket-008 / preprompt.md", "size": "436B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-008\n- **Task title**: Cross-repository governance standard hardening\n- **Owner**: unresolved:human\n- **Repository**: todo2code + wellmanifest/new-project\n\nApply the intent ownership, response routing and ticket-directory findings from\ntodo2code to the upstream governance templates. Keep executable implementation\noutside this ticket directory and do not create a human-owned participant file.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-002/preprompt.md", "path": "ticket-002 / preprompt.md", "size": "1.3KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-002)\n\n- **Task title**: Cross-repository semantic hardening\n- **Created**: 2026-07-31T06:49:07Z\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements and constraints\n\n1. Test todo2code on real external repositories through deterministic,\n reproducible runs.\n2. Capture a comparable baseline before changing semantic behavior.\n3. Classify observed failures and select one shared, measurable defect.\n4. Add an independent regression case before implementing its fix.\n5. Apply one semantic change at a time and repeat gold plus corpus measurements.\n6. Reject an attempted improvement when it increases noise or lacks measurable\n external benefit.\n7. Preserve external repositories, secrets, untracked files and current user\n changes.\n8. Keep raw command output in the provider-specific ticket log.\n\n## Referenced specifications\n\n- `docs/READINESS.md`\n- `docs/TEST_REPORT.md`\n- `evaluation/gold/README.md`\n- `evaluation/gold/v2/dataset.json`\n- `TODO.md`\n- Governance policy: `wellmanifest/new-project/POLICY.md`\n- Governance procedure: `wellmanifest/new-project/CONTRIBUTING.md`\n\n## Execution boundary\n\nThe planning state is `WAIT_FOR_APPROVAL`. Under `P-CORE-008`, no source-code\nchange or external benchmark execution begins until the user approves\n`ai-codex.md` and the project-level ticket entry in `TODO.md`.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-012/preprompt.md", "path": "ticket-012 / preprompt.md", "size": "396B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-012\n- **Task title**: Reliable live structured-output model\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nMake live LLM usable with an explicit structured-output-capable model. Preserve\nmetadata for rejected responses, correct current-run history accounting, test\noffline, then verify against the real provider without weakening validation.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-011/preprompt.md", "path": "ticket-011 / preprompt.md", "size": "463B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-011\n- **Task title**: AST-grounded NL symbol resolution\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nResolve explicit NL symbols against AST declarations. Preserve exact symbol\nevidence only when one module owns the symbol or an explicit path/qualifier\nselects one owner. Report ambiguity with candidate paths and actionable missing\nfields. Keep all executable implementation outside this ticket directory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-022/preprompt.md", "path": "ticket-022 / preprompt.md", "size": "438B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt β€” ticket-022\n\nImplement read-only, deterministic Git extraction for an umbrella workspace of\nnested repositories. Preserve the single-repository contract, prefix nested\nrepository paths relative to the umbrella, never follow symlinks, stop walking\nbelow a discovered repository, bound work, and degrade individual repository\nfailures to explicit warnings. Do not change public interfaces or execute any\nrepository mutation.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-020/preprompt.md", "path": "ticket-020 / preprompt.md", "size": "519B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-020\n- **Task title**: Role-bound trusted intake with CQRS ES Protobuf MCP and A2A\n- **Created**: 2026-08-01T11:23:59Z\n\nKeep executable implementation outside this governance/evidence directory.\nRead a human-owned user-*.md file only when one exists.\n\nTreat manager-*, user-* and dev-* as human-owned projections. Only a trusted\nintake boundary may create or update them. Keep identity, authorization,\nschema, event integrity and required acceptance deterministic and LLM-free.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-010/preprompt.md", "path": "ticket-010 / preprompt.md", "size": "466B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-010\n- **Task title**: Incremental extraction cache\n- **Owner**: unresolved:human\n- **Repository**: todo2code\n\nAdd a fail-open, content-addressed cache for deterministic AST extraction and\ndocumentation chunking. Preserve byte-for-byte-equivalent extraction output,\nnever cache provider responses, measure cold/warm behavior on real repository\nsnapshots, and keep all executable implementation outside this ticket directory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-015/preprompt.md", "path": "ticket-015 / preprompt.md", "size": "332B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-015\n- **Task title**: Preserve compound intent in code-change titles\n- **Owner**: agent:codex\n- **Repository**: todo2code\n\nFix the deterministic code-change title projection observed during PLF-003.\nDo not change the source Intent DSL record or place runtime code in this ticket\ndirectory.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-003/preprompt.md", "path": "ticket-003 / preprompt.md", "size": "1.2KB", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Preprompt and technical directives (ticket-003)\n\n- **Task title**: Residual changelog diagnostic audit\n- **Created**: 2026-07-31\n- **Governance source**: `wellmanifest/new-project`\n\n## Requirements\n\n1. Continue the iterative external-repository hardening from ticket-002.\n2. Reproduce the current residual changelog findings on the same seven commits.\n3. Select the review sample deterministically, without LLM labeling.\n4. Preserve sampled text, targets and source identity in a portable artifact.\n5. Distinguish real unsupported release claims from diagnostic false positives.\n6. Require cross-repository repetition and a hard negative before code changes.\n7. Measure each retained change independently and reject unsafe hypotheses.\n8. Keep external repositories and unrelated workspace changes untouched.\n\n## Referenced evidence\n\n- `project/ticket-002/baseline.json`\n- `project/ticket-002/iteration-01.json`\n- `project/ticket-002/iteration-01.md`\n- `docs/READINESS.md`\n- `evaluation/gold/v2/dataset.json`\n\n## Approval boundary\n\nThe user's `kontynuuj` message followed the explicit recommendation to place\nthe residual changelog audit in a separate ticket. It approves this recorded\nscope; unrelated `new-project` implementation remains outside the ticket.\n", "is_subdir": true}, {"name": "preprompt.md", "rel_path": "ticket-016/preprompt.md", "path": "ticket-016 / preprompt.md", "size": "362B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Ticket preprompt\n\n- **Task ID**: ticket-016\n- **Task title**: First-class PHP syntax evidence\n- **Owner**: agent:codex\n- **Repository**: todo2code\n\nAdd deterministic PHP evidence through the common adapter contract. Be exact\nabout the parser boundary: PHP syntax tokens are not presented as a full AST.\nKeep measurements outside analyzed repository worktrees.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-005/user-tom-sapletta-com.md", "path": "ticket-005 / user-tom-sapletta-com.md", "size": "436B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com\n\n- **Ticket**: ticket-005\n- **Role**: owner and reviewer\n\n## Instructions\n\n- Continue improving and testing the library step by step on other projects.\n- Explain and correct executable code placed under ticket directories.\n- Use the ticket standard from `wellmanifest/new-project/project`.\n\n## Decisions\n\n- Ticket directories are governance and evidence folders, not implementation\n source directories.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-004/user-tom-sapletta-com.md", "path": "ticket-004 / user-tom-sapletta-com.md", "size": "400B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com (human)\n\n- **Ticket**: ticket-004\n- **Status**: ACTIVE\n\n## Assigned instruction\n\nContinue improving the library step by step after identifying that a\nhand-written Polish-to-English topic dictionary covers vocabulary rather than\nlanguage.\n\n## Ownership boundary\n\nThis file records the initiating human instruction. Agents must not modify it\nduring ticket continuation.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-002/user-tom-sapletta-com.md", "path": "ticket-002 / user-tom-sapletta-com.md", "size": "447B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com (human)\n\n- **Ticket**: ticket-002\n- **Status**: ACTIVE\n\n## Assigned instruction\n\nTest todo2code on other projects, derive conclusions, improve the library\niteratively step by step, and use the `wellmanifest/new-project` ticket\nstandard in the target repository's `project/` directory.\n\n## Ownership boundary\n\nThis file records the initiating human instruction. Agents must not modify it\nduring ticket continuation.\n", "is_subdir": true}, {"name": "user-tom-sapletta-com.md", "rel_path": "ticket-003/user-tom-sapletta-com.md", "path": "ticket-003 / user-tom-sapletta-com.md", "size": "317B", "icon": "πŸ“", "type": "markdown", "type_name": "Markdown", "content": "# Participant: tom-sapletta-com (human)\n\n- **Ticket**: ticket-003\n- **Status**: ACTIVE\n\n## Assigned instruction\n\nContinue the previously proposed step-by-step hardening after ticket-002.\n\n## Ownership boundary\n\nThis file records the initiating human instruction. Agents must not modify it\nduring ticket continuation.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-006/ai-codex-logs.txt", "path": "ticket-006 / ai-codex-logs.txt", "size": "1.6KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nInput from ticket-005 live evaluation:\n- attempt 1: no decisions array,\n- attempt 2: judgments instead of decisions,\n- attempt 3: invalid confidence type/range,\n- all attempts failed closed,\n- no relation or coverage change was accepted.\n\nSelected next work:\ncanonical structured-output conformance and precise provider diagnostics.\n\nWorkflow state: PLAN\n\n2026-07-31 offline conformance implementation\n\n- provider schema and runtime validator share\n src/semantic/reranker-response.ts,\n- verdict/reason values and compatibility rule share\n src/semantic/reranker.ts,\n- published schema drift is checked in semantic-reranker.test.ts,\n- invalid response error identifies property + provider/model/response ID,\n- no raw response persistence and no coercion,\n- focused semantic tests: 5/5 PASS.\n\nWorkflow transition: PLAN -> TOOLS\n\n2026-07-31 tracked live comparison\n\n- root: clean subactor/platform worktree,\n- commit: 3e96573d587cb664741849ceba205bf303b9f418,\n- candidates: reciprocal E5 selected top-1, 6 declarations,\n- qwen/qwen3.7-plus: three prior contract failures from ticket-005,\n- qwen/qwen3.7-flash:\n response.decisions[0] contains unknown properties: decision,\n- response identity:\n Alibaba/qwen/qwen3.7-flash/gen-1785490219-noOw2NdfoPMqC6dLf7x6,\n- graph mutations: 0.\n\nFinal gates:\n- npm run verify: 252 total, 251 pass, 0 fail, 1 local JDK skip,\n- gold v2/v1: PASS,\n- examples:check: PASS, 227 records, 97 relations, five SDKs,\n- npm audit --omit=dev: 0 vulnerabilities,\n- CLI, MCP, A2A and Docker smoke: PASS.\n\nDecision: retain conformance diagnostics; reject production semantic\nenablement. Workflow state: DONE.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-019/ai-codex-logs.txt", "path": "ticket-019 / ai-codex-logs.txt", "size": "0B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-013/ai-codex-logs.txt", "path": "ticket-013 / ai-codex-logs.txt", "size": "706B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-013 opened\n2026-07-31 verified all three candidates in the current OpenRouter catalog with structured_outputs\n2026-07-31 Gemini 3 Flash Preview PASS 6/6, 64064 ms, 116604 tokens, $0.076411\n2026-07-31 Codestral 2508 PASS 6/6, 57129 ms, 118920 tokens, $0.037994\n2026-07-31 DeepSeek V4 Pro stopped after crossing the 900000 ms run budget; no manifest\n2026-07-31 weekly Codestral: 161 records, 6 requests, 218741 ms sequential\n2026-07-31 weekly Codestral after concurrency=3: 161 records, 6 requests, 53362 ms\n2026-07-31 nlp2uri Codestral after concurrency=3: 619 records, 20 requests, 194750 ms, $0.08588244\n2026-07-31 algitex deterministic full scan PASS: 2643 Markdown records, 9.4 s wall\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-005/ai-codex-logs.txt", "path": "ticket-005 / ai-codex-logs.txt", "size": "3.5KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nUser instruction: kontynuuj, with an explicit correction that executable source\nmust not live under project/ticket-*.\n\nPrevious measured result:\ncross-language expected=0/6\ncross-language forbidden violations=0/6\nraw E5 new platform candidates=2\nmanually accepted raw E5 candidates=0\n\nWorkflow state: PLAN\nImplementation status: waiting for P-CORE-008 review\n\n2026-07-31 owner approval and continuation\n\nUser approved work on subsequent todo2code tickets and requested an explicit\naudit of:\nuser-* / ai-* -> Intent DSL -> divergence -> required respondent.\n\nWorkflow transition: PLAN -> TOOLS\nHuman participant file remains unchanged.\n\n2026-07-31 communication fidelity validation\n\nFocused regression: 25/25 PASS for communication, identity, pipeline and task\nsynthesis after the initial implementation.\n\nExternal read-only migration (`wellmanifest/new-project`, historical\n2b9e3c9):\n- filename-only rename: 0 records; explicit owner-specific migration warnings,\n- Opus, typed request/message: 9 human + 58 agent records, 0 issues,\n- GPT56Luna, typed request/message: 9 human + 72 agent records, 3 unanswered\n prompt fragments, 0 false human-agent file conflict.\n\nFull gates after implementation:\n- npm run verify: PASS (247 total, 246 pass, 1 local JDK skip),\n- evaluate:gold v2 and v1: PASS, 100% gated precision/recall,\n- examples:check: PASS (227 records, 97 relations),\n- npm audit --omit=dev: 0 vulnerabilities,\n- CLI, MCP, A2A and Docker smoke: PASS.\n\n2026-07-31 audited reranker evaluation\n\nOffline contracts:\n- candidate set bounded to 1..10 per declaration,\n- retrieval creates no relation,\n- accept/reject/abstain decisions require both record IDs and exact grounded\n quotes,\n- accepted relations retain retrieval, decision, reranker and citation\n provenance,\n- captured gold reranker: 6/6 expected, 0/6 forbidden violations, 1 abstention.\n\nLive tracked repository:\n- repository: subactor/platform,\n- commit: 3e96573d587cb664741849ceba205bf303b9f418,\n- graph fingerprint:\n 250df4ff83f456fb371278d4a0c2cf17dd025582b6865a0cb2f01bd469fd1dd0,\n- selected reciprocal E5 shortlist: 6 declarations; top-3=18 candidates,\n top-1=6 candidates,\n- qwen/qwen3.7-plus attempt 1: missing decisions array,\n- attempt 2: returned judgments instead of decisions,\n- attempt 3: invalid non-numeric/out-of-range confidence,\n- result: fail-closed, 0 materialized relations, no coverage claim.\n\nFinal gates:\n- npm run verify: PASS (251 total, 250 pass, 1 local JDK skip),\n- one earlier full-suite CLI-watch timing failure; isolated retry 3/3 PASS and\n repeated full verify PASS,\n- evaluate:gold v2: deterministic linker 0/6; captured reranker 6/6 expected,\n 0/6 forbidden, accepted 6, abstained 1,\n- evaluate:gold v1: PASS,\n- examples:check: PASS (227 records, 97 relations, five SDKs),\n- npm audit --omit=dev: 0 vulnerabilities,\n- CLI, MCP, A2A and Docker smoke: PASS.\n\nDecision: reject production semantic reranking; do not export it and do not\nchange the deterministic linker. Workflow state: DONE.\n\nFinal communication re-analysis after closing documentation:\n- participants: codex 51 records, tom-sapletta-com 4 records,\n- 0 blocking, 8 warning, 8 review_required,\n- 7 AGENT_CLAIM_WITHOUT_EVIDENCE -> codex (workspace remains uncommitted),\n- 1 AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED -> tom-sapletta-com,\n- 8 AGENT_WORK_OUTSIDE_REQUEST -> tom-sapletta-com because the detailed latest\n instruction is present in the conversation but not in the human-owned file.\n\nNo human-owned file was modified to suppress these findings.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-018/ai-codex-logs.txt", "path": "ticket-018 / ai-codex-logs.txt", "size": "8.6KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-08-01T09:54:58Z PLAN-ONLY BASELINE\n$ git status --short\nResult: dirty worktree detected with existing/concurrent changes; preserved as\nout of scope for ticket-018 except ticket governance files.\n\n$ command -v docker\n/usr/bin/docker\n\n$ docker info --format '{{.ServerVersion}}'\n29.1.3\n\n$ bash project/new-ticket.sh --title 'Enforce new-project governance as policy-as-code' --agent codex\nUpdated project/TICKETS.md ticket index successfully.\nSuccessfully scaffolded project/ticket-018 for 'Enforce new-project governance as policy-as-code'.\n\nSTATE: WAIT_FOR_APPROVAL\nNo implementation or validation claim made.\n\n2026-08-01 APPROVAL TRANSITION\nUser response: explicit approval of the presented ticket-018 plan.\nTransition: PLAN / WAIT_FOR_APPROVAL -> IN_PROGRESS / EDIT.\nNote: chat approval authorizes this local implementation; it is not represented\nas trusted GitHub merge approval.\n\n2026-08-01 GOVERNANCE VALIDATOR\n$ bash tests/governance-scripts.test.sh\ngovernance scripts: PASS\n$ bash tests/governance-validator.test.sh\ngovernance validator: PASS\n\nPositive target-scoped probe:\nGOV-PASS: passed (0 errors, 0 warnings)\n\nNegative probes:\nGOV-SCOPE-001: src/unplanned.ts is outside ticket intent (exit 1)\nGOV-OWNER-001: agent change to user-alice.md rejected (exit 1)\nGOV-APPROVAL-001: untrusted approval source rejected (exit 1)\nGOV-INTENT-003: ticket intent and implementation in one commit rejected (exit 1)\n\n2026-08-01 DOCKER E2E\n$ make e2e-core\ntests 328; pass 321; fail 0; skipped 7; both gold datasets PASS;\nCLI/MCP/A2A/examples PASS; T2C-E2E-000: PASS suite=core\n\n$ docker compose -f compose.e2e.yml run --rm --no-deps e2e-core <scoped governance command>\nGOV-PASS: passed (0 errors, 0 warnings)\n\n$ make e2e-full\ntests 328; pass 328; fail 0; skipped 0; both gold datasets PASS;\nCLI/MCP/A2A/examples PASS; SDK examples 5 languages;\nT2C-E2E-000: PASS suite=full\n\n2026-08-01 CONCURRENT PUBLICATION AUDIT\nObserved HEAD moved concurrently to:\n5f1f4bdc03776fb59dd490d6fd2ccebb78f5f2d6 Tom Softreck <tom@sapletta.com> refaktor\nNo commit or push was performed by Codex.\n\n$ bash project/governance-check.sh --actor ci --base HEAD^ --enforce-approval --approval-source github-review --approved-ticket ticket-018\nexit=1\nGOV-INTENT-003: project/ticket-018/intent.json did not exist before the first implementation commit.\nGOV-SCOPE-001: nlp2uri.yaml, project/compact_flow.mmd,\nproject/compact_flow.png, src/cli.ts, src/core/types.ts,\nsrc/extractors/runtime-cycle.ts, src/pipeline/run.ts and\ntest/runtime-cycle.test.ts are outside ticket-018 intent.\n\n2026-08-01 MULTI-WORKSTREAM PLAN EVOLUTION\n$ command -v docker\n/usr/bin/docker\n\n$ docker info --format '{{.ServerVersion}}'\n29.1.3\n\n$ git status --short\nResult: concurrent modifications are present in .env.example, src/config/env.ts,\nsrc/interfaces/a2a.ts, test/a2a.test.ts and tests/fixtures/autonom-cycle.json.\nThey are explicitly preserved outside the multi-workstream plan change.\n\nTransition: BLOCKED -> PLAN / WAIT_FOR_APPROVAL for AC-11..AC-17.\nNo schema, validator, CI, application source or test implementation changed.\n\n$ git diff --check -- TODO.md project/ticket-018/README.md\n project/ticket-018/intent.json project/ticket-018/ai-codex.md\n project/ticket-018/ai-codex-logs.txt project/ticket-018/changelog.md\nexit=0 (no output)\n\n$ python3 -m json.tool project/ticket-018/intent.json\nexit=0 (formatted output intentionally discarded)\n\n2026-08-01 MULTI-WORKSTREAM APPROVAL TRANSITION\nUser response: ZATWIERDZAM\nTransition: PLAN / WAIT_FOR_APPROVAL -> IN_PROGRESS / EDIT.\nScope approved: multi-workstream acceptance criteria recorded in ticket-018.\nNote: interactive approval is not external trusted merge evidence.\n\n2026-08-01 MULTI-WORKSTREAM IMPLEMENTATION VALIDATION\n$ bash tests/governance-scripts.test.sh\ngovernance scripts: PASS\n\n$ bash tests/governance-validator.test.sh\ngovernance validator: PASS\n\n$ validate Draft 2020-12 schemas and instances\ncentral-jsonschema=PASS\ntarget-jsonschema=PASS\n\n$ compare emitted diagnostics with governance/diagnostics.json\ndiagnostics-catalog=PASS codes=27\n\n$ bash project/governance-check.sh <ticket-018 scoped changed files>\nGOV-PASS: passed (0 errors, 0 warnings)\n\n$ docker workstream fixture\nGOV-PASS: passed (0 errors, 0 warnings)\nGOV-WORKSTREAM-004 ERROR: Active ticket scopes overlap: ticket-001 and\nticket-002. [src/core/graph.ts]\nT2C-GOV-E2E-000: PASS parallel non-overlap accepted; concrete overlap rejected\n\n$ make e2e-core\nT2C-E2E-000: PASS suite=core\n\n$ focused Node test summary in current e2e-core image\n1..329\n# tests 329\n# pass 322\n# fail 0\n# skipped 7\n\n$ make e2e-full\nexit=2 (Docker build command failed)\ncargo fetch --locked: lock file needs to be updated but --locked prevents it\ncausal evidence: concurrent commit 9928699 changes sdk/rust/Cargo.toml package\nversion 0.5.0 -> 0.5.1; ignored sdk/rust/Cargo.lock still records 0.5.0.\nFull tests did not start; no full-suite PASS is claimed.\n\n2026-08-01 CONCURRENT WORKSTREAM OBSERVATION\nAnother process created untracked ticket-019 in PLAN / WAIT_FOR_APPROVAL with\nworkstream=sdk while ticket-018 remained active in workstream=governance.\nNo ticket-019 file or project/TICKETS.md entry was created or edited by this\nagent. The scopes do not overlap on implementation paths.\n\n$ bash project/governance-check.sh --actor agent\nGOV-PASS: passed (0 errors, 0 warnings)\nThis final workspace check included the concurrently created untracked ticket.\n\n2026-08-01 KORU CODE-REVIEW PLAN\n$ koru --version\ninstalled PATH version: 0.1.398\nlocal Koru development venv: 0.1.443\npublished pinned target: 0.1.444\n\n$ python -m pip index versions vallm\ninstalled version: 0.1.92\npublished pinned target: 0.1.94\n\n$ koru --doctor --project . --format json\nresult: project is not initialised for planfile queue mode; loop mode remains\navailable without repository mutation. Two expected setup failures were\nreported for missing .planfile config/sprints.\n\n$ gh secret list --org semcod\nThe organization-level OpenRouter credential is available to all repositories;\nits value was not read or logged.\n\n$ inspect GitHub repository controls for semcod/todo2code\nmain branch protection: absent\nrepository rulesets: none\nPR/review for commit 06a2faa: none\nCI verify/JDK/build/deploy: PASS\nCI governance/enforce: FAIL on ticket-019 state\n\nDecision: reuse unfinished governance ticket-018. Plan AC-18..AC-25 only and\nstop in WAIT_FOR_APPROVAL. No CI, source, test, ruleset or human-owned content\nwas changed.\n\n2026-08-01 KORU CODE-REVIEW APPROVAL\nUser response: tak, wykonaj\nTransition: PLAN / WAIT_FOR_APPROVAL -> IN_PROGRESS / EDIT.\nScope approved: AC-18..AC-25 recorded in ticket-018.\n\n2026-08-01 KORU CODE-REVIEW LOCAL IMPLEMENTATION\n$ uvx --from koru==0.1.444 --with vallm[llm,security]==0.1.94 koru --version\nkoru 0.1.444\n\n$ Koru loop positive probe (one repository, one round, command=true)\nkoru: repos=1 succeeded=1 failed=0 rounds=1\nexit=0\n\n$ Koru loop negative Vallm probe (intake-service.ts, security, fail on review)\nkoru: repos=1 succeeded=0 failed=1 rounds=1\nexit=1\n\n$ query current OpenRouter model catalog\ndeepseek/deepseek-v4-pro: available\n\n$ npm run verify:workflows\nWorkflow YAML verified: 2 file(s), no duplicate top-level keys.\n\n$ npm run verify\ntests 335; pass 334; fail 0; skipped 1 (local JDK unavailable)\nmodule boundaries: 114 modules, 521 internal imports, no cycles\nworkflow, schema, no-LLM and generated-analysis gates: PASS\n\n$ make governance\nFour existing ticket-019 findings remain: GOV-CONFLICT-001,\nGOV-DEPENDENCY-002, GOV-WORKSTREAM-003 and GOV-WORKSTREAM-004.\nNo new ticket-018 secret, path or scope finding was emitted.\n\n2026-08-01 KORU REMOTE VALIDATION\n$ GitHub pull request #1 / workflow run 30703151199\nkoru / code-review: PASS\nverify: PASS\nJava adapter (JDK 17 required): PASS\ngovernance / enforce: FAIL only on the separately owned ticket-019 state\nreport schema: t2c.koru-code-review/v1\nartifact retention: 14 days\nSigstore provenance attestations for review.json: 1\n\n$ workflow_dispatch run 30703292661\nreviewed base: 38d33d222d2e550d055c02b609a036937c7db255\nreviewed head: bc93128f42060be3106776a7c9551c464bb52ffc\nselected: src/comparison/workspace.ts, test/workspace.test.ts\nsemantic credential check: PASS (value was neither read nor logged)\nKoru/Vallm result: reject, exit=1, 2/2 files failed review\nrequired check: FAIL (expected negative path)\nreport/artifact/attestation steps: PASS\nreport digest: sha256:fa0f4d0c1f780bb8d21f56ca74d8ae901e184fb4996f9e84832a87846adfc1d8\nGitHub Sigstore provenance attestations for digest: 1\n\n$ stage repository ruleset 20186914\nname: main: governed Koru review\nenforcement: disabled for final bootstrap evidence merge\nbypass actors: none\ncurrent_user_can_bypass: never\nrules: pull request, dismiss stale reviews, block deletion/force-push,\nstrict required checks governance / enforce and koru / code-review\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-004/ai-codex-logs.txt", "path": "ticket-004 / ai-codex-logs.txt", "size": "2.9KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nUser decision: kontynuuj\nPrevious recommendation: replace further dictionary growth with a\nlanguage-independent topic-matching experiment.\nWorkflow state: TOOLS\n\nCurrent known gap:\nKolejka zadaΕ„ powinna ponawiaΔ‡ nieudane prΓ³by z opΓ³ΕΊnieniem\nsrc/queue/task-retry-backoff.ts\nResult: 0/1 relation because lexical topics do not cross the language boundary.\n\nConstraints:\noffline CI remains provider-independent\nthree-topic hard-negative boundary remains in force\nmodel-derived evidence must be explicit and auditable\nexternal inputs remain tracked-only snapshots\n\n2026-07-31 local embedding benchmark\n\nMiniLM revision=86741b4e3f5cb7765a600d3a3d55a0f6a6cb443d\npositive_min=0.673289 negative_max=0.732568 separation=-0.059279\npairwise_correct=5/6\n\nE5 revision=f470c6a1a906014160ece1968c484b275f0396de\nquery_prefix=query: passage_prefix=passage:\npositive_min=0.759374 negative_max=0.835202 separation=-0.075828\npairwise_correct=6/6 minimum_pairwise_margin=0.007190\n\nDecision: no global cosine threshold is safe.\n\n2026-07-31 tracked platform ranking\n\ncommit=3e96573d587cb664741849ceba205bf303b9f418\ngraph=ae92ead72d35e88e6de754d7af02d074201213c56166eb788a5e152d6a6f695d\nmodule_aggregates=133 actionable_targetless_declarations=66\n\nforward score>=0.75 margin>=0.01:\nselected=6 new_candidates=2 manually_accepted=0\n\nreciprocal top-1 with forward/reverse margin>=0.01:\nselected=1 new_candidates=0\n\nDecision: reject production embedding matcher; workflow TOOLS -> ANALYSIS.\n\n2026-07-31 gold cohort\n\ncross_language_cases=7\nknown_positive_relations=6 satisfied=0\nforbidden_pairs=6 violations=0\ngated exact-target/capability-topic precision=100% recall=100%\ngold v1=PASS gold v2=PASS\nWorkflow transition: ANALYSIS -> VERIFY.\n\n2026-07-31 full validation and close\n\n$ npm run verify\ntests=244 pass=243 fail=0 skip=1\nJava skip reason: local JDK unavailable; required CI supplies JDK 17.\nLLM boundary=PASS (9 entrypoints, 31 modules)\nmodule graph=PASS (94 modules, 429 imports, no cycles)\nenvironment contract=PASS (63/63)\nworkflows=PASS\ngenerated analysis=PASS (18 files)\n\n$ npm run evaluate:gold && npm run evaluate:gold:v1\nResult: PASS, gated precision/recall 100%, stability PASS.\nCross-language: expected=0/6, forbidden violations=0/6.\n\n$ npm run examples:check\nResult: PASS, five SDK fingerprints agree.\n\n$ npm audit --omit=dev\nResult: PASS, 0 vulnerabilities.\n\n$ make smoke protocol-smoke\nResult: PASS, CLI, MCP and A2A.\n\n$ make docker-smoke\nResult: PASS.\n\nResult: all acceptance criteria satisfied; workflow VERIFY -> DONE.\n\n2026-07-31 repository layout correction\n\nUser review identified executable code under project/ticket-004.\nMoved:\nproject/ticket-004/evaluate-embeddings.py\n-> scripts/research/evaluate-embedding-pairs.py\nproject/ticket-004/rank-graph-embeddings.py\n-> scripts/research/rank-intent-graph-embeddings.py\n\nBenchmark inputs, captured results, decisions and raw logs remain under the\nticket. No experiment code remains there.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-017/ai-codex-logs.txt", "path": "ticket-017 / ai-codex-logs.txt", "size": "93.1KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "[2026-08-01T09:15:46Z] [EXEC] [provider:codex] $ ./project/new-ticket.sh --title 'Audit and repair confirmed todo2code errors' --agent codex\n[2026-08-01T09:15:46Z] [STDOUT] Updated project/TICKETS.md ticket index successfully.\n[2026-08-01T09:15:46Z] [STDOUT] Successfully scaffolded project/ticket-017 for 'Audit and repair confirmed todo2code errors'.\n[2026-08-01T09:15:46Z] [EXIT] Command exited with code 0\n[2026-08-01T09:17:00Z] [OBSERVED] HEAD moved concurrently to 1ebad96beb2724d2b4296ad2b5a1b5c187f92139.\n[2026-08-01T09:17:00Z] [OBSERVED] Commit subject: fix: give Markdown paths one identity and plan create vs modify\n[2026-08-01T09:18:00Z] [DECISION] [provider:codex] User approved ticket-017 with: kontynuuj\n[2026-08-01T09:26:00Z] [DECISION] [provider:codex] User extended ticket-017: create Docker environments for E2E testing.\n[2026-08-01T09:18:54Z] [EXEC] [provider:codex] $ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\nPreparing worktree (detached HEAD 1ebad96)\nπŸ“– code2docs analyzing todo2code...\n\nAnalyzing: 0%| | 0/377 [00:00<?, ?it/s]\nAnalyzing: 28%|β–ˆβ–ˆβ–Š | 105/377 [00:00<00:00, 1012.29it/s]\nAnalyzing: 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 253/377 [00:00<00:00, 1282.43it/s]\nAnalyzing: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 377/377 [00:00<00:00, 421.61it/s]\n βœ… docs/README.md\n✨ Done!\n{"readme":"docs/README.md","version":"0.5.0","license":"Apache-2.0","nodeVersion":">=20","changed":true}\nπŸ” Scanning: /tmp/t2c-analysis.mltSXt/todo2code\nπŸ“ Extensions: .py, .pyw, .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .php, .phtml, .go, .rs, .java, .c, .h, .cpp, .cc, .cxx, .hpp, .cs, .scala, .kt, .swift, .m, .mm, .lua, .rb, .rake, .gemspec, .sql, .sh, .bash, .zsh, .fish, .html, .htm, .xhtml, .css, .scss, .sass, .less, .svelte, .vue\nπŸ“ Min lines: 3\n🎯 Min similarity: 0.85\n\nDuplicate finding completed in 679.0ms\nπŸ“Š Scanned 168 files (30600 lines, 1207ms)\nFound 17 duplicate groups (44 fragments, 120 lines recoverable)\n\n β†’ project/duplication.toon.yaml\nUsing .gitignore from .\nExcluded 7 files by .gitignore\nβœ“ Results saved to project/validation.toon.yaml\n{"filesChecked":18,"filesChanged":8}\n{"filesChecked":19,"untrackedInputsChecked":8,"status":"ok"}\nSkipping source refactoring; set T2C_APPLY_PREFACT=1 to apply prefact changes.\n[2026-08-01T09:19:11Z] [EXIT] Command exited with code 0\n[2026-08-01T09:20:29Z] [EXEC] [provider:codex] $ docker build -t todo2code:ticket017-baseline .\n#0 building with "default" instance using docker driver\n\n#1 [internal] load build definition from Dockerfile\n#1 transferring dockerfile: 1.58kB done\n#1 DONE 0.0s\n\n#2 resolve image config for docker-image://docker.io/docker/dockerfile:1.7\n#2 DONE 1.0s\n\n#3 docker-image://docker.io/docker/dockerfile:1.7@sha256:a57df69d0ea827fb7266491f2813635de6f17269be881f696fbfdf2d83dda33e\n#3 CACHED\n\n#4 [internal] load metadata for docker.io/library/node:22-bookworm-slim\n#4 DONE 0.8s\n\n#5 [internal] load .dockerignore\n#5 transferring context: 121B done\n#5 DONE 0.0s\n\n#6 [runtime 1/14] FROM docker.io/library/node:22-bookworm-slim@sha256:f32b81066cde10a75dbac96646099533316d94bac4150c55da1636e1f0ffdc46\n#6 DONE 0.0s\n\n#7 [internal] load build context\n#7 transferring context: 850.88kB 0.3s done\n#7 DONE 0.3s\n\n#8 [build 2/15] WORKDIR /app\n#8 CACHED\n\n#9 [build 3/15] COPY package.json package-lock.json tsconfig.json .intentignore ./\n#9 DONE 0.1s\n\n#10 [build 4/15] RUN npm ci --include=dev\n#10 1.867\n#10 1.867 added 3 packages, and audited 4 packages in 1s\n#10 1.868\n#10 1.868 found 0 vulnerabilities\n#10 1.870 npm notice\n#10 1.870 npm notice New major version of npm available! 10.9.8 -> 12.0.2\n#10 1.870 npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2\n#10 1.870 npm notice To update run: npm install -g npm@12.0.2\n#10 1.870 npm notice\n#10 DONE 2.0s\n\n#11 [build 5/15] COPY src ./src\n#11 DONE 0.1s\n\n#12 [build 6/15] COPY sdk/typescript/src ./sdk/typescript/src\n#12 DONE 0.1s\n\n#13 [build 7/15] COPY test ./test\n#13 DONE 0.1s\n\n#14 [build 8/15] COPY python ./python\n#14 DONE 0.1s\n\n#15 [build 9/15] COPY golang ./golang\n#15 DONE 0.1s\n\n#16 [build 10/15] COPY java ./java\n#16 DONE 0.1s\n\n#17 [build 11/15] COPY rust-ast ./rust-ast\n#17 DONE 0.1s\n\n#18 [build 12/15] COPY prompts ./prompts\n#18 DONE 0.1s\n\n#19 [build 13/15] COPY schemas ./schemas\n#19 DONE 0.1s\n\n#20 [build 14/15] COPY scripts ./scripts\n#20 DONE 0.1s\n\n#21 [build 15/15] RUN npm run build && npm prune --omit=dev --omit=optional\n#21 0.382\n#21 0.382 > todo2code@0.5.0 build\n#21 0.382 > tsc -p tsconfig.json\n#21 0.382\n#21 6.644\n#21 6.644 up to date, audited 2 packages in 876ms\n#21 6.645\n#21 6.645 found 0 vulnerabilities\n#21 DONE 6.8s\n\n#22 [runtime 2/14] RUN apt-get update && apt-get install -y --no-install-recommends git python3 ca-certificates && rm -rf /var/lib/apt/lists/*\n#22 CACHED\n\n#23 [runtime 3/14] WORKDIR /app\n#23 CACHED\n\n#24 [runtime 4/14] COPY --from=build /app/node_modules ./node_modules\n#24 CACHED\n\n#25 [runtime 5/14] COPY --from=build /app/dist ./dist\n#25 DONE 0.1s\n\n#26 [runtime 6/14] COPY package.json LICENSE .env.example .intentignore ./\n#26 DONE 0.1s\n\n#27 [runtime 7/14] COPY python ./python\n#27 DONE 0.1s\n\n#28 [runtime 8/14] COPY golang ./golang\n#28 DONE 0.1s\n\n#29 [runtime 9/14] COPY java ./java\n#29 DONE 0.1s\n\n#30 [runtime 10/14] COPY rust-ast ./rust-ast\n#30 DONE 0.1s\n\n#31 [runtime 11/14] COPY adapters/tensorflow/package*.json ./adapters/tensorflow/\n#31 DONE 0.1s\n\n#32 [runtime 12/14] COPY prompts ./prompts\n#32 DONE 0.1s\n\n#33 [runtime 13/14] COPY schemas ./schemas\n#33 DONE 0.1s\n\n#34 [runtime 14/14] RUN mkdir -p /workspace && chown -R node:node /app /workspace\n#34 DONE 2.1s\n\n#35 exporting to image\n#35 exporting layers\n#35 exporting layers 0.2s done\n#35 writing image sha256:8afd8ad4b5b1b64f2929b94bd3f0aeb1b125c9ac191ee9483f88d555239ea0a3 done\n#35 naming to docker.io/library/todo2code:ticket017-baseline done\n#35 DONE 0.3s\n[2026-08-01T09:20:45Z] [EXIT] Command exited with code 0\n[2026-08-01T09:21:03Z] [EXEC] [provider:codex] baseline CLI help and polarity probes in Docker\nhelp_exit=0 artifact_files=1\nhelp_stdout_first={\nhelp_stderr_first=DEGRADED: one or more pipeline stages did not complete in the requested mode\n./.intent\n./.intent/latest.json\n./.intent/runs\n{"prohibition":"positive","explicitBan":"negative"}\n[2026-08-01T09:21:04Z] [EXIT] Baseline probes completed\n[2026-08-01T09:22:22Z] [EXEC] [provider:codex] $ docker build -t todo2code:ticket017-fix .\n#0 building with "default" instance using docker driver\n\n#1 [internal] load build definition from Dockerfile\n#1 transferring dockerfile: 1.58kB done\n#1 DONE 0.0s\n\n#2 resolve image config for docker-image://docker.io/docker/dockerfile:1.7\n#2 DONE 0.5s\n\n#3 docker-image://docker.io/docker/dockerfile:1.7@sha256:a57df69d0ea827fb7266491f2813635de6f17269be881f696fbfdf2d83dda33e\n#3 CACHED\n\n#4 [internal] load metadata for docker.io/library/node:22-bookworm-slim\n#4 DONE 0.5s\n\n#5 [internal] load .dockerignore\n#5 transferring context: 121B done\n#5 DONE 0.0s\n\n#6 [build 1/15] FROM docker.io/library/node:22-bookworm-slim@sha256:f32b81066cde10a75dbac96646099533316d94bac4150c55da1636e1f0ffdc46\n#6 DONE 0.0s\n\n#7 [internal] load build context\n#7 transferring context: 93.15kB 0.3s done\n#7 DONE 0.4s\n\n#8 [build 2/15] WORKDIR /app\n#8 CACHED\n\n#9 [build 3/15] COPY package.json package-lock.json tsconfig.json .intentignore ./\n#9 CACHED\n\n#10 [build 4/15] RUN npm ci --include=dev\n#10 CACHED\n\n#11 [build 5/15] COPY src ./src\n#11 DONE 0.1s\n\n#12 [build 6/15] COPY sdk/typescript/src ./sdk/typescript/src\n#12 DONE 0.1s\n\n#13 [build 7/15] COPY test ./test\n#13 DONE 0.1s\n\n#14 [build 8/15] COPY python ./python\n#14 DONE 0.1s\n\n#15 [build 9/15] COPY golang ./golang\n#15 DONE 0.1s\n\n#16 [build 10/15] COPY java ./java\n#16 DONE 0.1s\n\n#17 [build 11/15] COPY rust-ast ./rust-ast\n#17 DONE 0.1s\n\n#18 [build 12/15] COPY prompts ./prompts\n#18 DONE 0.1s\n\n#19 [build 13/15] COPY schemas ./schemas\n#19 DONE 0.1s\n\n#20 [build 14/15] COPY scripts ./scripts\n#20 DONE 0.1s\n\n#21 [build 15/15] RUN npm run build && npm prune --omit=dev --omit=optional\n#21 0.356\n#21 0.356 > todo2code@0.5.0 build\n#21 0.356 > tsc -p tsconfig.json\n#21 0.356\n#21 7.938\n#21 7.938 up to date, audited 2 packages in 2s\n#21 7.939\n#21 7.939 found 0 vulnerabilities\n#21 DONE 8.0s\n\n#22 [runtime 2/14] RUN apt-get update && apt-get install -y --no-install-recommends git python3 ca-certificates && rm -rf /var/lib/apt/lists/*\n#22 CACHED\n\n#23 [runtime 3/14] WORKDIR /app\n#23 CACHED\n\n#24 [runtime 4/14] COPY --from=build /app/node_modules ./node_modules\n#24 CACHED\n\n#25 [runtime 5/14] COPY --from=build /app/dist ./dist\n#25 DONE 0.1s\n\n#26 [runtime 6/14] COPY package.json LICENSE .env.example .intentignore ./\n#26 DONE 0.1s\n\n#27 [runtime 7/14] COPY python ./python\n#27 DONE 0.1s\n\n#28 [runtime 8/14] COPY golang ./golang\n#28 DONE 0.1s\n\n#29 [runtime 9/14] COPY java ./java\n#29 DONE 0.1s\n\n#30 [runtime 10/14] COPY rust-ast ./rust-ast\n#30 DONE 0.1s\n\n#31 [runtime 11/14] COPY adapters/tensorflow/package*.json ./adapters/tensorflow/\n#31 DONE 0.1s\n\n#32 [runtime 12/14] COPY prompts ./prompts\n#32 DONE 0.1s\n\n#33 [runtime 13/14] COPY schemas ./schemas\n#33 DONE 0.1s\n\n#34 [runtime 14/14] RUN mkdir -p /workspace && chown -R node:node /app /workspace\n#34 DONE 2.2s\n\n#35 exporting to image\n#35 exporting layers\n#35 exporting layers 0.3s done\n#35 writing image sha256:900c8aa442049887da73c9c97e296518be16e0649ea2b35394bbdc9074b51d62\n#35 writing image sha256:900c8aa442049887da73c9c97e296518be16e0649ea2b35394bbdc9074b51d62 0.2s done\n#35 naming to docker.io/library/todo2code:ticket017-fix\n#35 naming to docker.io/library/todo2code:ticket017-fix 0.0s done\n#35 DONE 0.6s\n[2026-08-01T09:22:37Z] [EXIT] Command exited with code 0\n[2026-08-01T09:22:52Z] [EXEC] [provider:codex] focused regression tests and fixed probes in Docker\nTAP version 13\n# Subtest: CLI command help is successful and non-mutating\nok 1 - CLI command help is successful and non-mutating\n ---\n duration_ms: 1522.092528\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\nok 2 - proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\n ---\n duration_ms: 17.777143\n type: 'test'\n ...\n# Subtest: code-change title preserves the leading action of a compound intent\nok 3 - code-change title preserves the leading action of a compound intent\n ---\n duration_ms: 2.356781\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans is deterministic for the same evidence\nok 4 - proposeCodeChangePlans is deterministic for the same evidence\n ---\n duration_ms: 3.081802\n type: 'test'\n ...\n# Subtest: a plan creates a missing file and modifies an existing one\nok 5 - a plan creates a missing file and modifies an existing one\n ---\n duration_ms: 10.365874\n type: 'test'\n ...\n# Subtest: the repository probe never proposes creating a file outside the root\nok 6 - the repository probe never proposes creating a file outside the root\n ---\n duration_ms: 0.822336\n type: 'test'\n ...\n# Subtest: bounded plan sets prefer explicit TODO work over historical changelog audit\nok 7 - bounded plan sets prefer explicit TODO work over historical changelog audit\n ---\n duration_ms: 3.202845\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance passes when targeted diagnostics clear\nok 8 - evaluateCodeChangeAcceptance passes when targeted diagnostics clear\n ---\n duration_ms: 5.012056\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance fails while the plan is still open\nok 9 - evaluateCodeChangeAcceptance fails while the plan is still open\n ---\n duration_ms: 1.637813\n type: 'test'\n ...\n# Subtest: Plans without repository paths are not invented\nok 10 - Plans without repository paths are not invented\n ---\n duration_ms: 0.823864\n type: 'test'\n ...\n# Subtest: Non-repository paths are ignored instead of aborting code-change planning\nok 11 - Non-repository paths are ignored instead of aborting code-change planning\n ---\n duration_ms: 1.077878\n type: 'test'\n ...\n# Subtest: Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\nok 12 - Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\n ---\n duration_ms: 3.925064\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatch is deterministic and path-bound\nok 13 - createCodeChangeSourcePatch is deterministic and path-bound\n ---\n duration_ms: 4.391045\n type: 'test'\n ...\n# Subtest: applyUnifiedDiffToText creates and modifies files from hunks\nok 14 - applyUnifiedDiffToText creates and modifies files from hunks\n ---\n duration_ms: 0.537999\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch requires approval and is idempotent\nok 15 - applyCodeChangeSourcePatch requires approval and is idempotent\n ---\n duration_ms: 14.567562\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\nok 16 - applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\n ---\n duration_ms: 3.806494\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatchSet covers every plan\nok 17 - createCodeChangeSourcePatchSet covers every plan\n ---\n duration_ms: 1.715203\n type: 'test'\n ...\n# Subtest: createCodeChangeReviewPatch is hash-stable and lists grounded paths\nok 18 - createCodeChangeReviewPatch is hash-stable and lists grounded paths\n ---\n duration_ms: 2.748772\n type: 'test'\n ...\n# Subtest: CLI proposes and evaluates a grounded code-change plan through persisted JSON\nok 19 - CLI proposes and evaluates a grounded code-change plan through persisted JSON\n ---\n duration_ms: 2076.856443\n type: 'test'\n ...\n# Subtest: isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\nok 20 - isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\n ---\n duration_ms: 0.467711\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans skips diagnostics that only name junk paths\nok 21 - proposeCodeChangePlans skips diagnostics that only name junk paths\n ---\n duration_ms: 0.860219\n type: 'test'\n ...\n# Subtest: Published code-change JSON schemas require provenance, risk and rollback\nok 22 - Published code-change JSON schemas require provenance, risk and rollback\n ---\n duration_ms: 2.900834\n type: 'test'\n ...\n# Subtest: deterministic documentation baseline records headings, code blocks and explicit references\nok 23 - deterministic documentation baseline records headings, code blocks and explicit references\n ---\n duration_ms: 14.42927\n type: 'test'\n ...\n# Subtest: deterministic documentation preserves Polish prohibition polarity\nok 24 - deterministic documentation preserves Polish prohibition polarity\n ---\n duration_ms: 4.785258\n type: 'test'\n ...\n# Subtest: Markdown extractor separates TODO plans and changelog claims\nok 25 - Markdown extractor separates TODO plans and changelog claims\n ---\n duration_ms: 18.528748\n type: 'test'\n ...\n# Subtest: Markdown extractor preserves indented continuation lines and their source range\nok 26 - Markdown extractor preserves indented continuation lines and their source range\n ---\n duration_ms: 4.696856\n type: 'test'\n ...\n# Subtest: TODO bare filenames inherit an existing directory from the heading scope\nok 27 - TODO bare filenames inherit an existing directory from the heading scope\n ---\n duration_ms: 2.14091\n type: 'test'\n ...\n# Subtest: TODO resolves a bare filename only when its repository basename is unique\nok 28 - TODO resolves a bare filename only when its repository basename is unique\n ---\n duration_ms: 2.393646\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG resolve the same bare filename to one repository path\nok 29 - TODO and CHANGELOG resolve the same bare filename to one repository path\n ---\n duration_ms: 4.282139\n type: 'test'\n ...\n# Subtest: CHANGELOG keeps an ambiguous bare filename unresolved\nok 30 - CHANGELOG keeps an ambiguous bare filename unresolved\n ---\n duration_ms: 2.17068\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\nok 31 - TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\n ---\n duration_ms: 25.588506\n type: 'test'\n ...\n# Subtest: Markdown enrichment corrects one rejected response and audits both attempts\nok 32 - Markdown enrichment corrects one rejected response and audits both attempts\n ---\n duration_ms: 3.690729\n type: 'test'\n ...\n# Subtest: large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\nok 33 - large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\n ---\n duration_ms: 51.711469\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG LLM fallback and require mode are explicit\nok 34 - TODO and CHANGELOG LLM fallback and require mode are explicit\n ---\n duration_ms: 2.852228\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG reject structurally invalid LLM enrichments\nok 35 - TODO and CHANGELOG reject structurally invalid LLM enrichments\n ---\n duration_ms: 3.356339\n type: 'test'\n ...\n# Subtest: a truncated batch is split and every record keeps its own response provenance\nok 36 - a truncated batch is split and every record keeps its own response provenance\n ---\n duration_ms: 5.015455\n type: 'test'\n ...\n# Subtest: a malformed batch response splits instead of failing the whole stage\nok 37 - a malformed batch response splits instead of failing the whole stage\n ---\n duration_ms: 4.885324\n type: 'test'\n ...\n# Subtest: NL extractor produces deterministic non-LLM records\nok 38 - NL extractor produces deterministic non-LLM records\n ---\n duration_ms: 9.446016\n type: 'test'\n ...\n# Subtest: NL public extraction boundary names a missing sourcePath before path resolution\nok 39 - NL public extraction boundary names a missing sourcePath before path resolution\n ---\n duration_ms: 0.804404\n type: 'test'\n ...\n# Subtest: deterministic NL fallback skips Markdown headings and recognizes comparison intent\nok 40 - deterministic NL fallback skips Markdown headings and recognizes comparison intent\n ---\n duration_ms: 3.112411\n type: 'test'\n ...\n# Subtest: path extraction rejects lowercase prose alternations without losing repository paths\nok 41 - path extraction rejects lowercase prose alternations without losing repository paths\n ---\n duration_ms: 1.005619\n type: 'test'\n ...\n# Subtest: path extraction rejects dotted DSL fields but keeps known file extensions\nok 42 - path extraction rejects dotted DSL fields but keeps known file extensions\n ---\n duration_ms: 0.803532\n type: 'test'\n ...\n# Subtest: detectModality ignores parenthetical labels and bare adjectives\nok 43 - detectModality ignores parenthetical labels and bare adjectives\n ---\n duration_ms: 0.429784\n type: 'test'\n ...\n# Subtest: detectModality reads prohibitions and periphrastic obligation as requirements\nok 44 - detectModality reads prohibitions and periphrastic obligation as requirements\n ---\n duration_ms: 0.675938\n type: 'test'\n ...\n# Subtest: detectPolarity does not treat without-complements as sentence negation\nok 45 - detectPolarity does not treat without-complements as sentence negation\n ---\n duration_ms: 0.18631\n type: 'test'\n ...\n# Subtest: path extraction rejects HTTP routes, host paths and parent traversal\nok 46 - path extraction rejects HTTP routes, host paths and parent traversal\n ---\n duration_ms: 0.388588\n type: 'test'\n ...\n# Subtest: symbol extraction rejects hostnames without losing qualified code symbols\nok 47 - symbol extraction rejects hostnames without losing qualified code symbols\n ---\n duration_ms: 0.468356\n type: 'test'\n ...\n# Subtest: symbol extraction separates repository files and all-caps prose from code identifiers\nok 48 - symbol extraction separates repository files and all-caps prose from code identifiers\n ---\n duration_ms: 0.284159\n type: 'test'\n ...\n# Subtest: topic keywords normalize paths, camelCase and documentation word forms\nok 49 - topic keywords normalize paths, camelCase and documentation word forms\n ---\n duration_ms: 0.332673\n type: 'test'\n ...\n# Subtest: NL LLM extraction emits audited provenance and bounded DSL records\nok 50 - NL LLM extraction emits audited provenance and bounded DSL records\n ---\n duration_ms: 31.179852\n type: 'test'\n ...\n# Subtest: NL LLM failure is explicit when deterministic fallback is used\nok 51 - NL LLM failure is explicit when deterministic fallback is used\n ---\n duration_ms: 2.915055\n type: 'test'\n ...\n# Subtest: require-llm rejects instead of silently falling back\nok 52 - require-llm rejects instead of silently falling back\n ---\n duration_ms: 0.369677\n type: 'test'\n ...\n1..52\n# tests 52\n# suites 0\n# pass 52\n# fail 0\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms 4198.632614\nhelp_exit=0 artifact_files=0 stderr_bytes=0\ntodo2code (t2c)\n\n{"prohibition":"negative","explicitBan":"negative"}\n[2026-08-01T09:22:58Z] [EXIT] Focused regression validation completed\n[2026-08-01T09:23:28Z] [EXEC] [provider:codex] full offline verification in isolated Docker workspace\n\nadded 3 packages, and audited 4 packages in 2s\n\nfound 0 vulnerabilities\nnpm notice\nnpm notice New major version of npm available! 10.9.8 -> 12.0.2\nnpm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2\nnpm notice To update run: npm install -g npm@12.0.2\nnpm notice\n\n> todo2code@0.5.0 verify\n> npm run check && npm run verify:no-llm && npm run verify:modules && npm run verify:env && npm run verify:workflows && npm run verify:generated-analysis && npm run verify:structured-responses && npm run build && npm run verify:schemas && npm test\n\n\n> todo2code@0.5.0 check\n> tsc -p tsconfig.json --noEmit\n\n\n> todo2code@0.5.0 verify:no-llm\n> node scripts/verify-no-llm-imports.mjs\n\nLLM boundary verified transitively from 9 deterministic entrypoints across 37 modules.\n\n> todo2code@0.5.0 verify:modules\n> node scripts/verify-module-boundaries.mjs\n\nModule boundaries verified: 105 modules, 488 internal imports, no cycles, core is independent.\n\n> todo2code@0.5.0 verify:env\n> node scripts/verify-env-contract.mjs\n\nEnvironment contract verified: 75 code/Docker variables, 75 documented keys, no duplicates.\n\n> todo2code@0.5.0 verify:workflows\n> node scripts/verify-workflow-yaml.mjs\n\nWorkflow YAML verified: 1 file(s), no duplicate top-level keys.\n\n> todo2code@0.5.0 verify:generated-analysis\n> node scripts/verify-generated-analysis.mjs\n\n{"filesChecked":19,"untrackedInputsChecked":9,"status":"ok"}\n\n> todo2code@0.5.0 verify:structured-responses\n> node scripts/verify-structured-responses.mjs\n\n{"structuredCalls":7,"rawCalls":0,"status":"ok"}\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\n\n> todo2code@0.5.0 verify:schemas\n> node scripts/generate-response-schemas.mjs --check\n\n{"schema":"schemas/document-extraction-response.schema.json","status":"ok"}\n\n> todo2code@0.5.0 test\n> node --test --test-concurrency=4 dist/test/*.test.js\n\nTAP version 13\n# [t2c:a2a] listening on 127.0.0.1:43811\n# Subtest: A2A v1.0 card, versioning, task methods and cursor pagination are coherent\nok 1 - A2A v1.0 card, versioning, task methods and cursor pagination are coherent\n ---\n duration_ms: 146.659601\n type: 'test'\n ...\n# [t2c:a2a] listening on 127.0.0.1:41107\n# Subtest: A2A bearer authentication is declared with v1 security objects and enforced\nok 2 - A2A bearer authentication is declared with v1 security objects and enforced\n ---\n duration_ms: 69.742017\n type: 'test'\n ...\n# [t2c:a2a] listening on 127.0.0.1:42861\n# [t2c:a2a] listening on 127.0.0.1:45907\n# [t2c:a2a] listening on 127.0.0.1:34193\n# Subtest: A2A file task store survives restart and preserves idempotency across replicas\nok 3 - A2A file task store survives restart and preserves idempotency across replicas\n ---\n duration_ms: 99.66827\n type: 'test'\n ...\n# Subtest: Go adapter records package, imports, types, functions and methods\nok 4 - Go adapter records package, imports, types, functions and methods # SKIP Go toolchain not installed\n ---\n duration_ms: 10.21674\n type: 'test'\n ...\n# Subtest: Go facts are deterministic observations, not inferences\nok 5 - Go facts are deterministic observations, not inferences # SKIP Go toolchain not installed\n ---\n duration_ms: 4.574502\n type: 'test'\n ...\n# Subtest: Go adapter marks exported symbols and reports calls in scope\nok 6 - Go adapter marks exported symbols and reports calls in scope # SKIP Go toolchain not installed\n ---\n duration_ms: 11.430686\n type: 'test'\n ...\n# Subtest: Go extraction is skipped without cost when a tree holds no Go sources\nok 7 - Go extraction is skipped without cost when a tree holds no Go sources\n ---\n duration_ms: 43.258221\n type: 'test'\n ...\n# Subtest: A missing Go toolchain degrades to a warning instead of failing the run\nok 8 - A missing Go toolchain degrades to a warning instead of failing the run\n ---\n duration_ms: 19.340262\n type: 'test'\n ...\n# Subtest: Rust adapter records uses, types, functions, methods, values and calls\nok 9 - Rust adapter records uses, types, functions, methods, values and calls # SKIP Rust toolchain not installed\n ---\n duration_ms: 9.306034\n type: 'test'\n ...\n# Subtest: Java adapter records packages, imports, types, fields, methods and calls\nok 10 - Java adapter records packages, imports, types, fields, methods and calls # SKIP JDK not installed\n ---\n duration_ms: 6.646334\n type: 'test'\n ...\n# Subtest: Java and Rust adapters skip toolchain startup when no matching sources exist\nok 11 - Java and Rust adapters skip toolchain startup when no matching sources exist\n ---\n duration_ms: 33.693113\n type: 'test'\n ...\n# Subtest: Missing Java and Rust toolchains degrade to explicit warnings\nok 12 - Missing Java and Rust toolchains degrade to explicit warnings\n ---\n duration_ms: 15.762286\n type: 'test'\n ...\n# Subtest: PHP syntax adapter records namespaces, imports, types, functions, methods and calls\nok 13 - PHP syntax adapter records namespaces, imports, types, functions, methods and calls # SKIP PHP runtime not installed\n ---\n duration_ms: 6.798455\n type: 'test'\n ...\n# Subtest: PHP adapter skips runtime startup when no PHP source exists\nok 14 - PHP adapter skips runtime startup when no PHP source exists\n ---\n duration_ms: 33.006487\n type: 'test'\n ...\n# Subtest: Missing PHP runtime degrades to an explicit warning\nok 15 - Missing PHP runtime degrades to an explicit warning\n ---\n duration_ms: 13.66148\n type: 'test'\n ...\n# Subtest: Invalid PHP syntax is reported without aborting extraction\nok 16 - Invalid PHP syntax is reported without aborting extraction # SKIP PHP runtime not installed\n ---\n duration_ms: 7.505501\n type: 'test'\n ...\n# Subtest: AST extractor reads TypeScript and Python facts\nok 17 - AST extractor reads TypeScript and Python facts\n ---\n duration_ms: 193.913571\n type: 'test'\n ...\n# Subtest: CLI command help is successful and non-mutating\nok 18 - CLI command help is successful and non-mutating\n ---\n duration_ms: 1871.346239\n type: 'test'\n ...\n# Subtest: CLI summarize exposes deterministic, prefer-llm and require-llm modes\nok 19 - CLI summarize exposes deterministic, prefer-llm and require-llm modes\n ---\n duration_ms: 2489.134911\n type: 'test'\n ...\n# Subtest: CLI propose-todo, render-todo and apply-todo return JSON and preserve a no-op TODO\nok 20 - CLI propose-todo, render-todo and apply-todo return JSON and preserve a no-op TODO\n ---\n duration_ms: 1923.685426\n type: 'test'\n ...\n# Subtest: CLI watch reads TASK.md by default, disables summary LLM and reacts to a live file change\nok 21 - CLI watch reads TASK.md by default, disables summary LLM and reacts to a live file change\n ---\n duration_ms: 1890.190181\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\nok 22 - proposeCodeChangePlans materialises grounded plans from PLANNED_NOT_IMPLEMENTED\n ---\n duration_ms: 22.348339\n type: 'test'\n ...\n# Subtest: code-change title preserves the leading action of a compound intent\nok 23 - code-change title preserves the leading action of a compound intent\n ---\n duration_ms: 6.136311\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans is deterministic for the same evidence\nok 24 - proposeCodeChangePlans is deterministic for the same evidence\n ---\n duration_ms: 6.802655\n type: 'test'\n ...\n# Subtest: a plan creates a missing file and modifies an existing one\nok 25 - a plan creates a missing file and modifies an existing one\n ---\n duration_ms: 18.406348\n type: 'test'\n ...\n# Subtest: the repository probe never proposes creating a file outside the root\nok 26 - the repository probe never proposes creating a file outside the root\n ---\n duration_ms: 4.902866\n type: 'test'\n ...\n# Subtest: bounded plan sets prefer explicit TODO work over historical changelog audit\nok 27 - bounded plan sets prefer explicit TODO work over historical changelog audit\n ---\n duration_ms: 4.707445\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance passes when targeted diagnostics clear\nok 28 - evaluateCodeChangeAcceptance passes when targeted diagnostics clear\n ---\n duration_ms: 6.700415\n type: 'test'\n ...\n# Subtest: evaluateCodeChangeAcceptance fails while the plan is still open\nok 29 - evaluateCodeChangeAcceptance fails while the plan is still open\n ---\n duration_ms: 2.450987\n type: 'test'\n ...\n# Subtest: Plans without repository paths are not invented\nok 30 - Plans without repository paths are not invented\n ---\n duration_ms: 1.209589\n type: 'test'\n ...\n# Subtest: Non-repository paths are ignored instead of aborting code-change planning\nok 31 - Non-repository paths are ignored instead of aborting code-change planning\n ---\n duration_ms: 1.577214\n type: 'test'\n ...\n# Subtest: Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\nok 32 - Acceptance rejects ungrounded paths, missing provenance and inconsistent verdicts\n ---\n duration_ms: 6.867752\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatch is deterministic and path-bound\nok 33 - createCodeChangeSourcePatch is deterministic and path-bound\n ---\n duration_ms: 6.525621\n type: 'test'\n ...\n# Subtest: applyUnifiedDiffToText creates and modifies files from hunks\nok 34 - applyUnifiedDiffToText creates and modifies files from hunks\n ---\n duration_ms: 0.785959\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch requires approval and is idempotent\nok 35 - applyCodeChangeSourcePatch requires approval and is idempotent\n ---\n duration_ms: 22.951774\n type: 'test'\n ...\n# Subtest: applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\nok 36 - applyCodeChangeSourcePatch preflights diffs and refuses symlink escapes\n ---\n duration_ms: 8.337881\n type: 'test'\n ...\n# Subtest: createCodeChangeSourcePatchSet covers every plan\nok 37 - createCodeChangeSourcePatchSet covers every plan\n ---\n duration_ms: 1.828291\n type: 'test'\n ...\n# Subtest: createCodeChangeReviewPatch is hash-stable and lists grounded paths\nok 38 - createCodeChangeReviewPatch is hash-stable and lists grounded paths\n ---\n duration_ms: 4.22132\n type: 'test'\n ...\n# Subtest: CLI proposes and evaluates a grounded code-change plan through persisted JSON\nok 39 - CLI proposes and evaluates a grounded code-change plan through persisted JSON\n ---\n duration_ms: 2502.286629\n type: 'test'\n ...\n# Subtest: isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\nok 40 - isUsefulCodeChangePath rejects vendored, binary and analysis dump paths\n ---\n duration_ms: 0.384323\n type: 'test'\n ...\n# Subtest: proposeCodeChangePlans skips diagnostics that only name junk paths\nok 41 - proposeCodeChangePlans skips diagnostics that only name junk paths\n ---\n duration_ms: 0.923391\n type: 'test'\n ...\n# Subtest: Published code-change JSON schemas require provenance, risk and rollback\nok 42 - Published code-change JSON schemas require provenance, risk and rollback\n ---\n duration_ms: 3.252129\n type: 'test'\n ...\n# Subtest: participant registry maps stable IDs to Git/A2A identifiers without display-name guessing\nok 43 - participant registry maps stable IDs to Git/A2A identifiers without display-name guessing\n ---\n duration_ms: 42.813306\n type: 'test'\n ...\n# Subtest: participant registry rejects ambiguous external identifiers\nok 44 - participant registry rejects ambiguous external identifiers\n ---\n duration_ms: 0.69938\n type: 'test'\n ...\n# Subtest: communication enrichment preserves runtime identity, source, ticket and epistemic class\nok 45 - communication enrichment preserves runtime identity, source, ticket and epistemic class\n ---\n duration_ms: 55.824642\n type: 'test'\n ...\n# Subtest: communication enrichment corrects one rejected structured response without weakening validation\nok 46 - communication enrichment corrects one rejected structured response without weakening validation\n ---\n duration_ms: 6.699169\n type: 'test'\n ...\n# Subtest: communication prefer-llm fallback is explicit and require-llm rejects\nok 47 - communication prefer-llm fallback is explicit and require-llm rejects\n ---\n duration_ms: 10.495437\n type: 'test'\n ...\n# Subtest: project/<ticket> communication is attributed per human and agent and checked against Git evidence\nok 48 - project/<ticket> communication is attributed per human and agent and checked against Git evidence\n ---\n duration_ms: 169.382039\n type: 'test'\n ...\n# Subtest: governance user-* and ai-* files become typed participant intent without ingesting ticket evidence\nok 49 - governance user-* and ai-* files become typed participant intent without ingesting ticket evidence\n ---\n duration_ms: 13.753574\n type: 'test'\n ...\n# Subtest: unstructured governance participant content is rejected with an owner-specific migration warning\nok 50 - unstructured governance participant content is rejected with an owner-specific migration warning\n ---\n duration_ms: 2.184966\n type: 'test'\n ...\n# Subtest: opposite wording about different explicit files is not treated as an intent conflict\nok 51 - opposite wording about different explicit files is not treated as an intent conflict\n ---\n duration_ms: 4.01347\n type: 'test'\n ...\n# Subtest: missing response owners use explicit role sentinels without inventing participants\nok 52 - missing response owners use explicit role sentinels without inventing participants\n ---\n duration_ms: 7.747825\n type: 'test'\n ...\n# Subtest: communication extractor reports unresolved identity instead of inventing an actor\nok 53 - communication extractor reports unresolved identity instead of inventing an actor\n ---\n duration_ms: 3.301451\n type: 'test'\n ...\n# Subtest: communication extractor ignores generic generated analysis under project/\nok 54 - communication extractor ignores generic generated analysis under project/\n ---\n duration_ms: 6.515334\n type: 'test'\n ...\n# Subtest: configuration converter covers JSON, TOML, Docker and CI workflow declarations\nok 55 - configuration converter covers JSON, TOML, Docker and CI workflow declarations\n ---\n duration_ms: 24.61101\n type: 'test'\n ...\n# Subtest: configuration converter emits a deterministic file aggregate for an empty configuration\nok 56 - configuration converter emits a deterministic file aggregate for an empty configuration\n ---\n duration_ms: 5.345404\n type: 'test'\n ...\n# Subtest: splitLines treats a trailing newline as a terminator, not an extra line\nok 57 - splitLines treats a trailing newline as a terminator, not an extra line\n ---\n duration_ms: 1.721202\n type: 'test'\n ...\n# Subtest: Identical inputs produce no hunks\nok 58 - Identical inputs produce no hunks\n ---\n duration_ms: 0.614422\n type: 'test'\n ...\n# Subtest: A modified line keeps both sides addressable by original line number\nok 59 - A modified line keeps both sides addressable by original line number\n ---\n duration_ms: 0.361535\n type: 'test'\n ...\n# Subtest: Pure insertion and pure deletion are not reported as replacements\nok 60 - Pure insertion and pure deletion are not reported as replacements\n ---\n duration_ms: 0.424901\n type: 'test'\n ...\n# Subtest: Empty-to-content and content-to-empty are handled as block changes\nok 61 - Empty-to-content and content-to-empty are handled as block changes\n ---\n duration_ms: 0.339297\n type: 'test'\n ...\n# Subtest: Context width controls hunk size\nok 62 - Context width controls hunk size\n ---\n duration_ms: 0.286648\n type: 'test'\n ...\n# Subtest: Nearby changes merge into a single hunk\nok 63 - Nearby changes merge into a single hunk\n ---\n duration_ms: 1.129351\n type: 'test'\n ...\n# Subtest: Distant changes stay in separate hunks\nok 64 - Distant changes stay in separate hunks\n ---\n duration_ms: 0.265357\n type: 'test'\n ...\n# Subtest: Oversized inputs fall back to a bounded block replace\nok 65 - Oversized inputs fall back to a bounded block replace\n ---\n duration_ms: 0.69384\n type: 'test'\n ...\n# Subtest: Unified output carries a well formed hunk header\nok 66 - Unified output carries a well formed hunk header\n ---\n duration_ms: 0.671622\n type: 'test'\n ...\n# Subtest: Side-by-side rows pair deletions with insertions\nok 67 - Side-by-side rows pair deletions with insertions\n ---\n duration_ms: 0.330858\n type: 'test'\n ...\n# Subtest: Unbalanced change runs leave one side empty rather than misaligning\nok 68 - Unbalanced change runs leave one side empty rather than misaligning\n ---\n duration_ms: 0.190374\n type: 'test'\n ...\n# Subtest: Renderers escape source markup\nok 69 - Renderers escape source markup\n ---\n duration_ms: 1.1167\n type: 'test'\n ...\n# Subtest: SVG rendering caps rows and reports the remainder\nok 70 - SVG rendering caps rows and reports the remainder\n ---\n duration_ms: 1.795926\n type: 'test'\n ...\n# Subtest: Reality view keys topics by target and records lane presence\nok 71 - Reality view keys topics by target and records lane presence\n ---\n duration_ms: 19.431233\n type: 'test'\n ...\n# Subtest: A topic holding declared and observed records is never reported as planned-only\nok 72 - A topic holding declared and observed records is never reported as planned-only\n ---\n duration_ms: 3.630486\n type: 'test'\n ...\n# Subtest: Reality coverage stays open when a shared path has unrelated capabilities\nok 73 - Reality coverage stays open when a shared path has unrelated capabilities\n ---\n duration_ms: 1.853836\n type: 'test'\n ...\n# Subtest: Shared-path relations do not collapse unrelated files into one topic\nok 74 - Shared-path relations do not collapse unrelated files into one topic\n ---\n duration_ms: 2.975218\n type: 'test'\n ...\n# Subtest: Reality view is deterministic for identical input\nok 75 - Reality view is deterministic for identical input\n ---\n duration_ms: 1.986556\n type: 'test'\n ...\n# Subtest: Reality SVG escapes topic labels\nok 76 - Reality SVG escapes topic labels\n ---\n duration_ms: 1.434425\n type: 'test'\n ...\n# Subtest: graph diff detects changed source identities, additions and SVG-safe labels\nok 77 - graph diff detects changed source identities, additions and SVG-safe labels\n ---\n duration_ms: 17.059667\n type: 'test'\n ...\n# Subtest: graph diff is empty for graphs with identical evidence\nok 78 - graph diff is empty for graphs with identical evidence\n ---\n duration_ms: 1.421934\n type: 'test'\n ...\n# Subtest: file diff emits deterministic unified, SVG and HTML views\nok 79 - file diff emits deterministic unified, SVG and HTML views\n ---\n duration_ms: 1.832308\n type: 'test'\n ...\n# Subtest: intent-vs-reality builds an explainable SVG and Markdown projection\nok 80 - intent-vs-reality builds an explainable SVG and Markdown projection\n ---\n duration_ms: 4.462089\n type: 'test'\n ...\n# Subtest: a targetless declaration is filed under the single module it links to\nok 81 - a targetless declaration is filed under the single module it links to\n ---\n duration_ms: 2.746545\n type: 'test'\n ...\n# Subtest: a declaration touching several modules keeps its own topic\nok 82 - a declaration touching several modules keeps its own topic\n ---\n duration_ms: 2.561579\n type: 'test'\n ...\n# Subtest: semantically aligned configuration topics retain their evidence grade\nok 83 - semantically aligned configuration topics retain their evidence grade\n ---\n duration_ms: 2.587257\n type: 'test'\n ...\n# Subtest: A record claiming line 1 is re-anchored to the line carrying its statement\nok 84 - A record claiming line 1 is re-anchored to the line carrying its statement\n ---\n duration_ms: 51.025911\n type: 'test'\n ...\n# Subtest: An already correct line is kept and not reported as re-anchored\nok 85 - An already correct line is kept and not reported as re-anchored\n ---\n duration_ms: 7.036979\n type: 'test'\n ...\n# Subtest: An empty target is backfilled from the statement text\nok 86 - An empty target is backfilled from the statement text\n ---\n duration_ms: 5.568668\n type: 'test'\n ...\n# Subtest: A target supplied by the model is never overwritten\nok 87 - A target supplied by the model is never overwritten\n ---\n duration_ms: 6.514116\n type: 'test'\n ...\n# Subtest: An unclassified action and modality are derived from the statement\nok 88 - An unclassified action and modality are derived from the statement\n ---\n duration_ms: 3.8372\n type: 'test'\n ...\n# Subtest: A classified action from the model wins over the heuristic\nok 89 - A classified action from the model wins over the heuristic\n ---\n duration_ms: 3.501148\n type: 'test'\n ...\n# Subtest: An action that stays unclassifiable is reported as a missing field\nok 90 - An action that stays unclassifiable is reported as a missing field\n ---\n duration_ms: 3.11411\n type: 'test'\n ...\n# Subtest: A placeholder object is treated as a gap, not as content\nok 91 - A placeholder object is treated as a gap, not as content\n ---\n duration_ms: 5.066897\n type: 'test'\n ...\n# Subtest: Every repair is attributable through epistemic.basis\nok 92 - Every repair is attributable through epistemic.basis\n ---\n duration_ms: 4.50343\n type: 'test'\n ...\n# Subtest: deterministic documentation baseline records headings, code blocks and explicit references\nok 93 - deterministic documentation baseline records headings, code blocks and explicit references\n ---\n duration_ms: 19.116796\n type: 'test'\n ...\n# Subtest: deterministic documentation preserves Polish prohibition polarity\nok 94 - deterministic documentation preserves Polish prohibition polarity\n ---\n duration_ms: 5.823547\n type: 'test'\n ...\n# Subtest: AST cache is incremental by path and source content hash\nok 95 - AST cache is incremental by path and source content hash\n ---\n duration_ms: 32.037932\n type: 'test'\n ...\n# Subtest: AST cache rejects corrupt entries and recomputes authoritative records\nok 96 - AST cache rejects corrupt entries and recomputes authoritative records\n ---\n duration_ms: 10.053204\n type: 'test'\n ...\n# Subtest: AST cache can be bypassed without changing extraction output\nok 97 - AST cache can be bypassed without changing extraction output\n ---\n duration_ms: 5.477589\n type: 'test'\n ...\n# Subtest: successful external AST adapter is skipped on a warm manifest hit\nok 98 - successful external AST adapter is skipped on a warm manifest hit\n ---\n duration_ms: 61.236136\n type: 'test'\n ...\n# Subtest: documentation chunks cache independently while provider calls remain live\nok 99 - documentation chunks cache independently while provider calls remain live\n ---\n duration_ms: 49.74158\n type: 'test'\n ...\n# Subtest: generated analysis replaces its source root with a stable token\nok 100 - generated analysis replaces its source root with a stable token\n ---\n duration_ms: 55.230582\n type: 'test'\n ...\n# Subtest: generated analysis root normalization refuses the filesystem root\nok 101 - generated analysis root normalization refuses the filesystem root\n ---\n duration_ms: 56.49376\n type: 'test'\n ...\n# Subtest: generated analysis rejects references to untracked input\nok 102 - generated analysis rejects references to untracked input\n ---\n duration_ms: 79.960895\n type: 'test'\n ...\n# Subtest: generated analysis accepts outputs independent of untracked input\nok 103 - generated analysis accepts outputs independent of untracked input\n ---\n duration_ms: 68.70097\n type: 'test'\n ...\n# Subtest: generated analysis accepts an untracked filename already quoted by tracked evidence\nok 104 - generated analysis accepts an untracked filename already quoted by tracked evidence\n ---\n duration_ms: 70.261314\n type: 'test'\n ...\n# Subtest: generated analysis rejects temporary paths and unavailable validators\nok 105 - generated analysis rejects temporary paths and unavailable validators\n ---\n duration_ms: 60.354863\n type: 'test'\n ...\n# Subtest: generated README metadata is synchronized from package.json and stays idempotent\nok 106 - generated README metadata is synchronized from package.json and stays idempotent\n ---\n duration_ms: 78.424858\n type: 'test'\n ...\n# Subtest: generated README synchronization fails closed when the template drifts\nok 107 - generated README synchronization fails closed when the template drifts\n ---\n duration_ms: 37.269712\n type: 'test'\n ...\n# Subtest: generated README synchronization rejects output outside the project root\nok 108 - generated README synchronization rejects output outside the project root\n ---\n duration_ms: 40.393568\n type: 'test'\n ...\n# Subtest: Git extractor emits one record per requested commit\nok 109 - Git extractor emits one record per requested commit\n ---\n duration_ms: 208.991485\n type: 'test'\n ...\n# Subtest: An empty repository degrades to a warning instead of failing the run\nok 110 - An empty repository degrades to a warning instead of failing the run\n ---\n duration_ms: 13.055836\n type: 'test'\n ...\n# Subtest: versioned gold dataset reports perfect offline quality and repeated-run stability\nok 111 - versioned gold dataset reports perfect offline quality and repeated-run stability\n ---\n duration_ms: 178.434202\n type: 'test'\n ...\n# Subtest: gold linking reports exact-target and capability-topic quality separately\nok 112 - gold linking reports exact-target and capability-topic quality separately\n ---\n duration_ms: 77.448091\n type: 'test'\n ...\n# Subtest: gold capability-topic support is large enough to detect a floor regression\nok 113 - gold capability-topic support is large enough to detect a floor regression\n ---\n duration_ms: 87.650775\n type: 'test'\n ...\n# Subtest: gold known gaps are measured and kept out of precision and recall\nok 114 - gold known gaps are measured and kept out of precision and recall\n ---\n duration_ms: 86.357938\n type: 'test'\n ...\n# Subtest: gold reports cross-language positives and hard negatives as a separate cohort\nok 115 - gold reports cross-language positives and hard negatives as a separate cohort\n ---\n duration_ms: 88.263761\n type: 'test'\n ...\n# Subtest: gold diagnostics separate a false DONE claim from an evidenced one\nok 116 - gold diagnostics separate a false DONE claim from an evidenced one\n ---\n duration_ms: 115.859524\n type: 'test'\n ...\n# Subtest: gold v1 stays evaluable after the v2 contract extension\nok 117 - gold v1 stays evaluable after the v2 contract extension\n ---\n duration_ms: 57.195328\n type: 'test'\n ...\n# Subtest: gold loader rejects unsupported dataset versions\nok 118 - gold loader rejects unsupported dataset versions\n ---\n duration_ms: 0.615741\n type: 'test'\n ...\n# Subtest: gold evaluator rejects unknown linking cohorts\nok 119 - gold evaluator rejects unknown linking cohorts\n ---\n duration_ms: 2.053517\n type: 'test'\n ...\n# Subtest: gold v2 must declare diagnostics coverage\nok 120 - gold v2 must declare diagnostics coverage\n ---\n duration_ms: 2.828194\n type: 'test'\n ...\n# Subtest: published gold schema matches the runtime contract\nok 121 - published gold schema matches the runtime contract\n ---\n duration_ms: 4.429943\n type: 'test'\n ...\n# Subtest: gold evaluator rejects fixture files outside its temporary workspace\nok 122 - gold evaluator rejects fixture files outside its temporary workspace\n ---\n duration_ms: 16.438552\n type: 'test'\n ...\n# Subtest: Linker connects plan, Git claim and AST fact\nok 123 - Linker connects plan, Git claim and AST fact\n ---\n duration_ms: 16.311255\n type: 'test'\n ...\n# Subtest: Linker connects prose intent to a module through three grounded capability topics\nok 124 - Linker connects prose intent to a module through three grounded capability topics\n ---\n duration_ms: 1.86707\n type: 'test'\n ...\n# Subtest: Linker does not connect a module on one generic topic alone\nok 125 - Linker does not connect a module on one generic topic alone\n ---\n duration_ms: 0.959537\n type: 'test'\n ...\n# Subtest: An existing target path does not prove an unrelated capability\nok 126 - An existing target path does not prove an unrelated capability\n ---\n duration_ms: 2.146738\n type: 'test'\n ...\n# Subtest: An existing target path plus an AST capability proves implementation\nok 127 - An existing target path plus an AST capability proves implementation\n ---\n duration_ms: 1.393026\n type: 'test'\n ...\n# Subtest: Diagnostics distinguish descriptive documentation from prescriptive requirements\nok 128 - Diagnostics distinguish descriptive documentation from prescriptive requirements\n ---\n duration_ms: 1.838234\n type: 'test'\n ...\n# Subtest: A changelog entry naming an extracted documentation file has release evidence\nok 129 - A changelog entry naming an extracted documentation file has release evidence\n ---\n duration_ms: 1.289025\n type: 'test'\n ...\n# Subtest: Diagnostics ignore non-actionable changelog mechanics but retain release claims\nok 130 - Diagnostics ignore non-actionable changelog mechanics but retain release claims\n ---\n duration_ms: 4.907215\n type: 'test'\n ...\n# Subtest: Grounded conclusion and TODO proposal contracts accept traceable values\nok 131 - Grounded conclusion and TODO proposal contracts accept traceable values\n ---\n duration_ms: 7.362316\n type: 'test'\n ...\n# Subtest: Stable IDs ignore ordering noise but change with semantic content\nok 132 - Stable IDs ignore ordering noise but change with semantic content\n ---\n duration_ms: 0.776994\n type: 'test'\n ...\n# Subtest: Validators reject ungrounded citations and stale semantic IDs\nok 133 - Validators reject ungrounded citations and stale semantic IDs\n ---\n duration_ms: 2.605247\n type: 'test'\n ...\n# Subtest: Generation metadata exposes LLM failures instead of silently masking them\nok 134 - Generation metadata exposes LLM failures instead of silently masking them\n ---\n duration_ms: 1.242535\n type: 'test'\n ...\n# Subtest: TODO proposal collections enforce dependency integrity\nok 135 - TODO proposal collections enforce dependency integrity\n ---\n duration_ms: 1.25968\n type: 'test'\n ...\n# Subtest: Published JSON schemas identify all grounded output contract versions\nok 136 - Published JSON schemas identify all grounded output contract versions\n ---\n duration_ms: 7.932424\n type: 'test'\n ...\n# Subtest: Blank lines and comments produce no rules\nok 137 - Blank lines and comments produce no rules\n ---\n duration_ms: 1.470632\n type: 'test'\n ...\n# Subtest: A pattern without a slash matches at any depth\nok 138 - A pattern without a slash matches at any depth\n ---\n duration_ms: 0.498243\n type: 'test'\n ...\n# Subtest: A leading slash anchors the pattern to the root\nok 139 - A leading slash anchors the pattern to the root\n ---\n duration_ms: 0.189613\n type: 'test'\n ...\n# Subtest: A trailing slash restricts the rule to directories\nok 140 - A trailing slash restricts the rule to directories\n ---\n duration_ms: 0.183035\n type: 'test'\n ...\n# Subtest: Wildcards respect path separators\nok 141 - Wildcards respect path separators\n ---\n duration_ms: 0.488332\n type: 'test'\n ...\n# Subtest: Every dot-directory is excluded by `.*/`\nok 142 - Every dot-directory is excluded by `.*/`\n ---\n duration_ms: 0.249175\n type: 'test'\n ...\n# Subtest: Negation re-includes a previously excluded path\nok 143 - Negation re-includes a previously excluded path\n ---\n duration_ms: 0.310822\n type: 'test'\n ...\n# Subtest: Negation cannot resurrect a file inside an excluded directory\nok 144 - Negation cannot resurrect a file inside an excluded directory\n ---\n duration_ms: 0.193751\n type: 'test'\n ...\n# Subtest: Last matching rule wins\nok 145 - Last matching rule wins\n ---\n duration_ms: 0.428899\n type: 'test'\n ...\n# Subtest: Character classes are supported\nok 146 - Character classes are supported\n ---\n duration_ms: 0.517494\n type: 'test'\n ...\n# Subtest: Paths are normalised before matching\nok 147 - Paths are normalised before matching\n ---\n duration_ms: 0.305464\n type: 'test'\n ...\n# Subtest: loadIgnoreMatcher merges the three ignore files and skips missing ones\nok 148 - loadIgnoreMatcher merges the three ignore files and skips missing ones\n ---\n duration_ms: 15.360004\n type: 'test'\n ...\n# Subtest: A repository without ignore files excludes nothing\nok 149 - A repository without ignore files excludes nothing\n ---\n duration_ms: 1.118205\n type: 'test'\n ...\n# Subtest: The shipped .intentignore excludes build output but keeps sources\nok 150 - The shipped .intentignore excludes build output but keeps sources\n ---\n duration_ms: 2.221497\n type: 'test'\n ...\n# Subtest: resolveGlobs permits one explicit .intent report without recursively scanning generated runs\nok 151 - resolveGlobs permits one explicit .intent report without recursively scanning generated runs\n ---\n duration_ms: 9.340646\n type: 'test'\n ...\n# Subtest: Two unrelated AST facts sharing only a file are not linked\nok 152 - Two unrelated AST facts sharing only a file are not linked\n ---\n duration_ms: 13.063091\n type: 'test'\n ...\n# Subtest: AST facts sharing a symbol are still linked despite the path rule\nok 153 - AST facts sharing a symbol are still linked despite the path rule\n ---\n duration_ms: 1.869002\n type: 'test'\n ...\n# Subtest: AST details sharing only a file and generic tokens do not create a quadratic subgraph\nok 154 - AST details sharing only a file and generic tokens do not create a quadratic subgraph\n ---\n duration_ms: 3.748139\n type: 'test'\n ...\n# Subtest: A file-level plan links once to the AST module aggregate instead of every detail\nok 155 - A file-level plan links once to the AST module aggregate instead of every detail\n ---\n duration_ms: 5.105415\n type: 'test'\n ...\n# Subtest: A shared path still links a plan to an AST fact\nok 156 - A shared path still links a plan to an AST fact\n ---\n duration_ms: 0.871933\n type: 'test'\n ...\n# Subtest: A bare filename links to a module only when its repository path is unique\nok 157 - A bare filename links to a module only when its repository path is unique\n ---\n duration_ms: 1.030049\n type: 'test'\n ...\n# Subtest: A bare filename refuses ambiguous module paths\nok 158 - A bare filename refuses ambiguous module paths\n ---\n duration_ms: 0.676256\n type: 'test'\n ...\n# Subtest: Relations that carry a conclusion survive alongside suppressed noise\nok 159 - Relations that carry a conclusion survive alongside suppressed noise\n ---\n duration_ms: 2.142349\n type: 'test'\n ...\n# Subtest: Pair ordering stays deterministic across rebuilds\nok 160 - Pair ordering stays deterministic across rebuilds\n ---\n duration_ms: 2.95758\n type: 'test'\n ...\n# Subtest: Two configuration declarations sharing only a key name are not linked\nok 161 - Two configuration declarations sharing only a key name are not linked\n ---\n duration_ms: 0.957038\n type: 'test'\n ...\n# Subtest: A shared ticket still connects two configuration declarations\nok 162 - A shared ticket still connects two configuration declarations\n ---\n duration_ms: 0.521796\n type: 'test'\n ...\n# Subtest: Configuration still links to documentation that describes it\nok 163 - Configuration still links to documentation that describes it\n ---\n duration_ms: 0.705998\n type: 'test'\n ...\n# Subtest: Configuration file aggregate is the file-level target for an explicit documentation path\nok 164 - Configuration file aggregate is the file-level target for an explicit documentation path\n ---\n duration_ms: 0.566322\n type: 'test'\n ...\n# Subtest: Configuration aggregates do not create broad capability-topic links\nok 165 - Configuration aggregates do not create broad capability-topic links\n ---\n duration_ms: 0.336685\n type: 'test'\n ...\n# Subtest: a full six-stage live run passes and reports every stage\nok 166 - a full six-stage live run passes and reports every stage\n ---\n duration_ms: 3.400207\n type: 'test'\n ...\n# Subtest: a stage that silently fell back to deterministic fails the check\nok 167 - a stage that silently fell back to deterministic fails the check\n ---\n duration_ms: 0.480476\n type: 'test'\n ...\n# Subtest: a missing stage cannot pass as covered\nok 168 - a missing stage cannot pass as covered\n ---\n duration_ms: 0.266115\n type: 'test'\n ...\n# Subtest: per-stage and total budgets are enforced separately\nok 169 - per-stage and total budgets are enforced separately\n ---\n duration_ms: 0.478901\n type: 'test'\n ...\n# Subtest: live request timeout reaches the stage budget without shortening a larger override\nok 170 - live request timeout reaches the stage budget without shortening a larger override\n ---\n duration_ms: 0.161498\n type: 'test'\n ...\n# Subtest: a stage reason is recorded with provider text redacted\nok 171 - a stage reason is recorded with provider text redacted\n ---\n duration_ms: 0.687637\n type: 'test'\n ...\n# Subtest: history records the trend without gating on it\nok 172 - history records the trend without gating on it\n ---\n duration_ms: 0.466782\n type: 'test'\n ...\n# Subtest: recorded audit history includes the current run exactly once\nok 173 - recorded audit history includes the current run exactly once\n ---\n duration_ms: 0.68664\n type: 'test'\n ...\n# Subtest: history stays chronological, bounded and free of duplicate runs\nok 174 - history stays chronological, bounded and free of duplicate runs\n ---\n duration_ms: 10.591798\n type: 'test'\n ...\n# Subtest: an audit converts to exactly the redacted fields history keeps\nok 175 - an audit converts to exactly the redacted fields history keeps\n ---\n duration_ms: 1.312886\n type: 'test'\n ...\n# Subtest: an empty history summarizes without pretending to have measured anything\nok 176 - an empty history summarizes without pretending to have measured anything\n ---\n duration_ms: 0.233883\n type: 'test'\n ...\n# Subtest: a batched run is measured per record, not per request\nok 177 - a batched run is measured per record, not per request\n ---\n duration_ms: 4.266202\n type: 'test'\n ...\n# Subtest: a model whose response the validator rejected is not counted as enriched\nok 178 - a model whose response the validator rejected is not counted as enriched\n ---\n duration_ms: 0.320007\n type: 'test'\n ...\n# Subtest: a failed model is a comparison result rather than a crash\nok 179 - a failed model is a comparison result rather than a crash\n ---\n duration_ms: 1.113558\n type: 'test'\n ...\n# Subtest: agreement compares only records both models enriched\nok 180 - agreement compares only records both models enriched\n ---\n duration_ms: 0.342102\n type: 'test'\n ...\n# Subtest: agreement is absent rather than perfect when nothing overlaps\nok 181 - agreement is absent rather than perfect when nothing overlaps\n ---\n duration_ms: 0.570713\n type: 'test'\n ...\n# Subtest: the rendered comparison names the cheapest and fastest passing model\nok 182 - the rendered comparison names the cheapest and fastest passing model\n ---\n duration_ms: 0.293888\n type: 'test'\n ...\n# Subtest: Markdown extractor separates TODO plans and changelog claims\nok 183 - Markdown extractor separates TODO plans and changelog claims\n ---\n duration_ms: 19.681114\n type: 'test'\n ...\n# Subtest: Markdown extractor preserves indented continuation lines and their source range\nok 184 - Markdown extractor preserves indented continuation lines and their source range\n ---\n duration_ms: 4.638224\n type: 'test'\n ...\n# Subtest: TODO bare filenames inherit an existing directory from the heading scope\nok 185 - TODO bare filenames inherit an existing directory from the heading scope\n ---\n duration_ms: 3.269558\n type: 'test'\n ...\n# Subtest: TODO resolves a bare filename only when its repository basename is unique\nok 186 - TODO resolves a bare filename only when its repository basename is unique\n ---\n duration_ms: 3.480799\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG resolve the same bare filename to one repository path\nok 187 - TODO and CHANGELOG resolve the same bare filename to one repository path\n ---\n duration_ms: 5.255302\n type: 'test'\n ...\n# Subtest: CHANGELOG keeps an ambiguous bare filename unresolved\nok 188 - CHANGELOG keeps an ambiguous bare filename unresolved\n ---\n duration_ms: 2.541252\n type: 'test'\n ...\n# Subtest: Markdown path resolution drops paths and heading scopes outside the repository\nok 189 - Markdown path resolution drops paths and heading scopes outside the repository\n ---\n duration_ms: 1.485173\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\nok 190 - TODO and CHANGELOG receive audited LLM enrichment without changing structural facts\n ---\n duration_ms: 29.826445\n type: 'test'\n ...\n# Subtest: Markdown enrichment corrects one rejected response and audits both attempts\nok 191 - Markdown enrichment corrects one rejected response and audits both attempts\n ---\n duration_ms: 4.841234\n type: 'test'\n ...\n# Subtest: large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\nok 192 - large Markdown enrichment uses bounded concurrency and keeps provider audits ordered\n ---\n duration_ms: 59.491613\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG LLM fallback and require mode are explicit\nok 193 - TODO and CHANGELOG LLM fallback and require mode are explicit\n ---\n duration_ms: 5.765547\n type: 'test'\n ...\n# Subtest: TODO and CHANGELOG reject structurally invalid LLM enrichments\nok 194 - TODO and CHANGELOG reject structurally invalid LLM enrichments\n ---\n duration_ms: 4.748193\n type: 'test'\n ...\n# Subtest: a truncated batch is split and every record keeps its own response provenance\nok 195 - a truncated batch is split and every record keeps its own response provenance\n ---\n duration_ms: 5.712745\n type: 'test'\n ...\n# Subtest: a malformed batch response splits instead of failing the whole stage\nok 196 - a malformed batch response splits instead of failing the whole stage\n ---\n duration_ms: 4.76502\n type: 'test'\n ...\n# Subtest: MCP 2026 profile is stateless and exposes discovery plus complete results\nok 197 - MCP 2026 profile is stateless and exposes discovery plus complete results\n ---\n duration_ms: 1.863859\n type: 'test'\n ...\n# Subtest: MCP 2026 rejects missing metadata and unsupported versions with protocol errors\nok 198 - MCP 2026 rejects missing metadata and unsupported versions with protocol errors\n ---\n duration_ms: 0.668179\n type: 'test'\n ...\n# Subtest: MCP legacy profile negotiates 2025-11-25 and requires initialize\nok 199 - MCP legacy profile negotiates 2025-11-25 and requires initialize\n ---\n duration_ms: 0.392681\n type: 'test'\n ...\n# Subtest: An LLM record is marked as inference and keeps runtime-owned provenance\nok 200 - An LLM record is marked as inference and keeps runtime-owned provenance\n ---\n duration_ms: 51.091491\n type: 'test'\n ...\n# Subtest: NL extraction corrects one rejected structured response and audits both attempts\nok 201 - NL extraction corrects one rejected structured response and audits both attempts\n ---\n duration_ms: 8.587963\n type: 'test'\n ...\n# Subtest: Confidence must satisfy the provider schema instead of being silently clamped\nok 202 - Confidence must satisfy the provider schema instead of being silently clamped\n ---\n duration_ms: 16.121062\n type: 'test'\n ...\n# Subtest: Source lines are clamped to the real file\nok 203 - Source lines are clamped to the real file\n ---\n duration_ms: 6.09681\n type: 'test'\n ...\n# Subtest: A placeholder object is recorded as a missing field, not as content\nok 204 - A placeholder object is recorded as a missing field, not as content\n ---\n duration_ms: 31.306295\n type: 'test'\n ...\n# Subtest: A real object is kept verbatim and reports no missing field\nok 205 - A real object is kept verbatim and reports no missing field\n ---\n duration_ms: 7.577851\n type: 'test'\n ...\n# Subtest: The explicit unknown action is reported as a missing field\nok 206 - The explicit unknown action is reported as a missing field\n ---\n duration_ms: 6.952579\n type: 'test'\n ...\n# Subtest: Both gaps are reported together\nok 207 - Both gaps are reported together\n ---\n duration_ms: 2.763589\n type: 'test'\n ...\n# Subtest: Out-of-vocabulary enums are rejected instead of changing the provider intent\nok 208 - Out-of-vocabulary enums are rejected instead of changing the provider intent\n ---\n duration_ms: 16.185404\n type: 'test'\n ...\n# Subtest: Rejected NL output keeps provider metadata in the failed audit\nok 209 - Rejected NL output keeps provider metadata in the failed audit\n ---\n duration_ms: 8.156053\n type: 'test'\n ...\n# Subtest: The documented confidence hierarchy holds across LLM extractors\nok 210 - The documented confidence hierarchy holds across LLM extractors\n ---\n duration_ms: 7.207435\n type: 'test'\n ...\n# Subtest: NL extractor produces deterministic non-LLM records\nok 211 - NL extractor produces deterministic non-LLM records\n ---\n duration_ms: 10.390925\n type: 'test'\n ...\n# Subtest: NL public extraction boundary names a missing sourcePath before path resolution\nok 212 - NL public extraction boundary names a missing sourcePath before path resolution\n ---\n duration_ms: 0.807538\n type: 'test'\n ...\n# Subtest: deterministic NL fallback skips Markdown headings and recognizes comparison intent\nok 213 - deterministic NL fallback skips Markdown headings and recognizes comparison intent\n ---\n duration_ms: 2.695106\n type: 'test'\n ...\n# Subtest: path extraction rejects lowercase prose alternations without losing repository paths\nok 214 - path extraction rejects lowercase prose alternations without losing repository paths\n ---\n duration_ms: 0.860091\n type: 'test'\n ...\n# Subtest: path extraction rejects dotted DSL fields but keeps known file extensions\nok 215 - path extraction rejects dotted DSL fields but keeps known file extensions\n ---\n duration_ms: 0.221942\n type: 'test'\n ...\n# Subtest: detectModality ignores parenthetical labels and bare adjectives\nok 216 - detectModality ignores parenthetical labels and bare adjectives\n ---\n duration_ms: 0.371034\n type: 'test'\n ...\n# Subtest: detectModality reads prohibitions and periphrastic obligation as requirements\nok 217 - detectModality reads prohibitions and periphrastic obligation as requirements\n ---\n duration_ms: 0.824303\n type: 'test'\n ...\n# Subtest: detectPolarity does not treat without-complements as sentence negation\nok 218 - detectPolarity does not treat without-complements as sentence negation\n ---\n duration_ms: 0.17564\n type: 'test'\n ...\n# Subtest: path extraction rejects HTTP routes, host paths and parent traversal\nok 219 - path extraction rejects HTTP routes, host paths and parent traversal\n ---\n duration_ms: 0.371191\n type: 'test'\n ...\n# Subtest: symbol extraction rejects hostnames without losing qualified code symbols\nok 220 - symbol extraction rejects hostnames without losing qualified code symbols\n ---\n duration_ms: 0.717701\n type: 'test'\n ...\n# Subtest: symbol extraction separates repository files and all-caps prose from code identifiers\nok 221 - symbol extraction separates repository files and all-caps prose from code identifiers\n ---\n duration_ms: 0.531449\n type: 'test'\n ...\n# Subtest: topic keywords normalize paths, camelCase and documentation word forms\nok 222 - topic keywords normalize paths, camelCase and documentation word forms\n ---\n duration_ms: 0.557194\n type: 'test'\n ...\n# Subtest: NL LLM extraction emits audited provenance and bounded DSL records\nok 223 - NL LLM extraction emits audited provenance and bounded DSL records\n ---\n duration_ms: 55.760113\n type: 'test'\n ...\n# Subtest: NL LLM failure is explicit when deterministic fallback is used\nok 224 - NL LLM failure is explicit when deterministic fallback is used\n ---\n duration_ms: 4.75006\n type: 'test'\n ...\n# Subtest: require-llm rejects instead of silently falling back\nok 225 - require-llm rejects instead of silently falling back\n ---\n duration_ms: 0.401417\n type: 'test'\n ...\n# Subtest: OpenRouter client parses structured JSON without exposing key\nok 226 - OpenRouter client parses structured JSON without exposing key\n ---\n duration_ms: 31.088675\n type: 'test'\n ...\n# Subtest: OpenRouter client preserves metadata when runtime rejects structured output\nok 227 - OpenRouter client preserves metadata when runtime rejects structured output\n ---\n duration_ms: 4.977532\n type: 'test'\n ...\n# Subtest: OpenRouter client lists available models after an invalid model ID\nok 228 - OpenRouter client lists available models after an invalid model ID\n ---\n duration_ms: 17.693243\n type: 'test'\n ...\n# Subtest: OpenRouter JSON timeout is not repeated as a schema fallback request\nok 229 - OpenRouter JSON timeout is not repeated as a schema fallback request\n ---\n duration_ms: 0.77187\n type: 'test'\n ...\n# Subtest: OpenRouter request obeys a shared pipeline deadline without retrying\nok 230 - OpenRouter request obeys a shared pipeline deadline without retrying\n ---\n duration_ms: 0.999307\n type: 'test'\n ...\n# Subtest: Documentation extractor converts OpenRouter structured output to bounded LLM records\nok 231 - Documentation extractor converts OpenRouter structured output to bounded LLM records\n ---\n duration_ms: 29.455286\n type: 'test'\n ...\n# Subtest: Documentation extractor reports and enforces its chunk budget\nok 232 - Documentation extractor reports and enforces its chunk budget\n ---\n duration_ms: 10.600139\n type: 'test'\n ...\n# Subtest: Documentation extractor corrects one rejected chunk and audits both responses\nok 233 - Documentation extractor corrects one rejected chunk and audits both responses\n ---\n duration_ms: 5.462681\n type: 'test'\n ...\n# Subtest: Documentation extractor does not spend its correction retry on a timeout\nok 234 - Documentation extractor does not spend its correction retry on a timeout\n ---\n duration_ms: 4.769507\n type: 'test'\n ...\n# Subtest: Documentation extractor exposes an audited configuration failure\nok 235 - Documentation extractor exposes an audited configuration failure\n ---\n duration_ms: 1.008426\n type: 'test'\n ...\n# Subtest: Documentation extractor uses bounded concurrent OpenRouter requests\nok 236 - Documentation extractor uses bounded concurrent OpenRouter requests\n ---\n duration_ms: 43.640863\n type: 'test'\n ...\n# Subtest: LLM summarizer receives graph data and preserves grounded record citations\nok 237 - LLM summarizer receives graph data and preserves grounded record citations\n ---\n duration_ms: 9.249042\n type: 'test'\n ...\n# Subtest: LLM summarizer validates provider fields before creating semantic IDs\nok 238 - LLM summarizer validates provider fields before creating semantic IDs\n ---\n duration_ms: 8.000478\n type: 'test'\n ...\n# Subtest: LLM summarizer diagnoses a provider that ignores the response envelope\nok 239 - LLM summarizer diagnoses a provider that ignores the response envelope\n ---\n duration_ms: 4.953126\n type: 'test'\n ...\n# Subtest: LLM summarizer rejects diagnostic citations outside the supplied graph\nok 240 - LLM summarizer rejects diagnostic citations outside the supplied graph\n ---\n duration_ms: 6.537866\n type: 'test'\n ...\n# Subtest: LLM summarizer prioritizes documentation over the AST payload budget\nok 241 - LLM summarizer prioritizes documentation over the AST payload budget\n ---\n duration_ms: 212.231366\n type: 'test'\n ...\n# Subtest: deterministic summary presents AST module aggregates instead of low-level calls\nok 242 - deterministic summary presents AST module aggregates instead of low-level calls\n ---\n duration_ms: 3.568471\n type: 'test'\n ...\n# Subtest: The summarizer grounds a fabricated record citation from its diagnostic\nok 243 - The summarizer grounds a fabricated record citation from its diagnostic\n ---\n duration_ms: 3.322774\n type: 'test'\n ...\n# Subtest: The summarizer still fails when the retry fabricates a diagnostic again\nok 244 - The summarizer still fails when the retry fabricates a diagnostic again\n ---\n duration_ms: 4.212772\n type: 'test'\n ...\n# Subtest: variable contracts and operation plans have deterministic content-bound IDs\nok 245 - variable contracts and operation plans have deterministic content-bound IDs\n ---\n duration_ms: 8.536635\n type: 'test'\n ...\n# Subtest: every variable grants Founder read/write authority and immutable variables reject other writers\nok 246 - every variable grants Founder read/write authority and immutable variables reject other writers\n ---\n duration_ms: 1.166723\n type: 'test'\n ...\n# Subtest: plans reject undeclared parameters, actor visibility gaps and payload secrets\nok 247 - plans reject undeclared parameters, actor visibility gaps and payload secrets\n ---\n duration_ms: 1.95067\n type: 'test'\n ...\n# Subtest: safety-sensitive commands require a Founder decision, a human boundary and verification\nok 248 - safety-sensitive commands require a Founder decision, a human boundary and verification\n ---\n duration_ms: 1.434\n type: 'test'\n ...\n# Subtest: plan hash detects semantic tampering\nok 249 - plan hash detects semantic tampering\n ---\n duration_ms: 1.926311\n type: 'test'\n ...\n# Subtest: compiler emits the exact governed envelope without an execution surface\nok 250 - compiler emits the exact governed envelope without an execution surface\n ---\n duration_ms: 1.668421\n type: 'test'\n ...\n# Subtest: runtime draft boundaries ignore lifecycle and identity fields injected by untyped callers\nok 251 - runtime draft boundaries ignore lifecycle and identity fields injected by untyped callers\n ---\n duration_ms: 0.831727\n type: 'test'\n ...\n# Subtest: compiler fails closed on extra, stale, wrong-source and wrong-type bindings\nok 252 - compiler fails closed on extra, stale, wrong-source and wrong-type bindings\n ---\n duration_ms: 1.831983\n type: 'test'\n ...\n# Subtest: file boundary writes one private envelope atomically and refuses overwrite\nok 253 - file boundary writes one private envelope atomically and refuses overwrite\n ---\n duration_ms: 20.535351\n type: 'test'\n ...\n# Subtest: Offline pipeline writes a complete run\nok 254 - Offline pipeline writes a complete run\n ---\n duration_ms: 246.331443\n type: 'test'\n ...\n# Subtest: Pipeline persists synthesis, validation and review patch, then registers approval receipt\nok 255 - Pipeline persists synthesis, validation and review patch, then registers approval receipt\n ---\n duration_ms: 67.202194\n type: 'test'\n ...\n# Subtest: Pipeline integrates multi-participant communication into graph, diagnostics, reality and run artifacts\nok 256 - Pipeline integrates multi-participant communication into graph, diagnostics, reality and run artifacts\n ---\n duration_ms: 59.453988\n type: 'test'\n ...\n# Subtest: Pipeline require-llm task synthesis failure is audited and never publishes latest\nok 257 - Pipeline require-llm task synthesis failure is audited and never publishes latest\n ---\n duration_ms: 16.283976\n type: 'test'\n ...\n# Subtest: Pipeline persists an audited failure when communication require-llm cannot run\nok 258 - Pipeline persists an audited failure when communication require-llm cannot run\n ---\n duration_ms: 20.47493\n type: 'test'\n ...\n# Subtest: Pipeline persists communication stage failure and does not publish latest\nok 259 - Pipeline persists communication stage failure and does not publish latest\n ---\n duration_ms: 14.665912\n type: 'test'\n ...\n# Subtest: Pipeline persists a failed manifest when NL require-llm aborts\nok 260 - Pipeline persists a failed manifest when NL require-llm aborts\n ---\n duration_ms: 10.440662\n type: 'test'\n ...\n# Subtest: Pipeline persists a failed manifest when Markdown require-llm aborts\nok 261 - Pipeline persists a failed manifest when Markdown require-llm aborts\n ---\n duration_ms: 17.297888\n type: 'test'\n ...\n# Subtest: Pipeline persists a failed manifest for an unexpected summary failure\nok 262 - Pipeline persists a failed manifest for an unexpected summary failure\n ---\n duration_ms: 17.350083\n type: 'test'\n ...\n# Subtest: Proposal validation reports existing TODO duplicates and orders dependencies before priority\nok 263 - Proposal validation reports existing TODO duplicates and orders dependencies before priority\n ---\n duration_ms: 26.224678\n type: 'test'\n ...\n# Subtest: Proposal validation rejects dependency cycles and whitespace-only criterion duplicates\nok 264 - Proposal validation rejects dependency cycles and whitespace-only criterion duplicates\n ---\n duration_ms: 3.465658\n type: 'test'\n ...\n# Subtest: Python package executes the local TypeScript reality runtime without a server\nok 265 - Python package executes the local TypeScript reality runtime without a server\n ---\n duration_ms: 2253.194748\n type: 'test'\n ...\n# Subtest: Runtime validator enforces the complete Intent DSL enum and object contract\nok 266 - Runtime validator enforces the complete Intent DSL enum and object contract\n ---\n duration_ms: 8.202176\n type: 'test'\n ...\n# Subtest: Linker and remote action boundary reject malformed records before graph construction\nok 267 - Linker and remote action boundary reject malformed records before graph construction\n ---\n duration_ms: 24.226056\n type: 'test'\n ...\n# Subtest: Graph validator rejects invalid relations and inconsistent statistics\nok 268 - Graph validator rejects invalid relations and inconsistent statistics\n ---\n duration_ms: 5.197137\n type: 'test'\n ...\n# [t2c:a2a] listening on 127.0.0.1:33391\n# Subtest: diff UI and TypeScript/Python SDKs use the live backend runtime\nok 269 - diff UI and TypeScript/Python SDKs use the live backend runtime\n ---\n duration_ms: 261.606224\n type: 'test'\n ...\n# Subtest: MCP/A2A action boundary rejects traversal and symlink escapes\nok 270 - MCP/A2A action boundary rejects traversal and symlink escapes\n ---\n duration_ms: 34.084228\n type: 'test'\n ...\n# Subtest: bounded retrieval cannot create a relation until a grounded reranker accepts it\nok 271 - bounded retrieval cannot create a relation until a grounded reranker accepts it\n ---\n duration_ms: 23.585772\n type: 'test'\n ...\n# Subtest: reranker fails closed on ungrounded quotes and more than one accepted module\nok 272 - reranker fails closed on ungrounded quotes and more than one accepted module\n ---\n duration_ms: 7.570661\n type: 'test'\n ...\n# Subtest: OpenRouter reranking is required, structured and reusable only through an identity-bound cache\nok 273 - OpenRouter reranking is required, structured and reusable only through an identity-bound cache\n ---\n duration_ms: 91.892511\n type: 'test'\n ...\n# Subtest: published semantic reranker schemas expose the versioned bounded contracts\nok 274 - published semantic reranker schemas expose the versioned bounded contracts\n ---\n duration_ms: 2.010945\n type: 'test'\n ...\n# Subtest: provider response validation diagnoses the exact property without coercion\nok 275 - provider response validation diagnoses the exact property without coercion\n ---\n duration_ms: 0.661055\n type: 'test'\n ...\n# Subtest: one structured contract emits the provider schema and parses the same value\nok 276 - one structured contract emits the provider schema and parses the same value\n ---\n duration_ms: 2.255355\n type: 'test'\n ...\n# Subtest: structured parsing fails closed with the exact response path\nok 277 - structured parsing fails closed with the exact response path\n ---\n duration_ms: 0.867795\n type: 'test'\n ...\n# Subtest: object uniqueness uses canonical JSON identity rather than property order\nok 278 - object uniqueness uses canonical JSON identity rather than property order\n ---\n duration_ms: 0.371224\n type: 'test'\n ...\n# Subtest: a short NL symbol resolves to its only AST owner\nok 279 - a short NL symbol resolves to its only AST owner\n ---\n duration_ms: 15.377856\n type: 'test'\n ...\n# Subtest: an ambiguous short NL symbol does not pretend that either AST owner is selected\nok 280 - an ambiguous short NL symbol does not pretend that either AST owner is selected\n ---\n duration_ms: 4.471802\n type: 'test'\n ...\n# Subtest: an explicit path selects one owner of an otherwise ambiguous symbol\nok 281 - an explicit path selects one owner of an otherwise ambiguous symbol\n ---\n duration_ms: 1.499082\n type: 'test'\n ...\n# Subtest: a qualified symbol selects its exact AST declaration without a path\nok 282 - a qualified symbol selects its exact AST declaration without a path\n ---\n duration_ms: 1.084444\n type: 'test'\n ...\n# Subtest: a symbol and explicit path conflict reports the observed AST location\nok 283 - a symbol and explicit path conflict reports the observed AST location\n ---\n duration_ms: 0.996764\n type: 'test'\n ...\n# Subtest: missingFields diagnostics prescribe a concrete edit for every known gap\nok 284 - missingFields diagnostics prescribe a concrete edit for every known gap\n ---\n duration_ms: 0.72931\n type: 'test'\n ...\n# Subtest: Target normalization canonicalizes paths, symbols and cross-language separators\nok 285 - Target normalization canonicalizes paths, symbols and cross-language separators\n ---\n duration_ms: 2.888074\n type: 'test'\n ...\n# Subtest: Qualified AST symbols align with short plan and documentation targets\nok 286 - Qualified AST symbols align with short plan and documentation targets\n ---\n duration_ms: 26.630405\n type: 'test'\n ...\n# Subtest: Structured task synthesis materializes stable, grounded contracts with a complete audit\nok 287 - Structured task synthesis materializes stable, grounded contracts with a complete audit\n ---\n duration_ms: 65.587885\n type: 'test'\n ...\n# Subtest: blank response-local proposal keys are rejected instead of invented by the runtime\nok 288 - blank response-local proposal keys are rejected instead of invented by the runtime\n ---\n duration_ms: 9.129888\n type: 'test'\n ...\n# Subtest: prefer-llm exposes raw diagnostic actions without claiming semantic task generation\nok 289 - prefer-llm exposes raw diagnostic actions without claiming semantic task generation\n ---\n duration_ms: 1.883861\n type: 'test'\n ...\n# Subtest: communication divergence is grounded in task synthesis without treating agent claims as facts\nok 290 - communication divergence is grounded in task synthesis without treating agent claims as facts\n ---\n duration_ms: 9.879268\n type: 'test'\n ...\n# Subtest: require-llm fails explicitly when task synthesis cannot call the provider\nok 291 - require-llm fails explicitly when task synthesis cannot call the provider\n ---\n duration_ms: 1.012865\n type: 'test'\n ...\n# Subtest: invalid structured LLM citations are rejected or visibly degraded according to mode\nok 292 - invalid structured LLM citations are rejected or visibly degraded according to mode\n ---\n duration_ms: 10.101037\n type: 'test'\n ...\n# Subtest: task synthesis timeout is audited and never retried as a format fallback\nok 293 - task synthesis timeout is audited and never retried as a format fallback\n ---\n duration_ms: 16.120688\n type: 'test'\n ...\n# Subtest: A fabricated record citation is grounded from its cited diagnostic without a retry\nok 294 - A fabricated record citation is grounded from its cited diagnostic without a retry\n ---\n duration_ms: 5.084101\n type: 'test'\n ...\n# Subtest: A fabricated diagnostic still fails after the corrective retry\nok 295 - A fabricated diagnostic still fails after the corrective retry\n ---\n duration_ms: 4.725713\n type: 'test'\n ...\n# Subtest: TensorFlow remains an explicit fallback when the isolated adapter is not installed\nok 296 - TensorFlow remains an explicit fallback when the isolated adapter is not installed\n ---\n duration_ms: 6.864405\n type: 'test'\n ...\n# Subtest: TODO patch rendering is stable, dependency-first and excludes classified duplicates\nok 297 - TODO patch rendering is stable, dependency-first and excludes classified duplicates\n ---\n duration_ms: 22.998463\n type: 'test'\n ...\n# Subtest: empty and duplicate-only results render an explicit no-op patch\nok 298 - empty and duplicate-only results render an explicit no-op patch\n ---\n duration_ms: 2.704325\n type: 'test'\n ...\n# Subtest: apply rejects missing or wrong approval, stale TODO and a tampered patch\nok 299 - apply rejects missing or wrong approval, stale TODO and a tampered patch\n ---\n duration_ms: 19.546566\n type: 'test'\n ...\n# Subtest: approved apply is atomic, receipt-backed and idempotent\nok 300 - approved apply is atomic, receipt-backed and idempotent\n ---\n duration_ms: 30.289843\n type: 'test'\n ...\n# Subtest: service actions execute LLM propose -> render -> approved apply with scoped artifacts\nok 301 - service actions execute LLM propose -> render -> approved apply with scoped artifacts\n ---\n duration_ms: 58.741418\n type: 'test'\n ...\n# Subtest: scanTree prunes ignored directories and records file signatures\nok 302 - scanTree prunes ignored directories and records file signatures\n ---\n duration_ms: 19.888131\n type: 'test'\n ...\n# Subtest: diffSnapshots classifies additions, modifications and removals\nok 303 - diffSnapshots classifies additions, modifications and removals\n ---\n duration_ms: 0.498634\n type: 'test'\n ...\n# Subtest: describeDelta truncates long change lists\nok 304 - describeDelta truncates long change lists\n ---\n duration_ms: 0.168912\n type: 'test'\n ...\n# Subtest: An unchanged tree produces exactly one report and then stays quiet\nok 305 - An unchanged tree produces exactly one report and then stays quiet\n ---\n duration_ms: 5.425216\n type: 'test'\n ...\n# Subtest: Reports are rate limited to one per interval no matter how often files change\nok 306 - Reports are rate limited to one per interval no matter how often files change\n ---\n duration_ms: 73.367872\n type: 'test'\n ...\n# Subtest: A change is reported once the interval has elapsed\nok 307 - A change is reported once the interval has elapsed\n ---\n duration_ms: 5.445187\n type: 'test'\n ...\n# Subtest: Ignored files never trigger a report\nok 308 - Ignored files never trigger a report\n ---\n duration_ms: 5.75999\n type: 'test'\n ...\n# Subtest: A failing report is surfaced and does not stop the watcher\nok 309 - A failing report is surfaced and does not stop the watcher\n ---\n duration_ms: 2.468465\n type: 'test'\n ...\n# Subtest: --no-initial-report waits for a real change\nok 310 - --no-initial-report waits for a real change\n ---\n duration_ms: 3.497512\n type: 'test'\n ...\n# Subtest: Communication changes trigger watch and coalesce under the existing report rate limit\nok 311 - Communication changes trigger watch and coalesce under the existing report rate limit\n ---\n duration_ms: 8.331281\n type: 'test'\n ...\n# Subtest: workflow verifier rejects duplicate top-level YAML keys\nok 312 - workflow verifier rejects duplicate top-level YAML keys\n ---\n duration_ms: 108.911482\n type: 'test'\n ...\n# Subtest: workspace headline trend ignores AST-only topic and source churn\nok 313 - workspace headline trend ignores AST-only topic and source churn\n ---\n duration_ms: 0.948171\n type: 'test'\n ...\n# Subtest: workspace comparison measures origin/main against uncommitted filesystem intent\nok 314 - workspace comparison measures origin/main against uncommitted filesystem intent\n ---\n duration_ms: 246.81654\n type: 'test'\n ...\n1..314\n# tests 314\n# suites 0\n# pass 307\n# fail 0\n# cancelled 0\n# skipped 7\n# todo 0\n# duration_ms 8133.098817\n\n> todo2code@0.5.0 evaluate:gold\n> npm run build && node dist/src/evaluation/gold-cli.js evaluation/gold/v2/dataset.json --require-perfect\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\n# Gold evaluation: todo2code core semantic benchmark v2\n\nDataset: `t2c.gold-dataset/v2` Β· `61191fe8717db205`\n\n| Scope | Precision | Recall | TP / FP / FN |\n|---|---:|---:|---:|\n| Extraction: nl | 100.0% | 100.0% | 8 / 0 / 0 |\n| Extraction: documentation | 100.0% | 100.0% | 2 / 0 / 0 |\n| Extraction: documentation-deterministic | 100.0% | 100.0% | 8 / 0 / 0 |\n| Extraction: markdown | 100.0% | 100.0% | 3 / 0 / 0 |\n| Extraction: overall | 100.0% | 100.0% | 21 / 0 / 0 |\n| Linking: overall | 100.0% | 100.0% | 18 / 0 / 0 |\n| Linking: exact target | 100.0% | 100.0% | 10 / 0 / 0 |\n| Linking: capability topic | 100.0% | 100.0% | 8 / 0 / 0 |\n| DSL2TODO deduplication | 100.0% | 100.0% | 1 / 0 / 0 |\n| Diagnostics: codes | 100.0% | 100.0% | 14 / 0 / 0 |\n\nDiagnostics cases: **7** (forbidden codes raised: 0).\n\nKnown linking gaps: **0/6** relations reached across 6 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/6** expected relations and **0/6** forbidden violations across 7 case(s).\n\nCross-language reranking: **6/6** expected relations and **0/6** forbidden violations across 7 captured case(s); accepted 6, abstained 1.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5e6c88e139a88705 / 5e6c88e139a88705).\n\n> todo2code@0.5.0 evaluate:gold:v1\n> npm run build && node dist/src/evaluation/gold-cli.js evaluation/gold/v1/dataset.json --require-perfect\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\n# Gold evaluation: todo2code core semantic benchmark v1\n\nDataset: `t2c.gold-dataset/v1` Β· `ff2d9908f374da48`\n\n| Scope | Precision | Recall | TP / FP / FN |\n|---|---:|---:|---:|\n| Extraction: nl | 100.0% | 100.0% | 4 / 0 / 0 |\n| Extraction: documentation | 100.0% | 100.0% | 2 / 0 / 0 |\n| Extraction: documentation-deterministic | 100.0% | 100.0% | 0 / 0 / 0 |\n| Extraction: markdown | 100.0% | 100.0% | 3 / 0 / 0 |\n| Extraction: overall | 100.0% | 100.0% | 9 / 0 / 0 |\n| Linking: overall | 100.0% | 100.0% | 7 / 0 / 0 |\n| Linking: exact target | 100.0% | 100.0% | 6 / 0 / 0 |\n| Linking: capability topic | 100.0% | 100.0% | 1 / 0 / 0 |\n| DSL2TODO deduplication | 100.0% | 100.0% | 1 / 0 / 0 |\n| Diagnostics: codes | 100.0% | 100.0% | 0 / 0 / 0 |\n\nDiagnostics cases: **0** (forbidden codes raised: 0).\n\nKnown linking gaps: **0/0** relations reached across 0 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/0** expected relations and **0/0** forbidden violations across 0 case(s).\n\nCross-language reranking: **0/0** expected relations and **0/0** forbidden violations across 0 captured case(s); accepted 0, abstained 0.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5f928c74d5a6c8e3 / 5f928c74d5a6c8e3).\n\n> todo2code@0.5.0 examples:check\n> npm run build && bash scripts/examples-check.sh\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\ndemo: 227 records, 92 relations; communication: 3 blocking, 1 warning\nrejected event: agent is required\nbackend/frontend: strict compilation and HTTP integration passed\nexample failed: Task 9cb29036-f81b-4d7d-97ec-efe9812a1699 ended in TASK_STATE_FAILED: Configured T2C_ROOT does not exist: /workspace/examples/backend\n[2026-08-01T09:24:25Z] [EXIT] Full Docker verification exited with code 1\n[2026-08-01T09:24:41Z] [EXEC] [provider:codex] compact authoritative Docker gates\nnpm_ci=PASS\nverify=PASS\n duration_ms: 212.620174\n type: 'test'\n ...\n1..314\n# tests 314\n# suites 0\n# pass 307\n# fail 0\n# cancelled 0\n# skipped 7\n# todo 0\n# duration_ms 7286.318175\ngold_v2=PASS\n\nKnown linking gaps: **0/6** relations reached across 6 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/6** expected relations and **0/6** forbidden violations across 7 case(s).\n\nCross-language reranking: **6/6** expected relations and **0/6** forbidden violations across 7 captured case(s); accepted 6, abstained 1.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5e6c88e139a88705 / 5e6c88e139a88705).\ngold_v1=PASS\n\nKnown linking gaps: **0/0** relations reached across 0 documented case(s); excluded from precision and recall.\n\nCross-language linking: **0/0** expected relations and **0/0** forbidden violations across 0 case(s).\n\nCross-language reranking: **0/0** expected relations and **0/0** forbidden violations across 0 captured case(s); accepted 0, abstained 0.\n\nCitation completeness: **100.0%** (14/14).\n\nDeduplication rate: **50.0%** (1/2 proposals).\n\nRepeated-run stability: **PASS** (100.0%; 5f928c74d5a6c8e3 / 5f928c74d5a6c8e3).\nexamples=FAIL:1\n\n> todo2code@0.5.0 examples:check\n> npm run build && bash scripts/examples-check.sh\n\n\n> todo2code@0.5.0 build\n> tsc -p tsconfig.json\n\ndemo: 227 records, 92 relations; communication: 3 blocking, 1 warning\nrejected event: agent is required\nbackend/frontend: strict compilation and HTTP integration passed\nexample failed: Task c842f452-1bb5-4837-b133-c1f2f3ce9eb8 ended in TASK_STATE_FAILED: Configured T2C_ROOT does not exist: /workspace/examples/backend\n[2026-08-01T09:25:28Z] [EXIT] Compact Docker gates exited with code 1\n[2026-08-01T09:30:00Z] [RESULT] [provider:codex] final host and Docker gates\nhost_verify=PASS tests=314 pass=313 skip=1 fail=0\ndocker_verify=PASS tests=314 pass=307 skip=7 fail=0\ngold_v2=PASS gold_v1=PASS gated_precision_recall=100%\nhost_examples=PASS docker_examples=PASS\n[2026-08-01T09:31:00Z] [RESULT] [provider:codex] Governance Hub tracked A/B\nrepository=wellmanifest/new-project commit=72e5f6c9cf91998615e2342f02b2af650be81cea\nbefore_graph=322d2d1ca075a3cdd7060e88dcf3c7e5621f987ba0a5a8b4c3a43824c1e4d4c0\nafter_graph=6ac01af718a3a32c18a98d44b5751bcccc33ad1edb4696a30f59da948563950e\nbefore_conflicting_intent=1 after_conflicting_intent=0\nbefore_planned_not_implemented=31 after_planned_not_implemented=32\nbefore_total_diagnostics=183 after_total_diagnostics=183\ntarget_before=unknown/positive target_after=required/negative\n[2026-08-01T09:32:00Z] [RESULT] [provider:codex] generated analysis refresh\nsource=tracked-file overlay on 1ebad96 (unrelated untracked inputs excluded)\nverification={"filesChecked":19,"untrackedInputsChecked":5,"status":"ok"}\nprefact=skipped\n[2026-08-01T09:40:00Z] [RESULT] [provider:codex] isolated Docker core E2E\nsuite=core result=T2C-E2E-000:PASS tests=318 pass=311 skip=7 fail=0\ngold_v2=PASS gold_v1=PASS cli_smoke=PASS mcp_smoke=PASS a2a_smoke=PASS examples=PASS\n[2026-08-01T09:44:00Z] [RESULT] [provider:codex] isolated Docker full-toolchain E2E\nsuite=full result=T2C-E2E-000:PASS tests=318 pass=318 skip=0 fail=0\ngold_v2=PASS gold_v1=PASS cli_smoke=PASS mcp_smoke=PASS a2a_smoke=PASS\nsdk_examples=PASS languages=5 fingerprint=1b5dbbf867286090\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-014/ai-codex-logs.txt", "path": "ticket-014 / ai-codex-logs.txt", "size": "871B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 existing src/retry.py falsely aligned with a new retry/backoff TODO; 0 plans\n2026-07-31 missing src/retry_backoff.py produced 1 grounded plan and Koru PLF-001\n2026-07-31 Koru false-success root cause: todo2code ticket was not classified as edit work\n2026-07-31 Koru runner fixed to treat todo2code/code-change labels as edit work\n2026-07-31 Koru PLF-002 produced verified branch koru/run-6e596247e153 commit 1809ea5\n2026-07-31 independent pytest and todo2code re-analysis passed; targeted planned gap cleared\n2026-07-31 gold added existing-path negative and implemented-capability positive; 14/14 diagnostic codes\n2026-07-31 Koru replay created PLF-003 for existing src/retry.py; verified commit 55a8b15\n2026-07-31 independent replay: 6 pytest pass, zero target plans, capability_overlap:2\n2026-07-31 weekly/nlp2uri/algitex deterministic regressions succeeded\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-007/ai-codex-logs.txt", "path": "ticket-007 / ai-codex-logs.txt", "size": "423B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-007 initialized\n- selected the first open P1 readiness gap\n- implementation files remain outside project/ticket-007\n- no human participant file or registry entry created\n2026-07-31 implementation completed\n- real ticket-006: 3 issues, all route to unresolved:human, none empty\n- focused communication tests: 7/7 pass\n- full verify: 253 tests, 252 pass, 1 JDK skip\n- gold v2/v1 and five-SDK examples: PASS\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-009/ai-codex-logs.txt", "path": "ticket-009 / ai-codex-logs.txt", "size": "659B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-009 started\n- production structured OpenRouter boundaries found: 7\n- manual runtime strategies found: unchecked generic, duplicated validator, coercive normalizer\n- executable files in ticket directory: 0\n2026-07-31 ticket-009 verified\n- npm run verify: PASS (256 total, 255 pass, 1 JDK skip)\n- structured response gate: PASS (7 canonical, 0 raw)\n- generated schema gate: PASS\n- evaluate:gold v2: 100% required gates\n- evaluate:gold:v1: PASS\n- examples:check: PASS (5 SDK)\n- git diff --check: PASS\n2026-07-31 ticket-009 published\n- implementation commit: d0fc143\n- origin/main push: PASS\n- unrelated staged nlp2uri.yaml: preserved, excluded\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-008/ai-codex-logs.txt", "path": "ticket-008 / ai-codex-logs.txt", "size": "343B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-008 completed\n- Docker engine: running, version 29.1.3\n- governance script syntax: PASS\n- isolated scaffolder/index test: PASS\n- todo2code communication integration: PASS\n- generated participant: agent:codex / agent\n- invented human participants: 0\n- unresolved approval route: unresolved:human\n- upstream main push: 72e5f6c\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-002/ai-codex-logs.txt", "path": "ticket-002 / ai-codex-logs.txt", "size": "6.2KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31T06:49:07Z ticket initialization\n\n$ git status --short\n?? nlp2uri.yaml\n\n$ docker version --format 'client={{.Client.Version}} server={{.Server.Version}}'\nclient=29.1.3 server=29.1.3\n\n$ verify required container files\nDockerfile\ndocker-compose.yml\n\n$ verify external tracked commits\nsemcod/code2llm b297d60\nsemcod/domd b6c5ad2\nsemcod/pactfix daf301a\nsemcod/code2logic ba93489\nsemcod/code2docs c738aff\nsemcod/redup a175fb0\nsubactor/platform 3e96573\n\nResult: planning prerequisites verified; state WAIT_FOR_APPROVAL.\n\n$ git diff --check\nexit 0\n\n$ verify ticket files are non-empty\nOK project/ticket-002/README.md\nOK project/ticket-002/preprompt.md\nOK project/ticket-002/user-tom-sapletta-com.md\nOK project/ticket-002/ai-codex.md\nOK project/ticket-002/ai-codex-logs.txt\nOK project/ticket-002/changelog.md\n\n$ npm run verify:generated-analysis\n{"filesChecked":18,"untrackedInputsChecked":7,"status":"ok"}\n\n2026-07-31 approval\n\nUser decision: kontynuuj\nWorkflow transition: WAIT_FOR_APPROVAL -> TOOLS\n\n2026-07-31 generated-analysis audit\n\n$ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\ndetached tracked worktree: used\ncode2docs/redup/vallm/code2llm: completed\n{"filesChecked":18,"filesChanged":8}\n{"filesChecked":18,"untrackedInputsChecked":7,"status":"ok"}\nprefact: skipped; requires T2C_APPLY_PREFACT=1\nResult: generated analysis passed, but project/README.md generation replaced\nthe manually added ticket index. The namespace conflict is retained as a\nfollow-up tooling defect; ticket discovery remains available through TODO.md.\n\n2026-07-31 external deterministic baseline\n\nPolicy: detached tracked-only commits; TASK.md/TODO.md/CHANGELOG.md selected\nonly when tracked; documents README.md and docs/**/*.md; deterministic NL and\nMarkdown; no communication, task synthesis or LLM summary.\n\nsemcod/code2llm b297d600 run=20260731T065730Z-ca7a9a28 time=18s records=16899 relations=41747 graph=2e57056bf75fc5ef diagnostics=4700 warnings=9\nsemcod/domd b6c5ad24 run=20260731T065753Z-a3fde5a3 time=5s records=10611 relations=7470 graph=9df7e187f82b4ce8 diagnostics=2109 warnings=0\nsemcod/pactfix daf301a9 run=20260731T065802Z-48dc0b12 time=5s records=5161 relations=3917 graph=9c2d15fc76b8585f diagnostics=664 warnings=5\nsemcod/code2logic ba93489b run=20260731T065808Z-a52c2716 time=12s records=21423 relations=16927 graph=722f90e806be667f diagnostics=4680 warnings=3\nsemcod/code2docs c738aff7 run=20260731T065827Z-9f042652 time=9s records=6717 relations=35447 graph=4598fbe9eec85d61 diagnostics=1555 warnings=0\nsemcod/redup a175fb0a run=20260731T065840Z-61c33c16 time=6s records=7204 relations=19173 graph=ed0359f98ed4e18f diagnostics=2384 warnings=0\nsubactor/platform 3e96573d run=20260731T065848Z-3863e97d time=6s records=10628 relations=11002 graph=1c4166dd1b7b7789 diagnostics=1271 warnings=1\n\nResult: 7/7 succeeded. CHANGELOG_WITHOUT_IMPLEMENTATION occurred in every\nrepository, 2877 times in total. Samples include both substantive claims and\nnon-actionable generated-file updates/placeholders; broad topic linking is\ntherefore rejected for the first iteration.\n\n2026-07-31 regression before implementation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=5 fail=1\nfailure: Diagnostics ignore non-actionable changelog mechanics but retain\nrelease claims\nfirst counterexample: Update project/calls.mmd\nResult: expected red regression confirmed before the implementation change.\n\n2026-07-31 iteration 01 focused and gold validation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=6 fail=0\n\n$ npm run evaluate:gold\nextraction=100%/100% linking=100%/100% diagnostics=100%/100%\nforbiddenDiagnosticCodes=0 repeatedRunStability=PASS knownGap=0/1\n\n2026-07-31 iteration 01 external comparison\n\nRuntime: clean 5f5ae593 plus only src/graph/changelog-signal.ts and the\ndiagnostics integration. External commits and deterministic input policy are\nunchanged.\n\nsemcod/code2llm graph=same changelog=1411->955 review=1411->955 unlinked=1332->1313\nsemcod/domd graph=same changelog=105->99 review=105->99 unlinked=779->773\nsemcod/pactfix graph=same changelog=48->48 review=48->48 unlinked=217->217\nsemcod/code2logic graph=same changelog=121->120 review=121->120 unlinked=1504->1503\nsemcod/code2docs graph=same changelog=396->269 review=396->269 unlinked=463->455\nsemcod/redup graph=same changelog=703->269 review=703->269 unlinked=708->703\nsubactor/platform graph=same changelog=93->93 review=93->93 unlinked=780->780\n\nTotal: CHANGELOG_WITHOUT_IMPLEMENTATION 2877->1853 (-1024),\nUNLINKED_RECORD 5783->5744 (-39), all diagnostics 17363->16300 (-1063).\nResult: keep iteration 01; target improved in 5 repositories with no graph or\ngold regression. Workflow transition: ANALYSIS -> VERIFY.\n\n2026-07-31 final validation\n\n$ npm run verify\nPASS: 241 tests, 240 pass, 0 fail, 1 Java skip (JDK unavailable)\nPASS: LLM boundary 9 entrypoints / 31 modules\nPASS: module boundary 94 modules / 429 imports / 0 cycles\nPASS: env contract 63/63, workflow YAML, generated-analysis isolation\n\n$ npm run evaluate:gold\nPASS: all measured precision/recall 100%, forbidden diagnostics 0, stability PASS\n\n$ npm run examples:check\nPASS: 5 SDKs, shared graph and patch fingerprints\n\n$ npm audit --omit=dev\nPASS: 0 vulnerabilities\n\n$ make smoke protocol-smoke\nPASS: offline CLI, MCP and A2A\n\n$ make docker-smoke\nPASS: image build, /healthz and doctor\n\nResult: all acceptance criteria satisfied. Workflow transition: VERIFY -> DONE.\n\n2026-07-31 iteration 02 generated-analysis isolation\n\n$ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\nFAIL: project/index.html references untracked input nlp2uri.yaml\nCause: generated HTML quoted the committed ticket log containing an earlier\ngit-status line; the detached generator did not consume the untracked file.\n\n$ npm run build && node --test dist/test/generated-analysis.test.js\nbefore implementation: tests=4 pass=3 fail=1\nfailing regression: accepts an untracked filename already quoted by tracked evidence\n\nAfter implementation:\nfocused generated-analysis tests=4 pass=4 fail=0\nnew untracked reference hard negative=PASS\ntracked audit quotation=PASS\n\n$ T2C_SKIP_TOOL_INSTALL=1 T2C_ANALYSIS_SOURCE=tracked ./project.sh\nPASS: {"filesChecked":18,"untrackedInputsChecked":6,"status":"ok"}\n\n$ npm run verify\nPASS: 242 tests, 241 pass, 0 fail, 1 Java skip\n\n$ make docker-smoke\nPASS\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-012/ai-codex-logs.txt", "path": "ticket-012 / ai-codex-logs.txt", "size": "862B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-012 opened\n2026-07-31 attributed auto-beta failure to a schema-incomplete provider response\n2026-07-31 selected deepseek/deepseek-v4-flash from the live OpenRouter model API\n2026-07-31 DeepSeek attempt reached the contradictory 120s client timeout\n2026-07-31 aligned live request timeout with the 300s stage budget\n2026-07-31 selected qwen/qwen3.7-plus for the second explicit-model attempt\n2026-07-31 Qwen passed NL/Markdown but violated documentation and communication schemas twice\n2026-07-31 added one bounded schema-preserving correction to all direct extractors\n2026-07-31 rejected openai/gpt-5.4-mini after two corrected NL runs still violated the schema\n2026-07-31 google/gemini-3.6-flash passed all six live stages in 125486 ms for $0.412363\n2026-07-31 implementation and documentation pushed to main as 11348c0; nlp2uri.yaml excluded\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-011/ai-codex-logs.txt", "path": "ticket-011 / ai-codex-logs.txt", "size": "501B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-011 opened\n2026-07-31 measured 155 ambiguous leaf aliases in todo2code and 2 in subactor-improvement\n2026-07-31 implemented AST-backed NL symbol resolution outside project/\n2026-07-31 focused resolver tests passed; gold v2 extended to 10 exact-target relations\n2026-07-31 full verify passed: 277 tests, 276 pass, 1 JDK skip\n2026-07-31 gold v1/v2 and all five SDK examples passed\n2026-07-31 implementation commit 25df74a pushed to main; nlp2uri.yaml excluded\n2026-07-31 ticket closed\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-022/ai-codex-logs.txt", "path": "ticket-022 / ai-codex-logs.txt", "size": "1.2KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-08-01T14:25:00Z ticket-022 planned on isolated branch ticket-022-umbrella-git\n2026-08-01T14:25:00Z measured Subactor root: not a Git work tree; 41 real nested repository roots observed\n2026-08-01T14:25:00Z state: PLAN / WAIT_FOR_APPROVAL; no source/test edits\n2026-08-01T14:27:00Z user approval: "zatwierdzam ticket 022 i kolejne"; state: IN_PROGRESS / EDIT\n2026-08-01T14:29:00Z focused baseline failed as expected: umbrella records 0; repositoryRoot absent\n2026-08-01T14:31:00Z bounded umbrella discovery, path namespacing and t2c/git@2 implemented\n2026-08-01T14:32:00Z focused Git tests PASS 5/5\n2026-08-01T14:33:00Z npm run verify PASS: 338 tests, 337 passed, 1 optional JDK skip, 0 failed\n2026-08-01T14:33:00Z make docker-smoke PASS\n2026-08-01T14:33:00Z make governance: ticket-022 clean; 4 inherited ticket-018/019 errors remain\n2026-08-01T14:36:00Z comparable Subactor pipeline succeeded: 326 Git records from 39 member repositories\n2026-08-01T14:39:00Z same-snapshot delta: +41792 relations, -275 diagnostics; 268/326 Git records linked\n2026-08-01T14:40:00Z composed ticket-021 planner check: 44 plans, 43 Resolve, 0 unsafe\n2026-08-01T14:41:00Z state: BLOCKED / VALIDATION pending global governance reconciliation and protected review\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-020/ai-codex-logs.txt", "path": "ticket-020 / ai-codex-logs.txt", "size": "3.1KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "Updated project/TICKETS.md ticket index successfully.\nSuccessfully scaffolded project/ticket-020 for 'Role-bound trusted intake with CQRS ES Protobuf MCP and A2A'.\n\n$ ./project/governance-check.sh --actor agent --format text\nGOV-CONFLICT-001 ERROR: Conflicting tickets ticket-018 and ticket-019 are active together. [project/ticket-018/intent.json, project/ticket-019/intent.json]\n remediation: Serialize the tickets or resolve the conflict through an approved integration plan.\nGOV-DEPENDENCY-002 ERROR: Active ticket ticket-019 has unfinished or missing dependency ticket-018. [project/ticket-019/intent.json]\n remediation: Complete the prerequisite or return the dependent ticket to a non-active planning backlog.\nGOV-WORKSTREAM-003 ERROR: Ticket ticket-019 claims concrete paths outside workstream 'sdk'. [Makefile, goal.yaml]\n remediation: Narrow allowedPaths or route the concrete files to their owning workstream/integration ticket and obtain fresh approval.\nGOV-WORKSTREAM-004 ERROR: Active ticket scopes overlap: ticket-018 and ticket-019. [Makefile]\n remediation: Narrow one allowedPaths declaration, serialize the work, or route the shared contract through integration.\nGOV-FAIL: failed (4 errors, 0 warnings)\n\n$ python3 [Draft 2020-12 intent validation and workstream ownership probe]\nticket-020 intent: JSON Schema PASS\nticket-020 workstream paths: PASS\nhuman role files unchanged: PASS\n\n$ git diff --check\nPASS (no output)\n\n$ npm run verify\nPASS\ntests 335; pass 334; fail 0; skipped 1 (JDK unavailable)\nmodule boundaries: 114 modules, 521 internal imports, no cycles\nstructured calls: 7; raw calls: 0\n\n$ make e2e-core\nT2C-E2E-000: PASS suite=core\ntests 335; pass 328; fail 0; skipped 7 optional toolchains\ngold v1/v2: precision 100%; recall 100%; repeated-run stability PASS\nCLI smoke: PASS\nMCP smoke: PASS\nA2A smoke: PASS\nexamples: PASS\n\n$ make governance # before refreshing branch to main/0.8.0\nGOV-TICKET-002 ERROR: More than one active ticket exists.\n paths: project/ticket-018, project/ticket-020\n remediation: policy 0.7.0 requires serialization; ticket-018's approved\n workstream-aware 0.8.0 validator is not committed in this branch and cannot\n be imported without mixing ticket scopes.\nGOV-FAIL: failed (1 error, 0 warnings)\n\n$ git diff --check && git diff --cached --check\nPASS (no output)\n\n$ git merge --ff-only main\nPASS: ticket-020-role-bound-intake refreshed from 9928699 to 1a0799a\npolicy baseline: wellmanifest/new-project 0.8.0\n\n$ make governance # after refreshing branch to main/0.8.0\nGOV-CONFLICT-001: ticket-018/ticket-019\nGOV-DEPENDENCY-002: ticket-019 depends on unfinished ticket-018\nGOV-WORKSTREAM-003: ticket-019 claims Makefile and goal.yaml outside sdk\nGOV-WORKSTREAM-004: ticket-018/ticket-019 overlap on Makefile\nGOV-FAIL: 4 errors, 0 warnings\nticket-018 + ticket-020 parallelism: accepted; no finding names ticket-020\n\n$ npm run verify # after refreshing branch to main/0.8.0\nPASS\ntests 335; pass 334; fail 0; skipped 1 (JDK unavailable)\nmodule boundaries: 114 modules, 521 internal imports, no cycles\n\n$ git diff --check && git diff --cached --check\nPASS (no output)\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-010/ai-codex-logs.txt", "path": "ticket-010 / ai-codex-logs.txt", "size": "417B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket-010 opened\n2026-07-31 mapped AST adapters, Markdown chunking and output boundaries\n2026-07-31 implemented content-addressed fail-open cache outside project/\n2026-07-31 targeted cache and extractor tests passed\n2026-07-31 benchmarked three tracked repository snapshots\n2026-07-31 exact commit passed 261 tests, gold v1/v2 and five SDK examples\n2026-07-31 ticket closed; implementation commit f1d9334\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-015/ai-codex-logs.txt", "path": "ticket-015 / ai-codex-logs.txt", "size": "383B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 PLF-003 title reproduced as "Implement Implement ... and it ..."\n2026-07-31 focused test failed with the exact malformed title\n2026-07-31 lossless source-title fallback implemented under src/synthesis\n2026-07-31 focused suite 18/18 pass; real fixture title preserves implement + verify\n2026-07-31 verify PASS: 300 total, 299 pass, 1 JDK skip; gold v2/v1 and examples PASS\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-003/ai-codex-logs.txt", "path": "ticket-003 / ai-codex-logs.txt", "size": "3.9KB", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 ticket initialization\n\nUser decision: kontynuuj\nPrevious recommendation: audit and classify the residual actionable changelog\nfindings before changing linker policy.\nWorkflow state: TOOLS\n\nBaseline source: project/ticket-002/iteration-01.json\nTarget tracked runtime: 18cc21b\nExternal corpus: unchanged seven detached commits from ticket-002\n\n2026-07-31 current residual baseline\n\nsemcod/code2docs run=20260731T072143Z-a3208b84 records=6717 relations=35468 changelog=269 graph=83dcfa7a5b21ca77\nsemcod/code2llm run=20260731T072152Z-fb1ab530 records=16899 relations=41758 changelog=955 graph=bd57f05a14c3abca\nsemcod/code2logic run=20260731T072209Z-30215e36 records=21423 relations=16933 changelog=120 graph=c6e9f7a0671dc9b4\nsemcod/domd run=20260731T072221Z-f577ffe7 records=10611 relations=7484 changelog=99 graph=a9d2d5eb1287b7cb\nsemcod/pactfix run=20260731T072226Z-0fb2f8b8 records=5161 relations=3917 changelog=48 graph=9c2d15fc76b8585f\nsemcod/redup run=20260731T072230Z-6a2d832d records=7204 relations=19259 changelog=269 graph=b3a582ffa178ee30\nsubactor/platform run=20260731T072237Z-6cab0835 records=10628 relations=11424 changelog=93 graph=ae92ead72d35e88e\nResult: 7/7 succeeded, residual findings=1853.\n\n2026-07-31 deterministic audit\n\nSelection: lexical target-class:action strata, stable ID, round-robin, 24 per\nrepository.\nsampled=168\nnon_actionable_file_update=28 across 5 repositories\nnon_actionable_file_summary=1 across 1 repository\nroadmap_not_release=6 sampled / 30 census across 2 repositories\nsubstantive_or_unverified=133 sampled / 1275 census across 7 repositories\nSelected correction: exact Update <file> bookkeeping only.\nWorkflow transition: TOOLS -> ANALYSIS.\n\n2026-07-31 regression before implementation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=5 fail=1\nfailure: Diagnostics ignore non-actionable changelog mechanics but retain\nrelease claims\nfirst counterexample: Update src/runtime.ts\nResult: expected red regression confirmed before implementation.\n\n2026-07-31 focused validation after implementation\n\n$ npm run build && node --test dist/test/graph.test.js\ntests=6 pass=6 fail=0\n\n$ npm run evaluate:gold\nPASS: all measured precision/recall 100%, forbidden diagnostics 0, stability PASS\n\n2026-07-31 external A/B\n\nsemcod/code2docs graph=same changelog=269->127 unlinked=455->418\nsemcod/code2llm graph=same changelog=955->650 unlinked=1312->1219\nsemcod/code2logic graph=same changelog=120->109 unlinked=1503->1492\nsemcod/domd graph=same changelog=99->99 unlinked=772->772\nsemcod/pactfix graph=same changelog=48->48 unlinked=217->217\nsemcod/redup graph=same changelog=269->184 unlinked=703->661\nsubactor/platform graph=same changelog=93->89 unlinked=766->761\n\nTotal: changelog 1853->1306 (-547), unlinked 5728->5540 (-188),\nall diagnostics 16280->15545 (-735).\nResult: keep iteration; workflow transition ANALYSIS -> VERIFY.\n\n2026-07-31 full validation and close\n\n$ npm run verify\ntests=242 pass=241 fail=0 skip=1\nJava fixture skip reason: local JDK unavailable; required CI uses JDK 17.\nLLM boundary=PASS (9 entrypoints, 31 modules)\nmodule graph=PASS (94 modules, 429 imports, no cycles)\nenvironment contract=PASS (63/63)\nworkflows=PASS\ngenerated analysis=PASS (18 files)\n\n$ npm run examples:check\nResult: PASS, five SDK fingerprints agree.\n\n$ npm audit --omit=dev\nResult: PASS, 0 vulnerabilities.\n\n$ make smoke protocol-smoke\nResult: PASS, CLI, MCP and A2A.\n\n$ make docker-smoke\nResult: PASS.\n\nReadiness updated with residual census:\nsubstantive_or_unverified=1275\nroadmap_not_release=30\nnon_actionable_file_summary=1\ntotal retained=1306\n\nResult: all acceptance criteria satisfied; workflow transition VERIFY -> DONE.\n\n2026-07-31 repository layout correction\n\nUser review identified executable code under project/ticket-003.\nMoved:\nproject/ticket-003/sample-changelog.mjs\n-> scripts/research/audit-changelog-sample.mjs\n\nTicket inputs, captured results, decisions and raw logs remain under the\nticket. No experiment code remains there.\n", "is_subdir": true}, {"name": "ai-codex-logs.txt", "rel_path": "ticket-016/ai-codex-logs.txt", "path": "ticket-016 / ai-codex-logs.txt", "size": "453B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-31 PHP 8.4 available; ext-ast unavailable; selected TOKEN_PARSE boundary\n2026-07-31 focused PHP + existing AST suite 5/5 PASS\n2026-07-31 redsl A/B: 40 tracked PHP files, 2127 unique records, +80 relations\n2026-07-31 redsl diagnostics warnings 730 -> 712; plans stayed 1; extraction warnings 0\n2026-07-31 verify PASS: 304 total, 303 pass, 1 JDK skip; 104 modules, 75 env keys\n2026-07-31 gold v2/v1 100%; examples PASS, SDK fingerprints unchanged\n", "is_subdir": true}, {"name": "logs.txt", "rel_path": "ticket-001/logs.txt", "path": "ticket-001 / logs.txt", "size": "598B", "icon": "πŸ“„", "type": "text", "type_name": "Text", "content": "2026-07-29 bootstrap initialized; no test or runtime output produced.\n\n2026-07-29 validation outputs:\nGitHub repository lookup: 404 Not Found\nGitHub CLI auth: token invalid\nDocker CLI: Docker version 29.6.1, build 8900f1d\nDocker engine: permission denied while connecting to Docker Desktop Linux engine\ndocker compose config --quiet: exit code 0\nGit: initialized empty repository on main; no commits yet.\n\n2026-07-29 GitHub publication:\nGitHub authentication: verified for account MatthiasLew with repo and read:org scopes.\nRemote repository: https://github.com/semcod/todo2code\nVisibility: PUBLIC\n", "is_subdir": true}]; let currentFile = null; function renderFileList(filter = '') { diff --git a/project/map.toon.yaml b/project/map.toon.yaml index 6b93b73..07bca57 100644 --- a/project/map.toon.yaml +++ b/project/map.toon.yaml @@ -1,80 +1,41 @@ -# todo2code | 262f 45160L | json:32,yml:2,md:52,typescript:117,python:15,toml:2,rust:7,php:4,go:6,javascript:15,shell:6,txt:1,java:1 | 2026-08-01 -# generated in 0.03s +# todo2code | 281f 43441L | yaml:2,yml:2,json:40,shell:8,toml:3,rust:7,typescript:173,python:16,javascript:15,java:1,proto:1,go:6,php:4,txt:1 | 2026-08-04 +# generated in 0.04s # producer: code2llm | artifact: map.toon.yaml | schema: 1 -# stats: 3285 func | 0 cls | 262 mod | CCΜ„=4.0 | critical:120 | cycles:0 -# alerts[5]: CC main=95; CC assertOperationPlan=84; CC executeAction=83; CC root=83; CC extractCommunicationIntent=76 -# hotspots[5]: executeAction fan=65; root fan=64; runPipeline fan=54; main fan=44; extractTypeScriptFile fan=44 -# evolution: baseline +# stats: 4129 func | 0 cls | 281 mod | CCΜ„=3.1 | critical:24 | cycles:0 +# alerts[5]: fan-out compareWorkspaceIntent=40; CC parseFile=38; fan-out Client.parse_http_response=37; fan-out run=33; fan-out executePipeline=31 +# hotspots[5]: compareWorkspaceIntent fan=40; Client.parse_http_response fan=37; run fan=33; main fan=31; executePipeline fan=31 +# evolution: CCΜ„ 3.0β†’3.1 (regressed +0.1) # Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods -M[262]: - CHANGELOG.md,670 - CONTRIBUTION.md,37 +M[281]: Dockerfile,45 - Makefile,129 - README.md,871 - TASK.md,10 - TODO.md,391 - adapters/tensorflow/package.json,10 + Makefile,132 + adapters/tensorflow/package.json,14 compose.e2e.yml,27 docker-compose.yml,18 - docs/ARCHITECTURE.md,200 - docs/CLI_GUIDE.md,328 - docs/CODE_CHANGE_PLANS.md,173 - docs/DEMOLLM.md,175 - docs/DSL.md,457 - docs/E2E.md,52 - docs/GROK-PLAN.md,269 - docs/OPTIMIZATION.md,249 - docs/PIPELINE_DSL_NL.md,464 - docs/PROTOCOLS.md,124 - docs/READINESS.md,442 - docs/REQUIREMENTS.md,39 - docs/SECURITY.md,50 - docs/SUBACTOR_OPERATION_DSL.md,33 - docs/SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md,872 - docs/TEAM_COMMUNICATION.md,268 - docs/TEST_REPORT.md,587 - docs/VALIDATION.md,198 - docs/intent-guard-diagrams/ALL_DIAGRAMS.md,410 - docs/intent-guard-diagrams/README.md,22 - docs/reference/original-monitoring-design.md,872 - evaluation/gold/README.md,87 evaluation/gold/v1/dataset.json,761 evaluation/gold/v2/dataset.json,2410 - examples/CHANGELOG.md,11 - examples/TODO.md,7 - examples/backend/CHANGELOG.md,11 - examples/backend/README.md,46 - examples/backend/TODO.md,8 - examples/backend/src/server.ts,99 + examples/backend/src/request-handlers.ts,88 + examples/backend/src/server.ts,43 examples/backend/src/store.ts,48 examples/backend/src/validation.ts,31 - examples/backend/task.md,18 examples/backend/tsconfig.json,14 - examples/docs/ARCHITECTURE.md,9 - examples/frontend/CHANGELOG.md,11 - examples/frontend/README.md,35 - examples/frontend/TODO.md,7 examples/frontend/src/api.ts,50 examples/frontend/src/app.ts,43 examples/frontend/src/render.ts,64 - examples/frontend/task.md,17 examples/frontend/tsconfig.json,15 + examples/project/participants.json,37 examples/sdk/python.py,23 examples/sdk/typescript.mjs,16 examples/src/helper.py,9 examples/src/runtime.ts,13 - examples/task.md,9 + goal.yaml,530 golang/ast_extract.go,368 java/JavaAstExtract.java,260 - package.json,48 + nlp2uri.yaml,8 + package.json,52 php/ast_extract.php,233 - prompts/communication-to-intent.system.md,7 - prompts/docs-to-intent.system.md,23 - prompts/markdown-to-intent.system.md,5 - prompts/nl-to-intent.system.md,15 - prompts/summarize.system.md,51 - prompts/tasks-from-dsl.system.md,52 + project.sh,124 + project2.sh,79 python/ast_extract.py,221 python/requirements.txt,1 rust-ast/Cargo.toml,12 @@ -110,9 +71,8 @@ M[262]: scripts/live-contract-check.mjs,200 scripts/live-model-comparison.mjs,125 scripts/mcp-request.sh,11 - scripts/normalize-generated-analysis-roots.mjs,34 + scripts/normalize-generated-analysis-roots.mjs,38 scripts/package.py,25 - scripts/research/README.md,27 scripts/research/audit-changelog-sample.mjs,226 scripts/research/evaluate-embedding-pairs.py,101 scripts/research/rank-intent-graph-embeddings.py,174 @@ -127,70 +87,83 @@ M[262]: scripts/verify-structured-responses.mjs,35 scripts/verify-workflow-yaml.mjs,43 sdk/__init__.py,1 - sdk/README.md,107 - sdk/go/README.md,20 sdk/go/actions.go,136 sdk/go/client.go,197 sdk/go/examples/basic/main.go,163 sdk/go/todo2code.go,30 sdk/go/types.go,215 - sdk/php/README.md,21 sdk/php/composer.json,18 sdk/php/examples/basic.php,112 sdk/php/src/Client.php,401 sdk/php/src/Error.php,25 sdk/python/__init__.py,13 - sdk/python/README.md,68 sdk/python/examples/basic.py,95 sdk/python/examples/local_runtime.py,36 + sdk/python/pyproject.toml,17 sdk/python/todo2code/__init__.py,33 sdk/python/todo2code/client.py,469 sdk/python/todo2code/runtime.py,225 sdk/python/todo2code_sdk.py,171 sdk/rust/Cargo.toml,17 - sdk/rust/README.md,24 sdk/rust/examples/basic.rs,108 sdk/rust/src/lib.rs,49 sdk/rust/src/actions.rs,100 sdk/rust/src/client.rs,221 sdk/rust/src/error.rs,37 sdk/rust/src/types.rs,140 - sdk/typescript/README.md,23 sdk/typescript/examples/basic.ts,84 - sdk/typescript/package.json,28 + sdk/typescript/package.json,32 sdk/typescript/src/index.ts,420 sdk/typescript/tsconfig.json,20 src/index.ts,53 - src/cli.ts,827 - src/communication/analyzer.ts,542 - src/communication/identity.ts,100 - src/communication/llm.ts,514 - src/comparison/workspace.ts,327 - src/config/env.ts,227 + src/cli.ts,942 + src/communication/analyzer.ts,596 + src/communication/identity.ts,216 + src/communication/intake-contract.ts,334 + src/communication/intake-protobuf.ts,158 + src/communication/intake-service.ts,291 + src/communication/intake-store.ts,161 + src/communication/llm.ts,1 + src/communication/llm/implementation.ts,208 + src/communication/llm/implementation-helpers.ts,357 + src/comparison/workspace.ts,342 + src/config/env.ts,231 src/core/content-cache.ts,139 src/core/grounding.ts,24 src/core/id.ts,167 src/core/ignore.ts,200 - src/core/io.ts,177 - src/core/record.ts,172 - src/core/schema.ts,922 + src/core/io.ts,211 + src/core/record.ts,158 + src/core/record-metadata.ts,27 + src/core/schema/index.ts,4 + src/core/schema/code-change.ts,322 + src/core/schema/conclusions.ts,210 + src/core/schema/constants.ts,31 + src/core/schema/intent.ts,309 + src/core/schema/utils.ts,239 src/core/security.ts,55 src/core/target.ts,57 - src/core/text.ts,491 - src/core/types.ts,673 + src/core/text.ts,530 + src/core/types/index.ts,4 + src/core/types/code-change.ts,250 + src/core/types/diagnostics.ts,45 + src/core/types/intent.ts,212 + src/core/types/pipeline.ts,173 src/core/version.ts,2 - src/diff/git.ts,161 - src/diff/reality.ts,609 + src/diff/git.ts,208 + src/diff/git-binary.ts,10 + src/diff/reality.ts,690 src/diff/svg.ts,104 - src/diff/text.ts,239 + src/diff/text.ts,153 + src/diff/text-myers.ts,152 src/diff/text-render.ts,251 src/diff/text-types.ts,39 src/evaluation/gold.ts,329 - src/evaluation/gold-cases.ts,366 + src/evaluation/gold-cases.ts,489 src/evaluation/gold-cli.ts,44 src/evaluation/gold-extraction.ts,127 src/evaluation/gold-metrics.ts,50 - src/evaluation/gold-types.ts,378 + src/evaluation/gold-types.ts,405 src/extractors/ast.ts,167 src/extractors/ast/external.ts,48 src/extractors/ast/go.ts,20 @@ -200,235 +173,167 @@ M[262]: src/extractors/ast/records.ts,97 src/extractors/ast/rust.ts,20 src/extractors/ast/types.ts,20 - src/extractors/ast/typescript.ts,166 + src/extractors/ast/typescript.ts,266 src/extractors/ast/unsupported.ts,30 src/extractors/changelog.ts,99 - src/extractors/communication.ts,422 + src/extractors/communication.ts,63 + src/extractors/communication-file-helpers.ts,342 + src/extractors/communication-helpers.ts,320 src/extractors/configuration.ts,208 src/extractors/docs-chunks.ts,147 - src/extractors/docs-deterministic.ts,304 + src/extractors/docs-deterministic.ts,369 src/extractors/docs-llm.ts,269 src/extractors/docs-record.ts,193 src/extractors/docs-schema.ts,43 src/extractors/docs-types.ts,68 - src/extractors/git.ts,180 + src/extractors/git.ts,397 src/extractors/markdown.ts,35 src/extractors/markdown-block.ts,67 - src/extractors/markdown-llm.ts,458 - src/extractors/markdown-paths.ts,122 + src/extractors/markdown-llm.ts,178 + src/extractors/markdown-llm-helpers.ts,383 + src/extractors/markdown-paths.ts,158 src/extractors/nl.ts,107 - src/extractors/nl-llm.ts,316 + src/extractors/nl-llm.ts,163 + src/extractors/nl-llm-helpers.ts,261 + src/extractors/runtime-cycle.ts,306 src/extractors/todo.ts,93 src/graph/capability-evidence.ts,62 src/graph/changelog-signal.ts,89 - src/graph/diagnostics.ts,361 + src/graph/diagnostics.ts,459 src/graph/diff.ts,235 - src/graph/linker.ts,489 - src/graph/symbol-resolution.ts,120 - src/interfaces/a2a.ts,320 - src/interfaces/a2a-card.ts,169 - src/interfaces/a2a-history.ts,226 - src/interfaces/a2a-message.ts,184 - src/interfaces/a2a-task-store.ts,513 - src/interfaces/a2a-types.ts,160 + src/graph/linker.ts,286 + src/graph/linker-candidates.ts,163 + src/graph/linker-relations.ts,83 + src/graph/symbol-resolution.ts,146 + src/interfaces/a2a.ts,332 + src/interfaces/a2a-card.ts,181 + src/interfaces/a2a-history.ts,96 + src/interfaces/a2a-message.ts,125 + src/interfaces/a2a-message-command.ts,144 + src/interfaces/a2a-run-list-item.ts,171 + src/interfaces/a2a-task-store.ts,560 + src/interfaces/a2a-types.ts,164 + src/interfaces/governed-intake.proto,78 + src/interfaces/intake-actions.ts,38 + src/interfaces/intake-schemas/command-v1.schema.json,17 + src/interfaces/intake-schemas/diagnostic-v1.schema.json,11 + src/interfaces/intake-schemas/envelope-v1.schema.json,20 + src/interfaces/intake-schemas/event-v1.schema.json,20 + src/interfaces/intake-schemas/participant-registry-v2.schema.json,36 + src/interfaces/intake-schemas/query-v1.schema.json,11 + src/interfaces/intake-schemas/result-v1.schema.json,9 + src/interfaces/intake_cli.py,156 src/interfaces/mcp.ts,261 src/interfaces/mcp-errors.ts,10 src/interfaces/mcp-resources.ts,88 - src/interfaces/mcp-tools.ts,307 + src/interfaces/mcp-tools.ts,323 src/live/contract-check.ts,317 src/live/model-comparison.ts,218 src/llm/audit.ts,19 src/llm/failure.ts,25 - src/llm/openrouter.ts,338 + src/llm/openrouter.ts,240 + src/llm/openrouter-request.ts,242 src/llm/structured-schema.ts,218 src/operations/artifact.ts,66 src/operations/compile-cli.ts,34 src/operations/contract.ts,84 src/operations/subactor.ts,122 src/operations/types.ts,155 - src/operations/validation.ts,281 - src/pipeline/run.ts,602 + src/operations/validation.ts,429 + src/pipeline/run.ts,384 + src/pipeline/run-helpers.ts,188 + src/pipeline/run-persistence.ts,297 + src/pipeline/run-summary.ts,58 src/sdk/typescript.ts,172 - src/semantic/reranker.ts,509 - src/semantic/reranker-llm.ts,210 + src/semantic/reranker/index.ts,8 + src/semantic/reranker-llm.ts,291 src/semantic/reranker-response.ts,42 - src/services/actions.ts,700 + src/semantic/reranker/candidate.ts,250 + src/semantic/reranker/result.ts,311 + src/semantic/reranker/types.ts,106 + src/semantic/reranker/validation.ts,111 + src/services/actions.ts,806 src/summary/payload.ts,65 src/summary/render.ts,61 src/summary/summarizer.ts,333 - src/synthesis/code-change-path.ts,204 - src/synthesis/code-change-plan.ts,1310 + src/synthesis/code-change-path.ts,232 + src/synthesis/code-change-plan/index.ts,1 + src/synthesis/code-change-plan/implementation.ts,1 + src/synthesis/code-change-plan/implementation-diagnostics.ts,17 + src/synthesis/code-change-plan/implementation-helpers.ts,39 + src/synthesis/code-change-plan/implementation-helpers-acceptance.ts,141 + src/synthesis/code-change-plan/implementation-helpers-close.ts,75 + src/synthesis/code-change-plan/implementation-helpers-plans.ts,269 + src/synthesis/code-change-plan/implementation-helpers-shared.ts,29 + src/synthesis/code-change-plan/implementation-indexing.ts,25 + src/synthesis/code-change-plan/implementation-review.ts,274 + src/synthesis/code-change-plan/implementation-semantic.ts,125 + src/synthesis/code-change-plan/implementation-source-patch.ts,9 + src/synthesis/code-change-plan/implementation-source-patch-apply.ts,8 + src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts,434 + src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts,233 + src/synthesis/code-change-plan/implementation-source-patch-assert.ts,397 + src/synthesis/code-change-plan/implementation-source-patch-create.ts,235 + src/synthesis/code-change-plan/implementation-source-patch-diff.ts,74 + src/synthesis/code-change-plan/implementation-targets.ts,61 src/synthesis/task-synthesis-contract.ts,66 src/synthesis/task-synthesis-materialize.ts,172 src/synthesis/task-synthesis-payload.ts,70 src/synthesis/tasks-llm.ts,266 src/synthesis/todo-patch.ts,372 src/synthesis/validation.ts,113 - src/tf/classifier.ts,96 + src/tf/classifier.ts,135 src/version.ts,2 - src/watch/watcher.ts,243 - src/web/diff-ui.ts,48 + src/watch/watcher.ts,292 + src/web/diff-ui.ts,152 + src/web/diff-ui-script.ts,17 tsconfig.json,23 D: - src/cli.ts: - i: ./communication/analyzer.js,./communication/llm.js,./comparison/workspace.js,./config/env.js,./core/io.js,./core/types.js,./diff/git.js,./diff/reality.js,./extractors/ast.js,./extractors/configuration.js,./extractors/docs-llm.js,./extractors/git.js,./extractors/markdown-llm.js,./extractors/nl-llm.js,./graph/diagnostics.js,./graph/diff.js,./graph/linker.js,./interfaces/a2a.js,./interfaces/mcp.js,./pipeline/run.js,./services/actions.js,./summary/summarizer.js,./version.js,./watch/watcher.js,node:child_process,node:fs,node:path,node:url,node:util - e: ParsedArgs,execFileAsync,main,parsed,command,config,files,records,graph,graphFile,graph,graphFile,graph,diagnosticsPath,diagnostics,result,out,graphPath,diagnosticsPath,output,result,synthesisPath,graphPath,diagnosticsPath,patch,audit,result,patch,audit,receipt,actor,approvalHash,result,graphPath,diagnosticsPath,output,result,plansPath,patch,audit,result,inputPath,output,isPlanSet,result,patchPath,actor,approvalHash,receipt,result,planPath,beforeGraphPath,afterGraphPath,output,result,inputPath,beforeGraphPath,afterGraphPath,output,result,root,result,root,result,handleWatch,root,taskFile,controller,stop,formatWatchEvent,stamp,handleDiff,mode,out,svg,html,beforeFile,afterFile,diff,context,maxRows,beforeFile,afterFile,root,result,handleReality,graphFile,graph,diagnosticsPath,diagnostics,view,out,svg,markdown,handleExtract,extractor,root,out,file,inline,result,result,result,result,result,result,result,handleCommunication,root,graph,analysis,out,markdown,graphOut,emitExtraction,emitJson,initProject,moduleRoot,sourceEnv,targetEnv,task,sourceIgnore,targetIgnore,doctor,result,parseArgs,options,value,next,name,next,optionString,value,optionNullableString,value,optionBoolean,value,optionNumber,value,number,optionList,value,optionNlMode,optionLlmMode,value,optionTaskMode,value,optionSummaryMode,optionPipelineTaskMode,value,reportPipelineDegradation,printHelp,invokedPath - ParsedArgs: - execFileAsync() - main() - parsed() - command() - config() - files() - records() - graph() - graphFile() - graph() - graphFile() - graph() - diagnosticsPath() - diagnostics() - result() - out() - graphPath() - diagnosticsPath() - output() - result() - synthesisPath() - graphPath() - diagnosticsPath() - patch() - audit() - result() - patch() - audit() - receipt() - actor() - approvalHash() - result() - graphPath() - diagnosticsPath() - output() - result() - plansPath() - patch() - audit() - result() - inputPath() - output() - isPlanSet() - result() - patchPath() - actor() - approvalHash() - receipt() - result() - planPath() - beforeGraphPath() - afterGraphPath() - output() - result() - inputPath() - beforeGraphPath() - afterGraphPath() - output() - result() - root() - result() - root() - result() - handleWatch() - root() - taskFile() - controller() - stop() - formatWatchEvent() - stamp() - handleDiff() - mode() - out() - svg() - html() - beforeFile() - afterFile() - diff() - context() - maxRows() - beforeFile() - afterFile() - root() - result() - handleReality() - graphFile() - graph() - diagnosticsPath() - diagnostics() - view() - out() - svg() - markdown() - handleExtract() - extractor() - root() - out() - file() - inline() - result() - result() - result() - result() - result() - result() - result() - handleCommunication() + php/ast_extract.php: + e: argumentValue,normalizedToken,significant,qualifiedName,sourceExcerpt,addFact,parseFile + argumentValue() + normalizedToken() + significant() + qualifiedName() + sourceExcerpt() + addFact() + parseFile() + scripts/verify-env-contract.mjs: + i: node:fs,node:path + e: root,examplePath,example,declared,match,expected,configBody,body,makefile,body,local,auditLocalKeys,body,keys,collectExisting,absolute,collect,absolute root() - graph() - analysis() - out() - markdown() - graphOut() - emitExtraction() - emitJson() - initProject() - moduleRoot() - sourceEnv() - targetEnv() - task() - sourceIgnore() - targetIgnore() - doctor() - result() - parseArgs() - options() - value() - next() - name() - next() - optionString() - value() - optionNullableString() - value() - optionBoolean() - value() - optionNumber() - value() - number() - optionList() - value() - optionNlMode() - optionLlmMode() - value() - optionTaskMode() - value() - optionSummaryMode() - optionPipelineTaskMode() - value() - reportPipelineDegradation() - printHelp() - invokedPath() + examplePath() + example() + declared() + match() + expected() + configBody() + body() + makefile() + body() + local() + auditLocalKeys() + body() + keys() + collectExisting() + absolute() + collect() + absolute() + scripts/research/rank-intent-graph-embeddings.py: + e: parse_args,projection_text,main + parse_args() + projection_text(record;prefix) + main() + sdk/go/examples/basic/main.go: + e: main,run,envOr,truncate,joinedIDs + main() + run() + envOr() + truncate() + joinedIDs() src/operations/validation.ts: i: ../core/id.js,../core/types.js,./types.js - e: VALUE_TYPES,CLASSIFICATIONS,SOURCE_KINDS,RISK_CLASSES,objectValue,exactKeys,actual,nonBlank,dateString,uniqueStrings,assertPrincipalList,principals,isJsonValue,assertVariableContract,contract,source,access,readers,writers,assertGeneration,generation,assertAcyclic,ids,visiting,visited,byId,visit,assertOperationPlan,plan,evidence,variables,variableById,steps,stepIds,founderDecisionRequired,step,parameters,reference,variable,rollback,coveredSteps,expectationIds,expectation,verifiedBy,decision,verification,expectedHash + e: VALUE_TYPES,CLASSIFICATIONS,SOURCE_KINDS,RISK_CLASSES,objectValue,exactKeys,actual,nonBlank,dateString,uniqueStrings,assertPrincipalList,principals,isJsonValue,assertVariableContract,contract,source,access,readers,writers,expectedId,assertVariableContractShape,assertVariableContractCore,assertVariableSource,source,assertVariableAccess,access,assertVariableAuthoritativeness,assertVariableMutability,buildVariableContractId,assertGeneration,generation,assertAcyclic,ids,visiting,visited,byId,visit,assertOperationPlan,plan,variables,variableById,validateOperationPlanShape,validateOperationPlanMetadata,validateOperationPlanEvidence,evidence,collectOperationPlanVariables,variables,validateOperationSteps,stepIds,steps,hasCommandStep,founderDecisionRequired,step,validateOperationStep,step,parameters,rollback,validateOperationStepParameters,parameters,reference,variable,validateOperationStepRollback,rollback,validateOperationExpectations,coveredSteps,expectationIds,expectation,verifiedBy,validateOperationDecision,decision,validateOperationVerification,verification,validateOperationPlanHash,castPlan,expectedHash VALUE_TYPES() CLASSIFICATIONS() SOURCE_KINDS() @@ -448,6 +353,16 @@ D: access() readers() writers() + expectedId() + assertVariableContractShape() + assertVariableContractCore() + assertVariableSource() + source() + assertVariableAccess() + access() + assertVariableAuthoritativeness() + assertVariableMutability() + buildVariableContractId() assertGeneration() generation() assertAcyclic() @@ -458,299 +373,127 @@ D: visit() assertOperationPlan() plan() - evidence() variables() variableById() - steps() + validateOperationPlanShape() + validateOperationPlanMetadata() + validateOperationPlanEvidence() + evidence() + collectOperationPlanVariables() + variables() + validateOperationSteps() stepIds() + steps() + hasCommandStep() founderDecisionRequired() step() + validateOperationStep() + step() + parameters() + rollback() + validateOperationStepParameters() parameters() reference() variable() + validateOperationStepRollback() rollback() + validateOperationExpectations() coveredSteps() expectationIds() expectation() verifiedBy() + validateOperationDecision() decision() + validateOperationVerification() verification() + validateOperationPlanHash() + castPlan() expectedHash() - src/services/actions.ts: - i: ../communication/analyzer.js,../communication/llm.js,../comparison/workspace.js,../config/env.js,../core/io.js,../core/security.js,../core/types.js,../core/types.js,../diff/git.js,../diff/reality.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../graph/diagnostics.js,../graph/diff.js,../graph/linker.js,../pipeline/run.js,../summary/summarizer.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,node:path - e: executeAction,root,file,text,analysis,records,graph,graph,diagnostics,graph,diagnostics,result,output,graph,diagnostics,synthesis,todoPath,patchPath,auditPath,todoContent,rendered,todoPath,patchPath,auditPath,receiptPath,result,graph,diagnostics,conclusions,proposals,result,output,planSet,review,patchPath,auditPath,plan,unifiedDiffs,patch,output,planSet,result,output,patch,receiptPath,result,plan,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,result,output,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,value,planSet,result,output,beforeInput,afterInput,before,after,diff,svg,beforePath,afterPath,diff,result,graph,diagnostics,view,filterCommunicationGraph,participant,role,ticket,communicationOnly,records,isCommunication,nlModeValue,llmModeValue,taskSynthesisMode,summaryModeValue,pipelineTaskMode,withTextDiffViews,title,readGraphInput,safePath,readActionObject,safePath,resolveRoot,requested,scopedPath,selected,nullableScopedPath,selected,readRecords,files,safeFile,stringValue,nullableString,stringList,numberValue,number,hasInputValue,objectMapOfStrings,booleanValue,objectValue,registerRunArtifacts,manifestPath,manifest - executeAction() - root() - file() + src/interfaces/a2a-message-command.ts: + i: ../communication/intake-protobuf.js + e: parseCommand,protobufCommand,objectCommand,parseCommandFromProtobuf,protobuf,bytes,parseCommandFromObject,objectData,parseCommandFromText,text,looksLikeJson,parseCommandFromJson,parseCommandFromSentence,parseSentenceInput,defaultTextCommand,isSupportedAction,commandInputFromSentence,first,parseText,firstToken,commandFromData,action,nested,parseKeyValues,key,raw,stringValue,parseScalar,normalizeAction,normalized,action + parseCommand() + protobufCommand() + objectCommand() + parseCommandFromProtobuf() + protobuf() + bytes() + parseCommandFromObject() + objectData() + parseCommandFromText() text() - analysis() - records() - graph() - graph() - diagnostics() - graph() - diagnostics() - result() - output() - graph() - diagnostics() - synthesis() - todoPath() - patchPath() - auditPath() - todoContent() - rendered() - todoPath() - patchPath() - auditPath() - receiptPath() - result() - graph() - diagnostics() - conclusions() - proposals() - result() - output() - planSet() - review() - patchPath() - auditPath() - plan() - unifiedDiffs() - patch() - output() - planSet() - result() - output() - patch() - receiptPath() - result() - plan() - beforeGraph() - beforeDiagnostics() - afterGraph() - afterDiagnostics() - result() - output() - beforeGraph() - beforeDiagnostics() - afterGraph() - afterDiagnostics() - value() - planSet() - result() - output() - beforeInput() - afterInput() - before() - after() - diff() - svg() - beforePath() - afterPath() - diff() - result() - graph() - diagnostics() - view() - filterCommunicationGraph() - participant() - role() - ticket() - communicationOnly() - records() - isCommunication() - nlModeValue() - llmModeValue() - taskSynthesisMode() - summaryModeValue() - pipelineTaskMode() - withTextDiffViews() - title() - readGraphInput() - safePath() - readActionObject() - safePath() - resolveRoot() - requested() - scopedPath() - selected() - nullableScopedPath() - selected() - readRecords() - files() - safeFile() - stringValue() - nullableString() - stringList() - numberValue() - number() - hasInputValue() - objectMapOfStrings() - booleanValue() - objectValue() - registerRunArtifacts() - manifestPath() - manifest() - src/extractors/communication.ts: - i: ../communication/identity.js,../config/env.js,../core/io.js,../core/record.js,../core/security.js,../core/types.js,../tf/classifier.js,node:path - e: CommunicationExtractionOptions,CommunicationEnvelope,InferredCommunicationIdentity,CommunicationSegment,extractCommunicationIntent,root,projectRoot,files,identityRegistry,communicationFiles,relativeToProject,parts,pathTicket,envelope,inferred,explicitEnvelope,declaredParticipant,declaredRole,declaredParticipantId,identity,participant,role,displayName,explicitMessageType,messageType,ticket,recipient,timestamp,declaredGitAuthors,gitAuthors,declaredA2aAgentId,explicitPaths,explicitSymbols,segments,segmentType,semantics,classified,action,line,resolveIdentity,sameStrings,normalize,parseEnvelope,lines,end,match,inferIdentity,parts,basename,governance,fileParts,nestedRoleIndex,nestedRole,nestedParticipant,isTicketEvidenceFile,basename,communicationSegments,lines,flush,item,raw,heading,cleaned,isCommunicationNoise,normalized,governanceSectionType,normalized,looksLikeTicket,normalizeRole,normalizeType,normalized,isCommunicationType,semanticsFor,first,listValue,stripped,unquote,validTimestamp,parsed - CommunicationExtractionOptions: - CommunicationEnvelope: - InferredCommunicationIdentity: - CommunicationSegment: - extractCommunicationIntent() - root() - projectRoot() - files() - identityRegistry() - communicationFiles() - relativeToProject() - parts() - pathTicket() - envelope() - inferred() - explicitEnvelope() - declaredParticipant() - declaredRole() - declaredParticipantId() - identity() - participant() - role() - displayName() - explicitMessageType() - messageType() - ticket() - recipient() - timestamp() - declaredGitAuthors() - gitAuthors() - declaredA2aAgentId() - explicitPaths() - explicitSymbols() - segments() - segmentType() - semantics() - classified() - action() - line() - resolveIdentity() - sameStrings() - normalize() - parseEnvelope() - lines() - end() - match() - inferIdentity() - parts() - basename() - governance() - fileParts() - nestedRoleIndex() - nestedRole() - nestedParticipant() - isTicketEvidenceFile() - basename() - communicationSegments() - lines() - flush() - item() - raw() - heading() - cleaned() - isCommunicationNoise() - normalized() - governanceSectionType() - normalized() - looksLikeTicket() - normalizeRole() - normalizeType() - normalized() - isCommunicationType() - semanticsFor() - first() - listValue() - stripped() - unquote() - validTimestamp() - parsed() - src/interfaces/a2a-message.ts: - i: ../services/actions.js - e: parseSendConfiguration,validateOutputModes,supported,parseCommand,objectData,text,first,commandFromData,action,nested,parseKeyValues,key,raw,stringValue,parseScalar,parseMessage,messageId,contextId,taskId,referenceTaskIds,extensions,metadata,parsePart,output,parsePartContent,content,qualifier,ensureSupportedMessageContent,supported,normalizeAction,normalized,action,cloneMessage,clonePart,normalizeUserMessage - parseSendConfiguration() - validateOutputModes() - supported() - parseCommand() - objectData() - text() - first() - commandFromData() - action() - nested() - parseKeyValues() - key() - raw() - stringValue() - parseScalar() - parseMessage() - messageId() - contextId() - taskId() - referenceTaskIds() - extensions() - metadata() - parsePart() - output() - parsePartContent() - content() - qualifier() - ensureSupportedMessageContent() - supported() - normalizeAction() - normalized() - action() - cloneMessage() - clonePart() - normalizeUserMessage() - src/pipeline/run.ts: - i: ../communication/analyzer.js,../communication/llm.js,../config/env.js,../config/env.js,../core/id.js,../core/io.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-deterministic.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../graph/diagnostics.js,../graph/linker.js,../llm/audit.js,../summary/summarizer.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,../version.js,node:path - e: PipelineResult,runPipeline,root,runId,baseOutput,runDirectory,naturalLanguageAudit,result,git,ast,markdown,deterministicDocumentFiles,documentationStartedAt,deterministicDocs,docs,configurationExtraction,includeCommunication,communicationStartedAt,communicationAudit,communicationInputPresent,communication,missingDirectory,allRecords,generatedAt,graph,communicationAnalysis,diagnostics,taskSynthesisMode,taskSynthesisAudit,todoContent,codeChangePlans,codeChangeReview,codeChangeSourcePatches,summaryStartedAt,includeSummaryLlm,summary,filePath,graphPath,diagnosticsPath,summaryPath,summaryConclusionsPath,taskSynthesisPath,todoValidationPath,todoPatchPath,todoPatchAuditPath,codeChangePlansPath,codeChangeReviewPath,codeChangeReviewAuditPath,codeChangeSourcePatchesPath,communicationAnalysisPath,communicationMarkdownPath,configuration,manifestConfiguration,collectTargetHints,values,persistFailedRun,aborted,message,knownAudit,failedAudit,stageValue,reason,failureCode,skippedAudit,appendLlmNotConfigured - PipelineResult: - runPipeline() - root() - runId() - baseOutput() - runDirectory() - naturalLanguageAudit() + looksLikeJson() + parseCommandFromJson() + parseCommandFromSentence() + parseSentenceInput() + defaultTextCommand() + isSupportedAction() + commandInputFromSentence() + first() + parseText() + firstToken() + commandFromData() + action() + nested() + parseKeyValues() + key() + raw() + stringValue() + parseScalar() + normalizeAction() + normalized() + action() + sdk/rust/examples/basic.rs: + i: serde_json::json,std::env,todo2code::Client + e: main,run,joined_ids + main() + run() + joined_ids() + src/pipeline/run.ts: + i: ../communication/analyzer.js,../config/env.js,../config/env.js,../core/id.js,../core/io.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-deterministic.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../extractors/runtime-cycle.js,../graph/diagnostics.js,../graph/linker.js,../llm/audit.js,../summary/summarizer.js,../version.js,./run-summary.js,node:path + e: PipelineContext,PipelineExecutionOutput,PipelinePersistedPaths,PipelineResult,runPipeline,context,execution,persisted,manifest,manifestPath,initializePipelineContext,root,runId,baseOutput,runDirectory,executePipeline,deterministicDocumentFiles,naturalLanguageAudit,result,git,ast,markdown,markdownAudit,documentationStartedAt,deterministicDocs,docs,configurationExtraction,runtime,communicationInput,communicationAudit,communicationSyntheses,allRecords,generatedAt,graph,diagnostics,communicationAnalysis,taskSynthesis + PipelineContext: + PipelineExecutionOutput: + PipelinePersistedPaths: + PipelineResult: + runPipeline() + context() + execution() + persisted() + manifest() + manifestPath() + initializePipelineContext() + root() + runId() + baseOutput() + runDirectory() + executePipeline() + deterministicDocumentFiles() + naturalLanguageAudit() result() git() ast() markdown() - deterministicDocumentFiles() + markdownAudit() documentationStartedAt() deterministicDocs() docs() configurationExtraction() - includeCommunication() - communicationStartedAt() + runtime() + communicationInput() communicationAudit() - communicationInputPresent() - communication() - missingDirectory() + communicationSyntheses() allRecords() generatedAt() graph() - communicationAnalysis() diagnostics() - taskSynthesisMode() - taskSynthesisAudit() - todoContent() - codeChangePlans() - codeChangeReview() - codeChangeSourcePatches() - summaryStartedAt() - includeSummaryLlm() - summary() + communicationAnalysis() + taskSynthesis() + src/pipeline/run-persistence.ts: + i: ../communication/analyzer.js,../communication/llm.js,../config/env.js,../config/env.js,../core/id.js,../core/io.js,../core/types.js,../extractors/docs-llm.js,../extractors/nl-llm.js,../llm/audit.js,../synthesis/tasks-llm.js,../version.js,./run.js,node:path + e: makePipelineManifest,persistPipelineArtifacts,filePath,graphPath,diagnosticsPath,summaryPath,summaryConclusionsPath,taskSynthesisPath,todoValidationPath,todoPatchPath,todoPatchAuditPath,codeChangePlansPath,codeChangeReviewPath,codeChangeReviewAuditPath,codeChangeSourcePatchesPath,communicationAnalysisPath,communicationMarkdownPath,persistFailedRun,manifestConfiguration,persistFailedRunState,aborted,message,knownAudit,failedAudit,stageValue,reason,skippedAudit,failureCode + makePipelineManifest() + persistPipelineArtifacts() filePath() graphPath() diagnosticsPath() @@ -766,56 +509,239 @@ D: codeChangeSourcePatchesPath() communicationAnalysisPath() communicationMarkdownPath() - configuration() - manifestConfiguration() - collectTargetHints() - values() persistFailedRun() + manifestConfiguration() + persistFailedRunState() aborted() message() knownAudit() failedAudit() stageValue() reason() - failureCode() skippedAudit() - appendLlmNotConfigured() - src/web/diff-ui.ts: - e: diffUiHtml,byId,requestHeaders,formatBytes,selectedRun,updateMeta,fillSelect,loadRuns,compareGraphs - diffUiHtml() - byId() - requestHeaders() - formatBytes() - selectedRun() - updateMeta() - fillSelect() - loadRuns() - compareGraphs() - src/communication/analyzer.ts: - i: ../core/id.js,../core/schema.js,../core/text.js,../core/types.js,../extractors/communication.js,./llm.js - e: CommunicationIssue,ParticipantCommunicationAnalysis,CommunicationAnalysis,analyzeCommunication,communication,evidenceByRecord,participants,participant,values,left,right,leftRole,rightRole,code,responseRequiredFrom,humanRequests,agentMessages,response,type,participantGit,linked,matchedRequest,aliases,matchedGit,evidence,validateSyntheses,byId,ids,record,renderCommunicationMarkdown,addCommunicationIssuesToDiagnostics,hasSerious,communicationIssueTitle,evidenceNeighbors,records,output,left,right,isEvidenceRecord,matchedGitRecords,aliases,semanticMatch,conflictSemanticMatch,leftHasExplicitTarget,rightHasExplicitTarget,agentResponseCoversRequest,candidates,bySource,values,aggregateTopicMatch,requested,response,shared,agentWorkCoveredByHumanScope,requests,sourceRecords,plans,agentSourceRecords,isBroadRequest,isActionableAgentWork,isPositiveImplementationClaim,isHumanDecisionClaim,hasImplementationVerb,withoutTickets,value,intersects,values,participantOf,participantsForRole,roleOf,typeOf,ticketOf,gitAliases,normalizeIdentity,append,values,issue,sortedRespondents,explicitResponseRoute,severityRank,escapeCell,escapeRegex - CommunicationIssue: - ParticipantCommunicationAnalysis: + failureCode() + sdk/rust/src/client.rs: + i: crate::,serde_json::,std::io::,std::net::,std::sync::atomic::,std::time::,super:: + e: Client + Client: + src/core/record-metadata.ts: + i: ./types.js,./version.js + e: generationMetadata,generationIdentity,separator + generationMetadata() + generationIdentity() + separator() + src/evaluation/gold-types.ts: + e: GoldRecordProjection,GoldDocumentModelRecord,GoldExtractionCase,GoldFixtureRecord,GoldExpectedRelation,GoldRerankerDecisionFixture,GoldRerankerFixture,GoldLinkingCase,GoldProposalFixture,GoldDsl2TodoCase,GoldExpectedDiagnostic,GoldDiagnosticsCase,GoldDataset,BinaryMetric,GoldEvaluationReport,assertGoldDataset,dataset,assertDatasetObject,assertDatasetMetadata,assertDatasetCollections,assertUniqueCaseIds,assertExtractionCoverage,channels,assertLinkingCohorts,assertGoldLinkingCohort,assertRerankerFixture,assertRerankerModelIdentity,assertRerankerDecisions,decisions,recordLabels,seenModules,assertRerankerDecision + GoldRecordProjection: + GoldDocumentModelRecord: + GoldExtractionCase: + GoldFixtureRecord: + GoldExpectedRelation: + GoldRerankerDecisionFixture: + GoldRerankerFixture: + GoldLinkingCase: + GoldProposalFixture: + GoldDsl2TodoCase: + GoldExpectedDiagnostic: + GoldDiagnosticsCase: + GoldDataset: + BinaryMetric: + GoldEvaluationReport: + assertGoldDataset() + dataset() + assertDatasetObject() + assertDatasetMetadata() + assertDatasetCollections() + assertUniqueCaseIds() + assertExtractionCoverage() + channels() + assertLinkingCohorts() + assertGoldLinkingCohort() + assertRerankerFixture() + assertRerankerModelIdentity() + assertRerankerDecisions() + decisions() + recordLabels() + seenModules() + assertRerankerDecision() + sdk/typescript/examples/basic.ts: + i: ../src/index.js + e: baseUrl,token,root,main,client,health,card,nl,ast,markdown,graph,diagnostics,synthesis,validation,rendered,artifact,reality,gitDiff,comparison + baseUrl() + token() + root() + main() + client() + health() + card() + nl() + ast() + markdown() + graph() + diagnostics() + synthesis() + validation() + rendered() + artifact() + reality() + gitDiff() + comparison() + python/ast_extract.py: + e: FactVisitor,source_hash,dotted_name,is_module_entrypoint,iter_python_files,main + FactVisitor(ast.NodeVisitor): __init__(2),excerpt(1),add(6),visit_Import(1),visit_ImportFrom(1),visit_FunctionDef(1),visit_AsyncFunctionDef(1),visit_ClassDef(1),add_named_constant(3),visit_Assign(1),visit_AnnAssign(1),visit_If(1),visit_Call(1) + source_hash(value) + dotted_name(node) + is_module_entrypoint(node) + iter_python_files(root;files_from) + main() + src/web/diff-ui-script.ts: + e: byId,requestHeaders,formatBytes,selectedRun,updateMeta,fillSelect,loadRuns,compareGraphs + byId() + requestHeaders() + formatBytes() + selectedRun() + updateMeta() + fillSelect() + loadRuns() + compareGraphs() + src/diff/reality.ts: + i: ../core/id.js,../core/schema.js,../core/target.js + e: RealityRow,IntentRealityView,RealitySvgOptions,RealitySvgLayout,buildRealityView,components,diagnosticsByRecord,rows,buildRealityRows,rows,buildRealityRow,codes,status,compareRealityRows,bySeverity,alignment,bySize,buildRealityTotals,declaredRecords,observedRecords,aligned,declaredTopics,observedTopics,implementationAlignedTopics,documentedObservedTopics,ratio,documentedCoverageLabel,LABEL_CHAR,BADGE_CHAR,widestLabel,groupIntoTopics,symbolPaths,anchors,groups,key,bucket,indexModuleAnchors,modulePaths,targetless,candidates,path,values,resolvesToFile,resolved,indexUnambiguousSymbolPaths,candidates,paths,values,primaryTargetKey,anchor,indexDiagnostics,index,bucket,resolveEvidence,resolveStatus,summarizeLaneTotals,declared,observed,changelog,topicLabel,separator,raw,value,declared,object,renderRealitySvg,theme,maxRows,title,rows,visible,layout,header,body,overflow,height,buildRealityLayout,laneX,laneStep,statusX,statusWidth,renderRealityLaneHeaders,isDeclared,renderRealityRow,y,color,renderRealityLanes,count,cx,renderRealityLaneCell,fill,label,pillWidth,renderMoreTopicsLabel,y,renderRealityHeight,footer,y,renderRealityMarkdown,lanes,escapeMarkdown + RealityRow: + IntentRealityView: + RealitySvgOptions: + RealitySvgLayout: + buildRealityView() + components() + diagnosticsByRecord() + rows() + buildRealityRows() + rows() + buildRealityRow() + codes() + status() + compareRealityRows() + bySeverity() + alignment() + bySize() + buildRealityTotals() + declaredRecords() + observedRecords() + aligned() + declaredTopics() + observedTopics() + implementationAlignedTopics() + documentedObservedTopics() + ratio() + documentedCoverageLabel() + LABEL_CHAR() + BADGE_CHAR() + widestLabel() + groupIntoTopics() + symbolPaths() + anchors() + groups() + key() + bucket() + indexModuleAnchors() + modulePaths() + targetless() + candidates() + path() + values() + resolvesToFile() + resolved() + indexUnambiguousSymbolPaths() + candidates() + paths() + values() + primaryTargetKey() + anchor() + indexDiagnostics() + index() + bucket() + resolveEvidence() + resolveStatus() + summarizeLaneTotals() + declared() + observed() + changelog() + topicLabel() + separator() + raw() + value() + declared() + object() + renderRealitySvg() + theme() + maxRows() + title() + rows() + visible() + layout() + header() + body() + overflow() + height() + buildRealityLayout() + laneX() + laneStep() + statusX() + statusWidth() + renderRealityLaneHeaders() + isDeclared() + renderRealityRow() + y() + color() + renderRealityLanes() + count() + cx() + renderRealityLaneCell() + fill() + label() + pillWidth() + renderMoreTopicsLabel() + y() + renderRealityHeight() + footer() + y() + renderRealityMarkdown() + lanes() + escapeMarkdown() + src/communication/analyzer.ts: + i: ../core/id.js,../core/schema.js,../core/text.js,../core/types.js,../extractors/communication.js,./llm.js + e: CommunicationIssue,ParticipantCommunicationAnalysis,CommunicationAnalysis,analyzeCommunication,communication,evidenceByRecord,humanRequests,agentMessages,uniqueIssues,participantRows,collectParticipantsAndIdentityIssues,participants,participant,values,collectConflictIssues,left,right,leftRole,rightRole,code,responseRequiredFrom,resolveConflictCode,collectRequestResponseIssues,response,collectAgentActionIssues,type,participantGit,linked,matchedRequest,deduplicateCommunicationIssues,buildParticipantRows,aliases,matchedGit,evidence,validateSyntheses,byId,ids,record,renderCommunicationMarkdown,addCommunicationIssuesToDiagnostics,hasSerious,communicationIssueTitle,evidenceNeighbors,records,output,left,right,isEvidenceRecord,matchedGitRecords,aliases,semanticMatch,conflictSemanticMatch,leftHasExplicitTarget,rightHasExplicitTarget,agentResponseCoversRequest,candidates,bySource,values,aggregateTopicMatch,requested,response,shared,agentWorkCoveredByHumanScope,requests,sourceRecords,plans,agentSourceRecords,isBroadRequest,isActionableAgentWork,isPositiveImplementationClaim,isHumanDecisionClaim,hasImplementationVerb,withoutTickets,value,intersects,values,participantOf,participantsForRole,roleOf,typeOf,ticketOf,gitAliases,normalizeIdentity,append,values,issue,sortedRespondents,explicitResponseRoute,severityRank,escapeCell,escapeRegex + CommunicationIssue: + ParticipantCommunicationAnalysis: CommunicationAnalysis: analyzeCommunication() communication() evidenceByRecord() + humanRequests() + agentMessages() + uniqueIssues() + participantRows() + collectParticipantsAndIdentityIssues() participants() participant() values() + collectConflictIssues() left() right() leftRole() rightRole() code() responseRequiredFrom() - humanRequests() - agentMessages() + resolveConflictCode() + collectRequestResponseIssues() response() + collectAgentActionIssues() type() participantGit() linked() matchedRequest() + deduplicateCommunicationIssues() + buildParticipantRows() aliases() matchedGit() evidence() @@ -876,1523 +802,870 @@ D: severityRank() escapeCell() escapeRegex() - src/synthesis/code-change-plan.ts: - i: ../core/io.js,../core/security.js,../core/target.js,../graph/diagnostics.js,../version.js,./code-change-path.js,node:crypto,node:fs,node:path - e: ProposeCodeChangePlansOptions,ProposeCodeChangePlansResult,EvaluateCodeChangeAcceptanceOptions,CloseCodeChangesOptions,CreateCodeChangeReviewOptions,CreatedCodeChangeReview,CreateCodeChangeSourcePatchOptions,ApplyCodeChangeSourcePatchOptions,ApplyCodeChangeSourcePatchResult,PreparedSourceEdit,IMPLEMENTATION_DIAGNOSTIC_CODES,proposeCodeChangePlans,generatedAt,maxPlans,conclusions,proposals,recordsById,proposalsByDiagnostic,conclusionsByDiagnostic,candidates,relatedRecords,matchingProposals,matchingConclusions,target,changes,generation,planHash,createRepositoryPathProbe,base,absolute,implementationDiagnosticRank,evaluateCodeChangeAcceptance,afterDiagnostics,beforeIds,afterById,targeted,clearedDiagnosticIds,remainingDiagnosticIds,newBlockingDiagnosticIds,accepted,evaluatedAt,closeCodeChanges,evaluatedAt,afterDiagnostics,planIds,acceptances,acceptedCount,indexProposalsByDiagnostic,index,list,indexConclusionsByDiagnostic,index,list,collectTarget,paths,symbols,tickets,versions,buildChanges,symbols,sourceIntents,rationale,normalized,exists,titleFor,record,object,startsWithImperative,descriptionFor,acceptanceCriteriaFor,priorityFor,confidenceFor,riskFor,level,rollbackFor,deterministicGeneration,uniqueSorted,createCodeChangeReviewPatch,createdAt,markdown,renderCodeChangeReviewMarkdown,symbols,assertCodeChangeReviewPatch,artifact,generation,priorityRank,inline,renderIds,createCodeChangeSourcePatch,plan,graphFingerprint,createdAt,allowed,diffs,normalized,path,rawDiff,unifiedDiff,patchHash,createCodeChangeSourcePatchSet,generatedAt,assertCodeChangeSourcePatch,patch,paths,path,expectedHash,allowed,expectedChanges,editPath,assertCodeChangeSourcePatchSet,set,plansById,patchIds,exactSourcePatchKeys,actual,assertSourcePatchIds,assertSourcePatchStrings,exactSourcePatchSet,instructionFor,symbols,criteria,normalizeUnifiedDiff,normalized,path,bare,stripped,applyCodeChangeSourcePatch,root,receiptPath,existing,relative,absolute,exists,before,after,now,fileHashesAfter,assertExistingSourceReceipt,relative,absolute,exists,current,assertSourceApplyReceipt,expectedPaths,hashPaths,atomicWriteRaw,applyUnifiedDiffToText,normalizedDiff,baseLines,diffLines,cursor,oldIndex,oldCount,newCount,mark,body,splitKeep,lines - ProposeCodeChangePlansOptions: - ProposeCodeChangePlansResult: - EvaluateCodeChangeAcceptanceOptions: - CloseCodeChangesOptions: - CreateCodeChangeReviewOptions: - CreatedCodeChangeReview: - CreateCodeChangeSourcePatchOptions: - ApplyCodeChangeSourcePatchOptions: - ApplyCodeChangeSourcePatchResult: - PreparedSourceEdit: - IMPLEMENTATION_DIAGNOSTIC_CODES() - proposeCodeChangePlans() - generatedAt() - maxPlans() - conclusions() - proposals() - recordsById() - proposalsByDiagnostic() - conclusionsByDiagnostic() - candidates() - relatedRecords() - matchingProposals() - matchingConclusions() + scripts/verify-no-llm-imports.mjs: + i: node:fs,node:path + e: visited,visit,body,resolved,resolveSource,raw + visited() + visit() + body() + resolved() + resolveSource() + raw() + src/extractors/docs-record.ts: + i: ../core/record.js,../version.js,./docs-types.js + e: OBJECT_PLACEHOLDERS,toDocumentIntentRecord,statementText,target,action,modality,isPlaceholder,resolveObject,fallback,anchorToSource,claimedStart,claimedEnd,wanted,lines,scores,claimedScore,bestScore,bestIndex,anchored,keywordOverlap,present,shared,resolveTarget,hasTarget,resolveAction,derived,resolveModality,derived,linesFromChunk,lines,relativeStart,relativeEnd,clampLine,allowedAction,allowedModality,allowedLifecycle + OBJECT_PLACEHOLDERS() + toDocumentIntentRecord() + statementText() target() - changes() - generation() - planHash() - createRepositoryPathProbe() - base() - absolute() - implementationDiagnosticRank() - evaluateCodeChangeAcceptance() - afterDiagnostics() - beforeIds() - afterById() - targeted() - clearedDiagnosticIds() - remainingDiagnosticIds() - newBlockingDiagnosticIds() - accepted() - evaluatedAt() - closeCodeChanges() - evaluatedAt() - afterDiagnostics() - planIds() - acceptances() - acceptedCount() - indexProposalsByDiagnostic() - index() - list() - indexConclusionsByDiagnostic() - index() - list() - collectTarget() - paths() - symbols() - tickets() - versions() - buildChanges() - symbols() - sourceIntents() - rationale() - normalized() - exists() - titleFor() - record() - object() - startsWithImperative() - descriptionFor() - acceptanceCriteriaFor() - priorityFor() - confidenceFor() - riskFor() - level() - rollbackFor() - deterministicGeneration() - uniqueSorted() - createCodeChangeReviewPatch() - createdAt() - markdown() - renderCodeChangeReviewMarkdown() - symbols() - assertCodeChangeReviewPatch() - artifact() - generation() - priorityRank() - inline() - renderIds() - createCodeChangeSourcePatch() - plan() - graphFingerprint() - createdAt() - allowed() - diffs() - normalized() - path() - rawDiff() - unifiedDiff() - patchHash() - createCodeChangeSourcePatchSet() - generatedAt() - assertCodeChangeSourcePatch() - patch() - paths() - path() - expectedHash() - allowed() - expectedChanges() - editPath() - assertCodeChangeSourcePatchSet() - set() - plansById() - patchIds() - exactSourcePatchKeys() - actual() - assertSourcePatchIds() - assertSourcePatchStrings() - exactSourcePatchSet() - instructionFor() - symbols() - criteria() - normalizeUnifiedDiff() - normalized() - path() - bare() - stripped() - applyCodeChangeSourcePatch() - root() - receiptPath() - existing() - relative() - absolute() - exists() - before() - after() - now() - fileHashesAfter() - assertExistingSourceReceipt() - relative() - absolute() - exists() - current() - assertSourceApplyReceipt() - expectedPaths() - hashPaths() - atomicWriteRaw() - applyUnifiedDiffToText() - normalizedDiff() - baseLines() - diffLines() - cursor() - oldIndex() - oldCount() - newCount() - mark() - body() - splitKeep() - lines() - src/extractors/ast/typescript.ts: - i: ../../core/io.js,../../core/record.js,../../core/types.js,./records.js,node:path,typescript - e: extractTypeScriptFile,relative,sourceFile,moduleCapabilities,lineRange,excerpt,add,symbol,nameOf,modifiers,visit,symbol,symbolModifiers,declarationIsCallable,callee,capabilities,isTopLevel,scriptKind,extension,languageName,extension - extractTypeScriptFile() - relative() - sourceFile() - moduleCapabilities() - lineRange() - excerpt() - add() - symbol() - nameOf() - modifiers() - visit() - symbol() - symbolModifiers() - declarationIsCallable() - callee() - capabilities() - isTopLevel() - scriptKind() - extension() - languageName() - extension() - src/graph/diagnostics.ts: - i: ../core/id.js,../core/schema.js,../core/target.js,./capability-evidence.js,./changelog-signal.js,./symbol-resolution.js - e: diagnoseGraph,neighbors,recordsById,groundedImplementation,implementedPaths,documentedPaths,symbolResolutionIndex,related,evidenced,hasLocationOnlyEvidence,missingFields,symbolIssues,detail,indexGroundedImplementationEvidence,grounded,left,right,relationSupportsImplementation,basis,score,ambiguityDetail,paths,ambiguityAction,actions,buildNeighbors,map,appendNeighbor,values,indexImplementedPaths,paths,indexDocumentedPaths,paths,hasImplementedTarget,hasDocumentedTarget,isPlan,isImplementationEvidence,isPublicImplementation,symbol,isReleaseCandidate,isImportantRecord,makeDiagnostic,severityRank - diagnoseGraph() - neighbors() - recordsById() - groundedImplementation() - implementedPaths() - documentedPaths() - symbolResolutionIndex() - related() - evidenced() - hasLocationOnlyEvidence() - missingFields() - symbolIssues() - detail() - indexGroundedImplementationEvidence() - grounded() - left() - right() - relationSupportsImplementation() - basis() - score() - ambiguityDetail() - paths() - ambiguityAction() - actions() - buildNeighbors() - map() - appendNeighbor() - values() - indexImplementedPaths() - paths() - indexDocumentedPaths() - paths() - hasImplementedTarget() - hasDocumentedTarget() - isPlan() - isImplementationEvidence() - isPublicImplementation() - symbol() - isReleaseCandidate() - isImportantRecord() - makeDiagnostic() - severityRank() - src/synthesis/code-change-path.ts: - e: NON_SOURCE_DIR_SEGMENTS,BINARY_EXTENSIONS,GENERATED_ANALYSIS_BASENAMES,T2C_ARTIFACT_BASENAMES,EXTENSIONLESS_SOURCE_BASENAMES,isPlannablePath,normalized,segments,lowerSegments,basename,lowerBasename,dot,ext,isUsefulCodeChangePath - NON_SOURCE_DIR_SEGMENTS() - BINARY_EXTENSIONS() - GENERATED_ANALYSIS_BASENAMES() - T2C_ARTIFACT_BASENAMES() - EXTENSIONLESS_SOURCE_BASENAMES() - isPlannablePath() - normalized() - segments() - lowerSegments() - basename() - lowerBasename() - dot() - ext() - isUsefulCodeChangePath() - php/ast_extract.php: - e: argumentValue,normalizedToken,significant,qualifiedName,sourceExcerpt,addFact,parseFile - argumentValue() - normalizedToken() - significant() - qualifiedName() - sourceExcerpt() - addFact() - parseFile() - src/core/text.ts: - i: ./types.js - e: STOP_WORDS,classifyActionHeuristically,conventional,prose,searchable,detectModality,prose,searchable,matches,detectPolarity,prose,stripped,normalized,normalizeToken,keywords,GENERIC_TOPICS,topicKeywords,separated,foldTopicToken,aliased,singular,similarity,left,right,intersection,extractBacktickValues,value,extractPaths,FILE_EXTENSIONS,hasFileExtension,last,dot,PATH_ROOTS,isPathLike,segments,HOST_TLDS,isHostname,parts,tld,extractSymbols,repositoryPaths,backticks,camel,ticketPrefixes,extractTickets,values,extractVersions,inferObject,normalized,result,splitIntentLines,lines,raw,cleaned,pieces,value - STOP_WORDS() - classifyActionHeuristically() - conventional() - prose() - searchable() - detectModality() - prose() - searchable() - matches() - detectPolarity() - prose() - stripped() - normalized() - normalizeToken() - keywords() - GENERIC_TOPICS() - topicKeywords() - separated() - foldTopicToken() - aliased() - singular() - similarity() - left() - right() - intersection() - extractBacktickValues() - value() - extractPaths() - FILE_EXTENSIONS() - hasFileExtension() - last() - dot() - PATH_ROOTS() - isPathLike() - segments() - HOST_TLDS() - isHostname() - parts() - tld() - extractSymbols() - repositoryPaths() - backticks() - camel() - ticketPrefixes() - extractTickets() - values() - extractVersions() - inferObject() - normalized() - result() - splitIntentLines() - lines() - raw() - cleaned() - pieces() - value() - src/evaluation/gold-types.ts: - e: GoldRecordProjection,GoldDocumentModelRecord,GoldExtractionCase,GoldFixtureRecord,GoldExpectedRelation,GoldRerankerDecisionFixture,GoldRerankerFixture,GoldLinkingCase,GoldProposalFixture,GoldDsl2TodoCase,GoldExpectedDiagnostic,GoldDiagnosticsCase,GoldDataset,BinaryMetric,GoldEvaluationReport,assertGoldDataset,dataset,assertDatasetObject,assertDatasetMetadata,assertDatasetCollections,assertUniqueCaseIds,assertExtractionCoverage,channels,assertLinkingCohorts,labels,modules - GoldRecordProjection: - GoldDocumentModelRecord: - GoldExtractionCase: - GoldFixtureRecord: - GoldExpectedRelation: - GoldRerankerDecisionFixture: - GoldRerankerFixture: - GoldLinkingCase: - GoldProposalFixture: - GoldDsl2TodoCase: - GoldExpectedDiagnostic: - GoldDiagnosticsCase: - GoldDataset: - BinaryMetric: - GoldEvaluationReport: - assertGoldDataset() - dataset() - assertDatasetObject() - assertDatasetMetadata() - assertDatasetCollections() - assertUniqueCaseIds() - assertExtractionCoverage() - channels() - assertLinkingCohorts() - labels() - modules() - src/llm/openrouter.ts: - i: ../config/env.js,../core/types.js,./structured-schema.js - e: ChatMessage,OpenRouterChoice,OpenRouterResponse,OpenRouterResult,OpenRouterModelsResponse,OpenRouterModelError,OpenRouterClient - ChatMessage: - OpenRouterChoice: - OpenRouterResponse: - OpenRouterResult: - OpenRouterModelsResponse: - OpenRouterModelError: super(-1) - OpenRouterClient: isConfigured(-1),listAvailableModels(-1),controller(-1),timeout(-1),response(-1),text(-1),clearTimeout(-1),chatText(-1),chatTextWithMetadata(-1),response(-1),content(-1),chatJson(-1),result(-1),chatJsonWithMetadata(-1),response(-1),fallback(-1),request(-1),apiKey(-1),controller(-1),externalSignal(-1),abortFromExternal(-1),timeout(-1),response(-1),text(-1),message(-1),error(-1),model(-1),availableModels(-1),formatInvalidModelError(-1),clearTimeout(-1),responseMetadata(-1),usage(-1),stringOrNull(-1),finiteOrNull(-1),shouldRetryWithoutJsonSchema(-1),isInvalidModelError(-1),formatInvalidModelError(-1),removeUndefined(-1),extractContent(-1),content(-1),parseJsonContent(-1),trimmed(-1),start(-1),end(-1),parseJsonResponse(-1),metadata(-1),message(-1),sleep(-1) - src/communication/identity.ts: - i: ../core/io.js,../core/security.js,node:path - e: ParticipantIdentityEntry,ParticipantIdentityRegistry,LoadedParticipantIdentityRegistry,loadParticipantIdentityRegistry,registryPath,assertParticipantIdentityRegistry,registry,ids,external,entry,values,normalized,owner,exactKeys,allowed,missing,extra - ParticipantIdentityEntry: - ParticipantIdentityRegistry: - LoadedParticipantIdentityRegistry: - loadParticipantIdentityRegistry() - registryPath() - assertParticipantIdentityRegistry() - registry() - ids() - external() - entry() - values() - normalized() - owner() - exactKeys() - allowed() - missing() - extra() - scripts/verify-env-contract.mjs: - i: node:fs,node:path - e: root,examplePath,example,declared,match,expected,configBody,body,makefile,body,local,auditLocalKeys,body,keys,collectExisting,absolute,collect,absolute - root() - examplePath() - example() - declared() - match() - expected() - configBody() - body() - makefile() - body() - local() - auditLocalKeys() - body() - keys() - collectExisting() - absolute() - collect() - absolute() - src/semantic/reranker.ts: - i: ../core/id.js,../core/schema.js,../core/types.js,../version.js - e: SemanticRetrievalIdentity,SemanticCandidate,SemanticCandidateSet,SemanticCandidateInput,SemanticRetrievalInput,SemanticEvidenceCitation,SemanticRerankDecisionInput,SemanticRerankDecision,SemanticRerankGeneration,SemanticRerankResult,SemanticRerankGenerationInput,createSemanticCandidateSet,grouped,values,assertSemanticCandidateSet,records,seenIds,seenPairs,byDeclaration,declaration,module,values,expectedHash,createSemanticRerankResult,decisions,assertSemanticRerankResult,candidates,records,seenDecisions,acceptedDeclarations,candidate,citations,record,expectedHash,applyAcceptedSemanticRelations,candidates,added,candidate,validateRetrieval,validateGeneration,validateVerdictReason,assertSemanticVerdictReason,allowed,reasons,assertGroundedQuote,quote,boundedScore,roundedConfidence,requiredText,validDate,comparePair - SemanticRetrievalIdentity: - SemanticCandidate: - SemanticCandidateSet: - SemanticCandidateInput: - SemanticRetrievalInput: - SemanticEvidenceCitation: - SemanticRerankDecisionInput: - SemanticRerankDecision: - SemanticRerankGeneration: - SemanticRerankResult: - SemanticRerankGenerationInput: - createSemanticCandidateSet() - grouped() - values() - assertSemanticCandidateSet() - records() - seenIds() - seenPairs() - byDeclaration() - declaration() - module() - values() - expectedHash() - createSemanticRerankResult() - decisions() - assertSemanticRerankResult() - candidates() - records() - seenDecisions() - acceptedDeclarations() - candidate() - citations() - record() - expectedHash() - applyAcceptedSemanticRelations() - candidates() - added() - candidate() - validateRetrieval() - validateGeneration() - validateVerdictReason() - assertSemanticVerdictReason() - allowed() - reasons() - assertGroundedQuote() - quote() - boundedScore() - roundedConfidence() - requiredText() - validDate() - comparePair() - scripts/research/rank-intent-graph-embeddings.py: - e: parse_args,projection_text,main - parse_args() - projection_text(record;prefix) - main() - src/diff/reality.ts: - i: ../core/id.js,../core/schema.js,../core/target.js - e: RealityRow,IntentRealityView,RealitySvgOptions,buildRealityView,components,diagnosticsByRecord,codes,status,bySeverity,alignment,bySize,declaredRecords,observedRecords,aligned,declaredTopics,observedTopics,implementationAlignedTopics,documentedObservedTopics,ratio,documentedCoverageLabel,LABEL_CHAR,BADGE_CHAR,widestLabel,groupIntoTopics,symbolPaths,anchors,groups,key,bucket,indexModuleAnchors,modulePaths,targetless,candidates,path,values,resolvesToFile,resolved,indexUnambiguousSymbolPaths,candidates,paths,values,primaryTargetKey,anchor,indexDiagnostics,index,bucket,resolveEvidence,resolveStatus,declared,observed,changelog,topicLabel,separator,value,declared,object,renderRealitySvg,theme,maxRows,title,rows,visible,laneX,laneStep,statusX,statusWidth,width,rowHeight,headerY,y,isDeclared,color,count,cx,fill,label,pillWidth,renderRealityMarkdown,lanes,escapeMarkdown - RealityRow: - IntentRealityView: - RealitySvgOptions: - buildRealityView() - components() - diagnosticsByRecord() - codes() - status() - bySeverity() - alignment() - bySize() - declaredRecords() - observedRecords() - aligned() - declaredTopics() - observedTopics() - implementationAlignedTopics() - documentedObservedTopics() - ratio() - documentedCoverageLabel() - LABEL_CHAR() - BADGE_CHAR() - widestLabel() - groupIntoTopics() - symbolPaths() - anchors() - groups() - key() - bucket() - indexModuleAnchors() - modulePaths() - targetless() - candidates() - path() - values() - resolvesToFile() - resolved() - indexUnambiguousSymbolPaths() - candidates() - paths() - values() - primaryTargetKey() - anchor() - indexDiagnostics() - index() - bucket() - resolveEvidence() - resolveStatus() - declared() - observed() - changelog() - topicLabel() - separator() - value() - declared() - object() - renderRealitySvg() - theme() - maxRows() - title() - rows() - visible() - laneX() - laneStep() - statusX() - statusWidth() - width() - rowHeight() - headerY() - y() - isDeclared() - color() - count() - cx() - fill() - label() - pillWidth() - renderRealityMarkdown() - lanes() - escapeMarkdown() - sdk/go/examples/basic/main.go: - e: main,run,envOr,truncate,joinedIDs - main() - run() - envOr() - truncate() - joinedIDs() - src/semantic/reranker-llm.ts: - i: ../config/env.js,../core/id.js,../core/types.js,../llm/openrouter.js,../llm/structured-schema.js,node:child_process,node:path,node:util - e: SemanticRerankerOptions,SemanticRerankerRequiredError - SemanticRerankerOptions: - SemanticRerankerRequiredError: super(-1),rerankSemanticCandidates(-1),assertSemanticCandidateSet(-1),model(-1),modelRevision(-1),assertSemanticRerankResult(-1),client(-1),records(-1),payload(-1),response(-1),metadata(-1),assertSemanticRerankerResponse(-1),execFileAsync(-1),assertTrackedSnapshot(-1),root(-1),revision(-1),execFileAsync(-1),execFileAsync(-1),execFileAsync(-1),execFileAsync(-1),head(-1),resolvedRevision(-1),tracked(-1),records(-1),recordIds(-1),record(-1),sourcePath(-1),semanticRerankCacheKey(-1),projectRecord(-1) - src/core/schema.ts: - e: GroundedValidationContext,TodoProposalValidationContext,CodeChangePlanValidationContext,CodeChangeAcceptanceValidationContext,ACTIONS,MODALITIES,POLARITIES,LIFECYCLES,SOURCE_KINDS,EPISTEMIC_CLASSES,RELATION_TYPES,CONCLUSION_KINDS,DIAGNOSTIC_SEVERITIES,TODO_PRIORITIES,GENERATION_REQUESTED_MODES,GENERATION_EFFECTIVE_MODES,CODE_CHANGE_ACTIONS,CODE_CHANGE_RISK_LEVELS,assertIntentRecord,record,statement,target,lifecycle,source,lines,epistemic,metadata,assertGenerationMatchesExtractor,generation,separator,expectedGenerator,assertIntentGenerationMetadata,generation,assertIntentRecords,assertIntentGraph,graph,recordIds,relationIds,stats,records,expectedFingerprint,assertIntentGraphDiff,diff,records,change,relations,summary,assertConclusion,known,assertConclusions,known,ids,id,assertTodoProposal,known,assertTodoProposals,known,proposalIds,id,assertCodeChangePlan,known,assertCodeChangePlans,known,ids,id,assertCodeChangePlansForReview,ids,plan,evidence,id,assertCodeChangePlanForAcceptance,known,plan,evidence,assertPlanGraphFingerprint,assertCodeChangeAcceptance,beforeKnown,afterKnown,acceptance,expectedCleared,expectedRemaining,expectedBlocking,expectedAccepted,assertConclusionValue,conclusion,expectedId,assertTodoProposalValue,proposal,target,expectedId,assertGroundedGenerationMetadata,generation,validateGroundedContext,report,diagnosticIds,diagnostic,validateTodoProposalContext,known,validateCodeChangePlanContext,known,conclusions,proposals,referencedConclusionIds,proposal,proposalIds,assertCodeChangePlanValue,plan,target,targetPaths,changePaths,change,normalizedPath,risk,evidence,semantic,expectedHash,expectedId,assertRelation,relation,objectValue,exactKeys,expectedSet,missing,extra,nonEmptyString,nonBlankString,nullableString,enumValue,stringArray,nonEmptyUniqueStringArray,repositoryPath,normalized,exactStringSet,uniqueIdArray,nonEmptyUniqueIdArray,knownReferences,unknown,confidence,assertAcyclicProposalDependencies,byId,visiting,visited,visit,start,dateString,nullableDate,fingerprint,nonNegativeInteger,countMap,map,countRecords,key,exactCounts,actual,isJsonValue - GroundedValidationContext: - TodoProposalValidationContext: - CodeChangePlanValidationContext: - CodeChangeAcceptanceValidationContext: - ACTIONS() - MODALITIES() - POLARITIES() - LIFECYCLES() - SOURCE_KINDS() - EPISTEMIC_CLASSES() - RELATION_TYPES() - CONCLUSION_KINDS() - DIAGNOSTIC_SEVERITIES() - TODO_PRIORITIES() - GENERATION_REQUESTED_MODES() - GENERATION_EFFECTIVE_MODES() - CODE_CHANGE_ACTIONS() - CODE_CHANGE_RISK_LEVELS() - assertIntentRecord() - record() - statement() - target() - lifecycle() - source() - lines() - epistemic() - metadata() - assertGenerationMatchesExtractor() - generation() - separator() - expectedGenerator() - assertIntentGenerationMetadata() - generation() - assertIntentRecords() - assertIntentGraph() - graph() - recordIds() - relationIds() - stats() - records() - expectedFingerprint() - assertIntentGraphDiff() - diff() - records() - change() - relations() - summary() - assertConclusion() - known() - assertConclusions() - known() - ids() - id() - assertTodoProposal() - known() - assertTodoProposals() - known() - proposalIds() - id() - assertCodeChangePlan() - known() - assertCodeChangePlans() - known() - ids() - id() - assertCodeChangePlansForReview() - ids() - plan() - evidence() - id() - assertCodeChangePlanForAcceptance() - known() - plan() - evidence() - assertPlanGraphFingerprint() - assertCodeChangeAcceptance() - beforeKnown() - afterKnown() - acceptance() - expectedCleared() - expectedRemaining() - expectedBlocking() - expectedAccepted() - assertConclusionValue() - conclusion() - expectedId() - assertTodoProposalValue() - proposal() - target() - expectedId() - assertGroundedGenerationMetadata() - generation() - validateGroundedContext() - report() - diagnosticIds() - diagnostic() - validateTodoProposalContext() - known() - validateCodeChangePlanContext() - known() - conclusions() - proposals() - referencedConclusionIds() - proposal() - proposalIds() - assertCodeChangePlanValue() - plan() - target() - targetPaths() - changePaths() - change() - normalizedPath() - risk() - evidence() - semantic() - expectedHash() - expectedId() - assertRelation() - relation() - objectValue() - exactKeys() - expectedSet() - missing() - extra() - nonEmptyString() - nonBlankString() - nullableString() - enumValue() - stringArray() - nonEmptyUniqueStringArray() - repositoryPath() - normalized() - exactStringSet() - uniqueIdArray() - nonEmptyUniqueIdArray() - knownReferences() - unknown() - confidence() - assertAcyclicProposalDependencies() - byId() - visiting() - visited() - visit() - start() - dateString() - nullableDate() - fingerprint() - nonNegativeInteger() - countMap() - map() - countRecords() - key() - exactCounts() - actual() - isJsonValue() - src/diff/git.ts: - i: ./text.js,node:child_process,node:fs,node:path,node:util - e: GitDiffOptions,GitDiffResult,ChangedEntry,execFileAsync,BINARY_EXTENSIONS,collectGitDiff,root,revision,staged,maxFiles,inside,beforePath,before,after,diff,parseNameStatus,parts,status,isProbablyBinary,readBlob,readStagedBlob,readWorkingFile,runGit,result - GitDiffOptions: - GitDiffResult: - ChangedEntry: - execFileAsync() - BINARY_EXTENSIONS() - collectGitDiff() - root() - revision() - staged() - maxFiles() - inside() - beforePath() - before() - after() - diff() - parseNameStatus() - parts() - status() - isProbablyBinary() - readBlob() - readStagedBlob() - readWorkingFile() - runGit() - result() - sdk/rust/examples/basic.rs: - i: serde_json::json,std::env,todo2code::Client - e: main,run,joined_ids - main() - run() - joined_ids() - src/watch/watcher.ts: - i: ../config/env.js,../core/ignore.js,../core/types.js,../pipeline/run.js,node:fs,node:path - e: SnapshotDelta,ScanOptions,ReportResult,WatchOptions,scanTree,maxFiles,absoluteRoot,visit,absolute,relative,stat,diffSnapshots,previous,describeDelta,shown,rest,DEFAULT_MIN_INTERVAL_MS,DEFAULT_SCAN_INTERVAL_MS,watchRepository,root,minIntervalMs,scanIntervalMs,emit,now,sleep,signal,matcher,runReport,result,snapshot,lastReportStartedAt,pending,current,delta,waitMs,generate,startedAt,result,defaultSleep,timer,onAbort,finish - SnapshotDelta: - ScanOptions: - ReportResult: - WatchOptions: - scanTree() - maxFiles() - absoluteRoot() - visit() - absolute() - relative() - stat() - diffSnapshots() - previous() - describeDelta() - shown() - rest() - DEFAULT_MIN_INTERVAL_MS() - DEFAULT_SCAN_INTERVAL_MS() - watchRepository() - root() - minIntervalMs() - scanIntervalMs() - emit() - now() - sleep() - signal() - matcher() - runReport() - result() - snapshot() - lastReportStartedAt() - pending() - current() - delta() - waitMs() - generate() - startedAt() - result() - defaultSleep() - timer() - onAbort() - finish() - src/extractors/markdown-llm.ts: - i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,./markdown.js,node:fs,node:path,node:url - e: MarkdownEnrichment,MarkdownResponse,AuditedMarkdownExtractionResult,MarkdownLlmRequiredError,MarkdownAttemptError,CoveredBatch,MARKDOWN_LLM_BATCH_RECORDS + action() + modality() + isPlaceholder() + resolveObject() + fallback() + anchorToSource() + claimedStart() + claimedEnd() + wanted() + lines() + scores() + claimedScore() + bestScore() + bestIndex() + anchored() + keywordOverlap() + present() + shared() + resolveTarget() + hasTarget() + resolveAction() + derived() + resolveModality() + derived() + linesFromChunk() + lines() + relativeStart() + relativeEnd() + clampLine() + allowedAction() + allowedModality() + allowedLifecycle() + src/extractors/markdown-llm-helpers.ts: + i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,node:fs,node:path,node:url + e: MarkdownEnrichment,MarkdownResponse,CoveredBatch,MarkdownAttemptError,StageAuditInput,MARKDOWN_LLM_BATCH_RECORDS MarkdownEnrichment: MarkdownResponse: - AuditedMarkdownExtractionResult: - MarkdownLlmRequiredError: super(-1),extractMarkdownIntentAudited(-1),startedAt(-1),deterministic(-1),client(-1),prompt(-1),enrichments(-1),responseByRecord(-1),outcomes(-1),corrected(-1),failed(-1),failure(-1),failedResponses(-1) - MarkdownAttemptError: super(-1),enrichBatchCovering(-1),metadataByRecord(-1),uncovered(-1),enrichSplitBatch(-1),half(-1),emptyCoverage(-1),enrichMarkdownBatchWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failed(-1),promptRecord(-1),validateEnrichments(-1),expected(-1),output(-1),enrichRecord(-1),markDeterministic(-1),marked(-1),stageAudit(-1),readPrompt(-1),promptPath(-1),markdownResponseContract(-1),strings(-1),enrichment(-1) CoveredBatch: + MarkdownAttemptError: super(-1),enrichMarkdownRecords(-1),enrichments(-1),responseByRecord(-1),outcomes(-1),corrected(-1),failed(-1),enrichment(-1),metadata(-1),enrichBatchCovering(-1),metadataByRecord(-1),uncovered(-1),enrichSplitBatch(-1),half(-1),emptyCoverage(-1),enrichMarkdownBatchWithCorrection(-1),completion(-1),promptRecord(-1),validateEnrichments(-1),expected(-1),output(-1),enrichRecord(-1),markDeterministic(-1),marked(-1),stageAudit(-1),readPrompt(-1),promptPath(-1),markdownResponseContract(-1),strings(-1),enrichment(-1) + StageAuditInput: MARKDOWN_LLM_BATCH_RECORDS() - src/diff/text.ts: - i: ./text-types.js - e: RawOp,DEFAULT_CONTEXT,DEFAULT_MAX_COMPARE_LINES,splitLines,normalized,lines,diffText,diffLineArrays,context,maxCompareLines,beforePath,afterPath,summarizeLines,computeLineDiff,prefix,suffix,lines,middleBefore,middleAfter,truncated,middleOps,sharedPrefixLength,prefix,sharedSuffixLength,suffix,prefixLines,suffixLines,beforeIndex,afterIndex,blockReplace,myers,n,m,max,offset,v,y,backtrack,x,y,v,k,previousK,previousX,previousY,buildHunks,changeIndexes,start,end,last,hunkFromRange,slice,beforeNumbers,afterNumbers - RawOp: - DEFAULT_CONTEXT() - DEFAULT_MAX_COMPARE_LINES() - splitLines() - normalized() - lines() - diffText() - diffLineArrays() - context() - maxCompareLines() - beforePath() - afterPath() - summarizeLines() - computeLineDiff() - prefix() - suffix() + src/extractors/communication-helpers.ts: + i: ../communication/identity.js,../config/env.js,../core/io.js,../core/record.js,../core/types.js,../tf/classifier.js,node:path + e: CommunicationEnvelope,InferredCommunicationIdentity,CommunicationSegment,buildCommunicationRecords,segmentType,semantics,classified,action,line,parseEnvelope,lines,end,match,inferIdentity,parts,basename,governanceIdentity,inferGovernanceIdentityFromFilename,governance,inferIdentityFromPathAndFilename,fileParts,nestedRoleIndex,nestedRole,nestedParticipant,isTicketEvidenceFile,basename,communicationSegments,lines,flush,item,raw,heading,cleaned,looksLikeTicket,normalizeRole,normalizeType,normalized,isCommunicationType,first,listValue,stripped,validTimestamp,parsed,resolveIdentity,sameStrings,normalize,isCommunicationNoise,normalized,governanceSectionType,normalized,semanticsFor,unquote + CommunicationEnvelope: + InferredCommunicationIdentity: + CommunicationSegment: + buildCommunicationRecords() + segmentType() + semantics() + classified() + action() + line() + parseEnvelope() lines() - middleBefore() - middleAfter() - truncated() - middleOps() - sharedPrefixLength() - prefix() - sharedSuffixLength() - suffix() - prefixLines() - suffixLines() - beforeIndex() - afterIndex() - blockReplace() - myers() - n() - m() - max() - offset() - v() - y() - backtrack() - x() - y() - v() - k() - previousK() - previousX() - previousY() - buildHunks() - changeIndexes() - start() end() - last() - hunkFromRange() - slice() - beforeNumbers() - afterNumbers() - src/interfaces/a2a-history.ts: - i: ../config/env.js,../core/security.js,./a2a-types.js,node:fs,node:path - e: IntentRunListItem,CommunicationRunSummary,RunHistoryFilters,listIntentRuns,runsDirectory,entries,items,readRunEntries,readRun,runDirectory,graphPath,manifestPath,manifest,safeRunPath,runListItem,files,llm,runtime,warnings,validTimestamp,validStatus,llmSummary,readCommunicationSummary,relative,filePath,stat,value,participants,issues,participantSummary,matchesRunFilters,participant,role,ticket,severity,normalized,stringArray,safeManifestFiles,absolute,relative,relativeApiPath - IntentRunListItem: - CommunicationRunSummary: - RunHistoryFilters: - listIntentRuns() - runsDirectory() - entries() - items() - readRunEntries() - readRun() - runDirectory() - graphPath() - manifestPath() - manifest() - safeRunPath() - runListItem() - files() - llm() - runtime() - warnings() + match() + inferIdentity() + parts() + basename() + governanceIdentity() + inferGovernanceIdentityFromFilename() + governance() + inferIdentityFromPathAndFilename() + fileParts() + nestedRoleIndex() + nestedRole() + nestedParticipant() + isTicketEvidenceFile() + basename() + communicationSegments() + lines() + flush() + item() + raw() + heading() + cleaned() + looksLikeTicket() + normalizeRole() + normalizeType() + normalized() + isCommunicationType() + first() + listValue() + stripped() validTimestamp() - validStatus() - llmSummary() - readCommunicationSummary() - relative() - filePath() - stat() - value() - participants() - issues() - participantSummary() - matchesRunFilters() + parsed() + resolveIdentity() + sameStrings() + normalize() + isCommunicationNoise() + normalized() + governanceSectionType() + normalized() + semanticsFor() + unquote() + src/extractors/communication-file-helpers.ts: + i: ../communication/identity.js,../config/env.js,../core/io.js,../core/types.js,./communication-helpers.js,node:path + e: CommunicationFileOutcome,CommunicationMetadata,extractCommunicationFile,scope,readResult,envelope,inferred,extracted,localWarnings,segmentResult,records,shouldSkipCommunicationFile,explicitEnvelope,hasExplicitEnvelopeMetadata,buildCommunicationSegments,inferredRole,segments,resolveFileScope,relativeToProject,segments,pathTicket,readCommunicationBody,collectCommunicationMetadata,declaredParticipant,declaredRole,declaredParticipantId,identity,participant,role,displayName,explicitMessageType,messageType,ticket,recipient,rawTimestamp,timestamp,declaredGitAuthors,gitAuthors,explicitPaths,explicitSymbols,buildLocalWarnings,appendRoleAndParticipantWarnings,appendIdentityWarnings,appendRegistryAlignmentWarnings,appendA2aAgentWarnings,declaredA2aAgentId,hasRegistryEntry,appendTimestampWarnings,rawTimestamp + CommunicationFileOutcome: + CommunicationMetadata: + extractCommunicationFile() + scope() + readResult() + envelope() + inferred() + extracted() + localWarnings() + segmentResult() + records() + shouldSkipCommunicationFile() + explicitEnvelope() + hasExplicitEnvelopeMetadata() + buildCommunicationSegments() + inferredRole() + segments() + resolveFileScope() + relativeToProject() + segments() + pathTicket() + readCommunicationBody() + collectCommunicationMetadata() + declaredParticipant() + declaredRole() + declaredParticipantId() + identity() participant() role() + displayName() + explicitMessageType() + messageType() ticket() - severity() + recipient() + rawTimestamp() + timestamp() + declaredGitAuthors() + gitAuthors() + explicitPaths() + explicitSymbols() + buildLocalWarnings() + appendRoleAndParticipantWarnings() + appendIdentityWarnings() + appendRegistryAlignmentWarnings() + appendA2aAgentWarnings() + declaredA2aAgentId() + hasRegistryEntry() + appendTimestampWarnings() + rawTimestamp() + src/core/text.ts: + i: ./types.js + e: STOP_WORDS,buildStopWords,classifyActionHeuristically,conventionalAction,prose,searchable,matchedByPattern,extractConventionalAction,conventional,findActionInText,removeInlineCode,detectModality,prose,searchable,matches,detectPolarity,prose,stripped,normalized,normalizeToken,keywords,GENERIC_TOPICS,topicKeywords,separated,foldTopicToken,aliased,singular,similarity,left,right,intersection,extractBacktickValues,value,extractPaths,FILE_EXTENSIONS,hasFileExtension,last,dot,PATH_ROOTS,isPathLike,segments,HOST_TLDS,isHostname,parts,tld,extractSymbols,repositoryPaths,backticks,camel,ticketPrefixes,extractTickets,values,extractVersions,inferObject,normalized,withoutAction,result,normalizeForObject,removeObjectAction,stripObjectConnector,splitIntentLines,lines,raw,cleaned,pieces,value + STOP_WORDS() + buildStopWords() + classifyActionHeuristically() + conventionalAction() + prose() + searchable() + matchedByPattern() + extractConventionalAction() + conventional() + findActionInText() + removeInlineCode() + detectModality() + prose() + searchable() + matches() + detectPolarity() + prose() + stripped() normalized() - stringArray() - safeManifestFiles() - absolute() - relative() - relativeApiPath() - src/graph/linker.ts: - i: ../core/id.js,../core/schema.js,../core/target.js,../core/text.js,../core/types.js,./capability-evidence.js,./symbol-resolution.js - e: PairEvidence,RecordKeywords,DirectedRelation,SourceRelationRule,indexKeywords,jaccard,intersection,linkIntentRecords,records,byId,keywordIndex,symbolResolutionIndex,candidatePairs,resolvableBasenames,left,right,evidence,directed,deduplicateRecords,byId,existing,collectCandidatePairs,buckets,astIds,moduleAstIds,declarationAstIds,configurationIds,isModuleTopicSource,indexTargetBuckets,indexAliases,indexKeywordBuckets,indexTopicBuckets,addToBucket,values,isSuppressedConfigurationPair,pairsFromBuckets,output,leftId,rightId,isSuppressedAstPair,leftAst,rightAst,astId,indexResolvableBasenames,owners,normalized,basename,paths,pathsIntersect,expand,output,aliases,full,leftSet,scorePair,score,leftKeywords,rightKeywords,resolvedNlAstSymbol,capabilityOverlap,objectSimilarity,sharedTopics,intersectionSize,size,isFileAggregateEvidencePair,isModuleTopicEvidencePair,determineRelation,textScore,sourceRelation,relationForSourceKinds,relation,matchSourceRule,orientRelation,intersects,set,intersectsAliases,set,countBy,key - PairEvidence: - RecordKeywords: - DirectedRelation: - SourceRelationRule: - indexKeywords() - jaccard() - intersection() - linkIntentRecords() - records() - byId() - keywordIndex() - symbolResolutionIndex() - candidatePairs() - resolvableBasenames() + normalizeToken() + keywords() + GENERIC_TOPICS() + topicKeywords() + separated() + foldTopicToken() + aliased() + singular() + similarity() left() right() - evidence() - directed() - deduplicateRecords() - byId() - existing() - collectCandidatePairs() - buckets() - astIds() - moduleAstIds() - declarationAstIds() - configurationIds() - isModuleTopicSource() - indexTargetBuckets() - indexAliases() - indexKeywordBuckets() - indexTopicBuckets() - addToBucket() + intersection() + extractBacktickValues() + value() + extractPaths() + FILE_EXTENSIONS() + hasFileExtension() + last() + dot() + PATH_ROOTS() + isPathLike() + segments() + HOST_TLDS() + isHostname() + parts() + tld() + extractSymbols() + repositoryPaths() + backticks() + camel() + ticketPrefixes() + extractTickets() values() - isSuppressedConfigurationPair() - pairsFromBuckets() - output() - leftId() - rightId() - isSuppressedAstPair() - leftAst() - rightAst() - astId() - indexResolvableBasenames() - owners() + extractVersions() + inferObject() normalized() - basename() - paths() - pathsIntersect() - expand() - output() - aliases() - full() - leftSet() - scorePair() - score() - leftKeywords() - rightKeywords() - resolvedNlAstSymbol() - capabilityOverlap() - objectSimilarity() - sharedTopics() - intersectionSize() - size() - isFileAggregateEvidencePair() - isModuleTopicEvidencePair() - determineRelation() - textScore() - sourceRelation() - relationForSourceKinds() - relation() - matchSourceRule() - orientRelation() - intersects() - set() - intersectsAliases() - set() - countBy() - key() - src/extractors/nl-llm.ts: - i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./nl.js,node:fs,node:path,node:url - e: RawNlRecord,NlResponse,AuditedNlExtractionResult,NlLlmRequiredError,NlAttemptError - RawNlRecord: - NlResponse: - AuditedNlExtractionResult: - NlLlmRequiredError: super(-1),extractNlIntentAudited(-1),assertNlExtractionOptions(-1),startedAt(-1),result(-1),client(-1),absolute(-1),body(-1),sourcePath(-1),maxLine(-1),prompt(-1),response(-1),records(-1),failure(-1),responses(-1) - NlAttemptError: super(-1),extractNlWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failedAudit(-1),deterministic(-1),markDeterministic(-1),toIntentRecord(-1),start(-1),end(-1),lines(-1),excerpt(-1),action(-1),normalizedText(-1),statementText(-1),OBJECT_PLACEHOLDERS(-1),nonEmptyText(-1),isPlaceholder(-1),text(-1),resolveObject(-1),fallback(-1),audit(-1),clampLine(-1),allowedAction(-1),allowedModality(-1),readPrompt(-1),promptPath(-1),nlStrings(-1),NL_RECORD_CONTRACT(-1),NL_RESPONSE_CONTRACT(-1) - src/extractors/docs-deterministic.ts: - i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path - e: DeterministicDocumentationOptions,MAX_HEADING_LEVEL,MIN_STATEMENT_CHARS,extractDocumentationBaseline,root,resolver,body,primePathMapper,resolved,mapped,convertDocument,relative,lines,raw,fenceMatch,marker,language,record,heading,level,title,bullet,block,record,paragraph,record,readParagraph,cursor,line,qualifyingStatement,target,hasCodeSpanIdentifier,statementRecord,action,codeBlockRecord,targetsOf - DeterministicDocumentationOptions: - MAX_HEADING_LEVEL() - MIN_STATEMENT_CHARS() - extractDocumentationBaseline() - root() - resolver() - body() - primePathMapper() - resolved() - mapped() - convertDocument() - relative() + withoutAction() + result() + normalizeForObject() + removeObjectAction() + stripObjectConnector() + splitIntentLines() lines() raw() - fenceMatch() - marker() - language() - record() - heading() - level() - title() - bullet() - block() - record() - paragraph() - record() - readParagraph() - cursor() - line() - qualifyingStatement() - target() - hasCodeSpanIdentifier() - statementRecord() - action() - codeBlockRecord() - targetsOf() - src/evaluation/gold-cases.ts: - i: ../core/id.js,../core/record.js,../core/types.js,../graph/diagnostics.js,../graph/linker.js,../synthesis/validation.js,../version.js,./gold-metrics.js - e: LinkingCaseResult,RerankingCaseResult,DiagnosticsCaseResult,Dsl2TodoCaseResult,evaluateLinkingCase,idToLabel,graph,observed,actual,expected,byClass,forbidden,forbiddenViolations,evaluateRerankingCase,idToLabel,declarationRecordId,graph,candidates,moduleRecordId,candidateByModule,decisions,moduleRecordId,candidate,rerank,augmented,observed,expected,forbidden,forbiddenViolations,classifyRelation,exact,evaluateDiagnosticsCase,idToLabel,graph,report,observed,forbidden,forbiddenViolations,evaluateDsl2TodoCase,graph,diagnostics,diagnosticIds,conclusion,proposals,validation,duplicateIds,actual,expected,citations,buildConclusion,buildProposal,recordIds,id,countCitations,citationRequired,citationCited,buildFixtureRecords,labels,records,record,deterministicGeneration - LinkingCaseResult: - RerankingCaseResult: - DiagnosticsCaseResult: - Dsl2TodoCaseResult: - evaluateLinkingCase() - idToLabel() - graph() - observed() + cleaned() + pieces() + value() + src/evaluation/gold.ts: + i: ../core/id.js,./gold-extraction.js,node:fs + e: EvaluationCore,EvaluationRun,EvaluationResult,loadGoldDataset,parsed,evaluateGoldDataset,first,second,stable,goldReportIsPerfect,renderGoldReportMarkdown,percent,support,rows,value,evaluateOnce,extraction,linking,dsl2todo,diagnostics,evaluateExtraction,byChannel,actual,overall,evaluateDiagnostics,counts,forbiddenViolations,snapshots,result,evaluateLinking,counts,byClass,forbiddenViolations,snapshots,result,reranking,evaluateDsl2Todo,duplicateCounts,snapshots,result + EvaluationCore: + EvaluationRun: + EvaluationResult: + loadGoldDataset() + parsed() + evaluateGoldDataset() + first() + second() + stable() + goldReportIsPerfect() + renderGoldReportMarkdown() + percent() + support() + rows() + value() + evaluateOnce() + extraction() + linking() + dsl2todo() + diagnostics() + evaluateExtraction() + byChannel() actual() - expected() + overall() + evaluateDiagnostics() + counts() + forbiddenViolations() + snapshots() + result() + evaluateLinking() + counts() byClass() - forbidden() forbiddenViolations() - evaluateRerankingCase() - idToLabel() - declarationRecordId() - graph() - candidates() - moduleRecordId() - candidateByModule() - decisions() - moduleRecordId() - candidate() + snapshots() + result() + reranking() + evaluateDsl2Todo() + duplicateCounts() + snapshots() + result() + src/live/contract-check.ts: + i: ../core/types.js + e: LiveBudget,LiveStageMeasurement,LiveHistoryRecord,LiveHistoryStageSummary,LiveHistorySummary,LiveContractAudit,LIVE_HISTORY_LIMIT,liveRequestTimeoutMs,measureLiveStages,missingLiveStages,measureStage,responses,overLatency,sumUsage,values,buildLiveAudit,stages,missingStages,totalLatencyMs,costs,totalCostUsd,overCost,overTotalLatency,buildRecordedLiveAudit,initial,history,toLiveHistoryRecord,appendLiveHistory,kept,summarizeLiveHistory,runs,byStage,entries,redactLiveMessage,renderLiveReport,lines,status,cost,detail,total,median,middle,value,ratio,round + LiveBudget: + LiveStageMeasurement: + LiveHistoryRecord: + LiveHistoryStageSummary: + LiveHistorySummary: + LiveContractAudit: + LIVE_HISTORY_LIMIT() + liveRequestTimeoutMs() + measureLiveStages() + missingLiveStages() + measureStage() + responses() + overLatency() + sumUsage() + values() + buildLiveAudit() + stages() + missingStages() + totalLatencyMs() + costs() + totalCostUsd() + overCost() + overTotalLatency() + buildRecordedLiveAudit() + initial() + history() + toLiveHistoryRecord() + appendLiveHistory() + kept() + summarizeLiveHistory() + runs() + byStage() + entries() + redactLiveMessage() + renderLiveReport() + lines() + status() + cost() + detail() + total() + median() + middle() + value() + ratio() + round() + src/communication/intake-contract.ts: + i: node:crypto + e: VerifiedPrincipal,ParticipantV2,ParticipantRegistryV2,IntakeEnvelope,IntakeDiagnostic,IntakeResult,IntakeError + VerifiedPrincipal: + ParticipantV2: + ParticipantRegistryV2: + IntakeEnvelope: + IntakeDiagnostic: + IntakeResult: + IntakeError: super(-1),payloadHash(-1),canonicalJson(-1),record(-1),assertIntakeEnvelope(-1),envelope(-1),validateIntakeEnvelopeHeader(-1),validateIntakeEnvelopeTimestamp(-1),assertCommand(-1),assertQuery(-1),invalid(-1),validateIntakeEnvelopeHeader(-1),invalid(-1),invalid(-1),validateIntakeEnvelopeTimestamp(-1),invalid(-1),assertCommand(-1),base(-1),validateCommandPayload(-1),validateCommandPayload(-1),assertParticipant(-1),participantId(-1),assertPrincipal(-1),participantId(-1),role(-1),stringArray(-1),capabilities(-1),participantId(-1),role(-1),ticketId(-1),invalid(-1),invalid(-1),participantId(-1),ticketId(-1),invalid(-1),assertQuery(-1),base(-1),validateQueryPayload(-1),validateQueryPayload(-1),nonBlank(-1),participantId(-1),ticketId(-1),nonBlank(-1),participantId(-1),ticketId(-1),invalid(-1),assertParticipant(-1),entry(-1),participantId(-1),nonBlank(-1),capabilities(-1),stringArray(-1),principalKey(-1),assertPrincipal(-1),principal(-1),nonBlank(-1),nonBlank(-1),commandFields(-1),type(-1),queryFields(-1),type(-1),strictObject(-1),record(-1),allowed(-1),extra(-1),missing(-1),participantId(-1),ticketId(-1),role(-1),nonBlank(-1),stringArray(-1),capabilities(-1),allowed(-1),invalid(-1),diagnostic(-1),known(-1) + golang/ast_extract.go: + e: Fact,output,factCollector,main,emit,collectGoFiles,parseFile,position,excerpt,add,visitDecl,visitFunc,visitGenDecl,visitCalls,typeName,declaredTypeKind,strPtr,toSlash + Fact: + output: + factCollector: + main() + emit() + collectGoFiles() + parseFile() + position() + excerpt() + add() + visitDecl() + visitFunc() + visitGenDecl() + visitCalls() + typeName() + declaredTypeKind() + strPtr() + toSlash() + scripts/research/rerank-embedding-shortlist.mjs: + i: ../../dist/src/config/env.js,../../dist/src/semantic/reranker-llm.js,node:fs,node:path + e: options,records,selectedRows,declaration,module,candidateSet,config,rerank,augmentedGraph,originalRelationIds,originallyRelatedPairs,candidateById,accepted,candidate,relation,verdictCounts,resolveDeclaration,exact,matches,resolveModule,exact,matches,readJson,parseArgs,values,key,value,required,value,top + options() + records() + selectedRows() + declaration() + module() + candidateSet() + config() rerank() - augmented() - observed() - expected() - forbidden() - forbiddenViolations() - classifyRelation() + augmentedGraph() + originalRelationIds() + originallyRelatedPairs() + candidateById() + accepted() + candidate() + relation() + verdictCounts() + resolveDeclaration() exact() - evaluateDiagnosticsCase() - idToLabel() + matches() + resolveModule() + exact() + matches() + readJson() + parseArgs() + values() + key() + value() + required() + value() + top() + src/cli.ts: + i: ./communication/analyzer.js,./communication/llm.js,./comparison/workspace.js,./config/env.js,./core/io.js,./core/types.js,./diff/git.js,./diff/reality.js,./extractors/ast.js,./extractors/configuration.js,./extractors/docs-llm.js,./extractors/git.js,./extractors/markdown-llm.js,./extractors/nl-llm.js,./extractors/runtime-cycle.js,./graph/diagnostics.js,./graph/diff.js,./graph/linker.js,./interfaces/a2a.js,./interfaces/intake-actions.js,./interfaces/mcp.js,./pipeline/run.js,./services/actions.js,./summary/summarizer.js,./version.js,./watch/watcher.js,node:child_process,node:fs,node:path,node:url,node:util + e: ParsedArgs,execFileAsync,main,parsed,command,config,handler,commandHandlers,resolveMainCommand,handleLink,files,records,graph,handleDiagnose,graphFile,graph,handleSummarize,graphFile,graph,diagnosticsPath,diagnostics,result,out,handleProposeTodo,graphPath,diagnosticsPath,output,result,handleRenderTodo,synthesisPath,graphPath,diagnosticsPath,patch,audit,result,handleApplyTodo,patch,audit,receipt,actor,approvalHash,result,handleProposeCodeChange,graphPath,diagnosticsPath,output,result,handleRenderCodeChange,plansPath,patch,audit,result,handleProposeSourcePatch,inputPath,output,isPlanSet,result,handleApplySourcePatch,patchPath,actor,approvalHash,receipt,result,handleEvaluateCodeChange,planPath,beforeGraphPath,afterGraphPath,output,result,handleCloseCodeChange,inputPath,beforeGraphPath,afterGraphPath,output,result,handleCompareWorkspace,root,result,handlePipeline,root,options,result,handleWatch,root,taskFile,pipeline,controller,stop,resolvePipelineRoot,buildPipelineOptions,buildCommonPipelineOptions,resolveWatchTaskFile,buildWorkspaceComparisonOptions,formatWatchEvent,stamp,handleDiff,mode,out,svg,html,maxRows,parseDiffMode,mode,handleGraphDiff,beforeFile,afterFile,diff,out,svg,buildDiffPayload,buildFileDiff,beforeFile,afterFile,context,buildGitDiff,context,root,result,handleReality,graphFile,graph,diagnosticsPath,diagnostics,view,out,svg,markdown,handleExtract,extractor,root,out,handler,handleExtractNl,file,inline,result,handleExtractGit,result,handleExtractAst,result,handleExtractConfig,result,handleExtractRuntime,cycle,result,handleExtractMarkdown,result,handleExtractDocs,result,handleExtractCommunication,result,handleCommunication,root,graph,analysis,out,markdown,graphOut,emitExtraction,emitJson,handleIntake,operation,inputPath,absolute,result,intakeExitCode,initProject,moduleRoot,sourceEnv,targetEnv,task,sourceIgnore,targetIgnore,doctor,result,parseArgs,options,value,next,name,next,optionString,value,optionNullableString,value,optionBoolean,value,optionNumber,value,number,optionList,value,optionNlMode,optionLlmMode,value,optionTaskMode,value,optionSummaryMode,optionPipelineTaskMode,value,reportPipelineDegradation,printHelp,invokedPath + ParsedArgs: + execFileAsync() + main() + parsed() + command() + config() + handler() + commandHandlers() + resolveMainCommand() + handleLink() + files() + records() graph() - report() - observed() - forbidden() - forbiddenViolations() - evaluateDsl2TodoCase() + handleDiagnose() + graphFile() + graph() + handleSummarize() + graphFile() graph() + diagnosticsPath() diagnostics() - diagnosticIds() - conclusion() - proposals() - validation() - duplicateIds() - actual() - expected() - citations() - buildConclusion() - buildProposal() - recordIds() - id() - countCitations() - citationRequired() - citationCited() - buildFixtureRecords() - labels() - records() - record() - deterministicGeneration() - src/core/record.ts: - i: ./id.js,./target.js,./version.js - e: BuildRecordGenerationInput,BuildRecordInput,buildRecord,rawExcerpt,withRecordGeneration,generationMetadata,used,extractorIdentity,separator,clamp,sourcePrefix - BuildRecordGenerationInput: - BuildRecordInput: - buildRecord() - rawExcerpt() - withRecordGeneration() - generationMetadata() - used() - extractorIdentity() - separator() - clamp() - sourcePrefix() - sdk/rust/src/client.rs: - i: crate::,serde_json::,std::io::,std::net::,std::sync::atomic::,std::time::,super:: - e: Client - Client: - src/tf/classifier.ts: - i: ../config/env.js,../core/text.js,../core/types.js,node:fs,node:path,node:url - e: TfTensor,TfModel,TfModule,ModelAssets,dynamicImport,importer,loadAssets,directory,vocabularyPath,labels,loadClassifier,modelPath,modulePath,moduleValue,absolute,model,assets,vectorize,values,index,classifyAction,fallback,loaded,vector,input,predictionValue,prediction,probabilities,bestIndex,action,confidence - TfTensor: - TfModel: - TfModule: - ModelAssets: - dynamicImport() - importer() - loadAssets() - directory() - vocabularyPath() - labels() - loadClassifier() - modelPath() - modulePath() - moduleValue() - absolute() - model() - assets() - vectorize() - values() - index() - classifyAction() - fallback() - loaded() - vector() - input() - predictionValue() - prediction() - probabilities() - bestIndex() - action() - confidence() - src/extractors/markdown-paths.ts: - i: ../core/io.js,node:fs,node:fs,node:path - e: MarkdownPathResolver,PATH_SEARCH_EXCLUDES,MAX_INDEXED_FILES,createMarkdownPathResolver,repositoryRoot,basenames,headingDirectories,normalized,candidate,matches,isRepositoryPath,absolute,headingScopes,buildBasenameIndex,index,base,seen,directory,absolute,matches - MarkdownPathResolver: - PATH_SEARCH_EXCLUDES() - MAX_INDEXED_FILES() - createMarkdownPathResolver() - repositoryRoot() - basenames() - headingDirectories() - normalized() - candidate() - matches() - isRepositoryPath() - absolute() - headingScopes() - buildBasenameIndex() - index() - base() - seen() - directory() - absolute() - matches() - sdk/typescript/examples/basic.ts: - i: ../src/index.js - e: baseUrl,token,root,main,client,health,card,nl,ast,markdown,graph,diagnostics,synthesis,validation,rendered,artifact,reality,gitDiff,comparison - baseUrl() - token() + result() + out() + handleProposeTodo() + graphPath() + diagnosticsPath() + output() + result() + handleRenderTodo() + synthesisPath() + graphPath() + diagnosticsPath() + patch() + audit() + result() + handleApplyTodo() + patch() + audit() + receipt() + actor() + approvalHash() + result() + handleProposeCodeChange() + graphPath() + diagnosticsPath() + output() + result() + handleRenderCodeChange() + plansPath() + patch() + audit() + result() + handleProposeSourcePatch() + inputPath() + output() + isPlanSet() + result() + handleApplySourcePatch() + patchPath() + actor() + approvalHash() + receipt() + result() + handleEvaluateCodeChange() + planPath() + beforeGraphPath() + afterGraphPath() + output() + result() + handleCloseCodeChange() + inputPath() + beforeGraphPath() + afterGraphPath() + output() + result() + handleCompareWorkspace() root() - main() - client() - health() - card() - nl() - ast() + result() + handlePipeline() + root() + options() + result() + handleWatch() + root() + taskFile() + pipeline() + controller() + stop() + resolvePipelineRoot() + buildPipelineOptions() + buildCommonPipelineOptions() + resolveWatchTaskFile() + buildWorkspaceComparisonOptions() + formatWatchEvent() + stamp() + handleDiff() + mode() + out() + svg() + html() + maxRows() + parseDiffMode() + mode() + handleGraphDiff() + beforeFile() + afterFile() + diff() + out() + svg() + buildDiffPayload() + buildFileDiff() + beforeFile() + afterFile() + context() + buildGitDiff() + context() + root() + result() + handleReality() + graphFile() + graph() + diagnosticsPath() + diagnostics() + view() + out() + svg() markdown() + handleExtract() + extractor() + root() + out() + handler() + handleExtractNl() + file() + inline() + result() + handleExtractGit() + result() + handleExtractAst() + result() + handleExtractConfig() + result() + handleExtractRuntime() + cycle() + result() + handleExtractMarkdown() + result() + handleExtractDocs() + result() + handleExtractCommunication() + result() + handleCommunication() + root() graph() - diagnostics() - synthesis() - validation() - rendered() - artifact() - reality() - gitDiff() - comparison() - python/ast_extract.py: - e: FactVisitor,source_hash,dotted_name,is_module_entrypoint,iter_python_files,main - FactVisitor(ast.NodeVisitor): __init__(2),excerpt(1),add(6),visit_Import(1),visit_ImportFrom(1),visit_FunctionDef(1),visit_AsyncFunctionDef(1),visit_ClassDef(1),add_named_constant(3),visit_Assign(1),visit_AnnAssign(1),visit_If(1),visit_Call(1) - source_hash(value) - dotted_name(node) - is_module_entrypoint(node) - iter_python_files(root;files_from) - main() - examples/backend/src/server.ts: - i: ./store.js,./validation.js,node:http - e: BackendOptions,MAX_BODY_BYTES,createBackend,store,server,handleRequest,url,body,validation,event,offset,limit,readBody,size,buffer,sendJson,body,startBackend,port,host - BackendOptions: - MAX_BODY_BYTES() - createBackend() - store() - server() - handleRequest() - url() - body() - validation() - event() - offset() - limit() - readBody() - size() - buffer() - sendJson() - body() - startBackend() - port() - host() - src/graph/symbol-resolution.ts: - i: ../core/target.js,../core/types.js - e: AstSymbolCandidate,NlSymbolResolution,SymbolResolutionIndex,buildSymbolResolutionIndex,byAlias,values,byNlRecord,hasResolvedNlAstSymbolPair,nl,ast,resolveSymbol,matched,selected,paths,pathSelects,normalized,candidatePath,uniquePaths,isAstDeclaration - AstSymbolCandidate: - NlSymbolResolution: - SymbolResolutionIndex: - buildSymbolResolutionIndex() - byAlias() - values() - byNlRecord() - hasResolvedNlAstSymbolPair() - nl() - ast() - resolveSymbol() - matched() - selected() - paths() - pathSelects() - normalized() - candidatePath() - uniquePaths() - isAstDeclaration() - src/core/io.ts: - i: ./types.js,node:fs,node:path - e: WalkOptions,DEFAULT_IGNORED_DIRS,ensureDir,readText,stat,pathExists,writeJson,writeText,writeJsonl,readJsonl,body,readJson,walkFiles,ignored,extensions,maxFiles,matcher,base,visit,entries,absolute,relative,extension,escapeRegex,globToRegExp,normalized,char,next,after,matchesAnyGlob,normalized,resolveGlobs,files,absolute,relative,relative,relativePosix - WalkOptions: - DEFAULT_IGNORED_DIRS() - ensureDir() - readText() - stat() - pathExists() - writeJson() - writeText() - writeJsonl() - readJsonl() - body() - readJson() - walkFiles() - ignored() - extensions() - maxFiles() - matcher() - base() - visit() - entries() + analysis() + out() + markdown() + graphOut() + emitExtraction() + emitJson() + handleIntake() + operation() + inputPath() absolute() - relative() - extension() - escapeRegex() - globToRegExp() - normalized() - char() + result() + intakeExitCode() + initProject() + moduleRoot() + sourceEnv() + targetEnv() + task() + sourceIgnore() + targetIgnore() + doctor() + result() + parseArgs() + options() + value() next() - after() - matchesAnyGlob() - normalized() - resolveGlobs() - files() - absolute() - relative() - relative() - relativePosix() - scripts/verify-no-llm-imports.mjs: - i: node:fs,node:path - e: visited,visit,body,resolved,resolveSource,raw - visited() - visit() - body() - resolved() - resolveSource() - raw() - src/live/contract-check.ts: - i: ../core/types.js - e: LiveBudget,LiveStageMeasurement,LiveHistoryRecord,LiveHistoryStageSummary,LiveHistorySummary,LiveContractAudit,LIVE_HISTORY_LIMIT,liveRequestTimeoutMs,measureLiveStages,missingLiveStages,measureStage,responses,overLatency,sumUsage,values,buildLiveAudit,stages,missingStages,totalLatencyMs,costs,totalCostUsd,overCost,overTotalLatency,buildRecordedLiveAudit,initial,history,toLiveHistoryRecord,appendLiveHistory,kept,summarizeLiveHistory,runs,byStage,entries,redactLiveMessage,renderLiveReport,lines,status,cost,detail,total,median,middle,value,ratio,round - LiveBudget: - LiveStageMeasurement: - LiveHistoryRecord: - LiveHistoryStageSummary: - LiveHistorySummary: - LiveContractAudit: - LIVE_HISTORY_LIMIT() - liveRequestTimeoutMs() - measureLiveStages() - missingLiveStages() - measureStage() - responses() - overLatency() - sumUsage() - values() - buildLiveAudit() - stages() - missingStages() - totalLatencyMs() - costs() - totalCostUsd() - overCost() - overTotalLatency() - buildRecordedLiveAudit() - initial() - history() - toLiveHistoryRecord() - appendLiveHistory() - kept() - summarizeLiveHistory() - runs() - byStage() - entries() - redactLiveMessage() - renderLiveReport() - lines() - status() - cost() - detail() - total() - median() - middle() + name() + next() + optionString() value() - ratio() - round() - src/extractors/docs-record.ts: - i: ../core/record.js,../version.js,./docs-types.js - e: OBJECT_PLACEHOLDERS,toDocumentIntentRecord,statementText,target,action,modality,isPlaceholder,resolveObject,fallback,anchorToSource,claimedStart,claimedEnd,wanted,lines,scores,claimedScore,bestScore,bestIndex,anchored,keywordOverlap,present,shared,resolveTarget,hasTarget,resolveAction,derived,resolveModality,derived,linesFromChunk,lines,relativeStart,relativeEnd,clampLine,allowedAction,allowedModality,allowedLifecycle - OBJECT_PLACEHOLDERS() - toDocumentIntentRecord() - statementText() - target() - action() - modality() - isPlaceholder() - resolveObject() - fallback() - anchorToSource() - claimedStart() - claimedEnd() - wanted() - lines() - scores() - claimedScore() - bestScore() - bestIndex() - anchored() - keywordOverlap() - present() - shared() - resolveTarget() - hasTarget() - resolveAction() - derived() - resolveModality() - derived() - linesFromChunk() - lines() - relativeStart() - relativeEnd() - clampLine() - allowedAction() - allowedModality() - allowedLifecycle() - src/evaluation/gold.ts: - i: ../core/id.js,./gold-extraction.js,node:fs - e: EvaluationCore,EvaluationRun,EvaluationResult,loadGoldDataset,parsed,evaluateGoldDataset,first,second,stable,goldReportIsPerfect,renderGoldReportMarkdown,percent,support,rows,value,evaluateOnce,extraction,linking,dsl2todo,diagnostics,evaluateExtraction,byChannel,actual,overall,evaluateDiagnostics,counts,forbiddenViolations,snapshots,result,evaluateLinking,counts,byClass,forbiddenViolations,snapshots,result,reranking,evaluateDsl2Todo,duplicateCounts,snapshots,result - EvaluationCore: - EvaluationRun: - EvaluationResult: - loadGoldDataset() - parsed() - evaluateGoldDataset() - first() - second() - stable() - goldReportIsPerfect() - renderGoldReportMarkdown() - percent() - support() - rows() + optionNullableString() value() - evaluateOnce() - extraction() - linking() - dsl2todo() + optionBoolean() + value() + optionNumber() + value() + number() + optionList() + value() + optionNlMode() + optionLlmMode() + value() + optionTaskMode() + value() + optionSummaryMode() + optionPipelineTaskMode() + value() + reportPipelineDegradation() + printHelp() + invokedPath() + src/services/actions.ts: + i: ../communication/analyzer.js,../communication/llm.js,../comparison/workspace.js,../config/env.js,../core/io.js,../core/security.js,../core/types.js,../core/types.js,../diff/git.js,../diff/reality.js,../extractors/ast.js,../extractors/configuration.js,../extractors/docs-llm.js,../extractors/git.js,../extractors/markdown-llm.js,../extractors/nl-llm.js,../graph/diagnostics.js,../graph/diff.js,../graph/linker.js,../pipeline/run.js,../summary/summarizer.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,node:path + e: CommunicationGraphFilter,executeAction,root,handler,executeExtractNlAction,file,text,executeExtractGitAction,executeExtractAstAction,executeExtractConfigAction,executeExtractMarkdownAction,executeExtractDocsAction,executeExtractCommunicationAction,executeAnalyzeCommunicationAction,analysis,executeLinkAction,records,executeDiagnoseAction,graph,executeSummarizeAction,graph,diagnostics,executeProposeTodoAction,graph,diagnostics,result,output,executeRenderTodoAction,graph,diagnostics,synthesis,todoPath,patchPath,auditPath,todoContent,rendered,executeApplyTodoAction,todoPath,patchPath,auditPath,receiptPath,result,executeProposeCodeChangeAction,graph,diagnostics,conclusions,proposals,result,output,executeRenderCodeChangeAction,planSet,review,patchPath,auditPath,executeProposeSourcePatchAction,plan,unifiedDiffs,patch,output,planSet,result,output,executeApplySourcePatchAction,patch,receiptPath,result,executeEvaluateCodeChangeAction,plan,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,result,output,executeCloseCodeChangeAction,beforeGraph,beforeDiagnostics,afterGraph,afterDiagnostics,value,planSet,result,output,executeDiffAction,beforeInput,afterInput,before,after,diff,svg,executeDiffFilesAction,beforePath,afterPath,diff,executeDiffGitAction,result,executeRealityAction,graph,diagnostics,view,executeCompareWorkspaceAction,executePipelineAction,filterCommunicationGraph,filter,records,parseCommunicationGraphFilter,participant,role,ticket,communicationOnly,matchesCommunicationFilter,matchesParticipant,matchesRole,matchesTicket,nlModeValue,llmModeValue,taskSynthesisMode,summaryModeValue,pipelineTaskMode,withTextDiffViews,title,readGraphInput,safePath,readActionObject,safePath,resolveRoot,requested,scopedPath,selected,nullableScopedPath,selected,readRecords,files,safeFile,stringValue,nullableString,stringList,numberValue,number,hasInputValue,objectMapOfStrings,booleanValue,objectValue,registerRunArtifacts,manifestPath,manifest + CommunicationGraphFilter: + executeAction() + root() + handler() + executeExtractNlAction() + file() + text() + executeExtractGitAction() + executeExtractAstAction() + executeExtractConfigAction() + executeExtractMarkdownAction() + executeExtractDocsAction() + executeExtractCommunicationAction() + executeAnalyzeCommunicationAction() + analysis() + executeLinkAction() + records() + executeDiagnoseAction() + graph() + executeSummarizeAction() + graph() + diagnostics() + executeProposeTodoAction() + graph() diagnostics() - evaluateExtraction() - byChannel() - actual() - overall() - evaluateDiagnostics() - counts() - forbiddenViolations() - snapshots() result() - evaluateLinking() - counts() - byClass() - forbiddenViolations() - snapshots() + output() + executeRenderTodoAction() + graph() + diagnostics() + synthesis() + todoPath() + patchPath() + auditPath() + todoContent() + rendered() + executeApplyTodoAction() + todoPath() + patchPath() + auditPath() + receiptPath() result() - reranking() - evaluateDsl2Todo() - duplicateCounts() - snapshots() + executeProposeCodeChangeAction() + graph() + diagnostics() + conclusions() + proposals() result() - scripts/research/rerank-embedding-shortlist.mjs: - i: ../../dist/src/config/env.js,../../dist/src/semantic/reranker-llm.js,node:fs,node:path - e: options,records,selectedRows,declaration,module,candidateSet,config,rerank,augmentedGraph,originalRelationIds,originallyRelatedPairs,candidateById,accepted,candidate,relation,verdictCounts,resolveDeclaration,exact,matches,resolveModule,exact,matches,readJson,parseArgs,values,key,value,required,value,top - options() + output() + executeRenderCodeChangeAction() + planSet() + review() + patchPath() + auditPath() + executeProposeSourcePatchAction() + plan() + unifiedDiffs() + patch() + output() + planSet() + result() + output() + executeApplySourcePatchAction() + patch() + receiptPath() + result() + executeEvaluateCodeChangeAction() + plan() + beforeGraph() + beforeDiagnostics() + afterGraph() + afterDiagnostics() + result() + output() + executeCloseCodeChangeAction() + beforeGraph() + beforeDiagnostics() + afterGraph() + afterDiagnostics() + value() + planSet() + result() + output() + executeDiffAction() + beforeInput() + afterInput() + before() + after() + diff() + svg() + executeDiffFilesAction() + beforePath() + afterPath() + diff() + executeDiffGitAction() + result() + executeRealityAction() + graph() + diagnostics() + view() + executeCompareWorkspaceAction() + executePipelineAction() + filterCommunicationGraph() + filter() records() - selectedRows() - declaration() - module() - candidateSet() - config() - rerank() - augmentedGraph() - originalRelationIds() - originallyRelatedPairs() - candidateById() - accepted() - candidate() - relation() - verdictCounts() - resolveDeclaration() - exact() - matches() - resolveModule() - exact() - matches() - readJson() - parseArgs() - values() + parseCommunicationGraphFilter() + participant() + role() + ticket() + communicationOnly() + matchesCommunicationFilter() + matchesParticipant() + matchesRole() + matchesTicket() + nlModeValue() + llmModeValue() + taskSynthesisMode() + summaryModeValue() + pipelineTaskMode() + withTextDiffViews() + title() + readGraphInput() + safePath() + readActionObject() + safePath() + resolveRoot() + requested() + scopedPath() + selected() + nullableScopedPath() + selected() + readRecords() + files() + safeFile() + stringValue() + nullableString() + stringList() + numberValue() + number() + hasInputValue() + objectMapOfStrings() + booleanValue() + objectValue() + registerRunArtifacts() + manifestPath() + manifest() + src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts: + i: ../../core/io.js,../../core/schema.js,../../core/security.js,../../version.js,./implementation-diagnostics.js,./implementation-source-patch-apply-diff.js,./implementation-source-patch-assert.js,node:crypto,node:fs,node:path + e: ApplyCodeChangeSourcePatchOptions,ApplyCodeChangeSourcePatchResult,NormalizedApplyCodeChangeSourcePatchRequest,SourcePatchApplyLock,SourcePatchEditTarget,PreparedSourceEdit,applyCodeChangeSourcePatch,request,root,receiptPath,lock,idempotentResult,prepared,now,receipt,readExistingReceipt,existing,assertPatchApplicationRequest,patch,assertPatchApprovalActor,assertPatchApprovalHash,assertPatchEditsContainDiffs,acquireApplyLock,lock,prepareSourceEdits,target,before,after,prepareSourceEditTarget,relative,absolute,existed,assertSourcePatchTargetNotSymlink,assertDeleteEditClearsAll,validatePatchTargetForEdit,applyPreparedEdits,receipt,rollbackErrors,writePreparedEdits,buildPatchApplyReceipt,fileHashesAfter,rollbackPreparedEdits,assertExistingSourceReceipt,relative,absolute,exists,current,assertSourceApplyReceipt,validateSourceApplyReceiptShape,validateSourceApplyReceiptIdentity,validateSourceApplyReceiptTimestamps,validateSourceApplyReceiptPathHashes,expectedPaths,hashPaths,validateSourceApplyReceiptGeneration,atomicWriteRaw,exactSourcePatchKeys,actual,exactSourcePatchSet,deterministicGeneration + ApplyCodeChangeSourcePatchOptions: + ApplyCodeChangeSourcePatchResult: + NormalizedApplyCodeChangeSourcePatchRequest: + SourcePatchApplyLock: + SourcePatchEditTarget: + PreparedSourceEdit: + applyCodeChangeSourcePatch() + request() + root() + receiptPath() + lock() + idempotentResult() + prepared() + now() + receipt() + readExistingReceipt() + existing() + assertPatchApplicationRequest() + patch() + assertPatchApprovalActor() + assertPatchApprovalHash() + assertPatchEditsContainDiffs() + acquireApplyLock() + lock() + prepareSourceEdits() + target() + before() + after() + prepareSourceEditTarget() + relative() + absolute() + existed() + assertSourcePatchTargetNotSymlink() + assertDeleteEditClearsAll() + validatePatchTargetForEdit() + applyPreparedEdits() + receipt() + rollbackErrors() + writePreparedEdits() + buildPatchApplyReceipt() + fileHashesAfter() + rollbackPreparedEdits() + assertExistingSourceReceipt() + relative() + absolute() + exists() + current() + assertSourceApplyReceipt() + validateSourceApplyReceiptShape() + validateSourceApplyReceiptIdentity() + validateSourceApplyReceiptTimestamps() + validateSourceApplyReceiptPathHashes() + expectedPaths() + hashPaths() + validateSourceApplyReceiptGeneration() + atomicWriteRaw() + exactSourcePatchKeys() + actual() + exactSourcePatchSet() + deterministicGeneration() + src/llm/openrouter.ts: + i: ../config/env.js,../core/types.js,./structured-schema.js + e: ChatMessage,OpenRouterResult,OpenRouterModelsResponse,OpenRouterModelError,OpenRouterClient + ChatMessage: + OpenRouterResult: + OpenRouterModelsResponse: + OpenRouterModelError: super(-1) + OpenRouterClient: isConfigured(-1),listAvailableModels(-1),controller(-1),timeout(-1),response(-1),text(-1),clearTimeout(-1),chatText(-1),chatTextWithMetadata(-1),response(-1),content(-1),chatJson(-1),result(-1),chatJsonWithMetadata(-1),response(-1),fallback(-1),request(-1),responseMetadata(-1),usage(-1),stringOrNull(-1),finiteOrNull(-1),createModelError(-1),formatInvalidModelError(-1),extractContent(-1),content(-1),parseJsonContent(-1),trimmed(-1),start(-1),end(-1),parseJsonResponse(-1),metadata(-1),message(-1),shouldRetryWithoutJsonSchema(-1) + src/config/env.ts: + i: ../core/io.js,../core/types.js,../version.js,node:fs,node:path + e: T2CConfig,loadEnvFile,explicit,candidates,content,trimmed,separator,key,value,envString,value,envOptional,value,envNumber,raw,value,envBoolean,raw,envList,raw,envLlmMode,value,getConfig,model,root,configForDisplay,hasOpenRouter + T2CConfig: + loadEnvFile() + explicit() + candidates() + content() + trimmed() + separator() key() value() - required() + envString() value() - top() - golang/ast_extract.go: - e: Fact,output,factCollector,main,emit,collectGoFiles,parseFile,position,excerpt,add,visitDecl,visitFunc,visitGenDecl,visitCalls,typeName,declaredTypeKind,strPtr,toSlash - Fact: - output: - factCollector: - main() - emit() - collectGoFiles() - parseFile() - position() - excerpt() - add() - visitDecl() - visitFunc() - visitGenDecl() - visitCalls() - typeName() - declaredTypeKind() - strPtr() - toSlash() - src/operations/subactor.ts: - i: ../core/types.js,./validation.js - e: CompileSubactorEnvelopeOptions,valueMatchesType,assertBinding,ageSeconds,compileSubactorProcessEnvelope,variableById,referenced,variable,binding,humanApproval,binding - CompileSubactorEnvelopeOptions: - valueMatchesType() - assertBinding() - ageSeconds() - compileSubactorProcessEnvelope() - variableById() - referenced() - variable() - binding() - humanApproval() - binding() - src/extractors/git.ts: - i: ../config/env.js,../core/record.js,../core/text.js,../core/types.js,../tf/classifier.js,node:child_process,node:path,node:util - e: GitCommit,ChangedFile,GitExtractionOptions,execFileAsync,extractGitIntent,root,count,inside,message,commit,changedFiles,stats,diff,classified,inferredSymbols,docOnly,runGit,result,readCommits,output,readChangedFiles,output,parts,status,readStats,output,additions,deletions,extractChangedSymbols,output,symbol,isDocumentationPath - GitCommit: - ChangedFile: - GitExtractionOptions: - execFileAsync() - extractGitIntent() + envOptional() + value() + envNumber() + raw() + value() + envBoolean() + raw() + envList() + raw() + envLlmMode() + value() + getConfig() + model() root() - count() - inside() - message() - commit() - changedFiles() - stats() - diff() - classified() - inferredSymbols() - docOnly() - runGit() - result() - readCommits() - output() - readChangedFiles() - output() - parts() - status() - readStats() - output() - additions() - deletions() - extractChangedSymbols() - output() - symbol() - isDocumentationPath() + configForDisplay() + hasOpenRouter() + src/interfaces/a2a-history.ts: + i: ../config/env.js,../core/security.js,node:fs,node:path + e: RunHistoryFilters,listIntentRuns,runsDirectory,entries,items,readRunEntries,readRun,runDirectory,graphPath,manifestPath,manifest,matchesRunFilters,participant,role,ticket,severity,normalized,safeRunPath + RunHistoryFilters: + listIntentRuns() + runsDirectory() + entries() + items() + readRunEntries() + readRun() + runDirectory() + graphPath() + manifestPath() + manifest() + matchesRunFilters() + participant() + role() + ticket() + severity() + normalized() + safeRunPath() src/diff/text-render.ts: i: ./text-types.js e: TextDiffSvgOptions,SideBySideRow,renderUnifiedDiff,marker,toSideBySideRows,index,line,pairs,renderTextDiffSvg,theme,maxRows,maxColumns,title,charWidth,rowHeight,gutterWidth,columnWidth,width,totals,y,rendered,skipped,summarizeDiffs,diffHeading,svgBody,sideBySideRowMarkup,changed,number,renderTextDiffHtml,title,sections,renderHtmlSection,hunks,rows,htmlCell,cssClass,number @@ -2433,36 +1706,62 @@ D: htmlCell() cssClass() number() - src/config/env.ts: - i: ../core/io.js,../core/types.js,../version.js,node:fs,node:path - e: T2CConfig,loadEnvFile,explicit,candidates,content,trimmed,separator,key,value,envString,value,envOptional,value,envNumber,raw,value,envBoolean,raw,envList,raw,envLlmMode,value,getConfig,model,root,configForDisplay,hasOpenRouter - T2CConfig: - loadEnvFile() - explicit() - candidates() - content() - trimmed() - separator() - key() - value() - envString() - value() - envOptional() - value() - envNumber() + src/operations/subactor.ts: + i: ../core/types.js,./validation.js + e: CompileSubactorEnvelopeOptions,valueMatchesType,assertBinding,ageSeconds,compileSubactorProcessEnvelope,variableById,referenced,variable,binding,humanApproval,binding + CompileSubactorEnvelopeOptions: + valueMatchesType() + assertBinding() + ageSeconds() + compileSubactorProcessEnvelope() + variableById() + referenced() + variable() + binding() + humanApproval() + binding() + src/communication/intake-protobuf.ts: + i: ./intake-contract.js + e: encodeIntakeEnvelope,operation,decodeIntakeEnvelope,parsed,values,unknownFields,payload,envelope,encodeIntakeResult,decodeIntakeResult,parsed,strings,numbers,decodeDelimitedFields,values,strings,numbers,offset,fieldStart,field,wire,raw,value,parsePayloadJson,parseOptionalJson,buildIntakeEnvelope,bytesField,data,varintField,writeVarint,remaining,readVarint,value,byte + encodeIntakeEnvelope() + operation() + decodeIntakeEnvelope() + parsed() + values() + unknownFields() + payload() + envelope() + encodeIntakeResult() + decodeIntakeResult() + parsed() + strings() + numbers() + decodeDelimitedFields() + values() + strings() + numbers() + offset() + fieldStart() + field() + wire() raw() value() - envBoolean() - raw() - envList() - raw() - envLlmMode() + parsePayloadJson() + parseOptionalJson() + buildIntakeEnvelope() + bytesField() + data() + varintField() + writeVarint() + remaining() + readVarint() value() - getConfig() - model() - root() - configForDisplay() - hasOpenRouter() + byte() + src/communication/intake-service.ts: + i: ./intake-store.js,node:crypto,node:fs,node:path + e: IntakeState,GovernedIntakeService + IntakeState: + GovernedIntakeService: command(-1),duplicate(-1),state(-1),actor(-1),event(-1),appended(-1),actual(-1),updated(-1),participantId(-1),ticketId(-1),actual(-1),query(-1),stream(-1),state(-1),payload(-1),command(-1),requireManagerOrBootstrap(-1),ensurePrincipalsUnique(-1),requireCapability(-1),requireKnownActor(-1),requireCapability(-1),participant(-1),requireCapability(-1),participant(-1),participant(-1),requireCapability(-1),rejectSecrets(-1),requireCapability(-1),participant(-1),writeProjection(-1),participant(-1),target(-1),messages(-1),body(-1),projectionHash(-1),stat(-1),existing(-1),assertProjectionWritable(-1),target(-1),slug(-1),directory(-1),roleFiles(-1),stat(-1),existing(-1),validateProjection(-1),participant(-1),target(-1),directory(-1),slug(-1),candidates(-1),roleFiles(-1),conflictingFiles(-1),existing(-1),messages(-1),body(-1),hash(-1),replay(-1),participants(-1),participant(-1),participant(-1),participant(-1),registry(-1),resolveActor(-1),requireKnownActor(-1),requireManagerOrBootstrap(-1),requireCapability(-1),requireCapability(-1),requireKnownActor(-1),requireParticipant(-1),participant(-1),ensurePrincipalsUnique(-1),ensurePrincipalAvailable(-1),key(-1),rejectSecrets(-1),accepted(-1),rejected(-1),envelope(-1),unauthorized(-1),duplicate(-1),drift(-1),escapeRegex(-1),commandEnvelope(-1) scripts/live-model-comparison.mjs: i: node:fs,node:path,node:url e: REPO_ROOT,main,probe,timeoutMs,models,root,config,result,comparison,rendered,jsonTarget,markdownTarget,failedAudit,message,writeFile @@ -2481,6 +1780,112 @@ D: failedAudit() message() writeFile() + src/extractors/ast.ts: + i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/ignore.js,../core/io.js,../core/schema.js,../core/types.js,../version.js,./ast/go.js,./ast/java.js,./ast/php.js,./ast/python.js,./ast/rust.js,./ast/typescript.js,./ast/unsupported.js,node:path + e: AstExtractionOptions,ExternalCacheAdapter,extractAstIntent,root,cache,matcher,files,body,relative,extracted,adapterFiles,manifest,result,unsupported,sourceManifest,body,isIntentRecords,isExtractionResult,result + AstExtractionOptions: + ExternalCacheAdapter: + extractAstIntent() + root() + cache() + matcher() + files() + body() + relative() + extracted() + adapterFiles() + manifest() + result() + unsupported() + sourceManifest() + body() + isIntentRecords() + isExtractionResult() + result() + src/extractors/docs-llm.ts: + i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/io.js,../core/types.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,./docs-record.js,./docs-schema.js,node:fs,node:path,node:url + e: DocumentationLlmRequiredError + DocumentationLlmRequiredError: super(-1),extractDocumentationIntent(-1),startedAt(-1),client(-1),requireConfiguredClient(-1),cache(-1),chunks(-1),selectedChunks(-1),systemPrompt(-1),results(-1),requireConfiguredClient(-1),loadDocumentChunks(-1),files(-1),body(-1),relative(-1),fileChunks(-1),isDocumentChunks(-1),candidate(-1),selectWithinBudget(-1),prioritized(-1),selected(-1),extractChunk(-1),contract(-1),records(-1),buildAudit(-1),status(-1),readPrompt(-1),promptPath(-1),errorMessage(-1) + src/extractors/markdown-paths.ts: + i: ../core/io.js,node:fs,node:fs,node:path + e: MarkdownPathResolver,BasenameIndexState,PATH_SEARCH_EXCLUDES,MAX_INDEXED_FILES,createMarkdownPathResolver,repositoryRoot,basenames,headingDirectories,normalized,candidate,matches,isRepositoryPath,absolute,headingScopes,buildBasenameIndex,index,state,directory,entries,createBasenameIndexState,readBasenameDirectoryEntries,isNestedCheckout,scanDirectoryForBasenames,absolute,addBasenameIndexMatch,matches + MarkdownPathResolver: + BasenameIndexState: + PATH_SEARCH_EXCLUDES() + MAX_INDEXED_FILES() + createMarkdownPathResolver() + repositoryRoot() + basenames() + headingDirectories() + normalized() + candidate() + matches() + isRepositoryPath() + absolute() + headingScopes() + buildBasenameIndex() + index() + state() + directory() + entries() + createBasenameIndexState() + readBasenameDirectoryEntries() + isNestedCheckout() + scanDirectoryForBasenames() + absolute() + addBasenameIndexMatch() + matches() + src/core/schema/intent.ts: + i: ../id.js + e: GroundedValidationContext,TodoProposalValidationContext,CodeChangePlanValidationContext,CodeChangeAcceptanceValidationContext,assertIntentRecord,record,recordId,statement,lifecycle,source,epistemic,metadata,assertIntentStatement,statement,assertIntentTarget,target,assertIntentLifecycle,lifecycle,assertIntentSource,source,lines,assertIntentEpistemic,epistemic,assertIntentMetadata,typedMetadata,generation,assertGenerationMatchesExtractor,generation,separator,expectedGenerator,assertIntentGenerationMetadata,generation,assertIntentRecords,assertIntentGraph,graph,recordIds,relationIds,stats,records,expectedFingerprint,assertIntentGraphDiff,diff,records,change,relations,summary,assertRelation,relation + GroundedValidationContext: + TodoProposalValidationContext: + CodeChangePlanValidationContext: + CodeChangeAcceptanceValidationContext: + assertIntentRecord() + record() + recordId() + statement() + lifecycle() + source() + epistemic() + metadata() + assertIntentStatement() + statement() + assertIntentTarget() + target() + assertIntentLifecycle() + lifecycle() + assertIntentSource() + source() + lines() + assertIntentEpistemic() + epistemic() + assertIntentMetadata() + typedMetadata() + generation() + assertGenerationMatchesExtractor() + generation() + separator() + expectedGenerator() + assertIntentGenerationMetadata() + generation() + assertIntentRecords() + assertIntentGraph() + graph() + recordIds() + relationIds() + stats() + records() + expectedFingerprint() + assertIntentGraphDiff() + diff() + records() + change() + relations() + summary() + assertRelation() + relation() src/synthesis/todo-patch.ts: i: ../core/id.js,../core/io.js,./validation.js,node:crypto,node:fs,node:path e: CreateTodoPatchOptions,CreatedTodoPatch,WriteTodoPatchOptions,WrittenTodoPatch,ApplyTodoPatchOptions,diagnosticReportFingerprint,createTodoPatch,expectedValidation,proposalById,selected,proposal,orderedSelected,markdown,renderTodoPatchMarkdown,writeTodoPatchArtifacts,created,patchPath,auditPath,applyTodoPatch,current,receipt,now,currentHash,result,applied,recovered,assertTodoPatchArtifact,artifact,sourceTodo,selected,duplicates,classified,duplicate,assertApproval,assertReceipt,atomicWrite,temporary,existing,handle,appendPatch,separator,wasAlreadyAppended,renderTargets,rendered,renderIds,inline,normalizePath,sameArray,object,exactKeys,expected,missing,extra,nonBlank,hash,isoDate,uniqueIds,uniqueStrings @@ -2508,40 +1913,124 @@ D: now() currentHash() result() - applied() - recovered() - assertTodoPatchArtifact() - artifact() - sourceTodo() - selected() - duplicates() - classified() - duplicate() - assertApproval() - assertReceipt() - atomicWrite() - temporary() - existing() - handle() - appendPatch() - separator() - wasAlreadyAppended() - renderTargets() - rendered() - renderIds() - inline() - normalizePath() - sameArray() - object() - exactKeys() - expected() - missing() - extra() - nonBlank() - hash() - isoDate() - uniqueIds() - uniqueStrings() + applied() + recovered() + assertTodoPatchArtifact() + artifact() + sourceTodo() + selected() + duplicates() + classified() + duplicate() + assertApproval() + assertReceipt() + atomicWrite() + temporary() + existing() + handle() + appendPatch() + separator() + wasAlreadyAppended() + renderTargets() + rendered() + renderIds() + inline() + normalizePath() + sameArray() + object() + exactKeys() + expected() + missing() + extra() + nonBlank() + hash() + isoDate() + uniqueIds() + uniqueStrings() + src/comparison/workspace.ts: + i: ../config/env.js,../core/id.js,../core/io.js,../core/security.js,../core/types.js,../diff/reality.js,../graph/diff.js,../pipeline/run.js,node:child_process,node:fs,node:os,node:path,node:util + e: WorkspaceComparisonOptions,CoverageSnapshot,WorkspaceComparison,execFileAsync,compareWorkspaceIntent,root,repositoryRoot,relativeAnalysisRoot,outputDir,baseRef,baseCommit,headCommit,status,changedFiles,temporaryParent,baseWorktree,baseRoot,pipelineOptions,baseOptions,currentOptions,baseRun,currentRun,baseReality,currentReality,diff,baseCoverage,currentCoverage,alignmentRateDelta,implementationCoverageDelta,plannedCodeCoverageDelta,documentedCodeCoverageDelta,gapsDelta,diagnosticsDelta,comparisonId,comparisonDirectory,artifacts,scopedOutputDirectory,absolute,relative,commonPipelineOptions,optionsForRoot,existingFile,relative,coverage,diagnosticDelta,classifyWorkspaceTrend,severeDelta,improved,regressed,parseAheadBehind,defaultBaseRef,rounded,artifactPaths,relative,renderTrendMarkdown,percent,documentationLine,git,result + WorkspaceComparisonOptions: + CoverageSnapshot: + WorkspaceComparison: + execFileAsync() + compareWorkspaceIntent() + root() + repositoryRoot() + relativeAnalysisRoot() + outputDir() + baseRef() + baseCommit() + headCommit() + status() + changedFiles() + temporaryParent() + baseWorktree() + baseRoot() + pipelineOptions() + baseOptions() + currentOptions() + baseRun() + currentRun() + baseReality() + currentReality() + diff() + baseCoverage() + currentCoverage() + alignmentRateDelta() + implementationCoverageDelta() + plannedCodeCoverageDelta() + documentedCodeCoverageDelta() + gapsDelta() + diagnosticsDelta() + comparisonId() + comparisonDirectory() + artifacts() + scopedOutputDirectory() + absolute() + relative() + commonPipelineOptions() + optionsForRoot() + existingFile() + relative() + coverage() + diagnosticDelta() + classifyWorkspaceTrend() + severeDelta() + improved() + regressed() + parseAheadBehind() + defaultBaseRef() + rounded() + artifactPaths() + relative() + renderTrendMarkdown() + percent() + documentationLine() + git() + result() + src/interfaces/a2a-message.ts: + e: parseSendConfiguration,validateOutputModes,supported,parseMessage,messageId,contextId,taskId,referenceTaskIds,extensions,metadata,parsePart,output,parsePartContent,content,qualifier,ensureSupportedMessageContent,supported,cloneMessage,clonePart,normalizeUserMessage + parseSendConfiguration() + validateOutputModes() + supported() + parseMessage() + messageId() + contextId() + taskId() + referenceTaskIds() + extensions() + metadata() + parsePart() + output() + parsePartContent() + content() + qualifier() + ensureSupportedMessageContent() + supported() + cloneMessage() + clonePart() + normalizeUserMessage() src/summary/payload.ts: i: ../core/types.js e: compactSummaryPayload,referenced,nonAst,moduleAst,relevantAst,ids,selectedRelations,compactRecord @@ -2553,6 +2042,19 @@ D: ids() selectedRelations() compactRecord() + src/evaluation/gold-cli.ts: + i: node:fs,node:path + e: main,args,arg,json,requirePerfect,outIndex,outPath,dataset,report,rendered + main() + args() + arg() + json() + requirePerfect() + outIndex() + outPath() + dataset() + report() + rendered() src/live/model-comparison.ts: i: ../core/types.js,./contract-check.js e: LiveModelRun,LiveModelMeasurement,LiveModelAgreement,LiveModelComparison,measureLiveModelRun,responses,records,enrichedRecords,costUsd,isLlmEnriched,sourceKey,lines,compareLiveModelOutputs,rightBySource,pairs,agreeing,buildLiveModelComparison,models,passing,pick,measured,renderLiveModelComparison,sumUsage,values,round @@ -2581,117 +2083,477 @@ D: sumUsage() values() round() - src/extractors/docs-llm.ts: - i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/io.js,../core/types.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./docs-chunks.js,./docs-record.js,./docs-schema.js,node:fs,node:path,node:url - e: DocumentationLlmRequiredError - DocumentationLlmRequiredError: super(-1),extractDocumentationIntent(-1),startedAt(-1),client(-1),requireConfiguredClient(-1),cache(-1),chunks(-1),selectedChunks(-1),systemPrompt(-1),results(-1),requireConfiguredClient(-1),loadDocumentChunks(-1),files(-1),body(-1),relative(-1),fileChunks(-1),isDocumentChunks(-1),candidate(-1),selectWithinBudget(-1),prioritized(-1),selected(-1),extractChunk(-1),contract(-1),records(-1),buildAudit(-1),status(-1),readPrompt(-1),promptPath(-1),errorMessage(-1) - src/extractors/ast.ts: - i: ../config/env.js,../core/content-cache.js,../core/id.js,../core/ignore.js,../core/io.js,../core/schema.js,../core/types.js,../version.js,./ast/go.js,./ast/java.js,./ast/php.js,./ast/python.js,./ast/rust.js,./ast/typescript.js,./ast/unsupported.js,node:path - e: AstExtractionOptions,ExternalCacheAdapter,extractAstIntent,root,cache,matcher,files,body,relative,extracted,adapterFiles,manifest,result,unsupported,sourceManifest,body,isIntentRecords,isExtractionResult,result - AstExtractionOptions: - ExternalCacheAdapter: - extractAstIntent() + src/watch/watcher.ts: + i: ../config/env.js,../core/ignore.js,../core/types.js,../pipeline/run.js,node:fs,node:path + e: SnapshotDelta,ScanOptions,ReportResult,WatchOptions,WatchConfiguration,WatchRuntime,scanTree,maxFiles,absoluteRoot,visit,absolute,relative,stat,diffSnapshots,previous,describeDelta,shown,rest,DEFAULT_MIN_INTERVAL_MS,DEFAULT_SCAN_INTERVAL_MS,watchRepository,configuration,runtime,defaultSleep,timer,onAbort,finish,createWatchConfiguration,root,minIntervalMs,scanIntervalMs,emit,now,sleep,matcher,runReport,result,createWatchRuntime,initialSnapshot,scanTreeCurrent,evaluateChangeCycle,current,delta,handleDelta,maybeGenerateReport,waitMs,generateReportForReason,startedAt,result + SnapshotDelta: + ScanOptions: + ReportResult: + WatchOptions: + WatchConfiguration: + WatchRuntime: + scanTree() + maxFiles() + absoluteRoot() + visit() + absolute() + relative() + stat() + diffSnapshots() + previous() + describeDelta() + shown() + rest() + DEFAULT_MIN_INTERVAL_MS() + DEFAULT_SCAN_INTERVAL_MS() + watchRepository() + configuration() + runtime() + defaultSleep() + timer() + onAbort() + finish() + createWatchConfiguration() root() - cache() + minIntervalMs() + scanIntervalMs() + emit() + now() + sleep() matcher() - files() + runReport() + result() + createWatchRuntime() + initialSnapshot() + scanTreeCurrent() + evaluateChangeCycle() + current() + delta() + handleDelta() + maybeGenerateReport() + waitMs() + generateReportForReason() + startedAt() + result() + src/communication/identity.ts: + i: ../core/io.js,../core/security.js,./intake-contract.js,node:path + e: ParticipantIdentityEntry,ParticipantIdentityRegistry,LoadedParticipantIdentityRegistry,loadParticipantIdentityRegistry,v2Path,v1Path,registryPath,normalized,normalizeParticipantIdentityRegistry,registry,participants,ids,principals,key,normalizeV2Entry,principals,kind,assertParticipantIdentityRegistry,registry,ids,external,participants,validateRegistryShape,assertParticipantIdentityEntry,entry,participantId,role,values,assertParticipantIdentityId,assertParticipantIdentityRole,assertDisplayName,assertDuplicateId,assertParticipantIdentityField,values,assertParticipantIdentityFieldUnique,owner,assertRoleCompatibility,exactKeys,allowed,missing,extra + ParticipantIdentityEntry: + ParticipantIdentityRegistry: + LoadedParticipantIdentityRegistry: + loadParticipantIdentityRegistry() + v2Path() + v1Path() + registryPath() + normalized() + normalizeParticipantIdentityRegistry() + registry() + participants() + ids() + principals() + key() + normalizeV2Entry() + principals() + kind() + assertParticipantIdentityRegistry() + registry() + ids() + external() + participants() + validateRegistryShape() + assertParticipantIdentityEntry() + entry() + participantId() + role() + values() + assertParticipantIdentityId() + assertParticipantIdentityRole() + assertDisplayName() + assertDuplicateId() + assertParticipantIdentityField() + values() + assertParticipantIdentityFieldUnique() + owner() + assertRoleCompatibility() + exactKeys() + allowed() + missing() + extra() + src/communication/llm/implementation.ts: + i: ../../config/env.js,../../llm/failure.js,../../llm/openrouter.js,../../llm/structured-schema.js + e: ParticipantCommunicationSynthesis,AuditedCommunicationExtractionResult,CommunicationLlmRequiredError,CommunicationAttemptError + ParticipantCommunicationSynthesis: + AuditedCommunicationExtractionResult: + CommunicationLlmRequiredError: super(-1),extractCommunicationIntentAudited(-1),startedAt(-1),deterministic(-1),records(-1),client(-1),groups(-1),response(-1),enrichments(-1),enrichedByOriginal(-1),generation(-1),participants(-1),failure(-1),responses(-1),classifyLlmFailure(-1) + CommunicationAttemptError: super(-1),enrichWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failed(-1),marked(-1) + src/extractors/changelog.ts: + i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path + e: extractChangelog,absolute,body,relative,lines,raw,versionHeading,categoryHeading,bullet,block,text,action,resolvedPaths,changelogAction,normalized,lower + extractChangelog() + absolute() body() relative() - extracted() - adapterFiles() - manifest() - result() - unsupported() - sourceManifest() + lines() + raw() + versionHeading() + categoryHeading() + bullet() + block() + text() + action() + resolvedPaths() + changelogAction() + normalized() + lower() + src/extractors/docs-deterministic.ts: + i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path + e: DeterministicDocumentationOptions,DocumentationContext,LineResult,MAX_HEADING_LEVEL,MIN_STATEMENT_CHARS,extractDocumentationBaseline,root,resolver,body,primePathMapper,resolved,mapped,convertDocument,relative,lines,raw,lineResult,handleDocumentationLine,headingRecord,sectionHeading,bulletRecord,paragraphResult,parseFenceBlock,match,marker,language,record,parseSectionHeading,heading,level,title,record,parseBulletStatement,bullet,block,record,parseParagraphStatement,paragraph,record,readParagraph,cursor,line,qualifyingStatement,target,hasCodeSpanIdentifier,statementRecord,action,codeBlockRecord,targetsOf + DeterministicDocumentationOptions: + DocumentationContext: + LineResult: + MAX_HEADING_LEVEL() + MIN_STATEMENT_CHARS() + extractDocumentationBaseline() + root() + resolver() body() - isIntentRecords() - isExtractionResult() - result() - src/evaluation/gold-cli.ts: - i: node:fs,node:path - e: main,args,arg,json,requirePerfect,outIndex,outPath,dataset,report,rendered - main() - args() - arg() - json() - requirePerfect() - outIndex() - outPath() - dataset() - report() - rendered() - src/comparison/workspace.ts: - i: ../config/env.js,../core/id.js,../core/io.js,../core/security.js,../core/types.js,../diff/reality.js,../graph/diff.js,../pipeline/run.js,node:child_process,node:fs,node:os,node:path,node:util - e: WorkspaceComparisonOptions,CoverageSnapshot,WorkspaceComparison,execFileAsync,compareWorkspaceIntent,root,repositoryRoot,relativeAnalysisRoot,outputDir,baseRef,baseCommit,headCommit,status,changedFiles,temporaryParent,baseWorktree,baseRoot,pipelineOptions,baseOptions,currentOptions,baseRun,currentRun,baseReality,currentReality,diff,baseCoverage,currentCoverage,alignmentRateDelta,implementationCoverageDelta,plannedCodeCoverageDelta,documentedCodeCoverageDelta,gapsDelta,diagnosticsDelta,comparisonId,comparisonDirectory,artifacts,scopedOutputDirectory,absolute,commonPipelineOptions,optionsForRoot,existingFile,relative,coverage,diagnosticDelta,classifyWorkspaceTrend,severeDelta,improved,regressed,parseAheadBehind,defaultBaseRef,rounded,artifactPaths,relative,renderTrendMarkdown,percent,documentationLine,git,result - WorkspaceComparisonOptions: - CoverageSnapshot: - WorkspaceComparison: + primePathMapper() + resolved() + mapped() + convertDocument() + relative() + lines() + raw() + lineResult() + handleDocumentationLine() + headingRecord() + sectionHeading() + bulletRecord() + paragraphResult() + parseFenceBlock() + match() + marker() + language() + record() + parseSectionHeading() + heading() + level() + title() + record() + parseBulletStatement() + bullet() + block() + record() + parseParagraphStatement() + paragraph() + record() + readParagraph() + cursor() + line() + qualifyingStatement() + target() + hasCodeSpanIdentifier() + statementRecord() + action() + codeBlockRecord() + targetsOf() + src/extractors/git.ts: + i: ../config/env.js,../core/record.js,../core/text.js,../core/types.js,../tf/classifier.js,node:child_process,node:fs,node:fs,node:path,node:util + e: GitCommit,ChangedFile,GitExtractionOptions,DiscoveredRepository,RepositoryDiscoveryResult,DiscoveryState,execFileAsync,MAX_DISCOVERED_REPOSITORIES,MAX_DISCOVERY_DIRECTORIES,REPOSITORY_READ_CONCURRENCY,DISCOVERY_EXCLUDED_DIRECTORIES,extractGitIntent,root,count,discovery,results,message,extractRepositoryGitIntent,message,commit,changedFiles,stats,diff,classified,inferredSymbols,scopedFiles,docOnly,discoverGitRepositories,state,current,entries,createDiscoveryState,hasMoreDiscoveryWork,takeNextDiscoveryDirectory,current,readDiscoveryEntries,filterDiscoveryChildren,processDiscoveryDirectory,child,prefix,marker,registerDiscoveredRepository,resolveDiscoveryPrefix,finishDiscovery,gitMarkerState,marker,isGitWorkTree,scopeChangedFile,mapWithConcurrency,results,cursor,workers,index,value,runGit,result,readCommits,output,readChangedFiles,output,parts,status,readStats,output,additions,deletions,extractChangedSymbols,output,symbol,isDocumentationPath + GitCommit: + ChangedFile: + GitExtractionOptions: + DiscoveredRepository: + RepositoryDiscoveryResult: + DiscoveryState: execFileAsync() - compareWorkspaceIntent() + MAX_DISCOVERED_REPOSITORIES() + MAX_DISCOVERY_DIRECTORIES() + REPOSITORY_READ_CONCURRENCY() + DISCOVERY_EXCLUDED_DIRECTORIES() + extractGitIntent() root() - repositoryRoot() - relativeAnalysisRoot() - outputDir() - baseRef() - baseCommit() - headCommit() - status() + count() + discovery() + results() + message() + extractRepositoryGitIntent() + message() + commit() changedFiles() - temporaryParent() - baseWorktree() - baseRoot() - pipelineOptions() - baseOptions() - currentOptions() - baseRun() - currentRun() - baseReality() - currentReality() + stats() diff() - baseCoverage() - currentCoverage() - alignmentRateDelta() - implementationCoverageDelta() - plannedCodeCoverageDelta() - documentedCodeCoverageDelta() - gapsDelta() - diagnosticsDelta() - comparisonId() - comparisonDirectory() - artifacts() - scopedOutputDirectory() + classified() + inferredSymbols() + scopedFiles() + docOnly() + discoverGitRepositories() + state() + current() + entries() + createDiscoveryState() + hasMoreDiscoveryWork() + takeNextDiscoveryDirectory() + current() + readDiscoveryEntries() + filterDiscoveryChildren() + processDiscoveryDirectory() + child() + prefix() + marker() + registerDiscoveredRepository() + resolveDiscoveryPrefix() + finishDiscovery() + gitMarkerState() + marker() + isGitWorkTree() + scopeChangedFile() + mapWithConcurrency() + results() + cursor() + workers() + index() + value() + runGit() + result() + readCommits() + output() + readChangedFiles() + output() + parts() + status() + readStats() + output() + additions() + deletions() + extractChangedSymbols() + output() + symbol() + isDocumentationPath() + src/extractors/nl-llm-helpers.ts: + i: ../config/env.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,node:fs,node:path,node:url + e: RawNlRecord,NlResponse,NlAttemptError + RawNlRecord: + NlResponse: + NlAttemptError: super(-1),extractNlWithCorrection(-1),completion(-1),markDeterministicNlRecords(-1),toIntentRecord(-1),lines(-1),action(-1),normalizedText(-1),statementText(-1),nlStageAudit(-1),readPrompt(-1),promptPath(-1),sourceExcerpt(-1),start(-1),end(-1),resolveAction(-1),resolveModality(-1),OBJECT_PLACEHOLDERS(-1),nonEmptyText(-1),isPlaceholder(-1),text(-1),resolveObject(-1),fallback(-1),clampLine(-1),allowedAction(-1),allowedModality(-1),NL_ACTION_SET(-1),NL_MODALITY_SET(-1),nlStrings(-1),NL_RECORD_CONTRACT(-1),NL_RESPONSE_CONTRACT(-1) + src/graph/diff.ts: + i: ../core/id.js,../core/schema.js + e: DiffSvgOptions,diffIntentGraphs,beforeById,afterById,unchangedRecords,beforeGroups,afterGroups,left,right,paired,beforeRecord,afterRecord,beforeRelations,afterRelations,fingerprint,renderGraphDiffSvg,maxItems,title,visibleRows,width,height,y,assertGraph,groupRecords,groups,identity,values,recordIdentity,normalizeRecord,changedFieldPaths,isObject,relationKey,compareRecords,compareRelations,recordLabel,changeLabel,metricCard,escapeXml,truncate + DiffSvgOptions: + diffIntentGraphs() + beforeById() + afterById() + unchangedRecords() + beforeGroups() + afterGroups() + left() + right() + paired() + beforeRecord() + afterRecord() + beforeRelations() + afterRelations() + fingerprint() + renderGraphDiffSvg() + maxItems() + title() + visibleRows() + width() + height() + y() + assertGraph() + groupRecords() + groups() + identity() + values() + recordIdentity() + normalizeRecord() + changedFieldPaths() + isObject() + relationKey() + compareRecords() + compareRelations() + recordLabel() + changeLabel() + metricCard() + escapeXml() + truncate() + src/graph/diagnostics.ts: + i: ../core/id.js,../core/schema.js,../core/target.js,./capability-evidence.js,./changelog-signal.js,./symbol-resolution.js + e: DiagnosticContext,diagnoseGraph,context,buildDiagnosticContext,neighbors,recordsById,collectRecordDiagnostics,related,missingFields,symbolIssues,isEvidence,planned,notPlanned,notDocumented,changelog,ambiguous,lowConfidence,unlinked,collectRelatedRecords,collectMissingFields,collectSymbolIssues,isRecordEvidenced,hasDocumentedTargetEvidence,buildPlannedNotImplementedDiagnostic,hasLocationOnlyEvidence,buildImplementedWithoutPlanDiagnostic,buildUndocumentedImplementationDiagnostic,buildChangelogWithoutImplementationDiagnostic,buildAmbiguousRequirementDiagnostic,detail,buildLowConfidenceDiagnostic,buildUnlinkedRecordDiagnostic,collectContradictionDiagnostics,indexGroundedImplementationEvidence,grounded,left,right,relationSupportsImplementation,basis,score,ambiguityDetail,paths,ambiguityAction,actions,buildNeighbors,map,appendNeighbor,values,indexImplementedPaths,paths,indexDocumentedPaths,paths,hasImplementedTarget,hasDocumentedTarget,isPlan,isImplementationEvidence,isPublicImplementation,symbol,isReleaseCandidate,isImportantRecord,makeDiagnostic,severityRank + DiagnosticContext: + diagnoseGraph() + context() + buildDiagnosticContext() + neighbors() + recordsById() + collectRecordDiagnostics() + related() + missingFields() + symbolIssues() + isEvidence() + planned() + notPlanned() + notDocumented() + changelog() + ambiguous() + lowConfidence() + unlinked() + collectRelatedRecords() + collectMissingFields() + collectSymbolIssues() + isRecordEvidenced() + hasDocumentedTargetEvidence() + buildPlannedNotImplementedDiagnostic() + hasLocationOnlyEvidence() + buildImplementedWithoutPlanDiagnostic() + buildUndocumentedImplementationDiagnostic() + buildChangelogWithoutImplementationDiagnostic() + buildAmbiguousRequirementDiagnostic() + detail() + buildLowConfidenceDiagnostic() + buildUnlinkedRecordDiagnostic() + collectContradictionDiagnostics() + indexGroundedImplementationEvidence() + grounded() + left() + right() + relationSupportsImplementation() + basis() + score() + ambiguityDetail() + paths() + ambiguityAction() + actions() + buildNeighbors() + map() + appendNeighbor() + values() + indexImplementedPaths() + paths() + indexDocumentedPaths() + paths() + hasImplementedTarget() + hasDocumentedTarget() + isPlan() + isImplementationEvidence() + isPublicImplementation() + symbol() + isReleaseCandidate() + isImportantRecord() + makeDiagnostic() + severityRank() + src/core/io.ts: + i: ./types.js,node:fs,node:path + e: WalkOptions,WalkState,DEFAULT_IGNORED_DIRS,ensureDir,readText,stat,pathExists,writeJson,writeText,writeJsonl,readJsonl,body,readJson,walkFiles,state,createWalkState,walkDirectory,entries,walkEntry,absolute,relative,isTargetFile,escapeRegex,globToRegExp,normalized,char,next,after,matchesAnyGlob,normalized,resolveGlobs,files,absolute,relative,relative,relativePosix + WalkOptions: + WalkState: + DEFAULT_IGNORED_DIRS() + ensureDir() + readText() + stat() + pathExists() + writeJson() + writeText() + writeJsonl() + readJsonl() + body() + readJson() + walkFiles() + state() + createWalkState() + walkDirectory() + entries() + walkEntry() absolute() - commonPipelineOptions() - optionsForRoot() - existingFile() relative() - coverage() - diagnosticDelta() - classifyWorkspaceTrend() - severeDelta() - improved() - regressed() - parseAheadBehind() - defaultBaseRef() - rounded() - artifactPaths() + isTargetFile() + escapeRegex() + globToRegExp() + normalized() + char() + next() + after() + matchesAnyGlob() + normalized() + resolveGlobs() + files() + absolute() relative() - renderTrendMarkdown() - percent() - documentationLine() - git() - result() - src/communication/llm.ts: - i: ../config/env.js,../core/id.js,../core/io.js,../core/record.js,../llm/audit.js,../llm/failure.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,node:fs,node:path,node:url - e: RawCommunicationEnrichment,RawParticipantSynthesis,RawCommunicationResponse,ParticipantCommunicationSynthesis,AuditedCommunicationExtractionResult,CommunicationLlmRequiredError,CommunicationAttemptError,ParticipantGroup - RawCommunicationEnrichment: - RawParticipantSynthesis: - RawCommunicationResponse: - ParticipantCommunicationSynthesis: - AuditedCommunicationExtractionResult: - CommunicationLlmRequiredError: super(-1),extractCommunicationIntentAudited(-1),startedAt(-1),deterministic(-1),records(-1),client(-1),groups(-1),response(-1),enrichments(-1),enrichedByOriginal(-1),generation(-1),participants(-1),failure(-1),responses(-1),classifyLlmFailure(-1) - CommunicationAttemptError: super(-1),enrichWithCorrection(-1),completion(-1),fallbackOrThrow(-1),failed(-1),marked(-1),participantGroups(-1),grouped(-1),participant(-1),role(-1),key(-1),values(-1),promptPayload(-1),validateEnrichments(-1),expected(-1),output(-1),materializeSyntheses(-1),byKey(-1),seen(-1),output(-1),group(-1),permitted(-1),recordIds(-1),enrichRecord(-1),deterministicSyntheses(-1),synthesis(-1),markDeterministic(-1),marked(-1),deterministicGeneration(-1),fallbackGeneration(-1),llmGeneration(-1),audit(-1),roleOf(-1),sortedUnique(-1),readPrompt(-1),promptPath(-1),communicationStrings(-1),COMMUNICATION_ENRICHMENT_CONTRACT(-1),PARTICIPANT_SYNTHESIS_CONTRACT(-1),COMMUNICATION_RESPONSE_CONTRACT(-1) - ParticipantGroup: + relative() + relativePosix() + src/core/schema/code-change.ts: + i: ../id.js,../types.js + e: assertCodeChangePlan,known,assertCodeChangePlans,known,ids,id,assertCodeChangePlansForReview,ids,plan,evidence,id,assertCodeChangePlanForAcceptance,known,plan,evidence,assertCodeChangeAcceptance,beforeKnown,afterKnown,acceptance,expectedCleared,expectedRemaining,expectedBlocking,expectedAccepted,assertPlanGraphFingerprint,assertCodeChangePlanValue,plan,target,targetPaths,changePaths,change,normalizedPath,risk,evidence,semantic,expectedHash,expectedId,validateCodeChangePlanContext,known,conclusions,proposals,referencedConclusionIds,proposal,proposalIds,assertStringSetMatch + assertCodeChangePlan() + known() + assertCodeChangePlans() + known() + ids() + id() + assertCodeChangePlansForReview() + ids() + plan() + evidence() + id() + assertCodeChangePlanForAcceptance() + known() + plan() + evidence() + assertCodeChangeAcceptance() + beforeKnown() + afterKnown() + acceptance() + expectedCleared() + expectedRemaining() + expectedBlocking() + expectedAccepted() + assertPlanGraphFingerprint() + assertCodeChangePlanValue() + plan() + target() + targetPaths() + changePaths() + change() + normalizedPath() + risk() + evidence() + semantic() + expectedHash() + expectedId() + validateCodeChangePlanContext() + known() + conclusions() + proposals() + referencedConclusionIds() + proposal() + proposalIds() + assertStringSetMatch() + src/synthesis/code-change-path.ts: + e: NON_SOURCE_DIR_SEGMENTS,BINARY_EXTENSIONS,GENERATED_ANALYSIS_BASENAMES,T2C_ARTIFACT_BASENAMES,EXTENSIONLESS_SOURCE_BASENAMES,isUsefulCodeChangePath,isPlannablePath,normalized,segments,lowerSegments,basename,normalizePlannablePath,isCandidatePathSyntax,splitPathSegments,isInvalidSegmentShape,isConcretePath,hasShellPattern,isDisallowedSegment,isPlannableBasename,lowerBasename,dot,ext,isGeneratedArtifactPath + NON_SOURCE_DIR_SEGMENTS() + BINARY_EXTENSIONS() + GENERATED_ANALYSIS_BASENAMES() + T2C_ARTIFACT_BASENAMES() + EXTENSIONLESS_SOURCE_BASENAMES() + isUsefulCodeChangePath() + isPlannablePath() + normalized() + segments() + lowerSegments() + basename() + normalizePlannablePath() + isCandidatePathSyntax() + splitPathSegments() + isInvalidSegmentShape() + isConcretePath() + hasShellPattern() + isDisallowedSegment() + isPlannableBasename() + lowerBasename() + dot() + ext() + isGeneratedArtifactPath() src/synthesis/validation.ts: i: ../core/schema.js,../core/types.js e: TodoProposalDuplicate,TodoProposalValidationResult,validateAndClassifyTodoProposals,existing,duplicates,orderedProposalIds,duplicateProposalIds,duplicateIds,duplicateEvidence,proposalWords,target,sharedTicket,sharedSymbol,sharedPath,similarity,dependencyFirstPriorityOrder,byId,remainingDependencies,dependents,values,compare,left,right,ready,id,remaining,words,jaccard,common,intersects,values @@ -2733,9 +2595,106 @@ D: AuditedTaskSynthesisResult: TaskSynthesisRequiredError: super(-1) TaskSynthesisAttemptError: super(-1),synthesizeTodoProposals(-1),startedAt(-1),assertConclusions(-1),client(-1),prompt(-1),payload(-1),failure(-1),responses(-1),synthesizeWithCorrection(-1),generation(-1),message(-1),wrapped(-1),fallbackOrThrow(-1),failedAudit(-1),rawDiagnosticActions(-1),generationMetadata(-1),configuration(-1),synthesisAudit(-1),readPrompt(-1),promptPath(-1) + src/synthesis/code-change-plan/implementation-source-patch-assert.ts: + i: ../../core/schema.js,./implementation-source-patch-diff.js + e: SourcePatchEditValidationContext,SourcePatchSetValidationContext,assertCodeChangeSourcePatch,patch,editPaths,assertCodeChangeSourcePatchObject,patch,validateSourcePatchSchema,validateSourcePatchIdentifiers,validateSourcePatchEdits,collectSourcePatchEditPathActions,paths,editContext,validateSourcePatchEdit,normalizedEdit,normalizedPath,assertSourcePatchEditObject,validateSourcePatchEditBody,validateSourcePatchEditDiff,assertUniqueSourcePatchEditPathAction,normalizeSourcePatchEditPath,normalizedPath,ensureSourcePatchEditAction,ensureSourcePatchEditInstruction,validateSourcePatchHashAndId,expectedHash,validateSourcePatchGeneration,validateSourcePatchAgainstPlan,expectedChanges,assertSourcePatchPlanBinding,collectExpectedPlanChanges,validateSourcePatchEditsAgainstPlan,allowed,editPath,validateSourcePatchEvidence,marker,assertCodeChangeSourcePatchSet,set,context,createSourcePatchSetValidationContext,expectedPlanIds,assertSourcePatchSetObject,set,validateSourcePatchSetSchema,validateSourcePatchSetPatches,patchIds,validateSetPatchAndTrackDuplicates,expectedPlan,validateSetPatchGraphFingerprint,assertUniqueSetPatchId,validateSetPatchesPlanCoverage,validateSourcePatchSetGeneration,exactSourcePatchKeys,actual,assertSourcePatchIds,assertSourcePatchStrings,exactSourcePatchSet + SourcePatchEditValidationContext: + SourcePatchSetValidationContext: + assertCodeChangeSourcePatch() + patch() + editPaths() + assertCodeChangeSourcePatchObject() + patch() + validateSourcePatchSchema() + validateSourcePatchIdentifiers() + validateSourcePatchEdits() + collectSourcePatchEditPathActions() + paths() + editContext() + validateSourcePatchEdit() + normalizedEdit() + normalizedPath() + assertSourcePatchEditObject() + validateSourcePatchEditBody() + validateSourcePatchEditDiff() + assertUniqueSourcePatchEditPathAction() + normalizeSourcePatchEditPath() + normalizedPath() + ensureSourcePatchEditAction() + ensureSourcePatchEditInstruction() + validateSourcePatchHashAndId() + expectedHash() + validateSourcePatchGeneration() + validateSourcePatchAgainstPlan() + expectedChanges() + assertSourcePatchPlanBinding() + collectExpectedPlanChanges() + validateSourcePatchEditsAgainstPlan() + allowed() + editPath() + validateSourcePatchEvidence() + marker() + assertCodeChangeSourcePatchSet() + set() + context() + createSourcePatchSetValidationContext() + expectedPlanIds() + assertSourcePatchSetObject() + set() + validateSourcePatchSetSchema() + validateSourcePatchSetPatches() + patchIds() + validateSetPatchAndTrackDuplicates() + expectedPlan() + validateSetPatchGraphFingerprint() + assertUniqueSetPatchId() + validateSetPatchesPlanCoverage() + validateSourcePatchSetGeneration() + exactSourcePatchKeys() + actual() + assertSourcePatchIds() + assertSourcePatchStrings() + exactSourcePatchSet() + src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts: + i: ./implementation-source-patch-diff.js + e: ParsedUnifiedDiffHunk,UnifiedDiffParsingContext,UnifiedDiffCursor,applyUnifiedDiffToText,baseLines,hunks,output,joinAppliedText,parseUnifiedDiffIntoHunks,normalizedDiff,context,createEmptyUnifiedDiffContext,parseUnifiedDiffLines,finalizeUnifiedDiffContext,applyUnifiedDiffLineToContext,header,parseUnifiedDiffHeader,buildParsedUnifiedDiffHunk,applyUnifiedDiffHunks,applyUnifiedDiffHunk,oldIndex,copyBaseLinesToCursor,appendRemainingBaseLines,validateHunkCounts,oldCount,newCount,applyUnifiedDiffLine,mark,body,applyUnifiedDiffContextLine,applyUnifiedDiffDeletionLine,applyUnifiedDiffAdditionLine,splitKeep,lines + ParsedUnifiedDiffHunk: + UnifiedDiffParsingContext: + UnifiedDiffCursor: + applyUnifiedDiffToText() + baseLines() + hunks() + output() + joinAppliedText() + parseUnifiedDiffIntoHunks() + normalizedDiff() + context() + createEmptyUnifiedDiffContext() + parseUnifiedDiffLines() + finalizeUnifiedDiffContext() + applyUnifiedDiffLineToContext() + header() + parseUnifiedDiffHeader() + buildParsedUnifiedDiffHunk() + applyUnifiedDiffHunks() + applyUnifiedDiffHunk() + oldIndex() + copyBaseLinesToCursor() + appendRemainingBaseLines() + validateHunkCounts() + oldCount() + newCount() + applyUnifiedDiffLine() + mark() + body() + applyUnifiedDiffContextLine() + applyUnifiedDiffDeletionLine() + applyUnifiedDiffAdditionLine() + splitKeep() + lines() src/interfaces/a2a-task-store.ts: - i: ../config/env.js,../core/security.js,../services/actions.js,node:crypto,node:fs,node:path,node:timers/promises - e: PreparedTask,ListCursor,TaskStoreSnapshot,tasks,messageTaskIndex,clearA2aTaskStoreForTests,handleA2aRpc,handleRpcInTaskStore,params,sendMessage,message,sendConfiguration,prepared,getTask,task,historyLength,cancelTask,task,fullTaskView,scheduleTaskExecution,task,withTaskStore,storePath,release,result,configuredTaskStorePath,acquireTaskStoreLock,deadline,removeLock,removeStaleLock,stat,loadTaskStore,content,snapshot,restored,readTaskStore,stat,restoreTask,assertStoredTask,saveTaskStore,removeTemporaryFile,prepareTask,key,indexedTask,taskForMessage,indexedTaskId,task,continueTask,existing,continuationError,message,createTask,taskId,contextId,executeMessage,command,result,currentTaskState,completeTask,message,failTask,message,agentMessage,listTasks,contextId,status,pageSize,historyLength,includeArtifacts,statusTimestampAfter,filter,filtered,pageToken,start,page,last,filteredTasks,compareTasksByUpdate,timestampOrder,indexAfterCursor,exact,cursorTime,next,taskTime,encodeCursor,decodeCursor,decoded,taskView,effectiveHistoryLength,history,cloneArtifact,ownedTask,task,messageKey,errorMessage + i: ../config/env.js,../core/security.js,../services/actions.js,./intake-actions.js,node:crypto,node:fs,node:path,node:timers/promises + e: PreparedTask,ListCursor,TaskStoreSnapshot,tasks,messageTaskIndex,clearA2aTaskStoreForTests,handleA2aRpc,handleRpcInTaskStore,params,sendMessage,message,sendConfiguration,prepared,getTask,task,historyLength,cancelTask,task,fullTaskView,scheduleTaskExecution,task,withTaskStore,storePath,release,result,configuredTaskStorePath,acquireTaskStoreLock,deadline,removeLock,removeStaleLock,stat,loadTaskStore,content,snapshot,restored,readTaskStore,stat,restoreTask,assertStoredTask,saveTaskStore,removeTemporaryFile,prepareTask,key,indexedTask,taskForMessage,indexedTaskId,task,continueTask,existing,continuationError,message,createTask,taskId,contextId,executeMessage,command,result,domainResult,rejectTask,protobuf,diagnostic,message,currentTaskState,completeTask,protobuf,message,protobufResult,intakeDomainResult,record,failTask,message,agentMessage,listTasks,contextId,status,pageSize,historyLength,includeArtifacts,statusTimestampAfter,filter,filtered,pageCursor,start,page,last,filteredTasks,compareTasksByUpdate,timestampOrder,indexAfterCursor,exact,cursorTime,next,taskTime,encodeCursor,decodeCursor,decoded,taskView,effectiveHistoryLength,history,cloneArtifact,ownedTask,task,messageKey,errorMessage PreparedTask: ListCursor: TaskStoreSnapshot: @@ -2793,9 +2752,18 @@ D: executeMessage() command() result() + domainResult() + rejectTask() + protobuf() + diagnostic() + message() currentTaskState() completeTask() + protobuf() message() + protobufResult() + intakeDomainResult() + record() failTask() message() agentMessage() @@ -2808,7 +2776,7 @@ D: statusTimestampAfter() filter() filtered() - pageToken() + pageCursor() start() page() last() @@ -2831,73 +2799,33 @@ D: task() messageKey() errorMessage() - src/graph/diff.ts: - i: ../core/id.js,../core/schema.js - e: DiffSvgOptions,diffIntentGraphs,beforeById,afterById,unchangedRecords,beforeGroups,afterGroups,left,right,paired,beforeRecord,afterRecord,beforeRelations,afterRelations,fingerprint,renderGraphDiffSvg,maxItems,title,visibleRows,width,height,y,assertGraph,groupRecords,groups,identity,values,recordIdentity,normalizeRecord,changedFieldPaths,isObject,relationKey,compareRecords,compareRelations,recordLabel,changeLabel,metricCard,escapeXml,truncate - DiffSvgOptions: - diffIntentGraphs() - beforeById() - afterById() - unchangedRecords() - beforeGroups() - afterGroups() - left() - right() - paired() - beforeRecord() - afterRecord() - beforeRelations() - afterRelations() - fingerprint() - renderGraphDiffSvg() - maxItems() - title() - visibleRows() - width() - height() - y() - assertGraph() - groupRecords() - groups() - identity() + src/pipeline/run-helpers.ts: + i: ../communication/llm.js,../config/env.js,../core/id.js,../core/io.js,../core/types.js,../llm/audit.js,../synthesis/code-change-plan.js,../synthesis/tasks-llm.js,../synthesis/todo-patch.js,../version.js,./run.js,node:path + e: collectCommunicationAnalysis,includeCommunication,communicationStartedAt,missingDirectory,communication,foundMissingDirectory,collectTaskSynthesis,taskSynthesisMode,taskSynthesisAudit,todoContent,createCodeChangeArtifacts,codeChangePlans,codeChangeReview,codeChangeSourcePatches,collectTargetHints,values,appendLlmNotConfigured,skippedAudit + collectCommunicationAnalysis() + includeCommunication() + communicationStartedAt() + missingDirectory() + communication() + foundMissingDirectory() + collectTaskSynthesis() + taskSynthesisMode() + taskSynthesisAudit() + todoContent() + createCodeChangeArtifacts() + codeChangePlans() + codeChangeReview() + codeChangeSourcePatches() + collectTargetHints() values() - recordIdentity() - normalizeRecord() - changedFieldPaths() - isObject() - relationKey() - compareRecords() - compareRelations() - recordLabel() - changeLabel() - metricCard() - escapeXml() - truncate() - src/extractors/changelog.ts: - i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,./markdown-block.js,./markdown-paths.js,node:path - e: extractChangelog,absolute,body,relative,lines,raw,versionHeading,categoryHeading,bullet,block,text,action,resolvedPaths,changelogAction,normalized,lower - extractChangelog() - absolute() - body() - relative() - lines() - raw() - versionHeading() - categoryHeading() - bullet() - block() - text() - action() - resolvedPaths() - changelogAction() - normalized() - lower() - sdk/python/examples/basic.py: - e: main - main() - sdk/php/src/Client.php: - e: Client - Client: + appendLlmNotConfigured() + skippedAudit() + src/communication/intake-store.ts: + i: ../core/io.js,../core/security.js,node:crypto,node:fs,node:path + e: IntakeEvent,StreamSnapshot,IntakeEventStore + IntakeEvent: + StreamSnapshot: + IntakeEventStore: read(-1),names(-1),name(-1),eventPath(-1),stat(-1),event(-1),lockPath(-1),stream(-1),existing(-1),writeRegistry(-1),projectionPath(-1),slug(-1),atomicWrite(-1),safe(-1),temp(-1),assertSafe(-1),hashEvent(-1),broken(-1),unsafe(-1) scripts/verify-workflow-yaml.mjs: i: node:fs,node:path e: explicit,files,body,seen,match,key,previous,workflowFiles,directory @@ -2923,36 +2851,274 @@ D: recordsById() findings() selected() - trackedFiles() - classification() - labelCounts() - labelRepositories() - stratifiedSample() - groups() + trackedFiles() + classification() + labelCounts() + labelRepositories() + stratifiedSample() + groups() + values() + added() + record() + targetClass() + target() + classify() + text() + file() + exactFileUpdate() + match() + candidate() + basename() + pathOwners() + file() + countBy() + item() + readJson() + parseArgs() + value() + index() + limitIndex() + limit() + intentDirectoryIndex() + intentDirectory() + sdk/php/src/Client.php: + e: Client + Client: + sdk/python/examples/basic.py: + e: main + main() + examples/backend/src/validation.ts: + e: ValidationResult,ALLOWED_ACTIONS,validateEventPayload,invalid,record,agent,action,object + ValidationResult: + ALLOWED_ACTIONS() + validateEventPayload() + invalid() + record() + agent() + action() + object() + java/JavaAstExtract.java: + i: com.sun.source.util.JavacTask,com.sun.source.util.SourcePositions,com.sun.source.util.TreePathScanner,com.sun.source.util.Trees,java.io.IOException,java.nio.charset.StandardCharsets,java.nio.file.Files,java.nio.file.Path,java.nio.file.Paths + e: JavaAstExtract + JavaAstExtract: main(-1),emit(-1),parseFile(-1),emit(-1),collect(-1),try(-1),containsIgnored(-1),try(-1),Collector(-1),add(-1),map(-1),add(-1),map(-1),add(-1),add(-1),add(-1),add(-1),map(-1),add(-1),map(-1),emit(-1),json(-1),json(-1),escape(-1),slash(-1) + src/extractors/nl.ts: + i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,../tf/classifier.js,node:path + e: NlExtractionOptions,assertNlExtractionOptions,extractNlIntent,absolute,body,sourcePath,classified,action,object,missing,confidence,inferActor,detectMissingFields + NlExtractionOptions: + assertNlExtractionOptions() + extractNlIntent() + absolute() + body() + sourcePath() + classified() + action() + object() + missing() + confidence() + inferActor() + detectMissingFields() + src/extractors/configuration.ts: + i: ../config/env.js,../core/ignore.js,../core/io.js,../core/record.js,../core/types.js,node:path + e: ConfigurationEntry,MAX_ENTRIES_PER_FILE,extractConfigurationIntent,root,matcher,discovered,files,relative,body,isConfigurationPath,base,configurationRecords,base,entries,bounded,fileAggregate,format,lastLine,configurationFormat,base,jsonEntries,parsed,lines,tomlEntries,line,heading,pair,yamlOrAssignmentEntries,yaml,assignment,key,dockerEntries,match,instruction,detail,entry,uniqueEntries,seen,findKeyLine,pattern,index + ConfigurationEntry: + MAX_ENTRIES_PER_FILE() + extractConfigurationIntent() + root() + matcher() + discovered() + files() + relative() + body() + isConfigurationPath() + base() + configurationRecords() + base() + entries() + bounded() + fileAggregate() + format() + lastLine() + configurationFormat() + base() + jsonEntries() + parsed() + lines() + tomlEntries() + line() + heading() + pair() + yamlOrAssignmentEntries() + yaml() + assignment() + key() + dockerEntries() + match() + instruction() + detail() + entry() + uniqueEntries() + seen() + findKeyLine() + pattern() + index() + src/extractors/nl-llm.ts: + i: ../config/env.js,../core/io.js,../llm/failure.js,../llm/openrouter.js,./nl.js,node:path + e: AuditedNlExtractionResult,NlLlmRequiredError + AuditedNlExtractionResult: + NlLlmRequiredError: super(-1),extractNlIntentAudited(-1),assertNlExtractionOptions(-1),startedAt(-1),result(-1),client(-1),absolute(-1),body(-1),sourcePath(-1),maxLine(-1),prompt(-1),response(-1),records(-1),failure(-1),responses(-1),classifyLlmFailure(-1),fallbackOrThrow(-1),failedAudit(-1),deterministic(-1) + src/extractors/markdown-block.ts: + e: MarkdownListBlock,readListBlock,cursor,line + MarkdownListBlock: + readListBlock() + cursor() + line() + src/graph/symbol-resolution.ts: + i: ../core/target.js,../core/types.js + e: AstSymbolCandidate,NlSymbolResolution,SymbolResolutionIndex,buildSymbolResolutionIndex,byAlias,collectAstCandidates,byAlias,candidate,values,buildAstCandidate,uniqueSymbols,sortCandidates,collectNlResolutions,byNlRecord,hasResolvedNlAstSymbolPair,nl,ast,resolveSymbol,matched,selected,paths,pathSelects,normalized,candidatePath,uniquePaths,isAstDeclaration + AstSymbolCandidate: + NlSymbolResolution: + SymbolResolutionIndex: + buildSymbolResolutionIndex() + byAlias() + collectAstCandidates() + byAlias() + candidate() + values() + buildAstCandidate() + uniqueSymbols() + sortCandidates() + collectNlResolutions() + byNlRecord() + hasResolvedNlAstSymbolPair() + nl() + ast() + resolveSymbol() + matched() + selected() + paths() + pathSelects() + normalized() + candidatePath() + uniquePaths() + isAstDeclaration() + src/graph/capability-evidence.ts: + i: ../core/text.js,../core/types.js + e: STRUCTURAL_TOPICS,declaredCapabilityTopics,topics,locationTopics,aggregateCapabilityTopics,values,aggregateCapabilityOverlap,aggregate,declaration,requested,implemented,overlap,hasCapabilityClaim,isFileAggregate + STRUCTURAL_TOPICS() + declaredCapabilityTopics() + topics() + locationTopics() + aggregateCapabilityTopics() values() - added() - record() - targetClass() + aggregateCapabilityOverlap() + aggregate() + declaration() + requested() + implemented() + overlap() + hasCapabilityClaim() + isFileAggregate() + src/graph/linker-candidates.ts: + i: ../core/target.js,../core/text.js,../core/types.js,./capability-evidence.js + e: RecordKeywords,indexKeywords,collectCandidatePairs,buckets,astIds,moduleAstIds,declarationAstIds,configurationIds,isModuleTopicSource,indexTargetBuckets,indexAliases,indexKeywordBuckets,indexTopicBuckets,addToBucket,values,pairsFromBuckets,output,leftId,rightId,isSuppressedAstPair,leftAst,rightAst,astId,isSuppressedConfigurationPair + RecordKeywords: + indexKeywords() + collectCandidatePairs() + buckets() + astIds() + moduleAstIds() + declarationAstIds() + configurationIds() + isModuleTopicSource() + indexTargetBuckets() + indexAliases() + indexKeywordBuckets() + indexTopicBuckets() + addToBucket() + values() + pairsFromBuckets() + output() + leftId() + rightId() + isSuppressedAstPair() + leftAst() + rightAst() + astId() + isSuppressedConfigurationPair() + src/core/ignore.ts: + i: node:fs,node:path + e: IgnoreRule,IgnoreMatcher,LoadIgnoreOptions,compileIgnorePattern,pattern,negated,directoryOnly,anchored,body,prefix,translateGlob,char,next,close,body,escapeLiteral,parseIgnoreFile,createIgnoreMatcher,normalize,decide,target,segments,ancestor,loadIgnoreMatcher,files,absolute,rule + IgnoreRule: + IgnoreMatcher: + LoadIgnoreOptions: + compileIgnorePattern() + pattern() + negated() + directoryOnly() + anchored() + body() + prefix() + translateGlob() + char() + next() + close() + body() + escapeLiteral() + parseIgnoreFile() + createIgnoreMatcher() + normalize() + decide() target() - classify() - text() - file() - exactFileUpdate() - match() - candidate() - basename() - pathOwners() - file() - countBy() - item() - readJson() - parseArgs() - value() - index() - limitIndex() - limit() - intentDirectoryIndex() - intentDirectory() + segments() + ancestor() + loadIgnoreMatcher() + files() + absolute() + rule() + src/llm/structured-schema.ts: + i: ../core/types.js + e: StructuredSchema,StructuredResponseError,StringOptions,NumberOptions,ArrayOptions + StructuredSchema: + StructuredResponseError: super(-1),schema(-1),parse(-1),string(-1),pattern(-1),fail(-1),fail(-1),nullableString(-1),base(-1),number(-1),fail(-1),checkNumberBounds(-1),integer(-1),numeric(-1),parsed(-1),enumValue(-1),allowed(-1),fail(-1),array(-1),fail(-1),fail(-1),parsed(-1),identities(-1),object(-1),keys(-1),allowed(-1),fail(-1),candidate(-1),unknown(-1),missing(-1),checkNumberBounds(-1),fail(-1),fail(-1),jsonIdentity(-1),record(-1),describe(-1),fail(-1) + StringOptions: + NumberOptions: + ArrayOptions: + src/interfaces/a2a-types.ts: + i: ../services/actions.js,./intake-actions.js + e: JsonRpcRequest,A2APart,A2AMessage,A2AArtifact,A2ATask,StoredTask,SendConfiguration,A2ARequestError,BodyTooLargeError,TERMINAL_TASK_STATES,TASK_STATES + JsonRpcRequest: + A2APart: + A2AMessage: + A2AArtifact: + A2ATask: + StoredTask: + SendConfiguration: + A2ARequestError: super(-1) + BodyTooLargeError: stringParam(-1),optionalString(-1),optionalStringArray(-1),optionalInteger(-1),parsed(-1),optionalBoolean(-1),optionalTimestamp(-1),timestamp(-1),optionalTaskState(-1),recordParam(-1),isRecord(-1) + TERMINAL_TASK_STATES() + TASK_STATES() + src/interfaces/mcp-tools.ts: + i: ../config/env.js,../services/actions.js,./intake-actions.js,./mcp-errors.js + e: McpTool,callMcpTool,name,args,result,tool,writes,stringProp,nullableStringProp,stringArrayProp,numberProp + McpTool: + callMcpTool() + name() + args() + result() + tool() + writes() + stringProp() + nullableStringProp() + stringArrayProp() + numberProp() + src/interfaces/intake_cli.py: + e: _varint,_read_varint,encode_envelope,decode_envelope,execute,main + _varint(value) + _read_varint(data;offset) + encode_envelope(envelope) + decode_envelope(data) + execute(args) + main() src/summary/summarizer.ts: i: ../config/env.js,../core/grounding.js,../core/id.js,../core/io.js,../core/schema.js,../llm/audit.js,../llm/openrouter.js,../llm/structured-schema.js,../version.js,./payload.js,./render.js,node:fs,node:path,node:url e: SummaryResult,SummaryOptions,RawConclusion,RawSummaryResponse,SummaryAttemptError,summarizeGraph,mode,conclusions,client,conclusions,systemPrompt,payload,failure,responses,conclusions,SUMMARY_CONCLUSION_CONTRACT,SUMMARY_RESPONSE_CONTRACT @@ -3000,155 +3166,304 @@ D: unknown() main() args() - src/llm/structured-schema.ts: - i: ../core/types.js - e: StructuredSchema,StructuredResponseError,StringOptions,NumberOptions,ArrayOptions - StructuredSchema: - StructuredResponseError: super(-1),schema(-1),parse(-1),string(-1),pattern(-1),fail(-1),fail(-1),nullableString(-1),base(-1),number(-1),fail(-1),checkNumberBounds(-1),integer(-1),numeric(-1),parsed(-1),enumValue(-1),allowed(-1),fail(-1),array(-1),fail(-1),fail(-1),parsed(-1),identities(-1),object(-1),keys(-1),allowed(-1),fail(-1),candidate(-1),unknown(-1),missing(-1),checkNumberBounds(-1),fail(-1),fail(-1),jsonIdentity(-1),record(-1),describe(-1),fail(-1) - StringOptions: - NumberOptions: - ArrayOptions: - src/interfaces/a2a-types.ts: - i: ../services/actions.js - e: JsonRpcRequest,A2APart,A2AMessage,A2AArtifact,A2ATask,StoredTask,SendConfiguration,A2ARequestError,BodyTooLargeError,TERMINAL_TASK_STATES,TASK_STATES - JsonRpcRequest: - A2APart: - A2AMessage: - A2AArtifact: - A2ATask: - StoredTask: - SendConfiguration: - A2ARequestError: super(-1) - BodyTooLargeError: stringParam(-1),optionalString(-1),optionalStringArray(-1),optionalInteger(-1),parsed(-1),optionalBoolean(-1),optionalTimestamp(-1),timestamp(-1),optionalTaskState(-1),recordParam(-1),isRecord(-1) - TERMINAL_TASK_STATES() - TASK_STATES() - src/graph/capability-evidence.ts: - i: ../core/text.js,../core/types.js - e: STRUCTURAL_TOPICS,declaredCapabilityTopics,topics,locationTopics,aggregateCapabilityTopics,values,aggregateCapabilityOverlap,aggregate,declaration,requested,implemented,overlap,hasCapabilityClaim,isFileAggregate - STRUCTURAL_TOPICS() - declaredCapabilityTopics() - topics() - locationTopics() - aggregateCapabilityTopics() + src/communication/llm/implementation-helpers.ts: + i: ../../config/env.js,../../core/id.js,../../core/io.js,../../core/record.js,../../extractors/communication.js,../../llm/audit.js,../../llm/structured-schema.js,../../version.js,node:fs,node:path,node:url + e: RawCommunicationEnrichment,RawParticipantSynthesis,RawCommunicationResponse,ParticipantGroup,ParticipantCommunicationSynthesisInput,participantGroups,grouped,participant,role,key,values,promptPayload,validateEnrichments,expected,output,materializeSyntheses,byKey,seen,output,group,permitted,recordIds,enrichRecord,deterministicSyntheses,markDeterministic,marked,deterministicGeneration,fallbackGeneration,llmGeneration,audit,readPrompt,promptPath,synthesis,sortedUnique,roleOf,communicationStrings,COMMUNICATION_ENRICHMENT_CONTRACT,PARTICIPANT_SYNTHESIS_CONTRACT,COMMUNICATION_RESPONSE_CONTRACT + RawCommunicationEnrichment: + RawParticipantSynthesis: + RawCommunicationResponse: + ParticipantGroup: + ParticipantCommunicationSynthesisInput: + participantGroups() + grouped() + participant() + role() + key() values() - aggregateCapabilityOverlap() - aggregate() - declaration() - requested() - implemented() - overlap() - hasCapabilityClaim() - isFileAggregate() - src/extractors/nl.ts: - i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,../tf/classifier.js,node:path - e: NlExtractionOptions,assertNlExtractionOptions,extractNlIntent,absolute,body,sourcePath,classified,action,object,missing,confidence,inferActor,detectMissingFields - NlExtractionOptions: - assertNlExtractionOptions() - extractNlIntent() - absolute() - body() - sourcePath() - classified() - action() - object() - missing() - confidence() - inferActor() - detectMissingFields() - src/extractors/markdown-block.ts: - e: MarkdownListBlock,readListBlock,cursor,line - MarkdownListBlock: - readListBlock() - cursor() - line() - src/extractors/configuration.ts: - i: ../config/env.js,../core/ignore.js,../core/io.js,../core/record.js,../core/types.js,node:path - e: ConfigurationEntry,MAX_ENTRIES_PER_FILE,extractConfigurationIntent,root,matcher,discovered,files,relative,body,isConfigurationPath,base,configurationRecords,base,entries,bounded,fileAggregate,format,lastLine,configurationFormat,base,jsonEntries,parsed,lines,tomlEntries,line,heading,pair,yamlOrAssignmentEntries,yaml,assignment,key,dockerEntries,match,instruction,detail,entry,uniqueEntries,seen,findKeyLine,pattern,index - ConfigurationEntry: - MAX_ENTRIES_PER_FILE() - extractConfigurationIntent() - root() - matcher() - discovered() - files() - relative() + promptPayload() + validateEnrichments() + expected() + output() + materializeSyntheses() + byKey() + seen() + output() + group() + permitted() + recordIds() + enrichRecord() + deterministicSyntheses() + markDeterministic() + marked() + deterministicGeneration() + fallbackGeneration() + llmGeneration() + audit() + readPrompt() + promptPath() + synthesis() + sortedUnique() + roleOf() + communicationStrings() + COMMUNICATION_ENRICHMENT_CONTRACT() + PARTICIPANT_SYNTHESIS_CONTRACT() + COMMUNICATION_RESPONSE_CONTRACT() + rust-ast/src/main.rs: + i: proc_macro2::Span,quote::ToTokens,serde::Serialize,serde_json::,std::collections::BTreeSet,std::env,std::fs,std::path::,syn::spanned::Spanned,syn::visit:: + e: Fact,Output,Collector,main,arguments,collect_files,new,qualified,add,excerpt,modifiers,visit_item_mod,visit_item_use,visit_item_struct,visit_item_enum,visit_item_trait,visit_item_type,visit_item_const,visit_item_static,visit_item_fn,visit_item_impl,visit_impl_item_fn,visit_expr_call,visit_expr_method_call + Fact: + Output: + Collector: + main() + arguments() + collect_files() + new() + qualified() + add() + excerpt() + modifiers() + visit_item_mod() + visit_item_use() + visit_item_struct() + visit_item_enum() + visit_item_trait() + visit_item_type() + visit_item_const() + visit_item_static() + visit_item_fn() + visit_item_impl() + visit_impl_item_fn() + visit_expr_call() + visit_expr_method_call() + examples/backend/src/request-handlers.ts: + i: ./store.js,./validation.js,node:http + e: MAX_BODY_BYTES,handleRequest,url,handleHealth,handleEventPublish,body,validation,event,handleEventList,offset,limit,parseOffset,parsed,parseLimit,parsed,readBody,size,buffer,sendJson,body + MAX_BODY_BYTES() + handleRequest() + url() + handleHealth() + handleEventPublish() body() - isConfigurationPath() - base() - configurationRecords() - base() - entries() - bounded() - fileAggregate() - format() - lastLine() - configurationFormat() - base() - jsonEntries() + validation() + event() + handleEventList() + offset() + limit() + parseOffset() parsed() - lines() - tomlEntries() - line() - heading() - pair() - yamlOrAssignmentEntries() - yaml() - assignment() - key() - dockerEntries() - match() - instruction() - detail() - entry() - uniqueEntries() - seen() - findKeyLine() - pattern() - index() - src/core/ignore.ts: - i: node:fs,node:path - e: IgnoreRule,IgnoreMatcher,LoadIgnoreOptions,compileIgnorePattern,pattern,negated,directoryOnly,anchored,body,prefix,translateGlob,char,next,close,body,escapeLiteral,parseIgnoreFile,createIgnoreMatcher,normalize,decide,target,segments,ancestor,loadIgnoreMatcher,files,absolute,rule - IgnoreRule: - IgnoreMatcher: - LoadIgnoreOptions: - compileIgnorePattern() - pattern() - negated() - directoryOnly() - anchored() + parseLimit() + parsed() + readBody() + size() + buffer() + sendJson() body() - prefix() - translateGlob() - char() - next() - close() + src/extractors/runtime-cycle.ts: + i: ../config/env.js,../core/io.js,../core/record.js,node:path + e: CycleContext,MAX_PER_SECTION,extractRuntimeCycleIntent,cyclePath,root,body,cycle,sourcePath,observedAt,host,results,parseCycle,cycle,sourcePathFor,relative,boundedArray,objects,label,text,tags,watched,declared,probeRecord,id,failed,error,outcome,violationRecord,probe,fact,driftRecord,probe,fact,proposalRecord,kind,probe,detail,proposalAction,factsMetadata,jsonScalar + CycleContext: + MAX_PER_SECTION() + extractRuntimeCycleIntent() + cyclePath() + root() body() - escapeLiteral() - parseIgnoreFile() - createIgnoreMatcher() - normalize() - decide() - target() - segments() - ancestor() - loadIgnoreMatcher() + cycle() + sourcePath() + observedAt() + host() + results() + parseCycle() + cycle() + sourcePathFor() + relative() + boundedArray() + objects() + label() + text() + tags() + watched() + declared() + probeRecord() + id() + failed() + error() + outcome() + violationRecord() + probe() + fact() + driftRecord() + probe() + fact() + proposalRecord() + kind() + probe() + detail() + proposalAction() + factsMetadata() + jsonScalar() + src/extractors/markdown-llm.ts: + i: ../config/env.js,../llm/failure.js,../llm/openrouter.js,./markdown.js + e: AuditedMarkdownExtractionResult,MarkdownLlmRequiredError + AuditedMarkdownExtractionResult: + MarkdownLlmRequiredError: super(-1),extractMarkdownIntentAudited(-1),startedAt(-1),deterministic(-1),client(-1),prompt(-1),failure(-1),failedResponses(-1),classifyLlmFailure(-1),fallbackOrThrow(-1),failed(-1) + src/extractors/ast/external.ts: + i: ../../core/io.js,../../core/types.js,./records.js,./types.js,node:child_process,node:util + e: ExternalAdapterOptions,execFileAsync,runExternalAstAdapter,files,result,parsed + ExternalAdapterOptions: + execFileAsync() + runExternalAstAdapter() files() - absolute() - rule() - java/JavaAstExtract.java: - i: com.sun.source.util.JavacTask,com.sun.source.util.SourcePositions,com.sun.source.util.TreePathScanner,com.sun.source.util.Trees,java.io.IOException,java.nio.charset.StandardCharsets,java.nio.file.Files,java.nio.file.Path,java.nio.file.Paths - e: JavaAstExtract - JavaAstExtract: main(-1),emit(-1),parseFile(-1),emit(-1),collect(-1),try(-1),containsIgnored(-1),try(-1),Collector(-1),add(-1),map(-1),add(-1),map(-1),add(-1),add(-1),add(-1),add(-1),map(-1),add(-1),map(-1),emit(-1),json(-1),json(-1),escape(-1),slash(-1) - examples/backend/src/validation.ts: - e: ValidationResult,ALLOWED_ACTIONS,validateEventPayload,invalid,record,agent,action,object - ValidationResult: - ALLOWED_ACTIONS() - validateEventPayload() - invalid() + result() + parsed() + src/core/target.ts: + i: ./types.js + e: GENERIC_SYMBOLS,GENERIC_FILES,normalizeTarget,normalizePath,normalizeSymbol,symbolAliases,normalized,parts,leaf,pathAliases,normalized,basename,unique + GENERIC_SYMBOLS() + GENERIC_FILES() + normalizeTarget() + normalizePath() + normalizeSymbol() + symbolAliases() + normalized() + parts() + leaf() + pathAliases() + normalized() + basename() + unique() + src/core/schema/conclusions.ts: + i: ../id.js + e: assertConclusion,known,assertConclusions,known,ids,id,assertTodoProposal,known,assertTodoProposals,known,proposalIds,id,assertConclusionValue,conclusion,expectedId,assertTodoProposalValue,proposal,target,expectedId,assertTodoProposalReferenceValue,createRecordIdRegex,validateGroundedContext,report,diagnosticIds,diagnostic,validateTodoProposalContext,known + assertConclusion() + known() + assertConclusions() + known() + ids() + id() + assertTodoProposal() + known() + assertTodoProposals() + known() + proposalIds() + id() + assertConclusionValue() + conclusion() + expectedId() + assertTodoProposalValue() + proposal() + target() + expectedId() + assertTodoProposalReferenceValue() + createRecordIdRegex() + validateGroundedContext() + report() + diagnosticIds() + diagnostic() + validateTodoProposalContext() + known() + src/semantic/reranker-llm.ts: + i: ../config/env.js,../core/id.js,../core/types.js,../llm/openrouter.js,../llm/structured-schema.js,node:child_process,node:path,node:util + e: SemanticRerankerOptions,SemanticRerankerRequiredError + SemanticRerankerOptions: + SemanticRerankerRequiredError: super(-1),rerankSemanticCandidates(-1),assertSemanticCandidateSet(-1),validateCandidateSetSize(-1),model(-1),modelRevision(-1),cached(-1),client(-1),payload(-1),response(-1),validateCandidateSetSize(-1),resolveRerankerModel(-1),resolveModelRevision(-1),revision(-1),resolveCachedResult(-1),assertSemanticRerankResult(-1),assertRerankerClient(-1),client(-1),assertTrackedSnapshotAvailable(-1),buildRerankerPayload(-1),records(-1),messagesForCandidates(-1),callReranker(-1),metadata(-1),buildRerankResult(-1),assertSemanticRerankerResponse(-1),execFileAsync(-1),assertTrackedSnapshot(-1),root(-1),revision(-1),execFileAsync(-1),execFileAsync(-1),execFileAsync(-1),execFileAsync(-1),head(-1),resolvedRevision(-1),tracked(-1),records(-1),recordIds(-1),record(-1),sourcePath(-1),semanticRerankCacheKey(-1),projectRecord(-1) + src/synthesis/code-change-plan/implementation-semantic.ts: + i: ../../core/types.js + e: CodeChangePlanSemanticDraft,buildPlanEvidence,buildPlanSemantic,titleFor,record,object,startsWithImperative,descriptionFor,acceptanceCriteriaFor,priorityFor,riskFor,level,rollbackFor,uniqueSorted + CodeChangePlanSemanticDraft: + buildPlanEvidence() + buildPlanSemantic() + titleFor() record() - agent() - action() object() + startsWithImperative() + descriptionFor() + acceptanceCriteriaFor() + priorityFor() + riskFor() + level() + rollbackFor() + uniqueSorted() + src/synthesis/code-change-plan/implementation-helpers-plans.ts: + i: ./implementation-targets.js,node:fs,node:path + e: ProposeCodeChangePlansOptions,ProposeCodeChangePlansResult,PlanContext,proposeCodeChangePlans,generatedAt,maxPlans,context,candidates,plans,buildPlansForCandidates,plan,buildPlanSetResult,parseIsoDateTime,generatedAt,parseMaxPlans,maxPlans,buildPlanContext,conclusions,proposals,findRelatedRecords,createPlanForDiagnostic,relatedRecords,matchingProposals,matchingConclusions,target,changes,evidence,confidence,semantic,confidenceForDiagnostic,buildPlanResult,createRepositoryPathProbe,base,absolute,buildChanges,symbols,sourceIntents,rationale,normalized,exists,confidenceFor + ProposeCodeChangePlansOptions: + ProposeCodeChangePlansResult: + PlanContext: + proposeCodeChangePlans() + generatedAt() + maxPlans() + context() + candidates() + plans() + buildPlansForCandidates() + plan() + buildPlanSetResult() + parseIsoDateTime() + generatedAt() + parseMaxPlans() + maxPlans() + buildPlanContext() + conclusions() + proposals() + findRelatedRecords() + createPlanForDiagnostic() + relatedRecords() + matchingProposals() + matchingConclusions() + target() + changes() + evidence() + confidence() + semantic() + confidenceForDiagnostic() + buildPlanResult() + createRepositoryPathProbe() + base() + absolute() + buildChanges() + symbols() + sourceIntents() + rationale() + normalized() + exists() + confidenceFor() + src/llm/openrouter-request.ts: + e: ParsedOpenRouterResponse,OpenRouterChoice,OpenRouterResponse,OpenRouterRequestContext,requestOpenRouter,controller,detachAbort,timeout,response,parsed,resolution,resolution,ensureApiKeyConfigured,connectAbortSignal,abortFromExternal,sendRequest,resolveHttpResponse,message,error,createModelErrorResponse,model,availableModels,listErrorMessage,resolveTransportError,retryDelay,buildRequestHeaders,shouldRetryWithoutJsonSchema,shouldRetryRequestWithoutSchema,isRetryableServerError,isTransientNetworkError,isInvalidModelError,parseResponse,text,removeUndefined,sleep + ParsedOpenRouterResponse: + OpenRouterChoice: + OpenRouterResponse: + OpenRouterRequestContext: + requestOpenRouter() + controller() + detachAbort() + timeout() + response() + parsed() + resolution() + resolution() + ensureApiKeyConfigured() + connectAbortSignal() + abortFromExternal() + sendRequest() + resolveHttpResponse() + message() + error() + createModelErrorResponse() + model() + availableModels() + listErrorMessage() + resolveTransportError() + retryDelay() + buildRequestHeaders() + shouldRetryWithoutJsonSchema() + shouldRetryRequestWithoutSchema() + isRetryableServerError() + isTransientNetworkError() + isInvalidModelError() + parseResponse() + text() + removeUndefined() + sleep() src/interfaces/mcp.ts: i: ../config/env.js,./mcp-errors.js,./mcp-resources.js,./mcp-tools.js,node:path,node:readline,node:url e: JsonRpcRequest,McpConnectionState,DISCOVERY_TTL_MS,LIST_TTL_MS,RESOURCE_TTL_MS,createMcpConnectionState,startMcpServer,resolvedConfig,state,input,parsed,request,result,handleMcpRequest,initializeLegacy,params,requested,protocolVersion,handleModernRequest,params,responseMeta,handleLegacyRequest,params,validateModernRequest,params,meta,validateModernMetadata,requested,capabilities,hasModernMetadata,meta,parseRequestLine,completePublic,serverInfo,serverMeta,serverInstructions,isLegacyProtocol,isJsonRpcRequest,candidate,requestId,id,rpcError,sendError,send,invokedPath @@ -3199,7 +3514,7 @@ D: invokedPath() src/interfaces/a2a.ts: i: ../config/env.js,../services/actions.js,../web/diff-ui.js,./a2a-card.js,./a2a-history.js,./a2a-task-store.js,node:crypto,node:http,node:path,node:url - e: startA2aServer,resolvedConfig,server,address,port,handleHttp,url,handlePublicGet,handleAuthenticatedApi,handleDiffApi,input,handleJsonRpc,rpc,isNotification,result,parseRpcRequest,status,sendRpcFailure,code,metadata,status,requireAuthorization,requireProtocolVersion,requestedVersion,a2aVersion,raw,headerVersion,authorized,header,received,expected,principalForRequest,readBody,length,chunk,sendJson,payload,sendText,sendNoContent,rpcError,reason,errorInfo,stringMetadata,handleUnexpectedError,errorMessage,invokedPath + e: startA2aServer,resolvedConfig,server,address,port,handleHttp,url,handlePublicGet,handleAuthenticatedApi,handleDiffApi,input,handleJsonRpc,rpc,isNotification,result,parseRpcRequest,status,sendRpcFailure,code,metadata,status,requireAuthorization,requireProtocolVersion,requestedVersion,a2aVersion,raw,headerVersion,isLoopbackHost,value,authorized,header,received,expected,principalForRequest,readBody,length,chunk,sendJson,payload,sendText,sendNoContent,rpcError,reason,errorInfo,stringMetadata,handleUnexpectedError,errorMessage,invokedPath startA2aServer() resolvedConfig() server() @@ -3227,6 +3542,8 @@ D: a2aVersion() raw() headerVersion() + isLoopbackHost() + value() authorized() header() received() @@ -3246,39 +3563,45 @@ D: handleUnexpectedError() errorMessage() invokedPath() - src/extractors/ast/external.ts: - i: ../../core/io.js,../../core/types.js,./records.js,./types.js,node:child_process,node:util - e: ExternalAdapterOptions,execFileAsync,runExternalAstAdapter,files,result,parsed - ExternalAdapterOptions: - execFileAsync() - runExternalAstAdapter() - files() - result() - parsed() - src/core/target.ts: - i: ./types.js - e: GENERIC_SYMBOLS,GENERIC_FILES,normalizeTarget,normalizePath,normalizeSymbol,symbolAliases,normalized,parts,leaf,pathAliases,normalized,basename,unique - GENERIC_SYMBOLS() - GENERIC_FILES() - normalizeTarget() - normalizePath() - normalizeSymbol() - symbolAliases() - normalized() - parts() - leaf() - pathAliases() - normalized() - basename() - unique() - sdk/python/todo2code/runtime.py: - e: TypeScriptRuntimeError,RuntimeResult,TypeScriptRuntime,_resolve_cli,_parse_mapping,_load_mapping - TypeScriptRuntimeError(RuntimeError): # Raised when the local Node/TypeScript runtime cannot be exec... - RuntimeResult: # Raw result of a local TypeScript CLI invocation... - TypeScriptRuntime: __init__(1),invoke(1),version(0),pipeline(0),diagnose(1),diff_graphs(2),reality(1) # Execute the canonical TypeScript runtime from a Python proce... - _resolve_cli(value) - _parse_mapping(content;label) - _load_mapping(path;label) + src/diff/text-myers.ts: + i: ./text-types.js + e: RawDiffOp,MyersState,MyersEditPoint,blockReplace,myers,state,v,startX,point,createMyersState,n,m,chooseStartX,advanceDiagonal,nextX,nextY,backtrack,x,y,v,k,previous,previousX,previousY,diag,afterEqualX,afterEqualY,choosePreviousPoint,previousK,previousX,emitEqualOps,emitEditOp + RawDiffOp: + MyersState: + MyersEditPoint: + blockReplace() + myers() + state() + v() + startX() + point() + createMyersState() + n() + m() + chooseStartX() + advanceDiagonal() + nextX() + nextY() + backtrack() + x() + y() + v() + k() + previous() + previousX() + previousY() + diag() + afterEqualX() + afterEqualY() + choosePreviousPoint() + previousK() + previousX() + emitEqualOps() + emitEditOp() + scripts/research/evaluate-embedding-pairs.py: + e: parse_args,main + parse_args() + main() sdk/go/client.go: e: Client,rpcRequest,rpcResponse,New,nextID,setHeaders,RPC,Send,unwrapTask,Call,Health,AgentCard,getJSON Client: @@ -3294,67 +3617,14 @@ D: Health() AgentCard() getJSON() - scripts/research/evaluate-embedding-pairs.py: - e: parse_args,main - parse_args() - main() - rust-ast/src/main.rs: - i: proc_macro2::Span,quote::ToTokens,serde::Serialize,serde_json::,std::collections::BTreeSet,std::env,std::fs,std::path::,syn::spanned::Spanned,syn::visit:: - e: Fact,Output,Collector,main,arguments,collect_files,new,qualified,add,excerpt,modifiers,visit_item_mod,visit_item_use,visit_item_struct,visit_item_enum,visit_item_trait,visit_item_type,visit_item_const,visit_item_static,visit_item_fn,visit_item_impl,visit_impl_item_fn,visit_expr_call,visit_expr_method_call - Fact: - Output: - Collector: - main() - arguments() - collect_files() - new() - qualified() - add() - excerpt() - modifiers() - visit_item_mod() - visit_item_use() - visit_item_struct() - visit_item_enum() - visit_item_trait() - visit_item_type() - visit_item_const() - visit_item_static() - visit_item_fn() - visit_item_impl() - visit_impl_item_fn() - visit_expr_call() - visit_expr_method_call() - src/interfaces/mcp-tools.ts: - i: ../config/env.js,../services/actions.js,./mcp-errors.js - e: McpTool,callMcpTool,name,args,result,tool,writes,stringProp,nullableStringProp,stringArrayProp,numberProp - McpTool: - callMcpTool() - name() - args() - result() - tool() - writes() - stringProp() - nullableStringProp() - stringArrayProp() - numberProp() - src/graph/changelog-signal.ts: - i: ../core/types.js - e: GENERATED_ANALYSIS_BASENAMES,isActionableChangelogRecord,text,paths,isPlaceholder,isFileSummary,isFileOnlyUpdate,match,candidate,basename,isGeneratedAnalysisPath,segments,basename - GENERATED_ANALYSIS_BASENAMES() - isActionableChangelogRecord() - text() - paths() - isPlaceholder() - isFileSummary() - isFileOnlyUpdate() - match() - candidate() - basename() - isGeneratedAnalysisPath() - segments() - basename() + sdk/python/todo2code/runtime.py: + e: TypeScriptRuntimeError,RuntimeResult,TypeScriptRuntime,_resolve_cli,_parse_mapping,_load_mapping + TypeScriptRuntimeError(RuntimeError): # Raised when the local Node/TypeScript runtime cannot be exec... + RuntimeResult: # Raw result of a local TypeScript CLI invocation... + TypeScriptRuntime: __init__(1),invoke(1),version(0),pipeline(0),diagnose(1),diff_graphs(2),reality(1) # Execute the canonical TypeScript runtime from a Python proce... + _resolve_cli(value) + _parse_mapping(content;label) + _load_mapping(path;label) src/extractors/docs-chunks.ts: i: ./docs-types.js e: prioritizeDocumentChunks,needles,chunkPriority,matches,mapConcurrent,results,nextIndex,worker,index,item,workerCount,chunkMarkdown,lines,sections,currentStart,currentEnd,flush,sectionLines,sectionText,candidateSize,markdownSections,sectionStart,splitLongSection,batchStart,batch,takeLineBatch,size,offset,line @@ -3387,23 +3657,298 @@ D: size() offset() line() - sdk/typescript/src/index.ts: - e: IntentTarget,IntentStatement,IntentGenerationMetadata,IntentRecord,IntentGraph,DiagnosticReport,ExtractionAudit,ExtractionResult,A2APart,A2AMessage,A2ATask,T2CError,ClientOptions,T2CClient,unwrapTask - IntentTarget: - IntentStatement: - IntentGenerationMetadata: - IntentRecord: - IntentGraph: - DiagnosticReport: - ExtractionAudit: - ExtractionResult: - A2APart: - A2AMessage: - A2ATask: - T2CError: super(-1) - ClientOptions: - T2CClient: health(-1),agentCard(-1),send(-1),result(-1),call(-1),task(-1),detail(-1),part(-1),getTask(-1),cancelTask(-1),listTasks(-1),extractNl(-1),extractGit(-1),extractAst(-1),extractConfig(-1),link(-1),diagnose(-1),summarize(-1),compareWorkspace(-1),diffGraphs(-1),response(-1),body(-1),message(-1),diffFiles(-1),diffGit(-1),reality(-1),pipeline(-1),proposeTodo(-1),renderTodo(-1),applyTodo(-1),proposeCodeChange(-1),renderCodeChange(-1),proposeSourcePatch(-1),applySourcePatch(-1),evaluateCodeChange(-1),closeCodeChange(-1),rpc(-1),body(-1),response(-1),payload(-1),getJson(-1),response(-1),request(-1),controller(-1),timer(-1),clearTimeout(-1) - unwrapTask() + src/extractors/ast/typescript.ts: + i: ../../core/io.js,../../core/record.js,../../core/types.js,./records.js,node:path,typescript + e: TypeScriptExtractionContext,extractTypeScriptFile,context,capabilities,createTypeScriptExtractionContext,visitTypeScriptNode,handleNode,handleImportDeclaration,handleExportDeclaration,handleSymbolDeclaration,symbol,symbolModifiers,handleVariableDeclaration,declarationIsCallable,handleCallExpression,callee,isTypeScriptSymbolDeclaration,extractSymbolName,extractModifiers,addTypeScriptRecord,symbol,sourceLineRange,nodeExcerpt,recordModuleFact,isTopLevel,scriptKind,extension,languageName,extension + TypeScriptExtractionContext: + extractTypeScriptFile() + context() + capabilities() + createTypeScriptExtractionContext() + visitTypeScriptNode() + handleNode() + handleImportDeclaration() + handleExportDeclaration() + handleSymbolDeclaration() + symbol() + symbolModifiers() + handleVariableDeclaration() + declarationIsCallable() + handleCallExpression() + callee() + isTypeScriptSymbolDeclaration() + extractSymbolName() + extractModifiers() + addTypeScriptRecord() + symbol() + sourceLineRange() + nodeExcerpt() + recordModuleFact() + isTopLevel() + scriptKind() + extension() + languageName() + extension() + src/graph/linker.ts: + i: ../core/id.js,../core/schema.js,../core/target.js,../core/types.js,./capability-evidence.js,./linker-relations.js,./symbol-resolution.js + e: PairEvidence,jaccard,intersection,linkIntentRecords,records,byId,keywordIndex,symbolResolutionIndex,candidatePairs,resolvableBasenames,left,right,evidence,directed,deduplicateRecords,byId,existing,indexResolvableBasenames,owners,normalized,basename,paths,pathsIntersect,expand,output,aliases,full,leftSet,scorePair,score,leftKeywords,rightKeywords,objectSimilarity,scoreSharedTickets,scoreSharedSymbol,hasResolvedSymbol,hasSharedAlias,scoreSharedPath,points,capabilityOverlap,scoreSameAction,scoreObjectSimilarity,objectSimilarity,scoreSharedTopics,sharedTopics,scoreSourceKindPenalty,intersectionSize,size,isFileAggregateEvidencePair,isModuleTopicEvidencePair,intersects,set,intersectsAliases,set,countBy,key + PairEvidence: + jaccard() + intersection() + linkIntentRecords() + records() + byId() + keywordIndex() + symbolResolutionIndex() + candidatePairs() + resolvableBasenames() + left() + right() + evidence() + directed() + deduplicateRecords() + byId() + existing() + indexResolvableBasenames() + owners() + normalized() + basename() + paths() + pathsIntersect() + expand() + output() + aliases() + full() + leftSet() + scorePair() + score() + leftKeywords() + rightKeywords() + objectSimilarity() + scoreSharedTickets() + scoreSharedSymbol() + hasResolvedSymbol() + hasSharedAlias() + scoreSharedPath() + points() + capabilityOverlap() + scoreSameAction() + scoreObjectSimilarity() + objectSimilarity() + scoreSharedTopics() + sharedTopics() + scoreSourceKindPenalty() + intersectionSize() + size() + isFileAggregateEvidencePair() + isModuleTopicEvidencePair() + intersects() + set() + intersectsAliases() + set() + countBy() + key() + src/graph/changelog-signal.ts: + i: ../core/types.js + e: GENERATED_ANALYSIS_BASENAMES,isActionableChangelogRecord,text,paths,isPlaceholder,isFileSummary,isFileOnlyUpdate,match,candidate,basename,isGeneratedAnalysisPath,segments,basename + GENERATED_ANALYSIS_BASENAMES() + isActionableChangelogRecord() + text() + paths() + isPlaceholder() + isFileSummary() + isFileOnlyUpdate() + match() + candidate() + basename() + isGeneratedAnalysisPath() + segments() + basename() + src/core/schema/utils.ts: + i: ../types.js + e: objectValue,exactKeys,expectedSet,missing,extra,nonEmptyString,nonBlankString,nullableString,enumValue,stringArray,nonEmptyUniqueStringArray,repositoryPath,normalized,exactStringSet,uniqueIdArray,nonEmptyUniqueIdArray,knownReferences,unknown,confidence,assertAcyclicProposalDependencies,byId,visiting,visited,visit,start,dateString,nullableDate,fingerprint,nonNegativeInteger,countMap,map,countRecords,key,exactCounts,actual,isJsonValue,assertGroundedGenerationMetadata,generation,assertGroundedLlMMode,assertModeRequirements,assertDeterministicGeneration,assertDegradedRequirements + objectValue() + exactKeys() + expectedSet() + missing() + extra() + nonEmptyString() + nonBlankString() + nullableString() + enumValue() + stringArray() + nonEmptyUniqueStringArray() + repositoryPath() + normalized() + exactStringSet() + uniqueIdArray() + nonEmptyUniqueIdArray() + knownReferences() + unknown() + confidence() + assertAcyclicProposalDependencies() + byId() + visiting() + visited() + visit() + start() + dateString() + nullableDate() + fingerprint() + nonNegativeInteger() + countMap() + map() + countRecords() + key() + exactCounts() + actual() + isJsonValue() + assertGroundedGenerationMetadata() + generation() + assertGroundedLlMMode() + assertModeRequirements() + assertDeterministicGeneration() + assertDegradedRequirements() + src/semantic/reranker/candidate.ts: + i: ../../core/schema.js,../../core/types.js,./validation.js + e: CandidateValidationState,createSemanticCandidateSet,grouped,values,assertSemanticCandidateSet,state,assertCandidateSetHeader,createCandidateValidationState,addValidatedCandidate,validateCandidateId,validateCandidateRecords,declaration,module,validateCandidateRank,registerCandidate,existing,assertBoundedRanks,assertCandidateSetHash,expectedHash,comparePair + CandidateValidationState: + createSemanticCandidateSet() + grouped() + values() + assertSemanticCandidateSet() + state() + assertCandidateSetHeader() + createCandidateValidationState() + addValidatedCandidate() + validateCandidateId() + validateCandidateRecords() + declaration() + module() + validateCandidateRank() + registerCandidate() + existing() + assertBoundedRanks() + assertCandidateSetHash() + expectedHash() + comparePair() + src/interfaces/a2a-run-list-item.ts: + i: ./a2a-types.js,node:fs,node:path + e: IntentRunListItem,CommunicationRunSummary,runListItem,files,resolveRunId,resolveCreatedAt,valueString,warningCount,warnings,resolveStatus,runtimeVersion,runtime,readLlmSummary,llm,asRecord,validTimestamp,llmSummary,readCommunicationSummary,relative,filePath,stat,value,participants,issues,participantSummary,stringArray,safeManifestFiles,safePath,absolute,isWithinRoot,relative,relativeApiPath + IntentRunListItem: + CommunicationRunSummary: + runListItem() + files() + resolveRunId() + resolveCreatedAt() + valueString() + warningCount() + warnings() + resolveStatus() + runtimeVersion() + runtime() + readLlmSummary() + llm() + asRecord() + validTimestamp() + llmSummary() + readCommunicationSummary() + relative() + filePath() + stat() + value() + participants() + issues() + participantSummary() + stringArray() + safeManifestFiles() + safePath() + absolute() + isWithinRoot() + relative() + relativeApiPath() + src/evaluation/gold-cases.ts: + i: ../core/id.js,../core/record.js,../core/types.js,../graph/diagnostics.js,../graph/linker.js,../synthesis/validation.js,../version.js,./gold-metrics.js + e: LinkingCaseResult,RerankingCaseResult,DiagnosticsCaseResult,Dsl2TodoCaseResult,evaluateLinkingCase,idToLabel,graph,observed,actual,expected,byClass,forbidden,forbiddenViolations,evaluateRerankingCase,reranker,idToLabel,declarationRecordId,graph,candidates,decisions,rerank,observed,forbiddenViolations,buildRerankerCandidates,requestedCandidates,buildRerankerDecisions,candidateByModule,moduleRecordId,candidate,buildRerankResult,buildObservedRerankRelations,augmented,countForbiddenRelations,restricted,buildRerankExpected,buildRerankSnapshot,countVerdictDecisions,resolveRerankerFixture,resolveDeclarationRecordId,declarationRecordId,resolveFixtureLabelToRecordId,recordId,classifyRelation,exact,evaluateDiagnosticsCase,idToLabel,graph,report,observed,forbidden,forbiddenViolations,evaluateDsl2TodoCase,graph,diagnostics,diagnosticIds,conclusion,proposals,validation,duplicateIds,actual,expected,citations,buildConclusion,buildProposal,recordIds,id,countCitations,citationRequired,citationCited,buildFixtureRecords,labels,records,record,buildFixtureRecord,resolveDefaultFixtureModality,resolveFixtureSourcePath,resolveFixtureSymbol,resolveFixtureEpistemicClass,deterministicGeneration + LinkingCaseResult: + RerankingCaseResult: + DiagnosticsCaseResult: + Dsl2TodoCaseResult: + evaluateLinkingCase() + idToLabel() + graph() + observed() + actual() + expected() + byClass() + forbidden() + forbiddenViolations() + evaluateRerankingCase() + reranker() + idToLabel() + declarationRecordId() + graph() + candidates() + decisions() + rerank() + observed() + forbiddenViolations() + buildRerankerCandidates() + requestedCandidates() + buildRerankerDecisions() + candidateByModule() + moduleRecordId() + candidate() + buildRerankResult() + buildObservedRerankRelations() + augmented() + countForbiddenRelations() + restricted() + buildRerankExpected() + buildRerankSnapshot() + countVerdictDecisions() + resolveRerankerFixture() + resolveDeclarationRecordId() + declarationRecordId() + resolveFixtureLabelToRecordId() + recordId() + classifyRelation() + exact() + evaluateDiagnosticsCase() + idToLabel() + graph() + report() + observed() + forbidden() + forbiddenViolations() + evaluateDsl2TodoCase() + graph() + diagnostics() + diagnosticIds() + conclusion() + proposals() + validation() + duplicateIds() + actual() + expected() + citations() + buildConclusion() + buildProposal() + recordIds() + id() + countCitations() + citationRequired() + citationCited() + buildFixtureRecords() + labels() + records() + record() + buildFixtureRecord() + resolveDefaultFixtureModality() + resolveFixtureSourcePath() + resolveFixtureSymbol() + resolveFixtureEpistemicClass() + deterministicGeneration() scripts/verify-structured-responses.mjs: i: node:fs,node:path e: root,sourceRoot,files,structuredCalls,source,typescriptFiles,absolute @@ -3432,13 +3977,47 @@ D: referenced() content() text() - src/llm/failure.ts: - i: ../core/types.js,./openrouter.js,./structured-schema.js - e: LlmFailureReason,classifyLlmFailure,message,rejectedLlmResponseMetadata - LlmFailureReason: - classifyLlmFailure() - message() - rejectedLlmResponseMetadata() + sdk/typescript/src/index.ts: + e: IntentTarget,IntentStatement,IntentGenerationMetadata,IntentRecord,IntentGraph,DiagnosticReport,ExtractionAudit,ExtractionResult,A2APart,A2AMessage,A2ATask,T2CError,ClientOptions,T2CClient,unwrapTask + IntentTarget: + IntentStatement: + IntentGenerationMetadata: + IntentRecord: + IntentGraph: + DiagnosticReport: + ExtractionAudit: + ExtractionResult: + A2APart: + A2AMessage: + A2ATask: + T2CError: super(-1) + ClientOptions: + T2CClient: health(-1),agentCard(-1),send(-1),result(-1),call(-1),task(-1),detail(-1),part(-1),getTask(-1),cancelTask(-1),listTasks(-1),extractNl(-1),extractGit(-1),extractAst(-1),extractConfig(-1),link(-1),diagnose(-1),summarize(-1),compareWorkspace(-1),diffGraphs(-1),response(-1),body(-1),message(-1),diffFiles(-1),diffGit(-1),reality(-1),pipeline(-1),proposeTodo(-1),renderTodo(-1),applyTodo(-1),proposeCodeChange(-1),renderCodeChange(-1),proposeSourcePatch(-1),applySourcePatch(-1),evaluateCodeChange(-1),closeCodeChange(-1),rpc(-1),body(-1),response(-1),payload(-1),getJson(-1),response(-1),request(-1),controller(-1),timer(-1),clearTimeout(-1) + unwrapTask() + src/extractors/communication.ts: + i: ../communication/identity.js,../config/env.js,../core/io.js,../core/security.js,../core/types.js,./communication-file-helpers.js,node:path + e: CommunicationExtractionOptions,extractCommunicationIntent,root,projectRoot,files,identityRegistry,communicationFiles,fileResult + CommunicationExtractionOptions: + extractCommunicationIntent() + root() + projectRoot() + files() + identityRegistry() + communicationFiles() + fileResult() + src/graph/linker-relations.ts: + i: ../core/types.js + e: RelationEvidence,SourceRelationRule,DirectedRelation,determineRelation,textScore,sourceRelation,relationForSourceKinds,relation,matchSourceRule,orientRelation + RelationEvidence: + SourceRelationRule: + DirectedRelation: + determineRelation() + textScore() + sourceRelation() + relationForSourceKinds() + relation() + matchSourceRule() + orientRelation() src/core/security.ts: i: node:fs,node:path e: assertPathWithinRoot,rootAbsolute,candidateAbsolute,existingAncestor,ancestorReal,assertDescendant,relative,nearestExistingPath,current,code,parent @@ -3453,22 +4032,95 @@ D: current() code() parent() - sdk/python/todo2code/client.py: - e: T2CError,IntentRecord,ExtractionResult,Diagnostic,DiagnosticReport,IntentGraph,T2CClient,_unwrap_task,_as_dict,_graph_dict,_report_dict - T2CError(RuntimeError): __init__(3) # Raised for JSON-RPC errors, transport failures and non-compl... - IntentRecord: from_dict(1) # A single t2c.intent/v1 record... - ExtractionResult: from_dict(1) # Records, warnings and the optional audited LLM stage result... - Diagnostic: from_dict(1) - DiagnosticReport: from_dict(1),blocking(0) - IntentGraph: from_dict(1) - T2CClient: __init__(3),_headers(1),_open(1),_rpc(2),_get(1),health(0),agent_card(0),send(2),call(2),compare_workspace(0),propose_todo(1),render_todo(1),apply_todo(1),get_task(1),cancel_task(1),list_tasks(0),extract_nl(3),extract_nl_result(3),extract_git(2),extract_ast(1),extract_config(1),extract_markdown(4),extract_markdown_result(4),extract_docs(3),extract_docs_result(3),link(1),diagnose(1),summarize(3),diff_graphs(3),diff_graphs_rest(0),diff_files(2),diff_git(0),reality(2),pipeline(0) # Client for the todo2code A2A endpoint. - -Example: - >>> cli... - _unwrap_task(result) - _as_dict(value) - _graph_dict(value) - _report_dict(value) + src/semantic/reranker/result.ts: + i: ../../core/id.js,../../core/schema.js,../../core/types.js,../../version.js,./candidate.js + e: createSemanticRerankResult,decisions,assertSemanticRerankResult,seenDecisions,acceptedDeclarations,candidate,assertSemanticRerankHeader,createCandidateAndRecordIndex,validateSemanticDecisionCandidate,candidate,validateSemanticDecisionDecision,validateSemanticDecisionEvidence,citations,record,validateDecisionEvidenceScope,validateSemanticDecisionVerdict,assertRerankResultHash,expectedHash,applyAcceptedSemanticRelations,candidates,added,candidate,assertSemanticVerdictReason,allowedVerdicts,allowedReasons + createSemanticRerankResult() + decisions() + assertSemanticRerankResult() + seenDecisions() + acceptedDeclarations() + candidate() + assertSemanticRerankHeader() + createCandidateAndRecordIndex() + validateSemanticDecisionCandidate() + candidate() + validateSemanticDecisionDecision() + validateSemanticDecisionEvidence() + citations() + record() + validateDecisionEvidenceScope() + validateSemanticDecisionVerdict() + assertRerankResultHash() + expectedHash() + applyAcceptedSemanticRelations() + candidates() + added() + candidate() + assertSemanticVerdictReason() + allowedVerdicts() + allowedReasons() + src/semantic/reranker/validation.ts: + i: ../../core/types.js + e: requiredText,validateRetrieval,validateGeneration,validateVerdictReason,allowedVerdicts,allowedReasons,assertGroundedQuote,quote,validDate,boundedScore,roundedConfidence + requiredText() + validateRetrieval() + validateGeneration() + validateVerdictReason() + allowedVerdicts() + allowedReasons() + assertGroundedQuote() + quote() + validDate() + boundedScore() + roundedConfidence() + src/synthesis/code-change-plan/implementation-review.ts: + i: ../../core/id.js,../../core/schema.js,../../core/types.js,../../version.js,./implementation-diagnostics.js + e: CreateCodeChangeReviewOptions,CreatedCodeChangeReview,CodeChangeReviewContext,createCodeChangeReviewPatch,context,markdown,artifact,buildCodeChangeReviewContext,createdAt,sortCodeChangeReviewPlans,buildCodeChangeReviewMarkdown,buildCodeChangeReviewArtifact,renderCodeChangeReviewMarkdown,lines,buildCodeChangeReviewMarkdownLines,appendPriorityHeader,appendPlanDetails,appendPlanChanges,symbols,appendAfterImplementationSection,assertCodeChangeReviewPatch,artifact,validateReviewPatchKeys,assertCodeChangeReviewPatchSchema,assertReviewPatchSchemaVersion,assertReviewPatchDateFields,assertReviewPatchIds,assertCodeChangeReviewPatchPlanCollections,planIds,planHashes,assertCodeChangeReviewPatchGeneration,generation,deterministicGeneration,priorityRank,inline,renderIds,assertReviewPatchObject + CreateCodeChangeReviewOptions: + CreatedCodeChangeReview: + CodeChangeReviewContext: + createCodeChangeReviewPatch() + context() + markdown() + artifact() + buildCodeChangeReviewContext() + createdAt() + sortCodeChangeReviewPlans() + buildCodeChangeReviewMarkdown() + buildCodeChangeReviewArtifact() + renderCodeChangeReviewMarkdown() + lines() + buildCodeChangeReviewMarkdownLines() + appendPriorityHeader() + appendPlanDetails() + appendPlanChanges() + symbols() + appendAfterImplementationSection() + assertCodeChangeReviewPatch() + artifact() + validateReviewPatchKeys() + assertCodeChangeReviewPatchSchema() + assertReviewPatchSchemaVersion() + assertReviewPatchDateFields() + assertReviewPatchIds() + assertCodeChangeReviewPatchPlanCollections() + planIds() + planHashes() + assertCodeChangeReviewPatchGeneration() + generation() + deterministicGeneration() + priorityRank() + inline() + renderIds() + assertReviewPatchObject() + src/llm/failure.ts: + i: ../core/types.js,./openrouter.js,./structured-schema.js + e: LlmFailureReason,classifyLlmFailure,message,rejectedLlmResponseMetadata + LlmFailureReason: + classifyLlmFailure() + message() + rejectedLlmResponseMetadata() scripts/verify-module-boundaries.mjs: i: node:fs,node:path e: sourceRoot,files,graph,body,target,relative,targetRelative,visiting,visited,visit,start,collect,absolute,resolveSource,raw,relative,slash @@ -3489,21 +4141,152 @@ Example: raw() relative() slash() - src/operations/artifact.ts: - i: ../core/id.js,./subactor.js,./types.js,node:fs,node:path - e: CompileOperationPlanArtifactOptions,OperationPlanCompilationReceipt,readJson,writeExclusive,target,directory,temporary,existing,compileOperationPlanArtifact,plan,bindings,envelope - CompileOperationPlanArtifactOptions: - OperationPlanCompilationReceipt: - readJson() - writeExclusive() - target() + sdk/python/todo2code/client.py: + e: T2CError,IntentRecord,ExtractionResult,Diagnostic,DiagnosticReport,IntentGraph,T2CClient,_unwrap_task,_as_dict,_graph_dict,_report_dict + T2CError(RuntimeError): __init__(3) # Raised for JSON-RPC errors, transport failures and non-compl... + IntentRecord: from_dict(1) # A single t2c.intent/v1 record... + ExtractionResult: from_dict(1) # Records, warnings and the optional audited LLM stage result... + Diagnostic: from_dict(1) + DiagnosticReport: from_dict(1),blocking(0) + IntentGraph: from_dict(1) + T2CClient: __init__(3),_headers(1),_open(1),_rpc(2),_get(1),health(0),agent_card(0),send(2),call(2),compare_workspace(0),propose_todo(1),render_todo(1),apply_todo(1),get_task(1),cancel_task(1),list_tasks(0),extract_nl(3),extract_nl_result(3),extract_git(2),extract_ast(1),extract_config(1),extract_markdown(4),extract_markdown_result(4),extract_docs(3),extract_docs_result(3),link(1),diagnose(1),summarize(3),diff_graphs(3),diff_graphs_rest(0),diff_files(2),diff_git(0),reality(2),pipeline(0) # Client for the todo2code A2A endpoint. + +Example: + >>> cli... + _unwrap_task(result) + _as_dict(value) + _graph_dict(value) + _report_dict(value) + examples/frontend/src/api.ts: + e: IntentEvent,EventPage,ApiError + IntentEvent: + EventPage: + ApiError: super(-1),fetchEvents(-1),url(-1),response(-1),payload(-1),publishEvent(-1),response(-1),payload(-1) + src/extractors/ast/records.ts: + i: ../../core/record.js,../../core/types.js,./types.js + e: adapterRecords,detailRecords,moduleRecords,byPath,bucket,start,end,capabilities,boundedCapabilities,moduleTopicText + adapterRecords() + detailRecords() + moduleRecords() + byPath() + bucket() + start() + end() + capabilities() + boundedCapabilities() + moduleTopicText() + src/tf/classifier.ts: + i: ../config/env.js,../core/text.js,../core/types.js,node:fs,node:path,node:url + e: TfTensor,TfModel,TfModule,ModelAssets,dynamicImport,importer,loadAssets,directory,vocabularyPath,labels,loadClassifier,modelPath,modulePath,moduleValue,absolute,model,assets,vectorize,values,index,classifyAction,fallback,loaded,probabilities,buildHeuristicActionResult,classifyWithTensorFlow,vector,input,predictionValue,prediction,probabilities,resolveActionFromTensorflow,bestIndex,action,confidence,indexOfMaxValue,bestIndex,clampProbability + TfTensor: + TfModel: + TfModule: + ModelAssets: + dynamicImport() + importer() + loadAssets() directory() - temporary() - existing() - compileOperationPlanArtifact() - plan() - bindings() - envelope() + vocabularyPath() + labels() + loadClassifier() + modelPath() + modulePath() + moduleValue() + absolute() + model() + assets() + vectorize() + values() + index() + classifyAction() + fallback() + loaded() + probabilities() + buildHeuristicActionResult() + classifyWithTensorFlow() + vector() + input() + predictionValue() + prediction() + probabilities() + resolveActionFromTensorflow() + bestIndex() + action() + confidence() + indexOfMaxValue() + bestIndex() + clampProbability() + src/core/record.ts: + i: ./id.js,./record-metadata.js,./target.js + e: BuildRecordGenerationInput,BuildRecordInput,buildRecord,rawExcerpt,seed,buildRecordSeed,buildRecordStatement,buildRecordSource,buildRecordEpistemic,withRecordGeneration,clamp,sourcePrefix + BuildRecordGenerationInput: + BuildRecordInput: + buildRecord() + rawExcerpt() + seed() + buildRecordSeed() + buildRecordStatement() + buildRecordSource() + buildRecordEpistemic() + withRecordGeneration() + clamp() + sourcePrefix() + src/synthesis/code-change-plan/implementation-source-patch-diff.ts: + e: normalizeUnifiedDiff,normalized,normalizeUnifiedDiffText,normalized,validateUnifiedDiffBody,validateUnifiedDiffPathHeaders,extractUnifiedDiffHeaders,validateUnifiedDiffHeaderPath,normalizedPath,normalizeUnifiedDiffHeaderPath,assertUnifiedDiffHeaderPathSafety,bare,stripped,isUnifiedDiffTraversalHeader,matchesUnifiedDiffExpectedHeader,normalizedHeaderPathCandidate,stripLeadingDiffPrefix + normalizeUnifiedDiff() + normalized() + normalizeUnifiedDiffText() + normalized() + validateUnifiedDiffBody() + validateUnifiedDiffPathHeaders() + extractUnifiedDiffHeaders() + validateUnifiedDiffHeaderPath() + normalizedPath() + normalizeUnifiedDiffHeaderPath() + assertUnifiedDiffHeaderPathSafety() + bare() + stripped() + isUnifiedDiffTraversalHeader() + matchesUnifiedDiffExpectedHeader() + normalizedHeaderPathCandidate() + stripLeadingDiffPrefix() + src/synthesis/code-change-plan/implementation-source-patch-create.ts: + i: ../../core/schema.js,../../version.js,./implementation-diagnostics.js,./implementation-source-patch-diff.js + e: CreateCodeChangeSourcePatchOptions,SourcePatchCreationContext,SourcePatchSetBuildContext,createCodeChangeSourcePatch,context,edits,semantic,patchHash,buildSourcePatchContext,graphFingerprint,createdAt,allowedPaths,collectPlanTargetPaths,validateUnifiedDiffsBelongToPlan,normalizedPath,buildSourcePatchEdits,buildSourcePatchEdit,path,rawDiff,unifiedDiff,buildSourcePatchSemantic,createCodeChangeSourcePatchSet,context,patches,result,normalizePatchSetOptions,generatedAt,buildPatchesForSet,buildSourcePatchSet,instructionFor,symbols,criteria,deterministicGeneration,uniqueSorted + CreateCodeChangeSourcePatchOptions: + SourcePatchCreationContext: + SourcePatchSetBuildContext: + createCodeChangeSourcePatch() + context() + edits() + semantic() + patchHash() + buildSourcePatchContext() + graphFingerprint() + createdAt() + allowedPaths() + collectPlanTargetPaths() + validateUnifiedDiffsBelongToPlan() + normalizedPath() + buildSourcePatchEdits() + buildSourcePatchEdit() + path() + rawDiff() + unifiedDiff() + buildSourcePatchSemantic() + createCodeChangeSourcePatchSet() + context() + patches() + result() + normalizePatchSetOptions() + generatedAt() + buildPatchesForSet() + buildSourcePatchSet() + instructionFor() + symbols() + criteria() + deterministicGeneration() + uniqueSorted() src/interfaces/mcp-resources.ts: i: ../config/env.js,../core/io.js,./mcp-errors.js,node:fs,node:path e: listMcpResources,readRequestedMcpResource,uri,readMcpResource,latestPath,selected,latest,filePath,latestPointer,assertInsideRoot,relative,isInvalidResourceError,resource @@ -3520,64 +4303,109 @@ Example: relative() isInvalidResourceError() resource() - src/extractors/ast/records.ts: - i: ../../core/record.js,../../core/types.js,./types.js - e: adapterRecords,detailRecords,moduleRecords,byPath,bucket,start,end,capabilities,boundedCapabilities,moduleTopicText - adapterRecords() - detailRecords() - moduleRecords() - byPath() - bucket() + src/interfaces/intake-actions.ts: + i: ../communication/intake-contract.js,../communication/intake-protobuf.js,../communication/intake-service.js,../config/env.js,../core/security.js,node:path + e: executeIntakeAction,requestedRoot,root,projectDir,operation,supplied,envelope,service,result,envelopeInput + executeIntakeAction() + requestedRoot() + root() + projectDir() + operation() + supplied() + envelope() + service() + result() + envelopeInput() + src/diff/text.ts: + i: ./text-myers.js,./text-types.js + e: DEFAULT_CONTEXT,DEFAULT_MAX_COMPARE_LINES,splitLines,normalized,lines,diffText,diffLineArrays,context,maxCompareLines,beforePath,afterPath,summarizeLines,computeLineDiff,prefix,suffix,lines,middleBefore,middleAfter,truncated,middleOps,sharedPrefixLength,prefix,sharedSuffixLength,suffix,prefixLines,suffixLines,beforeIndex,afterIndex,buildHunks,changeIndexes,start,end,last,hunkFromRange,slice,beforeNumbers,afterNumbers + DEFAULT_CONTEXT() + DEFAULT_MAX_COMPARE_LINES() + splitLines() + normalized() + lines() + diffText() + diffLineArrays() + context() + maxCompareLines() + beforePath() + afterPath() + summarizeLines() + computeLineDiff() + prefix() + suffix() + lines() + middleBefore() + middleAfter() + truncated() + middleOps() + sharedPrefixLength() + prefix() + sharedSuffixLength() + suffix() + prefixLines() + suffixLines() + beforeIndex() + afterIndex() + buildHunks() + changeIndexes() start() end() - capabilities() - boundedCapabilities() - moduleTopicText() - examples/frontend/src/api.ts: - e: IntentEvent,EventPage,ApiError - IntentEvent: - EventPage: - ApiError: super(-1),fetchEvents(-1),url(-1),response(-1),payload(-1),publishEvent(-1),response(-1),payload(-1) - src/synthesis/task-synthesis-materialize.ts: - i: ../core/grounding.js,../core/id.js,../core/schema.js,../core/target.js,./task-synthesis-contract.js - e: materializeTaskSynthesisResponse,parsed,conclusionKeys,proposalKeys,conclusions,diagnosticIds,conclusionIdByKey,conclusionByKey,proposalDrafts,conclusionKeys,citedConclusions,conclusion,proposalIdByKey,proposals,normalizeLocalKeys,explicit,reserved,keys,hasBlankKey,key,suffix,mapKeys,keys,id,sortedUnique,normalizeStringArray,values,normalizeRawTarget,target,normalizeAcceptanceCriteria,criteria,source,assertProposalEvidenceMatchesConclusions,byId,cited,diagnostics,records - materializeTaskSynthesisResponse() - parsed() - conclusionKeys() - proposalKeys() - conclusions() - diagnosticIds() - conclusionIdByKey() - conclusionByKey() - proposalDrafts() - conclusionKeys() - citedConclusions() - conclusion() - proposalIdByKey() - proposals() - normalizeLocalKeys() - explicit() - reserved() - keys() - hasBlankKey() - key() - suffix() - mapKeys() - keys() - id() - sortedUnique() - normalizeStringArray() - values() - normalizeRawTarget() + last() + hunkFromRange() + slice() + beforeNumbers() + afterNumbers() + src/diff/git.ts: + i: ./git-binary.js,./text.js,node:child_process,node:fs,node:path,node:util + e: GitDiffOptions,GitDiffResult,ChangedEntry,ResolvedGitDiffOptions,execFileAsync,collectGitDiff,normalized,worktree,args,selected,diffs,resolveGitDiffOptions,getWorktreeStatus,buildNameStatusArgs,capEntries,collectFileDiffs,diff,buildFileDiff,beforePath,before,after,diff,loadBeforeSnapshot,loadAfterSnapshot,parseNameStatus,parts,status,readBlob,readStagedBlob,readWorkingFile,runGit,result + GitDiffOptions: + GitDiffResult: + ChangedEntry: + ResolvedGitDiffOptions: + execFileAsync() + collectGitDiff() + normalized() + worktree() + args() + selected() + diffs() + resolveGitDiffOptions() + getWorktreeStatus() + buildNameStatusArgs() + capEntries() + collectFileDiffs() + diff() + buildFileDiff() + beforePath() + before() + after() + diff() + loadBeforeSnapshot() + loadAfterSnapshot() + parseNameStatus() + parts() + status() + readBlob() + readStagedBlob() + readWorkingFile() + runGit() + result() + src/operations/artifact.ts: + i: ../core/id.js,./subactor.js,./types.js,node:fs,node:path + e: CompileOperationPlanArtifactOptions,OperationPlanCompilationReceipt,readJson,writeExclusive,target,directory,temporary,existing,compileOperationPlanArtifact,plan,bindings,envelope + CompileOperationPlanArtifactOptions: + OperationPlanCompilationReceipt: + readJson() + writeExclusive() target() - normalizeAcceptanceCriteria() - criteria() - source() - assertProposalEvidenceMatchesConclusions() - byId() - cited() - diagnostics() - records() + directory() + temporary() + existing() + compileOperationPlanArtifact() + plan() + bindings() + envelope() src/extractors/todo.ts: i: ../config/env.js,../core/io.js,../core/record.js,../core/types.js,../tf/classifier.js,./markdown-block.js,./markdown-paths.js,node:path e: extractTodo,absolute,body,relative,lines,raw,heading,level,task,checked,block,text,classified,action,resolvedPaths,inferOwner,match,extractExplicitId @@ -3606,23 +4434,6 @@ Example: files() counts() extension() - src/evaluation/gold-extraction.ts: - i: ../config/env.js,../core/security.js,../core/types.js,../extractors/docs-deterministic.js,../extractors/docs-llm.js,../extractors/markdown.js,../extractors/nl.js,./gold-types.js,node:fs,node:os,node:path - e: runExtractionCase,root,config,writeFixtureFiles,destination,extractNlCase,extractMarkdownCase,extractDeterministicDocumentationCase,files,extractDocumentationCase,originalFetch,benchmarkConfig,config,projectRecord - runExtractionCase() - root() - config() - writeFixtureFiles() - destination() - extractNlCase() - extractMarkdownCase() - extractDeterministicDocumentationCase() - files() - extractDocumentationCase() - originalFetch() - benchmarkConfig() - config() - projectRecord() src/core/id.ts: i: node:crypto e: stableStringify,sortValue,sha256,shortHash,createIntentId,createRelationId,createConclusionId,createTodoProposalId,createCodeChangePlanHash,createCodeChangePlanId,createCodeChangeSourcePatchHash,createCodeChangeSourcePatchId,graphFingerprint,newRunId,stamp,asJsonValue @@ -3657,6 +4468,85 @@ Example: ContentCacheOptions: ContentCacheEntryOptions: ContentCache: getOrCompute(-1),assertNamespace(-1),key(-1),filePath(-1),cached(-1),value(-1),snapshot(-1),envelope(-1),write(-1),directory(-1),temporaryPath(-1),assertNamespace(-1),isNodeError(-1) + src/web/diff-ui.ts: + i: ./diff-ui-script.js + e: diffUiStyles,diffUiRunPanel,diffUiFiltersPanel,diffUiBodyMarkup,diffUiScriptMarkup,diffUiTemplate,diffUiHtml + diffUiStyles() + diffUiRunPanel() + diffUiFiltersPanel() + diffUiBodyMarkup() + diffUiScriptMarkup() + diffUiTemplate() + diffUiHtml() + src/synthesis/task-synthesis-materialize.ts: + i: ../core/grounding.js,../core/id.js,../core/schema.js,../core/target.js,./task-synthesis-contract.js + e: materializeTaskSynthesisResponse,parsed,conclusionKeys,proposalKeys,conclusions,diagnosticIds,conclusionIdByKey,conclusionByKey,proposalDrafts,conclusionKeys,citedConclusions,conclusion,proposalIdByKey,proposals,normalizeLocalKeys,explicit,reserved,keys,hasBlankKey,key,suffix,mapKeys,keys,id,sortedUnique,normalizeStringArray,values,normalizeRawTarget,target,normalizeAcceptanceCriteria,criteria,source,assertProposalEvidenceMatchesConclusions,byId,cited,diagnostics,records + materializeTaskSynthesisResponse() + parsed() + conclusionKeys() + proposalKeys() + conclusions() + diagnosticIds() + conclusionIdByKey() + conclusionByKey() + proposalDrafts() + conclusionKeys() + citedConclusions() + conclusion() + proposalIdByKey() + proposals() + normalizeLocalKeys() + explicit() + reserved() + keys() + hasBlankKey() + key() + suffix() + mapKeys() + keys() + id() + sortedUnique() + normalizeStringArray() + values() + normalizeRawTarget() + target() + normalizeAcceptanceCriteria() + criteria() + source() + assertProposalEvidenceMatchesConclusions() + byId() + cited() + diagnostics() + records() + src/synthesis/code-change-plan/implementation-targets.ts: + i: ../../core/target.js,../../core/types.js,../code-change-path.js + e: collectTarget,target,collectTargetComponents,paths,symbols,tickets,versions,addTargetEntries,finalizeTarget + collectTarget() + target() + collectTargetComponents() + paths() + symbols() + tickets() + versions() + addTargetEntries() + finalizeTarget() + src/evaluation/gold-extraction.ts: + i: ../config/env.js,../core/security.js,../core/types.js,../extractors/docs-deterministic.js,../extractors/docs-llm.js,../extractors/markdown.js,../extractors/nl.js,./gold-types.js,node:fs,node:os,node:path + e: runExtractionCase,root,config,writeFixtureFiles,destination,extractNlCase,extractMarkdownCase,extractDeterministicDocumentationCase,files,extractDocumentationCase,originalFetch,benchmarkConfig,config,projectRecord + runExtractionCase() + root() + config() + writeFixtureFiles() + destination() + extractNlCase() + extractMarkdownCase() + extractDeterministicDocumentationCase() + files() + extractDocumentationCase() + originalFetch() + benchmarkConfig() + config() + projectRecord() scripts/live-contract-check.mjs: i: node:fs,node:path,node:url e: REPO_ROOT,envNumber,value,main,config,manifest,history,recorded,runLivePipeline,root,outputDir,config,deadline,deadlineTimer,startedAt,failed,runLivePipelineOnce,result,readLatestRunManifest,runsRoot,manifestPath,stat,auditPath,historyPath,readHistory,parsed,writeJson @@ -3687,6 +4577,54 @@ Example: readHistory() parsed() writeJson() + src/pipeline/run-summary.ts: + i: ../config/env.js,../config/env.js,../core/types.js,../core/types.js,../llm/audit.js,../summary/summarizer.js,../version.js + e: SummaryResult,collectSummary,summaryStartedAt,includeSummaryLlm,summary + SummaryResult: + collectSummary() + summaryStartedAt() + includeSummaryLlm() + summary() + examples/backend/src/server.ts: + i: ./request-handlers.js,./store.js,node:http + e: BackendOptions,createBackend,store,server,sendJson,body,startBackend,port,host + BackendOptions: + createBackend() + store() + server() + sendJson() + body() + startBackend() + port() + host() + examples/frontend/src/render.ts: + i: ./api.js + e: PanelRow,classifyEvent,toRows,renderTable,table,head,body,tr,cell,renderError,banner,headerRow,tr,th + PanelRow: + classifyEvent() + toRows() + renderTable() + table() + head() + body() + tr() + cell() + renderError() + banner() + headerRow() + tr() + th() + examples/frontend/src/app.ts: + i: ./api.js,./render.js + e: PanelState,createState,refresh,page,message,mountPanel,state,reload + PanelState: + createState() + refresh() + page() + message() + mountPanel() + state() + reload() src/extractors/markdown.ts: i: ../config/env.js,../core/types.js,./changelog.js,./markdown-paths.js,./todo.js e: MarkdownExtractionOptions,extractMarkdownIntent,pathResolver,todo,changelog @@ -3695,6 +4633,50 @@ Example: pathResolver() todo() changelog() + src/synthesis/code-change-plan/implementation-helpers-acceptance.ts: + i: ../../core/schema.js,../../graph/diagnostics.js + e: EvaluateCodeChangeAcceptanceOptions,AcceptanceContext,evaluateCodeChangeAcceptance,context,reasons,accepted,acceptance,buildAcceptanceContext,evaluatedAt,afterDiagnostics,beforeDiagnosticIds,afterById,targetedDiagnosticIds,buildAcceptanceReasons,isAcceptancePassed,appendAcceptanceGateReason,buildAcceptanceResult + EvaluateCodeChangeAcceptanceOptions: + AcceptanceContext: + evaluateCodeChangeAcceptance() + context() + reasons() + accepted() + acceptance() + buildAcceptanceContext() + evaluatedAt() + afterDiagnostics() + beforeDiagnosticIds() + afterById() + targetedDiagnosticIds() + buildAcceptanceReasons() + isAcceptancePassed() + appendAcceptanceGateReason() + buildAcceptanceResult() + src/synthesis/code-change-plan/implementation-indexing.ts: + i: ../../core/types.js + e: indexProposalsByDiagnostic,index,list,indexConclusionsByDiagnostic,index,list + indexProposalsByDiagnostic() + index() + list() + indexConclusionsByDiagnostic() + index() + list() + src/synthesis/code-change-plan/implementation-helpers-close.ts: + i: ../../core/schema.js,../../graph/diagnostics.js,./implementation-helpers-shared.js + e: CloseCodeChangesOptions,CloseCodeChangeContext,closeCodeChanges,context,acceptances,acceptedCount,buildCloseCodeChangeContext,evaluatedAt,afterDiagnostics,ensureClosePlanIdsAreUnique,planIds,buildCloseResult + CloseCodeChangesOptions: + CloseCodeChangeContext: + closeCodeChanges() + context() + acceptances() + acceptedCount() + buildCloseCodeChangeContext() + evaluatedAt() + afterDiagnostics() + ensureClosePlanIdsAreUnique() + planIds() + buildCloseResult() src/evaluation/gold-metrics.ts: i: ../core/id.js,./gold-types.js e: Counts,emptyCounts,addCounts,compareSets,actualCounts,expectedCounts,counts,actualCount,expectedCount,frequency,counts,metric,ratio @@ -3711,8 +4693,33 @@ Example: counts() metric() ratio() - sdk/rust/src/actions.rs: - i: crate::,serde_json:: + scripts/normalize-generated-analysis-roots.mjs: + i: node:fs,node:path + e: root,sourceRoot,textExtensions,projectDirectory,changed,original,normalized + root() + sourceRoot() + textExtensions() + projectDirectory() + changed() + original() + normalized() + scripts/sync-generated-readme-metadata.mjs: + i: node:fs,node:path + e: root,readmePath,relativeReadme,packagePath,packageJson,version,license,nodeVersion,original,synchronized,licenseTarget,requiredString,replaceRequired,badgeValue + root() + readmePath() + relativeReadme() + packagePath() + packageJson() + version() + license() + nodeVersion() + original() + synchronized() + licenseTarget() + requiredString() + replaceRequired() + badgeValue() sdk/go/types.go: e: SourceLineRange,IntentTarget,IntentStatement,IntentSource,IntentEpistemic,IntentGenerationMetadata,IntentRecord,IntentRelation,IntentGraph,Diagnostic,DiagnosticReport,ExtractionResult,Part,Message,Artifact,Task,RealityResult,DiffResult,Error,Generation,Error SourceLineRange: @@ -3736,61 +4743,8 @@ Example: Error: Generation() Error() - scripts/sync-generated-readme-metadata.mjs: - i: node:fs,node:path - e: root,readmePath,relativeReadme,packagePath,packageJson,version,license,nodeVersion,original,synchronized,licenseTarget,requiredString,replaceRequired,badgeValue - root() - readmePath() - relativeReadme() - packagePath() - packageJson() - version() - license() - nodeVersion() - original() - synchronized() - licenseTarget() - requiredString() - replaceRequired() - badgeValue() - scripts/normalize-generated-analysis-roots.mjs: - i: node:fs,node:path - e: root,sourceRoot,textExtensions,projectDirectory,changed,original,normalized - root() - sourceRoot() - textExtensions() - projectDirectory() - changed() - original() - normalized() - examples/frontend/src/render.ts: - i: ./api.js - e: PanelRow,classifyEvent,toRows,renderTable,table,head,body,tr,cell,renderError,banner,headerRow,tr,th - PanelRow: - classifyEvent() - toRows() - renderTable() - table() - head() - body() - tr() - cell() - renderError() - banner() - headerRow() - tr() - th() - examples/frontend/src/app.ts: - i: ./api.js,./render.js - e: PanelState,createState,refresh,page,message,mountPanel,state,reload - PanelState: - createState() - refresh() - page() - message() - mountPanel() - state() - reload() + sdk/rust/src/actions.rs: + i: crate::,serde_json:: src/synthesis/task-synthesis-payload.ts: e: compactSynthesisPayload,recordIds,todoRecords,records,includedIds,groundedDiagnostics,compactRecord,compareDiagnostics compactSynthesisPayload() @@ -3801,9 +4755,6 @@ Example: groundedDiagnostics() compactRecord() compareDiagnostics() - src/interfaces/mcp-errors.ts: - e: McpRequestError - McpRequestError: super(-1),normalizeMcpError(-1) src/interfaces/a2a-card.ts: i: ../config/env.js,../version.js,node:crypto,node:http e: sendAgentCard,card,serialized,payload,agentCard,skills,skill @@ -3814,6 +4765,9 @@ Example: agentCard() skills() skill() + src/interfaces/mcp-errors.ts: + e: McpRequestError + McpRequestError: super(-1),normalizeMcpError(-1) sdk/go/actions.go: i: context e: ExtractAST,ExtractConfig,ExtractNL,ExtractDocs,ExtractMarkdown,ExtractMarkdownWithOptions,ExtractGit,Link,Diagnose,Reality,DiffGit,DiffFiles,CompareWorkspace,Pipeline,ProposeTodo,RenderTodo,ApplyTodo,callMap @@ -3835,15 +4789,11 @@ Example: RenderTodo() ApplyTodo() callMap() - src/sdk/typescript.ts: - i: ../core/types.js,../diff/reality.js,../diff/text.js,../services/actions.js - e: Todo2CodeClientOptions,DiffResult,FileDiffResult,GitDiffResponse,RealityResult,Todo2CodeClient - Todo2CodeClientOptions: - DiffResult: - FileDiffResult: - GitDiffResponse: - RealityResult: - Todo2CodeClient: a2a(-1),health(-1),diffGraphs(-1),diffGraphFiles(-1),compareWorkspace(-1),proposeTodo(-1),renderTodo(-1),applyTodo(-1),proposeCodeChange(-1),renderCodeChange(-1),proposeSourcePatch(-1),applySourcePatch(-1),evaluateCodeChange(-1),closeCodeChange(-1),extractNl(-1),run(-1) + examples/src/runtime.ts: + e: Contract,validateContract,executeContract + Contract: + validateContract() + executeContract() src/extractors/ast/python.ts: i: ../../config/env.js,../../core/ignore.js,../../core/io.js,../../core/types.js,./external.js,node:fs,node:os,node:path,node:url e: extractPythonAst,helperPath,matcher,files,temporaryDirectory,filesPath @@ -3862,6 +4812,11 @@ Example: files() temporaryDirectory() filesPath() + src/synthesis/code-change-plan/implementation-diagnostics.ts: + i: ../../core/types.js + e: collectImplementationDiagnostics,implementationDiagnosticRank + collectImplementationDiagnostics() + implementationDiagnosticRank() src/diff/svg.ts: e: SvgTheme,SvgDocumentOptions,escapeXml,truncate,sanitizeSourceLine,metricCard,svgStyles,svgDocument,theme SvgTheme: @@ -3873,6 +4828,40 @@ Example: svgStyles() svgDocument() theme() + src/sdk/typescript.ts: + i: ../core/types.js,../diff/reality.js,../diff/text.js,../services/actions.js + e: Todo2CodeClientOptions,DiffResult,FileDiffResult,GitDiffResponse,RealityResult,Todo2CodeClient + Todo2CodeClientOptions: + DiffResult: + FileDiffResult: + GitDiffResponse: + RealityResult: + Todo2CodeClient: a2a(-1),health(-1),diffGraphs(-1),diffGraphFiles(-1),compareWorkspace(-1),proposeTodo(-1),renderTodo(-1),applyTodo(-1),proposeCodeChange(-1),renderCodeChange(-1),proposeSourcePatch(-1),applySourcePatch(-1),evaluateCodeChange(-1),closeCodeChange(-1),extractNl(-1),run(-1) + scripts/assert-demollm-run.mjs: + i: node:fs/promises,node:path + e: root,output,latestPath,latest,manifestPath,manifest,stage,stage,tokens,cost + root() + output() + latestPath() + latest() + manifestPath() + manifest() + stage() + stage() + tokens() + cost() + scripts/generate-response-schemas.mjs: + i: ../dist/src/extractors/docs-schema.js,node:fs,node:path,node:url + e: root,outputPath,publishedDocumentMaximum,current + root() + outputPath() + publishedDocumentMaximum() + current() + scripts/vallm-compatible.py: + e: detect_file_language_with_parser_id + detect_file_language_with_parser_id(file_path) + sdk/rust/src/error.rs: + i: std::fmt sdk/rust/src/types.rs: i: serde::,serde_json::Value e: SourceLineRange,IntentTarget,IntentStatement,IntentSource,IntentEpistemic,IntentLifecycle,IntentGenerationMetadata,IntentRecord,Diagnostic,DiagnosticReport,ExtractionResult @@ -3887,42 +4876,73 @@ Example: Diagnostic: DiagnosticReport: ExtractionResult: - sdk/rust/src/error.rs: - i: std::fmt sdk/python/todo2code_sdk.py: e: Todo2CodeClient,_record_dict Todo2CodeClient: __init__(3),health(0),extract_nl(3),extract_docs(3),diff_graphs(3),diff_graph_files(3),diff_text_files(2),diff_git(0),reality(1),run(2) # Diff-focused client for the todo2code runtime. Graph compar... _record_dict(record) - scripts/vallm-compatible.py: - e: detect_file_language_with_parser_id - detect_file_language_with_parser_id(file_path) - scripts/generate-response-schemas.mjs: - i: ../dist/src/extractors/docs-schema.js,node:fs,node:path,node:url - e: root,outputPath,publishedDocumentMaximum,current - root() - outputPath() - publishedDocumentMaximum() - current() - scripts/assert-demollm-run.mjs: - i: node:fs/promises,node:path - e: root,output,latestPath,latest,manifestPath,manifest,stage,stage,tokens,cost - root() - output() - latestPath() - latest() - manifestPath() - manifest() - stage() - stage() - tokens() - cost() - examples/src/runtime.ts: - e: Contract,validateContract,executeContract - Contract: - validateContract() - executeContract() + examples/backend/src/store.ts: + e: IntentEvent,EventPage,EventStore + IntentEvent: + EventPage: + EventStore: enqueueEvent(-1),listEvents(-1),start(-1),size(-1) + examples/src/helper.py: + e: load_task,normalize_task + load_task(path) + normalize_task(value) + examples/sdk/typescript.mjs: + i: ../../dist/src/sdk/typescript.js,node:fs/promises + e: client + client() + src/extractors/docs-schema.ts: + i: ../llm/structured-schema.js,./docs-types.js + e: strings,target,documentRecord,documentResponseContract,documentResponseSchema + strings() + target() + documentRecord() + documentResponseContract() + documentResponseSchema() + src/extractors/ast/rust.ts: + i: ../../config/env.js,../../core/types.js,./external.js,node:path,node:url + e: extractRustAst,helperPath + extractRustAst() + helperPath() + src/extractors/ast/go.ts: + i: ../../config/env.js,../../core/types.js,./external.js,node:path,node:url + e: extractGoAst,helperPath + extractGoAst() + helperPath() + src/extractors/ast/java.ts: + i: ../../config/env.js,../../core/types.js,./external.js,node:path,node:url + e: extractJavaAst,helperPath + extractJavaAst() + helperPath() + src/core/schema/constants.ts: + e: ACTIONS,MODALITIES,POLARITIES,LIFECYCLES,SOURCE_KINDS,EPISTEMIC_CLASSES,RELATION_TYPES,CONCLUSION_KINDS,DIAGNOSTIC_SEVERITIES,TODO_PRIORITIES,GENERATION_REQUESTED_MODES,GENERATION_EFFECTIVE_MODES,CODE_CHANGE_ACTIONS,CODE_CHANGE_RISK_LEVELS + ACTIONS() + MODALITIES() + POLARITIES() + LIFECYCLES() + SOURCE_KINDS() + EPISTEMIC_CLASSES() + RELATION_TYPES() + CONCLUSION_KINDS() + DIAGNOSTIC_SEVERITIES() + TODO_PRIORITIES() + GENERATION_REQUESTED_MODES() + GENERATION_EFFECTIVE_MODES() + CODE_CHANGE_ACTIONS() + CODE_CHANGE_RISK_LEVELS() + src/semantic/reranker-response.ts: + i: ../llm/structured-schema.js + e: SemanticRerankerResponse,RERANK_DECISION_CONTRACT,SEMANTIC_RERANK_RESPONSE_CONTRACT,SEMANTIC_RERANK_RESPONSE_SCHEMA,assertSemanticRerankerResponse,response + SemanticRerankerResponse: + RERANK_DECISION_CONTRACT() + SEMANTIC_RERANK_RESPONSE_CONTRACT() + SEMANTIC_RERANK_RESPONSE_SCHEMA() + assertSemanticRerankerResponse() + response() src/synthesis/task-synthesis-contract.ts: i: ../core/types.js,../llm/structured-schema.js e: RawConclusion,RawProposal,RawTaskSynthesisResponse,taskStrings,taskIds,nonBlank,RAW_CONCLUSION_CONTRACT,RAW_PROPOSAL_CONTRACT,TASK_SYNTHESIS_RESPONSE_CONTRACT @@ -3935,15 +4955,20 @@ Graph compar... RAW_CONCLUSION_CONTRACT() RAW_PROPOSAL_CONTRACT() TASK_SYNTHESIS_RESPONSE_CONTRACT() - src/semantic/reranker-response.ts: - i: ../llm/structured-schema.js - e: SemanticRerankerResponse,RERANK_DECISION_CONTRACT,SEMANTIC_RERANK_RESPONSE_CONTRACT,SEMANTIC_RERANK_RESPONSE_SCHEMA,assertSemanticRerankerResponse,response - SemanticRerankerResponse: - RERANK_DECISION_CONTRACT() - SEMANTIC_RERANK_RESPONSE_CONTRACT() - SEMANTIC_RERANK_RESPONSE_SCHEMA() - assertSemanticRerankerResponse() - response() + src/synthesis/code-change-plan/implementation-helpers-shared.ts: + i: ../../core/id.js,../../core/types.js,../../version.js,./implementation-diagnostics.js + e: uniqueSorted,deterministicGeneration + uniqueSorted() + deterministicGeneration() + src/llm/audit.ts: + i: ../config/env.js,../core/types.js + e: openRouterAuditConfiguration + openRouterAuditConfiguration() + src/diff/git-binary.ts: + i: node:path + e: BINARY_EXTENSIONS,isProbablyBinary + BINARY_EXTENSIONS() + isProbablyBinary() src/operations/contract.ts: i: ../core/id.js,./validation.js e: variableContractSemanticValue,createVariableContract,normalized,normalizedPlanDraft,operationPlanHashMaterial,createOperationPlan,normalized,planHash @@ -3955,76 +4980,55 @@ Graph compar... createOperationPlan() normalized() planHash() - src/llm/audit.ts: - i: ../config/env.js,../core/types.js - e: openRouterAuditConfiguration - openRouterAuditConfiguration() - src/extractors/docs-schema.ts: - i: ../llm/structured-schema.js,./docs-types.js - e: strings,target,documentRecord,documentResponseContract,documentResponseSchema - strings() - target() - documentRecord() - documentResponseContract() - documentResponseSchema() - src/extractors/ast/rust.ts: - i: ../../config/env.js,../../core/types.js,./external.js,node:path,node:url - e: extractRustAst,helperPath - extractRustAst() - helperPath() - src/extractors/ast/java.ts: - i: ../../config/env.js,../../core/types.js,./external.js,node:path,node:url - e: extractJavaAst,helperPath - extractJavaAst() - helperPath() - src/extractors/ast/go.ts: - i: ../../config/env.js,../../core/types.js,./external.js,node:path,node:url - e: extractGoAst,helperPath - extractGoAst() - helperPath() - sdk/python/examples/local_runtime.py: - e: main - main() sdk/php/src/Error.php: e: Error Error: - examples/src/helper.py: - e: load_task,normalize_task - load_task(path) - normalize_task(value) - examples/sdk/typescript.mjs: - i: ../../dist/src/sdk/typescript.js,node:fs/promises - e: client - client() - examples/backend/src/store.ts: - e: IntentEvent,EventPage,EventStore - IntentEvent: - EventPage: - EventStore: enqueueEvent(-1),listEvents(-1),start(-1),size(-1) - tsconfig.json: - package.json: - docker-compose.yml: + sdk/python/examples/local_runtime.py: + e: main + main() + goal.yaml: compose.e2e.yml: - TODO.md: - TASK.md: - README.md: Makefile: + docker-compose.yml: Dockerfile: - CONTRIBUTION.md: - CHANGELOG.md: - src/version.ts: + tsconfig.json: + nlp2uri.yaml: + project2.sh: + package.json: + project.sh: + e: install_project_package,cleanup_analysis_snapshot,run_analysis_tool + install_project_package() + cleanup_analysis_snapshot() + run_analysis_tool() + schemas/todo-proposal.schema.json: + schemas/conclusion.schema.json: + schemas/document-extraction-response.schema.json: + schemas/participant-synthesis.schema.json: + schemas/intent-graph-diff.schema.json: + schemas/code-change-acceptance.schema.json: + schemas/operation-plan.schema.json: + schemas/code-change-review.schema.json: + schemas/code-change-close-result.schema.json: + schemas/code-change-source-patch.schema.json: + schemas/semantic-rerank.schema.json: + schemas/intent-graph.schema.json: + schemas/intent-record.schema.json: + schemas/code-change-plan-set.schema.json: + schemas/code-change-source-apply-receipt.schema.json: + schemas/todo-patch.schema.json: + schemas/variable-contract.schema.json: + schemas/participant-registry.schema.json: + schemas/code-change-plan.schema.json: + schemas/code-change-source-patch-set.schema.json: + schemas/semantic-candidate-set.schema.json: + schemas/gold-dataset.schema.json: + rust-ast/Cargo.toml: + examples/backend/tsconfig.json: + examples/frontend/tsconfig.json: + examples/project/participants.json: + examples/sdk/python.py: src/index.ts: - src/operations/types.ts: - i: ../core/types.js - e: VariableContract,OperationParameterReference,OperationRollback,OperationStep,OperationExpectation,OperationPlan,ResolvedVariableBinding,SubactorProcessEnvelope - VariableContract: - OperationParameterReference: - OperationRollback: - OperationStep: - OperationExpectation: - OperationPlan: - ResolvedVariableBinding: - SubactorProcessEnvelope: + src/version.ts: src/extractors/docs-types.ts: e: RawDocumentRecord,DocumentResponse,DocumentChunk,DocumentationTargetHints,DocumentationExtractionOptions,DocumentationExtractionResult,DocumentChunkResult RawDocumentRecord: @@ -4039,30 +5043,12 @@ Graph compar... e: AdapterFact,AdapterOutput AdapterFact: AdapterOutput: - src/diff/text-types.ts: - e: DiffLine,DiffHunk,FileDiff,DiffTextOptions - DiffLine: - DiffHunk: - FileDiff: - DiffTextOptions: + src/core/types/index.ts: src/core/version.ts: - src/core/types.ts: - e: SourceLineRange,IntentTarget,IntentStatement,IntentSource,IntentEpistemic,IntentLifecycle,IntentGenerationMetadata,IntentRecordMetadata,IntentRecord,IntentRelation,IntentGraph,IntentRecordChange,IntentGraphDiff,Diagnostic,DiagnosticReport,GroundedGenerationMetadata,Conclusion,TodoProposal,CodeChangeFile,CodeChangeRisk,CodeChangePlan,CodeChangeAcceptance,CodeChangeCloseResult,CodeChangeReviewPatch,CodeChangeSourceEdit,CodeChangeSourcePatch,CodeChangeSourcePatchSet,CodeChangeSourcePatchApproval,CodeChangeSourceApplyReceipt,TodoPatchDuplicateClassification,TodoPatchArtifact,TodoPatchApproval,TodoApplyReceipt,TodoApplyResult,ExtractionResult,ContentCacheStats,CachedExtractionResult,LlmResponseMetadata,PipelineStageAudit,PipelineOptions,PipelineManifest - SourceLineRange: - IntentTarget: - IntentStatement: - IntentSource: - IntentEpistemic: - IntentLifecycle: - IntentGenerationMetadata: - IntentRecordMetadata: - IntentRecord: - IntentRelation: - IntentGraph: - IntentRecordChange: - IntentGraphDiff: - Diagnostic: - DiagnosticReport: + src/core/schema/index.ts: + src/core/types/code-change.ts: + i: ./diagnostics.js,./intent.js,./pipeline.js + e: GroundedGenerationMetadata,Conclusion,TodoProposal,CodeChangeFile,CodeChangeRisk,CodeChangePlan,CodeChangeAcceptance,CodeChangeCloseResult,CodeChangeReviewPatch,CodeChangeSourceEdit,CodeChangeSourcePatch,CodeChangeSourcePatchSet,CodeChangeSourcePatchApproval,CodeChangeSourceApplyReceipt,TodoPatchDuplicateClassification,TodoPatchArtifact,TodoPatchApproval,TodoApplyReceipt,TodoApplyResult GroundedGenerationMetadata: Conclusion: TodoProposal: @@ -4082,6 +5068,28 @@ Graph compar... TodoPatchApproval: TodoApplyReceipt: TodoApplyResult: + src/core/types/intent.ts: + e: SourceLineRange,IntentTarget,IntentStatement,IntentSource,IntentEpistemic,IntentLifecycle,IntentGenerationMetadata,IntentRecordMetadata,IntentRecord,IntentRelation,IntentGraph,IntentRecordChange,IntentGraphDiff + SourceLineRange: + IntentTarget: + IntentStatement: + IntentSource: + IntentEpistemic: + IntentLifecycle: + IntentGenerationMetadata: + IntentRecordMetadata: + IntentRecord: + IntentRelation: + IntentGraph: + IntentRecordChange: + IntentGraphDiff: + src/core/types/diagnostics.ts: + e: Diagnostic,DiagnosticReport + Diagnostic: + DiagnosticReport: + src/core/types/pipeline.ts: + i: ./intent.js + e: ExtractionResult,ContentCacheStats,CachedExtractionResult,LlmResponseMetadata,PipelineStageAudit,PipelineOptions,PipelineManifest ExtractionResult: ContentCacheStats: CachedExtractionResult: @@ -4089,108 +5097,81 @@ Graph compar... PipelineStageAudit: PipelineOptions: PipelineManifest: - sdk/__init__.py: - sdk/README.md: - sdk/typescript/tsconfig.json: - sdk/typescript/package.json: - sdk/typescript/README.md: - sdk/rust/README.md: - sdk/rust/Cargo.toml: - sdk/rust/src/lib.rs: - sdk/python/__init__.py: - sdk/python/README.md: - sdk/python/todo2code/__init__.py: - sdk/php/composer.json: - sdk/php/README.md: - sdk/php/examples/basic.php: - i: Todo2Code\Client,Todo2Code\Error - sdk/go/todo2code.go: - sdk/go/README.md: - scripts/smoke.sh: + src/semantic/reranker/index.ts: + src/semantic/reranker/types.ts: + e: SemanticRetrievalIdentity,SemanticCandidate,SemanticCandidateSet,SemanticCandidateInput,SemanticRetrievalInput,SemanticEvidenceCitation,SemanticRerankDecisionInput,SemanticRerankDecision,SemanticRerankGeneration,SemanticRerankResult,SemanticRerankGenerationInput + SemanticRetrievalIdentity: + SemanticCandidate: + SemanticCandidateSet: + SemanticCandidateInput: + SemanticRetrievalInput: + SemanticEvidenceCitation: + SemanticRerankDecisionInput: + SemanticRerankDecision: + SemanticRerankGeneration: + SemanticRerankResult: + SemanticRerankGenerationInput: + src/synthesis/code-change-plan/index.ts: + src/synthesis/code-change-plan/implementation.ts: + src/synthesis/code-change-plan/implementation-helpers.ts: + src/synthesis/code-change-plan/implementation-source-patch.ts: + src/synthesis/code-change-plan/implementation-source-patch-apply.ts: + src/interfaces/governed-intake.proto: + src/interfaces/intake-schemas/command-v1.schema.json: + src/interfaces/intake-schemas/result-v1.schema.json: + src/interfaces/intake-schemas/event-v1.schema.json: + src/interfaces/intake-schemas/envelope-v1.schema.json: + src/interfaces/intake-schemas/participant-registry-v2.schema.json: + src/interfaces/intake-schemas/query-v1.schema.json: + src/interfaces/intake-schemas/diagnostic-v1.schema.json: + src/diff/text-types.ts: + e: DiffLine,DiffHunk,FileDiff,DiffTextOptions + DiffLine: + DiffHunk: + FileDiff: + DiffTextOptions: + src/operations/types.ts: + i: ../core/types.js + e: VariableContract,OperationParameterReference,OperationRollback,OperationStep,OperationExpectation,OperationPlan,ResolvedVariableBinding,SubactorProcessEnvelope + VariableContract: + OperationParameterReference: + OperationRollback: + OperationStep: + OperationExpectation: + OperationPlan: + ResolvedVariableBinding: + SubactorProcessEnvelope: + src/communication/llm.ts: scripts/package.py: - scripts/mcp-request.sh: - scripts/examples-check.sh: - e: cleanup,record_sdk_log,run_sdk - cleanup() - record_sdk_log() - run_sdk() scripts/e2e.sh: e: fail,require_command,run_step fail() require_command() run_step() + scripts/a2a-request.sh: + scripts/mcp-request.sh: scripts/docker-smoke.sh: e: cleanup cleanup() - scripts/a2a-request.sh: - scripts/research/README.md: - schemas/variable-contract.schema.json: - schemas/todo-proposal.schema.json: - schemas/todo-patch.schema.json: - schemas/semantic-rerank.schema.json: - schemas/semantic-candidate-set.schema.json: - schemas/participant-synthesis.schema.json: - schemas/participant-registry.schema.json: - schemas/operation-plan.schema.json: - schemas/intent-record.schema.json: - schemas/intent-graph.schema.json: - schemas/intent-graph-diff.schema.json: - schemas/gold-dataset.schema.json: - schemas/document-extraction-response.schema.json: - schemas/conclusion.schema.json: - schemas/code-change-source-patch.schema.json: - schemas/code-change-source-patch-set.schema.json: - schemas/code-change-source-apply-receipt.schema.json: - schemas/code-change-review.schema.json: - schemas/code-change-plan.schema.json: - schemas/code-change-plan-set.schema.json: - schemas/code-change-close-result.schema.json: - schemas/code-change-acceptance.schema.json: - rust-ast/Cargo.toml: - python/requirements.txt: - prompts/tasks-from-dsl.system.md: - prompts/summarize.system.md: - prompts/nl-to-intent.system.md: - prompts/markdown-to-intent.system.md: - prompts/docs-to-intent.system.md: - prompts/communication-to-intent.system.md: - examples/task.md: - examples/TODO.md: - examples/CHANGELOG.md: - examples/sdk/python.py: - examples/frontend/tsconfig.json: - examples/frontend/task.md: - examples/frontend/TODO.md: - examples/frontend/README.md: - examples/frontend/CHANGELOG.md: - examples/docs/ARCHITECTURE.md: - examples/backend/tsconfig.json: - examples/backend/task.md: - examples/backend/TODO.md: - examples/backend/README.md: - examples/backend/CHANGELOG.md: - evaluation/gold/README.md: + scripts/examples-check.sh: + e: cleanup,record_sdk_log,run_sdk + cleanup() + record_sdk_log() + run_sdk() + scripts/smoke.sh: + adapters/tensorflow/package.json: evaluation/gold/v2/dataset.json: evaluation/gold/v1/dataset.json: - docs/VALIDATION.md: - docs/TEST_REPORT.md: - docs/TEAM_COMMUNICATION.md: - docs/SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md: - docs/SUBACTOR_OPERATION_DSL.md: - docs/SECURITY.md: - docs/REQUIREMENTS.md: - docs/READINESS.md: - docs/PROTOCOLS.md: - docs/PIPELINE_DSL_NL.md: - docs/OPTIMIZATION.md: - docs/GROK-PLAN.md: - docs/E2E.md: - docs/DSL.md: - docs/DEMOLLM.md: - docs/CODE_CHANGE_PLANS.md: - docs/CLI_GUIDE.md: - docs/ARCHITECTURE.md: - docs/reference/original-monitoring-design.md: - docs/intent-guard-diagrams/README.md: - docs/intent-guard-diagrams/ALL_DIAGRAMS.md: - adapters/tensorflow/package.json: + python/requirements.txt: + sdk/__init__.py: + sdk/go/todo2code.go: + sdk/typescript/tsconfig.json: + sdk/typescript/package.json: + sdk/rust/Cargo.toml: + sdk/rust/src/lib.rs: + sdk/php/composer.json: + sdk/php/examples/basic.php: + i: Todo2Code\Client,Todo2Code\Error + sdk/python/__init__.py: + sdk/python/pyproject.toml: + sdk/python/todo2code/__init__.py: diff --git a/project/mermaid.export b/project/mermaid.export index 07a9a48..c4063d4 100644 --- a/project/mermaid.export +++ b/project/mermaid.export @@ -1,6 +1,24 @@ flowchart TD %% generated in 0.02s subgraph examples__backend + examples__backend__src__request_handlers__MAX_BODY_BYTES("MAX_BODY_BYTES CC=9") + examples__backend__src__request_handlers__handleRequest("handleRequest CC=9") + examples__backend__src__request_handlers__url["url"] + examples__backend__src__request_handlers__handleHealth["handleHealth"] + examples__backend__src__request_handlers__handleEventPublish["handleEventPublish"] + examples__backend__src__request_handlers__body["body"] + examples__backend__src__request_handlers__validation["validation"] + examples__backend__src__request_handlers__event["event"] + examples__backend__src__request_handlers__handleEventList["handleEventList"] + examples__backend__src__request_handlers__offset["offset"] + examples__backend__src__request_handlers__limit["limit"] + examples__backend__src__request_handlers__parseOffset["parseOffset"] + examples__backend__src__request_handlers__parsed["parsed"] + examples__backend__src__request_handlers__parseLimit["parseLimit"] + examples__backend__src__request_handlers__readBody["readBody"] + examples__backend__src__request_handlers__size["size"] + examples__backend__src__request_handlers__buffer["buffer"] + examples__backend__src__request_handlers__sendJson["sendJson"] examples__backend__src__validation__ALLOWED_ACTIONS("ALLOWED_ACTIONS CC=10") examples__backend__src__validation__validateEventPayload("validateEventPayload CC=10") examples__backend__src__validation__invalid["invalid"] @@ -12,26 +30,22 @@ flowchart TD examples__backend__src__store__EventStore__listEvents["listEvents"] examples__backend__src__store__EventStore__start["start"] examples__backend__src__store__EventStore__size["size"] - examples__backend__src__server__MAX_BODY_BYTES["MAX_BODY_BYTES"] examples__backend__src__server__createBackend["createBackend"] examples__backend__src__server__store["store"] examples__backend__src__server__server["server"] - examples__backend__src__server__handleRequest{{handleRequest CC=16}} - examples__backend__src__server__url["url"] - examples__backend__src__server__body["body"] - examples__backend__src__server__validation["validation"] - examples__backend__src__server__event["event"] - examples__backend__src__server__offset["offset"] - examples__backend__src__server__limit["limit"] - examples__backend__src__server__readBody["readBody"] - examples__backend__src__server__size["size"] - examples__backend__src__server__buffer["buffer"] examples__backend__src__server__sendJson["sendJson"] + examples__backend__src__server__body["body"] examples__backend__src__server__startBackend["startBackend"] examples__backend__src__server__port["port"] examples__backend__src__server__host["host"] end subgraph examples__frontend + examples__frontend__src__api__ApiError__super["super"] + examples__frontend__src__api__ApiError__fetchEvents["fetchEvents"] + examples__frontend__src__api__ApiError__url["url"] + examples__frontend__src__api__ApiError__response["response"] + examples__frontend__src__api__ApiError__payload["payload"] + examples__frontend__src__api__ApiError__publishEvent["publishEvent"] examples__frontend__src__render__classifyEvent["classifyEvent"] examples__frontend__src__render__toRows["toRows"] examples__frontend__src__render__renderTable["renderTable"] @@ -51,21 +65,15 @@ flowchart TD examples__frontend__src__app__mountPanel["mountPanel"] examples__frontend__src__app__state["state"] examples__frontend__src__app__reload["reload"] - examples__frontend__src__api__ApiError__super["super"] - examples__frontend__src__api__ApiError__fetchEvents["fetchEvents"] - examples__frontend__src__api__ApiError__url["url"] - examples__frontend__src__api__ApiError__response["response"] - examples__frontend__src__api__ApiError__payload["payload"] - examples__frontend__src__api__ApiError__publishEvent["publishEvent"] end subgraph examples__sdk examples__sdk__typescript__client["client"] end subgraph examples__src - examples__src__runtime__validateContract["validateContract"] - examples__src__runtime__executeContract["executeContract"] examples__src__helper__load_task["load_task"] examples__src__helper__normalize_task["normalize_task"] + examples__src__runtime__validateContract["validateContract"] + examples__src__runtime__executeContract["executeContract"] end subgraph golang__ast_extract golang__ast_extract__main("main CC=14") @@ -107,6 +115,11 @@ flowchart TD php__ast_extract__addFact["addFact"] php__ast_extract__parseFile{{parseFile CC=38}} end + subgraph project + project__install_project_package["install_project_package"] + project__cleanup_analysis_snapshot["cleanup_analysis_snapshot"] + project__run_analysis_tool["run_analysis_tool"] + end subgraph python__ast_extract python__ast_extract__source_hash["source_hash"] python__ast_extract__dotted_name["dotted_name"] @@ -237,6 +250,8 @@ flowchart TD scripts__normalize_generated_analysis_roots__normalized["normalized"] end subgraph scripts__research + scripts__research__evaluate_embedding_pairs__parse_args["parse_args"] + scripts__research__evaluate_embedding_pairs__main("main CC=9") scripts__research__rerank_embedding_shortlist__options["options"] scripts__research__rerank_embedding_shortlist__records["records"] scripts__research__rerank_embedding_shortlist__selectedRows["selectedRows"] @@ -264,11 +279,6 @@ flowchart TD scripts__research__rerank_embedding_shortlist__value["value"] scripts__research__rerank_embedding_shortlist__required["required"] scripts__research__rerank_embedding_shortlist__top["top"] - scripts__research__rank_intent_graph_embeddings__parse_args["parse_args"] - scripts__research__rank_intent_graph_embeddings__projection_text["projection_text"] - scripts__research__rank_intent_graph_embeddings__main{{main CC=27}} - scripts__research__evaluate_embedding_pairs__parse_args["parse_args"] - scripts__research__evaluate_embedding_pairs__main("main CC=9") scripts__research__audit_changelog_sample__options["options"] scripts__research__audit_changelog_sample__entries["entries"] scripts__research__audit_changelog_sample__root["root"] @@ -297,6 +307,9 @@ flowchart TD scripts__research__audit_changelog_sample__match["match"] scripts__research__audit_changelog_sample__candidate["candidate"] scripts__research__audit_changelog_sample__basename["basename"] + scripts__research__audit_changelog_sample__pathOwners["pathOwners"] + scripts__research__audit_changelog_sample__countBy["countBy"] + scripts__research__audit_changelog_sample__item["item"] end subgraph scripts__sync_generated_readme_metadata scripts__sync_generated_readme_metadata__root["root"] @@ -397,8 +410,6 @@ flowchart TD scripts__verify_workflow_yaml__directory["directory"] end subgraph sdk__go - sdk__go__types__Generation["Generation"] - sdk__go__types__Error["Error"] sdk__go__client__New["New"] sdk__go__client__nextID["nextID"] sdk__go__client__setHeaders["setHeaders"] @@ -409,6 +420,8 @@ flowchart TD sdk__go__client__Health["Health"] sdk__go__client__AgentCard["AgentCard"] sdk__go__client__getJSON["getJSON"] + sdk__go__types__Generation["Generation"] + sdk__go__types__Error["Error"] sdk__go__actions__ExtractAST["ExtractAST"] sdk__go__actions__ExtractConfig["ExtractConfig"] sdk__go__actions__ExtractNL["ExtractNL"] @@ -434,8 +447,6 @@ flowchart TD sdk__go__examples__basic__main__joinedIDs["joinedIDs"] end subgraph sdk__php - sdk__php__src__Error__Todo2Code__Error____construct["__construct"] - sdk__php__src__Error__Todo2Code__Error__data["data"] sdk__php__src__Client__Todo2Code__Client____construct["__construct"] sdk__php__src__Client__Todo2Code__Client__health["health"] sdk__php__src__Client__Todo2Code__Client__agentCard["agentCard"] @@ -463,6 +474,8 @@ flowchart TD sdk__php__src__Client__Todo2Code__Client__request("request CC=10") sdk__php__src__Client__Todo2Code__Client__statusFromHeaders["statusFromHeaders"] sdk__php__src__Client__Todo2Code__Client__nextId["nextId"] + sdk__php__src__Error__Todo2Code__Error____construct["__construct"] + sdk__php__src__Error__Todo2Code__Error__data["data"] end subgraph sdk__python sdk__python__todo2code_sdk__Todo2CodeClient____init__["__init__"] @@ -476,6 +489,8 @@ flowchart TD sdk__python__todo2code_sdk__Todo2CodeClient__reality["reality"] sdk__python__todo2code_sdk__Todo2CodeClient__run["run"] sdk__python__todo2code_sdk___record_dict["_record_dict"] + sdk__python__examples__basic__main("main CC=11") + sdk__python__examples__local_runtime__main["main"] sdk__python__todo2code__runtime__TypeScriptRuntime____init__["__init__"] sdk__python__todo2code__runtime__TypeScriptRuntime__invoke["invoke"] sdk__python__todo2code__runtime__TypeScriptRuntime__version["version"] @@ -523,13 +538,34 @@ flowchart TD sdk__python__todo2code__client__T2CClient__summarize["summarize"] sdk__python__todo2code__client__T2CClient__diff_graphs["diff_graphs"] sdk__python__todo2code__client__T2CClient__diff_graphs_rest["diff_graphs_rest"] - sdk__python__todo2code__client__T2CClient__diff_files["diff_files"] - sdk__python__todo2code__client__T2CClient__diff_git["diff_git"] end subgraph sdk__rust - sdk__rust__src__types__generation["generation"] + sdk__rust__examples__basic__main["main"] + sdk__rust__examples__basic__run{{run CC=20}} + sdk__rust__examples__basic__joined_ids["joined_ids"] + sdk__rust__src__actions__extract_ast["extract_ast"] + sdk__rust__src__actions__extract_config["extract_config"] + sdk__rust__src__actions__extract_nl["extract_nl"] + sdk__rust__src__actions__extract_nl_mode["extract_nl_mode"] + sdk__rust__src__actions__extract_docs["extract_docs"] + sdk__rust__src__actions__extract_markdown["extract_markdown"] + sdk__rust__src__actions__extract_markdown_mode["extract_markdown_mode"] + sdk__rust__src__actions__extract_git["extract_git"] + sdk__rust__src__actions__link["link"] + sdk__rust__src__actions__diagnose["diagnose"] + sdk__rust__src__actions__reality["reality"] + sdk__rust__src__actions__diff_git["diff_git"] + sdk__rust__src__actions__diff_files["diff_files"] + sdk__rust__src__actions__diff_graphs["diff_graphs"] + sdk__rust__src__actions__compare_workspace["compare_workspace"] + sdk__rust__src__actions__pipeline["pipeline"] + sdk__rust__src__actions__propose_todo["propose_todo"] + sdk__rust__src__actions__render_todo["render_todo"] + sdk__rust__src__actions__apply_todo["apply_todo"] + sdk__rust__src__actions__merge["merge"] sdk__rust__src__error__fmt["fmt"] sdk__rust__src__error__from["from"] + sdk__rust__src__types__generation["generation"] sdk__rust__src__client__new["new"] sdk__rust__src__client__with_timeout["with_timeout"] sdk__rust__src__client__next_id["next_id"] @@ -549,31 +585,27 @@ flowchart TD sdk__rust__src__client__decode_chunked["decode_chunked"] sdk__rust__src__client__parses_base_urls["parses_base_urls"] sdk__rust__src__client__decodes_chunked_bodies["decodes_chunked_bodies"] - sdk__rust__src__actions__extract_ast["extract_ast"] - sdk__rust__src__actions__extract_config["extract_config"] - sdk__rust__src__actions__extract_nl["extract_nl"] - sdk__rust__src__actions__extract_nl_mode["extract_nl_mode"] - sdk__rust__src__actions__extract_docs["extract_docs"] - sdk__rust__src__actions__extract_markdown["extract_markdown"] - sdk__rust__src__actions__extract_markdown_mode["extract_markdown_mode"] - sdk__rust__src__actions__extract_git["extract_git"] - sdk__rust__src__actions__link["link"] - sdk__rust__src__actions__diagnose["diagnose"] - sdk__rust__src__actions__reality["reality"] - sdk__rust__src__actions__diff_git["diff_git"] - sdk__rust__src__actions__diff_files["diff_files"] - sdk__rust__src__actions__diff_graphs["diff_graphs"] - sdk__rust__src__actions__compare_workspace["compare_workspace"] - sdk__rust__src__actions__pipeline["pipeline"] - sdk__rust__src__actions__propose_todo["propose_todo"] - sdk__rust__src__actions__render_todo["render_todo"] - sdk__rust__src__actions__apply_todo["apply_todo"] - sdk__rust__src__actions__merge["merge"] - sdk__rust__examples__basic__main["main"] - sdk__rust__examples__basic__run{{run CC=20}} - sdk__rust__examples__basic__joined_ids["joined_ids"] end subgraph sdk__typescript + sdk__typescript__examples__basic__baseUrl{{baseUrl CC=17}} + sdk__typescript__examples__basic__token{{token CC=17}} + sdk__typescript__examples__basic__root{{root CC=17}} + sdk__typescript__examples__basic__main{{main CC=17}} + sdk__typescript__examples__basic__client["client"] + sdk__typescript__examples__basic__health["health"] + sdk__typescript__examples__basic__card["card"] + sdk__typescript__examples__basic__nl["nl"] + sdk__typescript__examples__basic__ast["ast"] + sdk__typescript__examples__basic__markdown["markdown"] + sdk__typescript__examples__basic__graph["graph"] + sdk__typescript__examples__basic__diagnostics["diagnostics"] + sdk__typescript__examples__basic__synthesis["synthesis"] + sdk__typescript__examples__basic__validation["validation"] + sdk__typescript__examples__basic__rendered["rendered"] + sdk__typescript__examples__basic__artifact["artifact"] + sdk__typescript__examples__basic__reality["reality"] + sdk__typescript__examples__basic__gitDiff["gitDiff"] + sdk__typescript__examples__basic__comparison["comparison"] sdk__typescript__src__unwrapTask["unwrapTask"] sdk__typescript__src__T2CError__super["super"] sdk__typescript__src__T2CClient__health["health"] @@ -615,149 +647,130 @@ flowchart TD sdk__typescript__src__T2CClient__rpc["rpc"] sdk__typescript__src__T2CClient__payload["payload"] sdk__typescript__src__T2CClient__getJson["getJson"] - sdk__typescript__src__T2CClient__request["request"] - sdk__typescript__src__T2CClient__controller["controller"] - sdk__typescript__src__T2CClient__timer["timer"] - sdk__typescript__src__T2CClient__clearTimeout["clearTimeout"] - sdk__typescript__examples__basic__baseUrl{{baseUrl CC=17}} - sdk__typescript__examples__basic__token{{token CC=17}} - sdk__typescript__examples__basic__root{{root CC=17}} - sdk__typescript__examples__basic__main{{main CC=17}} - sdk__typescript__examples__basic__client["client"] - sdk__typescript__examples__basic__health["health"] - sdk__typescript__examples__basic__card["card"] - sdk__typescript__examples__basic__nl["nl"] - sdk__typescript__examples__basic__ast["ast"] - sdk__typescript__examples__basic__markdown["markdown"] - sdk__typescript__examples__basic__graph["graph"] - sdk__typescript__examples__basic__diagnostics["diagnostics"] - sdk__typescript__examples__basic__synthesis["synthesis"] - sdk__typescript__examples__basic__validation["validation"] - sdk__typescript__examples__basic__rendered["rendered"] end subgraph src__cli src__cli__execFileAsync["execFileAsync"] - src__cli__main{{main CC=95}} + src__cli__main("main CC=9") src__cli__parsed["parsed"] src__cli__command["command"] src__cli__config["config"] + src__cli__handler["handler"] + src__cli__commandHandlers["commandHandlers"] + src__cli__resolveMainCommand["resolveMainCommand"] + src__cli__handleLink["handleLink"] src__cli__files["files"] src__cli__records["records"] src__cli__graph["graph"] + src__cli__handleDiagnose["handleDiagnose"] src__cli__graphFile["graphFile"] + src__cli__handleSummarize["handleSummarize"] src__cli__diagnosticsPath["diagnosticsPath"] src__cli__diagnostics["diagnostics"] src__cli__result["result"] src__cli__out["out"] + src__cli__handleProposeTodo["handleProposeTodo"] src__cli__graphPath["graphPath"] src__cli__output["output"] + src__cli__handleRenderTodo("handleRenderTodo CC=8") src__cli__synthesisPath["synthesisPath"] src__cli__patch["patch"] src__cli__audit["audit"] + src__cli__handleApplyTodo("handleApplyTodo CC=8") src__cli__receipt["receipt"] src__cli__actor["actor"] src__cli__approvalHash["approvalHash"] + src__cli__handleProposeCodeChange["handleProposeCodeChange"] + src__cli__handleRenderCodeChange["handleRenderCodeChange"] src__cli__plansPath["plansPath"] + src__cli__handleProposeSourcePatch["handleProposeSourcePatch"] src__cli__inputPath["inputPath"] src__cli__isPlanSet["isPlanSet"] + src__cli__handleApplySourcePatch["handleApplySourcePatch"] src__cli__patchPath["patchPath"] + src__cli__handleEvaluateCodeChange["handleEvaluateCodeChange"] src__cli__planPath["planPath"] src__cli__beforeGraphPath["beforeGraphPath"] src__cli__afterGraphPath["afterGraphPath"] + src__cli__handleCloseCodeChange["handleCloseCodeChange"] + src__cli__handleCompareWorkspace["handleCompareWorkspace"] src__cli__root["root"] + src__cli__handlePipeline["handlePipeline"] + src__cli__options("options CC=13") src__cli__handleWatch["handleWatch"] src__cli__taskFile["taskFile"] + src__cli__pipeline["pipeline"] src__cli__controller["controller"] src__cli__stop["stop"] + src__cli__resolvePipelineRoot["resolvePipelineRoot"] + src__cli__buildPipelineOptions["buildPipelineOptions"] + src__cli__buildCommonPipelineOptions["buildCommonPipelineOptions"] + src__cli__resolveWatchTaskFile["resolveWatchTaskFile"] + src__cli__buildWorkspaceComparisonOptions["buildWorkspaceComparisonOptions"] src__cli__formatWatchEvent("formatWatchEvent CC=10") src__cli__stamp("stamp CC=10") - src__cli__handleDiff{{handleDiff CC=24}} - src__cli__mode("mode CC=8") - src__cli__svg["svg"] - src__cli__html("html CC=8") - src__cli__beforeFile["beforeFile"] - src__cli__afterFile["afterFile"] - src__cli__diff["diff"] - src__cli__context("context CC=9") - src__cli__maxRows("maxRows CC=9") - src__cli__handleReality("handleReality CC=9") - src__cli__view["view"] - src__cli__markdown["markdown"] - src__cli__handleExtract{{handleExtract CC=16}} - src__cli__extractor["extractor"] - src__cli__file["file"] - src__cli__inline["inline"] - src__cli__handleCommunication("handleCommunication CC=11") - src__cli__analysis["analysis"] - src__cli__graphOut["graphOut"] - src__cli__emitExtraction["emitExtraction"] - src__cli__emitJson["emitJson"] - src__cli__initProject["initProject"] - src__cli__moduleRoot["moduleRoot"] - src__cli__sourceEnv["sourceEnv"] - src__cli__targetEnv["targetEnv"] + src__cli__handleDiff("handleDiff CC=9") end subgraph src__communication - src__communication__llm__CommunicationLlmRequiredError__super["super"] - src__communication__llm__CommunicationLlmRequiredError__extractCommunicationIntentAudited("extractCommunicationIntentAudited CC=12") - src__communication__llm__CommunicationLlmRequiredError__startedAt["startedAt"] - src__communication__llm__CommunicationLlmRequiredError__deterministic["deterministic"] - src__communication__llm__CommunicationLlmRequiredError__records["records"] - src__communication__llm__CommunicationLlmRequiredError__client["client"] - src__communication__llm__CommunicationLlmRequiredError__groups["groups"] - src__communication__llm__CommunicationLlmRequiredError__response["response"] - src__communication__llm__CommunicationLlmRequiredError__enrichments["enrichments"] - src__communication__llm__CommunicationLlmRequiredError__enrichedByOriginal["enrichedByOriginal"] - src__communication__llm__CommunicationLlmRequiredError__generation["generation"] - src__communication__llm__CommunicationLlmRequiredError__participants["participants"] - src__communication__llm__CommunicationLlmRequiredError__failure["failure"] - src__communication__llm__CommunicationLlmRequiredError__responses["responses"] - src__communication__llm__CommunicationLlmRequiredError__classifyLlmFailure["classifyLlmFailure"] - src__communication__llm__CommunicationAttemptError__super["super"] - src__communication__llm__CommunicationAttemptError__enrichWithCorrection["enrichWithCorrection"] - src__communication__llm__CommunicationAttemptError__completion["completion"] - src__communication__llm__CommunicationAttemptError__fallbackOrThrow["fallbackOrThrow"] - src__communication__llm__CommunicationAttemptError__failed["failed"] - src__communication__llm__CommunicationAttemptError__marked["marked"] - src__communication__llm__CommunicationAttemptError__participantGroups("participantGroups CC=10") - src__communication__llm__CommunicationAttemptError__grouped["grouped"] - src__communication__llm__CommunicationAttemptError__participant["participant"] - src__communication__llm__CommunicationAttemptError__role["role"] - src__communication__llm__CommunicationAttemptError__key["key"] - src__communication__llm__CommunicationAttemptError__values["values"] - src__communication__llm__CommunicationAttemptError__promptPayload["promptPayload"] - src__communication__llm__CommunicationAttemptError__validateEnrichments["validateEnrichments"] - src__communication__llm__CommunicationAttemptError__expected["expected"] - src__communication__llm__CommunicationAttemptError__output["output"] - src__communication__llm__CommunicationAttemptError__materializeSyntheses("materializeSyntheses CC=9") - src__communication__llm__CommunicationAttemptError__byKey["byKey"] - src__communication__llm__CommunicationAttemptError__seen["seen"] - src__communication__llm__CommunicationAttemptError__group["group"] - src__communication__llm__CommunicationAttemptError__permitted["permitted"] - src__communication__llm__CommunicationAttemptError__recordIds["recordIds"] - src__communication__llm__CommunicationAttemptError__enrichRecord["enrichRecord"] - src__communication__llm__CommunicationAttemptError__deterministicSyntheses["deterministicSyntheses"] - src__communication__llm__CommunicationAttemptError__synthesis["synthesis"] - src__communication__llm__CommunicationAttemptError__markDeterministic["markDeterministic"] - src__communication__llm__CommunicationAttemptError__deterministicGeneration["deterministicGeneration"] - src__communication__llm__CommunicationAttemptError__fallbackGeneration["fallbackGeneration"] - src__communication__llm__CommunicationAttemptError__llmGeneration["llmGeneration"] - src__communication__llm__CommunicationAttemptError__audit["audit"] - src__communication__llm__CommunicationAttemptError__roleOf["roleOf"] - src__communication__llm__CommunicationAttemptError__sortedUnique["sortedUnique"] - src__communication__llm__CommunicationAttemptError__readPrompt["readPrompt"] - src__communication__llm__CommunicationAttemptError__promptPath["promptPath"] - src__communication__llm__CommunicationAttemptError__communicationStrings["communicationStrings"] - src__communication__llm__CommunicationAttemptError__COMMUNICATION_ENRICHMENT_CONTRACT["COMMUNICATION_ENRICHMENT_CONTRACT"] - src__communication__llm__CommunicationAttemptError__PARTICIPANT_SYNTHESIS_CONTRACT["PARTICIPANT_SYNTHESIS_CONTRACT"] - src__communication__llm__CommunicationAttemptError__COMMUNICATION_RESPONSE_CONTRACT["COMMUNICATION_RESPONSE_CONTRACT"] - src__communication__identity__loadParticipantIdentityRegistry["loadParticipantIdentityRegistry"] - src__communication__identity__registryPath["registryPath"] - src__communication__identity__assertParticipantIdentityRegistry{{assertParticipantIdentityRegistry CC=30}} - src__communication__identity__registry{{registry CC=25}} - src__communication__identity__ids{{ids CC=25}} - src__communication__identity__external{{external CC=25}} - src__communication__identity__entry["entry"] + src__communication__intake_contract__IntakeError__super["super"] + src__communication__intake_contract__IntakeError__payloadHash["payloadHash"] + src__communication__intake_contract__IntakeError__canonicalJson["canonicalJson"] + src__communication__intake_contract__IntakeError__record["record"] + src__communication__intake_contract__IntakeError__assertIntakeEnvelope["assertIntakeEnvelope"] + src__communication__intake_contract__IntakeError__envelope["envelope"] + src__communication__intake_contract__IntakeError__validateIntakeEnvelopeHeader("validateIntakeEnvelopeHeader CC=14") + src__communication__intake_contract__IntakeError__validateIntakeEnvelopeTimestamp["validateIntakeEnvelopeTimestamp"] + src__communication__intake_contract__IntakeError__assertCommand["assertCommand"] + src__communication__intake_contract__IntakeError__assertQuery["assertQuery"] + src__communication__intake_contract__IntakeError__invalid["invalid"] + src__communication__intake_contract__IntakeError__base["base"] + src__communication__intake_contract__IntakeError__validateCommandPayload["validateCommandPayload"] + src__communication__intake_contract__IntakeError__assertParticipant("assertParticipant CC=9") + src__communication__intake_contract__IntakeError__participantId["participantId"] + src__communication__intake_contract__IntakeError__assertPrincipal["assertPrincipal"] + src__communication__intake_contract__IntakeError__role["role"] + src__communication__intake_contract__IntakeError__stringArray["stringArray"] + src__communication__intake_contract__IntakeError__capabilities["capabilities"] + src__communication__intake_contract__IntakeError__ticketId["ticketId"] + src__communication__intake_contract__IntakeError__validateQueryPayload["validateQueryPayload"] + src__communication__intake_contract__IntakeError__nonBlank["nonBlank"] + src__communication__intake_contract__IntakeError__entry["entry"] + src__communication__intake_contract__IntakeError__principalKey["principalKey"] + src__communication__intake_contract__IntakeError__principal["principal"] + src__communication__intake_contract__IntakeError__commandFields["commandFields"] + src__communication__intake_contract__IntakeError__type["type"] + src__communication__intake_contract__IntakeError__queryFields["queryFields"] + src__communication__intake_contract__IntakeError__strictObject["strictObject"] + src__communication__intake_contract__IntakeError__allowed["allowed"] + src__communication__intake_contract__IntakeError__extra["extra"] + src__communication__intake_contract__IntakeError__missing["missing"] + src__communication__intake_contract__IntakeError__diagnostic["diagnostic"] + src__communication__intake_contract__IntakeError__known["known"] + src__communication__intake_protobuf__encodeIntakeEnvelope["encodeIntakeEnvelope"] + src__communication__intake_protobuf__operation["operation"] + src__communication__intake_protobuf__decodeIntakeEnvelope["decodeIntakeEnvelope"] + src__communication__intake_protobuf__parsed("parsed CC=10") + src__communication__intake_protobuf__values("values CC=13") + src__communication__intake_protobuf__unknownFields["unknownFields"] + src__communication__intake_protobuf__payload["payload"] + src__communication__intake_protobuf__envelope["envelope"] + src__communication__intake_protobuf__encodeIntakeResult["encodeIntakeResult"] + src__communication__intake_protobuf__decodeIntakeResult("decodeIntakeResult CC=12") + src__communication__intake_protobuf__strings("strings CC=13") + src__communication__intake_protobuf__numbers("numbers CC=13") + src__communication__intake_protobuf__decodeDelimitedFields("decodeDelimitedFields CC=13") + src__communication__intake_protobuf__offset("offset CC=13") + src__communication__intake_protobuf__fieldStart["fieldStart"] + src__communication__intake_protobuf__field["field"] + src__communication__intake_protobuf__wire["wire"] + src__communication__intake_protobuf__raw["raw"] + src__communication__intake_protobuf__value["value"] + src__communication__intake_protobuf__parsePayloadJson["parsePayloadJson"] + src__communication__intake_protobuf__parseOptionalJson["parseOptionalJson"] + src__communication__intake_protobuf__buildIntakeEnvelope["buildIntakeEnvelope"] + src__communication__intake_protobuf__bytesField["bytesField"] + src__communication__intake_protobuf__data["data"] + src__communication__intake_protobuf__varintField["varintField"] + src__communication__intake_protobuf__writeVarint["writeVarint"] end subgraph src__comparison src__comparison__workspace__execFileAsync("execFileAsync CC=12") @@ -795,10 +808,10 @@ flowchart TD src__comparison__workspace__artifacts["artifacts"] src__comparison__workspace__scopedOutputDirectory["scopedOutputDirectory"] src__comparison__workspace__absolute["absolute"] + src__comparison__workspace__relative["relative"] src__comparison__workspace__commonPipelineOptions("commonPipelineOptions CC=11") src__comparison__workspace__optionsForRoot["optionsForRoot"] src__comparison__workspace__existingFile["existingFile"] - src__comparison__workspace__relative["relative"] src__comparison__workspace__coverage["coverage"] src__comparison__workspace__diagnosticDelta["diagnosticDelta"] src__comparison__workspace__classifyWorkspaceTrend("classifyWorkspaceTrend CC=9") @@ -838,16 +851,34 @@ flowchart TD src__config__env__hasOpenRouter["hasOpenRouter"] end subgraph src__core - src__core__text__STOP_WORDS{{STOP_WORDS CC=17}} - src__core__text__classifyActionHeuristically{{classifyActionHeuristically CC=17}} - src__core__text__conventional["conventional"] + src__core__target__GENERIC_SYMBOLS("GENERIC_SYMBOLS CC=9") + src__core__target__GENERIC_FILES("GENERIC_FILES CC=9") + src__core__target__normalizeTarget("normalizeTarget CC=9") + src__core__target__normalizePath["normalizePath"] + src__core__target__normalizeSymbol["normalizeSymbol"] + src__core__target__symbolAliases["symbolAliases"] + src__core__target__normalized["normalized"] + src__core__target__parts["parts"] + src__core__target__leaf["leaf"] + src__core__target__pathAliases["pathAliases"] + src__core__target__basename["basename"] + src__core__target__unique["unique"] + src__core__text__STOP_WORDS["STOP_WORDS"] + src__core__text__buildStopWords["buildStopWords"] + src__core__text__classifyActionHeuristically["classifyActionHeuristically"] + src__core__text__conventionalAction["conventionalAction"] src__core__text__prose["prose"] src__core__text__searchable["searchable"] + src__core__text__matchedByPattern["matchedByPattern"] + src__core__text__extractConventionalAction("extractConventionalAction CC=14") + src__core__text__conventional["conventional"] + src__core__text__findActionInText["findActionInText"] + src__core__text__removeInlineCode["removeInlineCode"] src__core__text__detectModality("detectModality CC=11") src__core__text__matches["matches"] src__core__text__detectPolarity("detectPolarity CC=8") src__core__text__stripped["stripped"] - src__core__text__normalized{{normalized CC=30}} + src__core__text__normalized["normalized"] src__core__text__normalizeToken["normalizeToken"] src__core__text__keywords["keywords"] src__core__text__GENERIC_TOPICS["GENERIC_TOPICS"] @@ -880,26 +911,17 @@ flowchart TD src__core__text__camel["camel"] src__core__text__ticketPrefixes["ticketPrefixes"] src__core__text__extractTickets["extractTickets"] - src__core__text__values["values"] - src__core__text__extractVersions["extractVersions"] - src__core__text__inferObject{{inferObject CC=34}} - src__core__text__result["result"] - src__core__text__splitIntentLines["splitIntentLines"] - src__core__text__lines["lines"] - src__core__text__raw["raw"] - src__core__text__cleaned["cleaned"] - src__core__text__pieces["pieces"] - src__core__target__GENERIC_SYMBOLS("GENERIC_SYMBOLS CC=9") - src__core__target__GENERIC_FILES("GENERIC_FILES CC=9") - src__core__target__normalizeTarget("normalizeTarget CC=9") - src__core__target__normalizePath["normalizePath"] - src__core__target__normalizeSymbol["normalizeSymbol"] - src__core__target__symbolAliases["symbolAliases"] - src__core__target__normalized["normalized"] - src__core__target__parts["parts"] - src__core__target__leaf["leaf"] end subgraph src__diff + src__diff__svg__escapeXml["escapeXml"] + src__diff__svg__truncate["truncate"] + src__diff__svg__sanitizeSourceLine["sanitizeSourceLine"] + src__diff__svg__metricCard["metricCard"] + src__diff__svg__svgStyles["svgStyles"] + src__diff__svg__svgDocument["svgDocument"] + src__diff__svg__theme["theme"] + src__diff__git_binary__BINARY_EXTENSIONS["BINARY_EXTENSIONS"] + src__diff__git_binary__isProbablyBinary["isProbablyBinary"] src__diff__text__DEFAULT_CONTEXT["DEFAULT_CONTEXT"] src__diff__text__DEFAULT_MAX_COMPARE_LINES["DEFAULT_MAX_COMPARE_LINES"] src__diff__text__splitLines["splitLines"] @@ -925,20 +947,6 @@ flowchart TD src__diff__text__suffixLines["suffixLines"] src__diff__text__beforeIndex["beforeIndex"] src__diff__text__afterIndex["afterIndex"] - src__diff__text__blockReplace["blockReplace"] - src__diff__text__myers{{myers CC=19}} - src__diff__text__n{{n CC=15}} - src__diff__text__m{{m CC=15}} - src__diff__text__max{{max CC=15}} - src__diff__text__offset{{offset CC=15}} - src__diff__text__v["v"] - src__diff__text__y{{y CC=15}} - src__diff__text__backtrack{{backtrack CC=18}} - src__diff__text__x{{x CC=15}} - src__diff__text__k["k"] - src__diff__text__previousK["previousK"] - src__diff__text__previousX["previousX"] - src__diff__text__previousY["previousY"] src__diff__text__buildHunks["buildHunks"] src__diff__text__changeIndexes["changeIndexes"] src__diff__text__start["start"] @@ -948,51 +956,38 @@ flowchart TD src__diff__text__slice["slice"] src__diff__text__beforeNumbers["beforeNumbers"] src__diff__text__afterNumbers["afterNumbers"] - src__diff__text_render__renderUnifiedDiff["renderUnifiedDiff"] - src__diff__text_render__marker["marker"] - src__diff__text_render__toSideBySideRows("toSideBySideRows CC=13") - src__diff__text_render__index("index CC=13") - src__diff__text_render__line["line"] - src__diff__text_render__pairs["pairs"] - src__diff__text_render__renderTextDiffSvg("renderTextDiffSvg CC=11") - src__diff__text_render__theme["theme"] - src__diff__text_render__maxRows["maxRows"] - src__diff__text_render__maxColumns["maxColumns"] - src__diff__text_render__title["title"] - src__diff__text_render__charWidth["charWidth"] + src__diff__reality__buildRealityView["buildRealityView"] + src__diff__reality__components["components"] + src__diff__reality__diagnosticsByRecord["diagnosticsByRecord"] + src__diff__reality__rows["rows"] + src__diff__reality__buildRealityRows["buildRealityRows"] + src__diff__reality__buildRealityRow("buildRealityRow CC=9") + src__diff__reality__codes["codes"] + src__diff__reality__status["status"] + src__diff__reality__compareRealityRows["compareRealityRows"] + src__diff__reality__bySeverity["bySeverity"] + src__diff__reality__alignment["alignment"] + src__diff__reality__bySize["bySize"] + src__diff__reality__buildRealityTotals{{buildRealityTotals CC=15}} + src__diff__reality__declaredRecords["declaredRecords"] + src__diff__reality__observedRecords["observedRecords"] + src__diff__reality__aligned["aligned"] + src__diff__reality__declaredTopics["declaredTopics"] end subgraph src__evaluation - src__evaluation__gold__loadGoldDataset["loadGoldDataset"] - src__evaluation__gold__parsed["parsed"] - src__evaluation__gold__evaluateGoldDataset["evaluateGoldDataset"] - src__evaluation__gold__first["first"] - src__evaluation__gold__second["second"] - src__evaluation__gold__stable["stable"] - src__evaluation__gold__goldReportIsPerfect("goldReportIsPerfect CC=14") - src__evaluation__gold__renderGoldReportMarkdown["renderGoldReportMarkdown"] - src__evaluation__gold__percent["percent"] - src__evaluation__gold__support["support"] - src__evaluation__gold__rows["rows"] - src__evaluation__gold__value["value"] - src__evaluation__gold__evaluateOnce["evaluateOnce"] - src__evaluation__gold__extraction["extraction"] - src__evaluation__gold__linking["linking"] - src__evaluation__gold__dsl2todo["dsl2todo"] - src__evaluation__gold__diagnostics["diagnostics"] - src__evaluation__gold__evaluateExtraction["evaluateExtraction"] - src__evaluation__gold__byChannel["byChannel"] - src__evaluation__gold__actual["actual"] - src__evaluation__gold__overall["overall"] - src__evaluation__gold__evaluateDiagnostics["evaluateDiagnostics"] - src__evaluation__gold__counts["counts"] - src__evaluation__gold__forbiddenViolations["forbiddenViolations"] - src__evaluation__gold__snapshots["snapshots"] - src__evaluation__gold__result["result"] - src__evaluation__gold__evaluateLinking("evaluateLinking CC=10") - src__evaluation__gold__byClass["byClass"] - src__evaluation__gold__reranking["reranking"] - src__evaluation__gold__evaluateDsl2Todo["evaluateDsl2Todo"] - src__evaluation__gold__duplicateCounts["duplicateCounts"] + src__evaluation__gold_extraction__runExtractionCase["runExtractionCase"] + src__evaluation__gold_extraction__root["root"] + src__evaluation__gold_extraction__config["config"] + src__evaluation__gold_extraction__writeFixtureFiles["writeFixtureFiles"] + src__evaluation__gold_extraction__destination["destination"] + src__evaluation__gold_extraction__extractNlCase["extractNlCase"] + src__evaluation__gold_extraction__extractMarkdownCase["extractMarkdownCase"] + src__evaluation__gold_extraction__extractDeterministicDocumentationCase["extractDeterministicDocumentationCa"] + src__evaluation__gold_extraction__files["files"] + src__evaluation__gold_extraction__extractDocumentationCase["extractDocumentationCase"] + src__evaluation__gold_extraction__originalFetch["originalFetch"] + src__evaluation__gold_extraction__benchmarkConfig["benchmarkConfig"] + src__evaluation__gold_extraction__projectRecord["projectRecord"] src__evaluation__gold_types__assertGoldDataset["assertGoldDataset"] src__evaluation__gold_types__dataset["dataset"] src__evaluation__gold_types__assertDatasetObject["assertDatasetObject"] @@ -1001,47 +996,47 @@ flowchart TD src__evaluation__gold_types__assertUniqueCaseIds["assertUniqueCaseIds"] src__evaluation__gold_types__assertExtractionCoverage["assertExtractionCoverage"] src__evaluation__gold_types__channels["channels"] - src__evaluation__gold_types__assertLinkingCohorts{{assertLinkingCohorts CC=32}} - src__evaluation__gold_types__labels{{labels CC=18}} - src__evaluation__gold_types__modules{{modules CC=18}} - src__evaluation__gold_metrics__emptyCounts["emptyCounts"] - src__evaluation__gold_metrics__addCounts["addCounts"] - src__evaluation__gold_metrics__compareSets["compareSets"] - src__evaluation__gold_metrics__actualCounts["actualCounts"] - src__evaluation__gold_metrics__expectedCounts["expectedCounts"] - src__evaluation__gold_metrics__counts["counts"] - src__evaluation__gold_metrics__actualCount["actualCount"] - src__evaluation__gold_metrics__expectedCount["expectedCount"] - src__evaluation__gold_metrics__frequency["frequency"] - src__evaluation__gold_metrics__metric["metric"] - src__evaluation__gold_metrics__ratio["ratio"] - src__evaluation__gold_extraction__runExtractionCase["runExtractionCase"] - src__evaluation__gold_extraction__root["root"] - src__evaluation__gold_extraction__config["config"] - src__evaluation__gold_extraction__writeFixtureFiles["writeFixtureFiles"] - src__evaluation__gold_extraction__destination["destination"] - src__evaluation__gold_extraction__extractNlCase["extractNlCase"] - src__evaluation__gold_extraction__extractMarkdownCase["extractMarkdownCase"] + src__evaluation__gold_types__assertLinkingCohorts["assertLinkingCohorts"] + src__evaluation__gold_types__assertGoldLinkingCohort["assertGoldLinkingCohort"] + src__evaluation__gold_types__assertRerankerFixture["assertRerankerFixture"] + src__evaluation__gold_types__assertRerankerModelIdentity["assertRerankerModelIdentity"] + src__evaluation__gold_types__assertRerankerDecisions["assertRerankerDecisions"] + src__evaluation__gold_types__decisions["decisions"] + src__evaluation__gold_types__recordLabels["recordLabels"] + src__evaluation__gold_types__seenModules["seenModules"] + src__evaluation__gold_types__assertRerankerDecision{{assertRerankerDecision CC=17}} + src__evaluation__gold_cases__evaluateLinkingCase("evaluateLinkingCase CC=8") + src__evaluation__gold_cases__idToLabel["idToLabel"] + src__evaluation__gold_cases__graph["graph"] + src__evaluation__gold_cases__observed["observed"] + src__evaluation__gold_cases__actual["actual"] + src__evaluation__gold_cases__expected["expected"] + src__evaluation__gold_cases__byClass["byClass"] + src__evaluation__gold_cases__forbidden["forbidden"] + src__evaluation__gold_cases__forbiddenViolations["forbiddenViolations"] + src__evaluation__gold_cases__evaluateRerankingCase["evaluateRerankingCase"] + src__evaluation__gold_cases__reranker["reranker"] + src__evaluation__gold_cases__declarationRecordId["declarationRecordId"] + src__evaluation__gold_cases__candidates["candidates"] + src__evaluation__gold_cases__decisions["decisions"] + src__evaluation__gold_cases__rerank["rerank"] + src__evaluation__gold_cases__buildRerankerCandidates["buildRerankerCandidates"] + src__evaluation__gold_cases__requestedCandidates["requestedCandidates"] + src__evaluation__gold_cases__buildRerankerDecisions["buildRerankerDecisions"] + src__evaluation__gold_cases__candidateByModule["candidateByModule"] + src__evaluation__gold_cases__moduleRecordId["moduleRecordId"] + src__evaluation__gold_cases__candidate["candidate"] + src__evaluation__gold_cases__buildRerankResult["buildRerankResult"] + src__evaluation__gold_cases__buildObservedRerankRelations["buildObservedRerankRelations"] + src__evaluation__gold_cases__augmented["augmented"] + src__evaluation__gold_cases__countForbiddenRelations["countForbiddenRelations"] + src__evaluation__gold_cases__restricted["restricted"] + src__evaluation__gold_cases__buildRerankExpected["buildRerankExpected"] + src__evaluation__gold_cases__buildRerankSnapshot["buildRerankSnapshot"] + src__evaluation__gold_cases__countVerdictDecisions["countVerdictDecisions"] + src__evaluation__gold_cases__resolveRerankerFixture["resolveRerankerFixture"] end subgraph src__extractors - src__extractors__todo__extractTodo["extractTodo"] - src__extractors__todo__absolute["absolute"] - src__extractors__todo__body["body"] - src__extractors__todo__relative["relative"] - src__extractors__todo__lines["lines"] - src__extractors__todo__raw["raw"] - src__extractors__todo__heading["heading"] - src__extractors__todo__level["level"] - src__extractors__todo__task["task"] - src__extractors__todo__checked["checked"] - src__extractors__todo__block["block"] - src__extractors__todo__text["text"] - src__extractors__todo__classified["classified"] - src__extractors__todo__action["action"] - src__extractors__todo__resolvedPaths["resolvedPaths"] - src__extractors__todo__inferOwner["inferOwner"] - src__extractors__todo__match["match"] - src__extractors__todo__extractExplicitId["extractExplicitId"] src__extractors__nl__assertNlExtractionOptions("assertNlExtractionOptions CC=9") src__extractors__nl__extractNlIntent["extractNlIntent"] src__extractors__nl__absolute["absolute"] @@ -1054,183 +1049,180 @@ flowchart TD src__extractors__nl__confidence["confidence"] src__extractors__nl__inferActor["inferActor"] src__extractors__nl__detectMissingFields("detectMissingFields CC=10") - src__extractors__nl_llm__NlLlmRequiredError__super["super"] - src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited("extractNlIntentAudited CC=10") - src__extractors__nl_llm__NlLlmRequiredError__assertNlExtractionOptions["assertNlExtractionOptions"] - src__extractors__nl_llm__NlLlmRequiredError__startedAt["startedAt"] - src__extractors__nl_llm__NlLlmRequiredError__result["result"] - src__extractors__nl_llm__NlLlmRequiredError__client["client"] - src__extractors__nl_llm__NlLlmRequiredError__absolute["absolute"] - src__extractors__nl_llm__NlLlmRequiredError__body["body"] - src__extractors__nl_llm__NlLlmRequiredError__sourcePath["sourcePath"] - src__extractors__nl_llm__NlLlmRequiredError__maxLine["maxLine"] - src__extractors__nl_llm__NlLlmRequiredError__prompt["prompt"] - src__extractors__nl_llm__NlLlmRequiredError__response["response"] - src__extractors__nl_llm__NlLlmRequiredError__records["records"] - src__extractors__nl_llm__NlLlmRequiredError__failure["failure"] - src__extractors__nl_llm__NlLlmRequiredError__responses["responses"] - src__extractors__nl_llm__NlAttemptError__super["super"] - src__extractors__nl_llm__NlAttemptError__extractNlWithCorrection["extractNlWithCorrection"] - src__extractors__nl_llm__NlAttemptError__completion["completion"] - src__extractors__nl_llm__NlAttemptError__fallbackOrThrow["fallbackOrThrow"] - src__extractors__nl_llm__NlAttemptError__failedAudit["failedAudit"] - src__extractors__nl_llm__NlAttemptError__deterministic["deterministic"] - src__extractors__nl_llm__NlAttemptError__markDeterministic["markDeterministic"] - src__extractors__nl_llm__NlAttemptError__toIntentRecord{{toIntentRecord CC=18}} - src__extractors__nl_llm__NlAttemptError__start["start"] - src__extractors__nl_llm__NlAttemptError__end["end"] - src__extractors__nl_llm__NlAttemptError__lines["lines"] - src__extractors__nl_llm__NlAttemptError__excerpt["excerpt"] - src__extractors__nl_llm__NlAttemptError__action["action"] - src__extractors__nl_llm__NlAttemptError__normalizedText("normalizedText CC=11") - src__extractors__nl_llm__NlAttemptError__statementText("statementText CC=11") + src__extractors__ast__extractAstIntent("extractAstIntent CC=12") + src__extractors__ast__root["root"] + src__extractors__ast__cache["cache"] + src__extractors__ast__matcher["matcher"] + src__extractors__ast__files["files"] + src__extractors__ast__body["body"] + src__extractors__ast__relative["relative"] + src__extractors__ast__extracted["extracted"] + src__extractors__ast__adapterFiles["adapterFiles"] + src__extractors__ast__manifest["manifest"] + src__extractors__ast__result["result"] + src__extractors__ast__unsupported["unsupported"] + src__extractors__ast__sourceManifest["sourceManifest"] + src__extractors__ast__isIntentRecords["isIntentRecords"] + src__extractors__ast__isExtractionResult["isExtractionResult"] + src__extractors__runtime_cycle__MAX_PER_SECTION("MAX_PER_SECTION CC=8") + src__extractors__runtime_cycle__extractRuntimeCycleIntent("extractRuntimeCycleIntent CC=8") + src__extractors__runtime_cycle__cyclePath["cyclePath"] + src__extractors__runtime_cycle__root["root"] + src__extractors__runtime_cycle__body["body"] + src__extractors__runtime_cycle__cycle["cycle"] + src__extractors__runtime_cycle__sourcePath["sourcePath"] + src__extractors__runtime_cycle__observedAt["observedAt"] + src__extractors__runtime_cycle__host["host"] + src__extractors__runtime_cycle__results["results"] + src__extractors__runtime_cycle__parseCycle["parseCycle"] + src__extractors__runtime_cycle__sourcePathFor["sourcePathFor"] + src__extractors__runtime_cycle__relative["relative"] + src__extractors__runtime_cycle__boundedArray("boundedArray CC=8") + src__extractors__runtime_cycle__objects["objects"] + src__extractors__runtime_cycle__label["label"] + src__extractors__runtime_cycle__text["text"] + src__extractors__runtime_cycle__tags["tags"] + src__extractors__runtime_cycle__watched["watched"] + src__extractors__runtime_cycle__declared["declared"] + src__extractors__runtime_cycle__probeRecord("probeRecord CC=9") + src__extractors__runtime_cycle__id["id"] + src__extractors__runtime_cycle__failed["failed"] + src__extractors__runtime_cycle__error["error"] + src__extractors__runtime_cycle__outcome["outcome"] + src__extractors__runtime_cycle__violationRecord["violationRecord"] + src__extractors__runtime_cycle__probe["probe"] + src__extractors__runtime_cycle__fact["fact"] + src__extractors__runtime_cycle__driftRecord["driftRecord"] + src__extractors__runtime_cycle__proposalRecord["proposalRecord"] + src__extractors__runtime_cycle__kind["kind"] + src__extractors__runtime_cycle__detail["detail"] + src__extractors__runtime_cycle__proposalAction["proposalAction"] end subgraph src__graph - src__graph__symbol_resolution__buildSymbolResolutionIndex{{buildSymbolResolutionIndex CC=15}} - src__graph__symbol_resolution__byAlias("byAlias CC=9") + src__graph__diff__diffIntentGraphs("diffIntentGraphs CC=11") + src__graph__diff__beforeById["beforeById"] + src__graph__diff__afterById["afterById"] + src__graph__diff__unchangedRecords["unchangedRecords"] + src__graph__diff__beforeGroups["beforeGroups"] + src__graph__diff__afterGroups["afterGroups"] + src__graph__diff__left["left"] + src__graph__diff__right["right"] + src__graph__diff__paired["paired"] + src__graph__diff__beforeRecord["beforeRecord"] + src__graph__diff__afterRecord["afterRecord"] + src__graph__diff__beforeRelations["beforeRelations"] + src__graph__diff__afterRelations["afterRelations"] + src__graph__diff__fingerprint["fingerprint"] + src__graph__diff__renderGraphDiffSvg["renderGraphDiffSvg"] + src__graph__diff__maxItems["maxItems"] + src__graph__diff__title["title"] + src__graph__diff__visibleRows["visibleRows"] + src__graph__diff__width["width"] + src__graph__diff__height["height"] + src__graph__diff__y["y"] + src__graph__diff__assertGraph["assertGraph"] + src__graph__diff__groupRecords["groupRecords"] + src__graph__diff__groups["groups"] + src__graph__diff__identity["identity"] + src__graph__diff__values["values"] + src__graph__diff__recordIdentity["recordIdentity"] + src__graph__diff__normalizeRecord["normalizeRecord"] + src__graph__diff__changedFieldPaths["changedFieldPaths"] + src__graph__diff__isObject["isObject"] + src__graph__diff__relationKey["relationKey"] + src__graph__diff__compareRecords["compareRecords"] + src__graph__diff__compareRelations["compareRelations"] + src__graph__diff__recordLabel["recordLabel"] + src__graph__diff__changeLabel["changeLabel"] + src__graph__diff__metricCard["metricCard"] + src__graph__diff__escapeXml["escapeXml"] + src__graph__diff__truncate["truncate"] + src__graph__linker_relations__determineRelation["determineRelation"] + src__graph__linker_relations__textScore["textScore"] + src__graph__linker_relations__sourceRelation["sourceRelation"] + src__graph__linker_relations__relationForSourceKinds["relationForSourceKinds"] + src__graph__linker_relations__relation["relation"] + src__graph__linker_relations__matchSourceRule["matchSourceRule"] + src__graph__linker_relations__orientRelation["orientRelation"] + src__graph__symbol_resolution__buildSymbolResolutionIndex["buildSymbolResolutionIndex"] + src__graph__symbol_resolution__byAlias("byAlias CC=8") + src__graph__symbol_resolution__collectAstCandidates("collectAstCandidates CC=8") + src__graph__symbol_resolution__candidate["candidate"] src__graph__symbol_resolution__values["values"] + src__graph__symbol_resolution__buildAstCandidate["buildAstCandidate"] + src__graph__symbol_resolution__uniqueSymbols["uniqueSymbols"] + src__graph__symbol_resolution__sortCandidates["sortCandidates"] + src__graph__symbol_resolution__collectNlResolutions["collectNlResolutions"] src__graph__symbol_resolution__byNlRecord["byNlRecord"] src__graph__symbol_resolution__hasResolvedNlAstSymbolPair("hasResolvedNlAstSymbolPair CC=10") src__graph__symbol_resolution__nl["nl"] src__graph__symbol_resolution__ast["ast"] src__graph__symbol_resolution__resolveSymbol("resolveSymbol CC=8") src__graph__symbol_resolution__matched["matched"] - src__graph__symbol_resolution__selected["selected"] - src__graph__symbol_resolution__paths["paths"] - src__graph__symbol_resolution__pathSelects["pathSelects"] - src__graph__symbol_resolution__normalized["normalized"] - src__graph__symbol_resolution__candidatePath["candidatePath"] - src__graph__symbol_resolution__uniquePaths["uniquePaths"] - src__graph__symbol_resolution__isAstDeclaration["isAstDeclaration"] - src__graph__linker__indexKeywords["indexKeywords"] - src__graph__linker__jaccard["jaccard"] - src__graph__linker__intersection["intersection"] - src__graph__linker__linkIntentRecords["linkIntentRecords"] - src__graph__linker__records["records"] - src__graph__linker__byId["byId"] - src__graph__linker__keywordIndex["keywordIndex"] - src__graph__linker__symbolResolutionIndex["symbolResolutionIndex"] - src__graph__linker__candidatePairs["candidatePairs"] - src__graph__linker__resolvableBasenames["resolvableBasenames"] - src__graph__linker__left["left"] - src__graph__linker__right["right"] - src__graph__linker__evidence["evidence"] - src__graph__linker__directed["directed"] - src__graph__linker__deduplicateRecords["deduplicateRecords"] - src__graph__linker__existing["existing"] - src__graph__linker__collectCandidatePairs("collectCandidatePairs CC=10") - src__graph__linker__buckets("buckets CC=10") - src__graph__linker__astIds("astIds CC=10") - src__graph__linker__moduleAstIds("moduleAstIds CC=10") - src__graph__linker__declarationAstIds("declarationAstIds CC=10") - src__graph__linker__configurationIds("configurationIds CC=10") - src__graph__linker__isModuleTopicSource["isModuleTopicSource"] - src__graph__linker__indexTargetBuckets["indexTargetBuckets"] - src__graph__linker__indexAliases["indexAliases"] - src__graph__linker__indexKeywordBuckets["indexKeywordBuckets"] - src__graph__linker__indexTopicBuckets["indexTopicBuckets"] - src__graph__linker__addToBucket["addToBucket"] - src__graph__linker__values["values"] - src__graph__linker__isSuppressedConfigurationPair["isSuppressedConfigurationPair"] - src__graph__linker__pairsFromBuckets("pairsFromBuckets CC=8") - src__graph__linker__output("output CC=8") - src__graph__linker__leftId["leftId"] - src__graph__linker__rightId["rightId"] - src__graph__linker__isSuppressedAstPair("isSuppressedAstPair CC=9") - src__graph__linker__leftAst["leftAst"] - src__graph__linker__rightAst["rightAst"] - src__graph__linker__astId["astId"] - src__graph__linker__indexResolvableBasenames("indexResolvableBasenames CC=8") - src__graph__linker__owners("owners CC=8") - src__graph__linker__normalized["normalized"] - src__graph__linker__basename["basename"] - src__graph__linker__paths["paths"] - src__graph__linker__pathsIntersect("pathsIntersect CC=8") end subgraph src__interfaces - src__interfaces__mcp__DISCOVERY_TTL_MS["DISCOVERY_TTL_MS"] - src__interfaces__mcp__LIST_TTL_MS["LIST_TTL_MS"] - src__interfaces__mcp__RESOURCE_TTL_MS["RESOURCE_TTL_MS"] - src__interfaces__mcp__createMcpConnectionState["createMcpConnectionState"] - src__interfaces__mcp__startMcpServer("startMcpServer CC=8") - src__interfaces__mcp__resolvedConfig["resolvedConfig"] - src__interfaces__mcp__state["state"] - src__interfaces__mcp__input["input"] - src__interfaces__mcp__parsed["parsed"] - src__interfaces__mcp__request["request"] - src__interfaces__mcp__result["result"] - src__interfaces__mcp__handleMcpRequest["handleMcpRequest"] - src__interfaces__mcp__initializeLegacy["initializeLegacy"] - src__interfaces__mcp__params["params"] - src__interfaces__mcp__requested["requested"] - src__interfaces__mcp__protocolVersion["protocolVersion"] - src__interfaces__mcp__handleModernRequest("handleModernRequest CC=8") - src__interfaces__mcp__responseMeta["responseMeta"] - src__interfaces__mcp__handleLegacyRequest("handleLegacyRequest CC=8") - src__interfaces__mcp__validateModernRequest("validateModernRequest CC=9") - src__interfaces__mcp__meta["meta"] - src__interfaces__mcp__validateModernMetadata["validateModernMetadata"] - src__interfaces__mcp__capabilities["capabilities"] - src__interfaces__mcp__hasModernMetadata["hasModernMetadata"] - src__interfaces__mcp__parseRequestLine["parseRequestLine"] - src__interfaces__mcp__completePublic["completePublic"] - src__interfaces__mcp__serverInfo["serverInfo"] - src__interfaces__mcp__serverMeta["serverMeta"] - src__interfaces__mcp__serverInstructions["serverInstructions"] - src__interfaces__mcp__isLegacyProtocol["isLegacyProtocol"] - src__interfaces__mcp__isJsonRpcRequest("isJsonRpcRequest CC=9") - src__interfaces__mcp__candidate["candidate"] - src__interfaces__mcp__requestId("requestId CC=8") - src__interfaces__mcp__id["id"] - src__interfaces__mcp__rpcError["rpcError"] - src__interfaces__mcp__sendError["sendError"] - src__interfaces__mcp__send["send"] - src__interfaces__mcp__invokedPath["invokedPath"] - src__interfaces__mcp_tools__callMcpTool("callMcpTool CC=8") - src__interfaces__mcp_tools__name["name"] - src__interfaces__mcp_tools__args["args"] - src__interfaces__mcp_tools__result["result"] - src__interfaces__mcp_tools__tool["tool"] - src__interfaces__mcp_tools__writes["writes"] - src__interfaces__mcp_tools__stringProp["stringProp"] - src__interfaces__mcp_tools__nullableStringProp["nullableStringProp"] - src__interfaces__mcp_tools__stringArrayProp["stringArrayProp"] - src__interfaces__mcp_tools__numberProp["numberProp"] - src__interfaces__mcp_resources__listMcpResources["listMcpResources"] - src__interfaces__mcp_resources__readRequestedMcpResource["readRequestedMcpResource"] - src__interfaces__mcp_resources__uri["uri"] - src__interfaces__mcp_resources__readMcpResource["readMcpResource"] - src__interfaces__mcp_resources__latestPath["latestPath"] - src__interfaces__mcp_resources__selected["selected"] - src__interfaces__mcp_resources__latest["latest"] - src__interfaces__mcp_resources__filePath["filePath"] - src__interfaces__mcp_resources__latestPointer["latestPointer"] - src__interfaces__mcp_resources__assertInsideRoot["assertInsideRoot"] - src__interfaces__mcp_resources__relative["relative"] - src__interfaces__mcp_resources__isInvalidResourceError["isInvalidResourceError"] + src__interfaces__a2a_card__sendAgentCard["sendAgentCard"] + src__interfaces__a2a_card__card["card"] + src__interfaces__a2a_card__serialized["serialized"] + src__interfaces__a2a_card__payload["payload"] + src__interfaces__a2a_card__agentCard["agentCard"] + src__interfaces__a2a_card__skills["skills"] + src__interfaces__a2a_card__skill["skill"] + src__interfaces__a2a_message__parseSendConfiguration["parseSendConfiguration"] + src__interfaces__a2a_message__validateOutputModes["validateOutputModes"] + src__interfaces__a2a_message__supported["supported"] + src__interfaces__a2a_message__parseMessage("parseMessage CC=12") + src__interfaces__a2a_message__messageId["messageId"] + src__interfaces__a2a_message__contextId["contextId"] + src__interfaces__a2a_message__taskId["taskId"] + src__interfaces__a2a_message__referenceTaskIds["referenceTaskIds"] + src__interfaces__a2a_message__extensions["extensions"] + src__interfaces__a2a_message__metadata["metadata"] + src__interfaces__a2a_message__parsePart["parsePart"] + src__interfaces__a2a_message__output["output"] + src__interfaces__a2a_message__parsePartContent["parsePartContent"] + src__interfaces__a2a_message__content["content"] + src__interfaces__a2a_message__qualifier["qualifier"] + src__interfaces__a2a_message__ensureSupportedMessageContent["ensureSupportedMessageContent"] + src__interfaces__a2a_message__cloneMessage["cloneMessage"] + src__interfaces__a2a_message__clonePart("clonePart CC=8") + src__interfaces__a2a_message__normalizeUserMessage["normalizeUserMessage"] + src__interfaces__a2a_message_command__parseCommand["parseCommand"] + src__interfaces__a2a_message_command__protobufCommand["protobufCommand"] + src__interfaces__a2a_message_command__objectCommand["objectCommand"] + src__interfaces__a2a_message_command__parseCommandFromProtobuf["parseCommandFromProtobuf"] + src__interfaces__a2a_message_command__protobuf["protobuf"] + src__interfaces__a2a_message_command__bytes["bytes"] + src__interfaces__a2a_message_command__parseCommandFromObject["parseCommandFromObject"] + src__interfaces__a2a_message_command__objectData["objectData"] + src__interfaces__a2a_message_command__parseCommandFromText["parseCommandFromText"] + src__interfaces__a2a_message_command__text["text"] + src__interfaces__a2a_message_command__looksLikeJson{{looksLikeJson CC=20}} + src__interfaces__a2a_message_command__parseCommandFromJson["parseCommandFromJson"] + src__interfaces__a2a_message_command__parseCommandFromSentence["parseCommandFromSentence"] + src__interfaces__a2a_message_command__parseSentenceInput["parseSentenceInput"] + src__interfaces__a2a_message_command__defaultTextCommand["defaultTextCommand"] + src__interfaces__a2a_message_command__isSupportedAction["isSupportedAction"] + src__interfaces__a2a_message_command__commandInputFromSentence["commandInputFromSentence"] + src__interfaces__a2a_message_command__first["first"] + src__interfaces__a2a_message_command__parseText["parseText"] + src__interfaces__a2a_message_command__firstToken["firstToken"] + src__interfaces__a2a_message_command__commandFromData["commandFromData"] + src__interfaces__a2a_message_command__action["action"] + src__interfaces__a2a_message_command__nested["nested"] + src__interfaces__a2a_message_command__parseKeyValues["parseKeyValues"] + src__interfaces__a2a_message_command__key["key"] + src__interfaces__a2a_message_command__raw["raw"] + src__interfaces__a2a_message_command__stringValue["stringValue"] + src__interfaces__a2a_message_command__parseScalar["parseScalar"] + src__interfaces__a2a_message_command__normalizeAction["normalizeAction"] + src__interfaces__a2a_message_command__normalized["normalized"] + src__interfaces__mcp_errors__McpRequestError__super["super"] + src__interfaces__mcp_errors__McpRequestError__normalizeMcpError["normalizeMcpError"] + src__interfaces__a2a_run_list_item__runListItem["runListItem"] + src__interfaces__a2a_run_list_item__files["files"] end subgraph src__live - src__live__model_comparison__measureLiveModelRun("measureLiveModelRun CC=12") - src__live__model_comparison__responses["responses"] - src__live__model_comparison__records["records"] - src__live__model_comparison__enrichedRecords["enrichedRecords"] - src__live__model_comparison__costUsd["costUsd"] - src__live__model_comparison__isLlmEnriched["isLlmEnriched"] - src__live__model_comparison__sourceKey["sourceKey"] - src__live__model_comparison__lines["lines"] - src__live__model_comparison__compareLiveModelOutputs["compareLiveModelOutputs"] - src__live__model_comparison__rightBySource["rightBySource"] - src__live__model_comparison__pairs["pairs"] - src__live__model_comparison__agreeing["agreeing"] - src__live__model_comparison__buildLiveModelComparison["buildLiveModelComparison"] - src__live__model_comparison__models["models"] - src__live__model_comparison__passing["passing"] - src__live__model_comparison__pick["pick"] - src__live__model_comparison__measured["measured"] - src__live__model_comparison__renderLiveModelComparison("renderLiveModelComparison CC=10") - src__live__model_comparison__sumUsage["sumUsage"] - src__live__model_comparison__values["values"] - src__live__model_comparison__round["round"] src__live__contract_check__LIVE_HISTORY_LIMIT["LIVE_HISTORY_LIMIT"] src__live__contract_check__liveRequestTimeoutMs["liveRequestTimeoutMs"] src__live__contract_check__measureLiveStages["measureLiveStages"] @@ -1270,38 +1262,34 @@ flowchart TD src__live__contract_check__value["value"] src__live__contract_check__ratio["ratio"] src__live__contract_check__round["round"] + src__live__model_comparison__measureLiveModelRun("measureLiveModelRun CC=12") + src__live__model_comparison__responses["responses"] + src__live__model_comparison__records["records"] + src__live__model_comparison__enrichedRecords["enrichedRecords"] + src__live__model_comparison__costUsd["costUsd"] + src__live__model_comparison__isLlmEnriched["isLlmEnriched"] + src__live__model_comparison__sourceKey["sourceKey"] + src__live__model_comparison__lines["lines"] + src__live__model_comparison__compareLiveModelOutputs["compareLiveModelOutputs"] + src__live__model_comparison__rightBySource["rightBySource"] + src__live__model_comparison__pairs["pairs"] + src__live__model_comparison__agreeing["agreeing"] + src__live__model_comparison__buildLiveModelComparison["buildLiveModelComparison"] + src__live__model_comparison__models["models"] + src__live__model_comparison__passing["passing"] + src__live__model_comparison__pick["pick"] + src__live__model_comparison__measured["measured"] + src__live__model_comparison__renderLiveModelComparison("renderLiveModelComparison CC=10") + src__live__model_comparison__sumUsage["sumUsage"] + src__live__model_comparison__values["values"] + src__live__model_comparison__round["round"] end subgraph src__llm - src__llm__structured_schema__StructuredResponseError__super["super"] - src__llm__structured_schema__StructuredResponseError__schema["schema"] - src__llm__structured_schema__StructuredResponseError__parse["parse"] - src__llm__structured_schema__StructuredResponseError__string("string CC=10") - src__llm__structured_schema__StructuredResponseError__pattern["pattern"] - src__llm__structured_schema__StructuredResponseError__fail["fail"] - src__llm__structured_schema__StructuredResponseError__nullableString["nullableString"] - src__llm__structured_schema__StructuredResponseError__base["base"] - src__llm__structured_schema__StructuredResponseError__number["number"] - src__llm__structured_schema__StructuredResponseError__checkNumberBounds["checkNumberBounds"] - src__llm__structured_schema__StructuredResponseError__integer["integer"] - src__llm__structured_schema__StructuredResponseError__numeric["numeric"] - src__llm__structured_schema__StructuredResponseError__parsed["parsed"] - src__llm__structured_schema__StructuredResponseError__enumValue["enumValue"] - src__llm__structured_schema__StructuredResponseError__allowed["allowed"] - src__llm__structured_schema__StructuredResponseError__array("array CC=9") - src__llm__structured_schema__StructuredResponseError__identities["identities"] - src__llm__structured_schema__StructuredResponseError__object["object"] - src__llm__structured_schema__StructuredResponseError__keys["keys"] - src__llm__structured_schema__StructuredResponseError__candidate["candidate"] - src__llm__structured_schema__StructuredResponseError__unknown["unknown"] - src__llm__structured_schema__StructuredResponseError__missing["missing"] - src__llm__structured_schema__StructuredResponseError__jsonIdentity["jsonIdentity"] - src__llm__structured_schema__StructuredResponseError__record["record"] - src__llm__structured_schema__StructuredResponseError__describe["describe"] src__llm__openrouter__OpenRouterModelError__super["super"] src__llm__openrouter__OpenRouterClient__isConfigured["isConfigured"] src__llm__openrouter__OpenRouterClient__listAvailableModels("listAvailableModels CC=13") - src__llm__openrouter__OpenRouterClient__controller["controller"] - src__llm__openrouter__OpenRouterClient__timeout{{timeout CC=26}} + src__llm__openrouter__OpenRouterClient__controller("controller CC=13") + src__llm__openrouter__OpenRouterClient__timeout("timeout CC=13") src__llm__openrouter__OpenRouterClient__response["response"] src__llm__openrouter__OpenRouterClient__text["text"] src__llm__openrouter__OpenRouterClient__clearTimeout["clearTimeout"] @@ -1312,28 +1300,72 @@ flowchart TD src__llm__openrouter__OpenRouterClient__result["result"] src__llm__openrouter__OpenRouterClient__chatJsonWithMetadata("chatJsonWithMetadata CC=10") src__llm__openrouter__OpenRouterClient__fallback["fallback"] - src__llm__openrouter__OpenRouterClient__request{{request CC=31}} - src__llm__openrouter__OpenRouterClient__apiKey["apiKey"] - src__llm__openrouter__OpenRouterClient__externalSignal["externalSignal"] - src__llm__openrouter__OpenRouterClient__abortFromExternal["abortFromExternal"] - src__llm__openrouter__OpenRouterClient__message["message"] - src__llm__openrouter__OpenRouterClient__error["error"] - src__llm__openrouter__OpenRouterClient__model["model"] - src__llm__openrouter__OpenRouterClient__availableModels["availableModels"] - src__llm__openrouter__OpenRouterClient__formatInvalidModelError["formatInvalidModelError"] + src__llm__openrouter__OpenRouterClient__request["request"] src__llm__openrouter__OpenRouterClient__responseMetadata["responseMetadata"] src__llm__openrouter__OpenRouterClient__usage["usage"] src__llm__openrouter__OpenRouterClient__stringOrNull["stringOrNull"] src__llm__openrouter__OpenRouterClient__finiteOrNull["finiteOrNull"] - src__llm__openrouter__OpenRouterClient__shouldRetryWithoutJsonSchema["shouldRetryWithoutJsonSchema"] - src__llm__openrouter__OpenRouterClient__isInvalidModelError["isInvalidModelError"] - src__llm__openrouter__OpenRouterClient__removeUndefined["removeUndefined"] + src__llm__openrouter__OpenRouterClient__createModelError["createModelError"] + src__llm__openrouter__OpenRouterClient__formatInvalidModelError["formatInvalidModelError"] src__llm__openrouter__OpenRouterClient__extractContent["extractContent"] src__llm__openrouter__OpenRouterClient__parseJsonContent["parseJsonContent"] src__llm__openrouter__OpenRouterClient__trimmed["trimmed"] src__llm__openrouter__OpenRouterClient__start["start"] + src__llm__openrouter__OpenRouterClient__end["end"] + src__llm__openrouter__OpenRouterClient__parseJsonResponse["parseJsonResponse"] + src__llm__openrouter__OpenRouterClient__metadata["metadata"] + src__llm__openrouter__OpenRouterClient__message["message"] + src__llm__openrouter__OpenRouterClient__shouldRetryWithoutJsonSchema["shouldRetryWithoutJsonSchema"] + src__llm__failure__classifyLlmFailure["classifyLlmFailure"] + src__llm__failure__message["message"] + src__llm__failure__rejectedLlmResponseMetadata["rejectedLlmResponseMetadata"] + src__llm__audit__openRouterAuditConfiguration["openRouterAuditConfiguration"] + src__llm__openrouter_request__requestOpenRouter["requestOpenRouter"] + src__llm__openrouter_request__controller["controller"] + src__llm__openrouter_request__detachAbort["detachAbort"] + src__llm__openrouter_request__timeout["timeout"] + src__llm__openrouter_request__response["response"] + src__llm__openrouter_request__parsed["parsed"] + src__llm__openrouter_request__resolution["resolution"] + src__llm__openrouter_request__ensureApiKeyConfigured["ensureApiKeyConfigured"] + src__llm__openrouter_request__connectAbortSignal["connectAbortSignal"] + src__llm__openrouter_request__abortFromExternal["abortFromExternal"] + src__llm__openrouter_request__sendRequest["sendRequest"] + src__llm__openrouter_request__resolveHttpResponse("resolveHttpResponse CC=8") + src__llm__openrouter_request__message["message"] + src__llm__openrouter_request__error["error"] + src__llm__openrouter_request__createModelErrorResponse["createModelErrorResponse"] + src__llm__openrouter_request__model["model"] + src__llm__openrouter_request__availableModels["availableModels"] + src__llm__openrouter_request__listErrorMessage["listErrorMessage"] + src__llm__openrouter_request__resolveTransportError("resolveTransportError CC=9") + src__llm__openrouter_request__retryDelay["retryDelay"] + src__llm__openrouter_request__buildRequestHeaders["buildRequestHeaders"] + src__llm__openrouter_request__shouldRetryWithoutJsonSchema["shouldRetryWithoutJsonSchema"] + src__llm__openrouter_request__shouldRetryRequestWithoutSchema["shouldRetryRequestWithoutSchema"] + src__llm__openrouter_request__isRetryableServerError["isRetryableServerError"] + src__llm__openrouter_request__isTransientNetworkError["isTransientNetworkError"] end subgraph src__operations + src__operations__artifact__readJson["readJson"] + src__operations__artifact__writeExclusive["writeExclusive"] + src__operations__artifact__target["target"] + src__operations__artifact__directory["directory"] + src__operations__artifact__temporary["temporary"] + src__operations__artifact__existing["existing"] + src__operations__artifact__compileOperationPlanArtifact["compileOperationPlanArtifact"] + src__operations__artifact__plan["plan"] + src__operations__artifact__bindings["bindings"] + src__operations__artifact__envelope["envelope"] + src__operations__subactor__valueMatchesType("valueMatchesType CC=11") + src__operations__subactor__assertBinding("assertBinding CC=9") + src__operations__subactor__ageSeconds["ageSeconds"] + src__operations__subactor__compileSubactorProcessEnvelope("compileSubactorProcessEnvelope CC=13") + src__operations__subactor__variableById["variableById"] + src__operations__subactor__referenced["referenced"] + src__operations__subactor__variable["variable"] + src__operations__subactor__binding["binding"] + src__operations__subactor__humanApproval["humanApproval"] src__operations__validation__VALUE_TYPES["VALUE_TYPES"] src__operations__validation__CLASSIFICATIONS["CLASSIFICATIONS"] src__operations__validation__SOURCE_KINDS["SOURCE_KINDS"] @@ -1347,12 +1379,20 @@ flowchart TD src__operations__validation__assertPrincipalList["assertPrincipalList"] src__operations__validation__principals["principals"] src__operations__validation__isJsonValue["isJsonValue"] - src__operations__validation__assertVariableContract{{assertVariableContract CC=20}} + src__operations__validation__assertVariableContract["assertVariableContract"] src__operations__validation__contract["contract"] src__operations__validation__source["source"] src__operations__validation__access["access"] src__operations__validation__readers["readers"] src__operations__validation__writers["writers"] + src__operations__validation__expectedId["expectedId"] + src__operations__validation__assertVariableContractShape["assertVariableContractShape"] + src__operations__validation__assertVariableContractCore("assertVariableContractCore CC=8") + src__operations__validation__assertVariableSource["assertVariableSource"] + src__operations__validation__assertVariableAccess["assertVariableAccess"] + src__operations__validation__assertVariableAuthoritativeness["assertVariableAuthoritativeness"] + src__operations__validation__assertVariableMutability["assertVariableMutability"] + src__operations__validation__buildVariableContractId["buildVariableContractId"] src__operations__validation__assertGeneration{{assertGeneration CC=16}} src__operations__validation__generation["generation"] src__operations__validation__assertAcyclic("assertAcyclic CC=8") @@ -1361,101 +1401,74 @@ flowchart TD src__operations__validation__visited["visited"] src__operations__validation__byId["byId"] src__operations__validation__visit["visit"] - src__operations__validation__assertOperationPlan{{assertOperationPlan CC=84}} + src__operations__validation__assertOperationPlan["assertOperationPlan"] src__operations__validation__plan["plan"] - src__operations__validation__evidence["evidence"] - src__operations__validation__variables{{variables CC=44}} - src__operations__validation__variableById{{variableById CC=44}} - src__operations__validation__steps{{steps CC=44}} - src__operations__validation__stepIds{{stepIds CC=44}} - src__operations__validation__founderDecisionRequired{{founderDecisionRequired CC=44}} - src__operations__validation__step["step"] - src__operations__validation__parameters["parameters"] - src__operations__validation__reference["reference"] - src__operations__validation__variable["variable"] - src__operations__validation__rollback["rollback"] - src__operations__validation__coveredSteps("coveredSteps CC=8") - src__operations__validation__expectationIds("expectationIds CC=8") - src__operations__validation__expectation["expectation"] - src__operations__validation__verifiedBy["verifiedBy"] - src__operations__validation__decision["decision"] - src__operations__validation__verification["verification"] - src__operations__validation__expectedHash["expectedHash"] - src__operations__subactor__valueMatchesType("valueMatchesType CC=11") - src__operations__subactor__assertBinding("assertBinding CC=9") - src__operations__subactor__ageSeconds["ageSeconds"] - src__operations__subactor__compileSubactorProcessEnvelope("compileSubactorProcessEnvelope CC=13") - src__operations__subactor__variableById["variableById"] - src__operations__subactor__referenced["referenced"] - src__operations__subactor__variable["variable"] - src__operations__subactor__binding["binding"] - src__operations__subactor__humanApproval["humanApproval"] - src__operations__contract__variableContractSemanticValue["variableContractSemanticValue"] - src__operations__contract__createVariableContract["createVariableContract"] - src__operations__contract__normalized["normalized"] - src__operations__contract__normalizedPlanDraft["normalizedPlanDraft"] + src__operations__validation__variables["variables"] + src__operations__validation__variableById["variableById"] + src__operations__validation__validateOperationPlanShape["validateOperationPlanShape"] + src__operations__validation__validateOperationPlanMetadata("validateOperationPlanMetadata CC=9") end subgraph src__pipeline - src__pipeline__run__runPipeline{{runPipeline CC=53}} + src__pipeline__run_helpers__collectCommunicationAnalysis("collectCommunicationAnalysis CC=11") + src__pipeline__run_helpers__includeCommunication["includeCommunication"] + src__pipeline__run_helpers__communicationStartedAt["communicationStartedAt"] + src__pipeline__run_helpers__missingDirectory["missingDirectory"] + src__pipeline__run_helpers__communication["communication"] + src__pipeline__run_helpers__foundMissingDirectory["foundMissingDirectory"] + src__pipeline__run_helpers__collectTaskSynthesis["collectTaskSynthesis"] + src__pipeline__run_helpers__taskSynthesisMode["taskSynthesisMode"] + src__pipeline__run_helpers__taskSynthesisAudit["taskSynthesisAudit"] + src__pipeline__run_helpers__todoContent["todoContent"] + src__pipeline__run_helpers__createCodeChangeArtifacts["createCodeChangeArtifacts"] + src__pipeline__run_helpers__codeChangePlans["codeChangePlans"] + src__pipeline__run_helpers__codeChangeReview["codeChangeReview"] + src__pipeline__run_helpers__codeChangeSourcePatches["codeChangeSourcePatches"] + src__pipeline__run_helpers__collectTargetHints["collectTargetHints"] + src__pipeline__run_helpers__values["values"] + src__pipeline__run_helpers__appendLlmNotConfigured["appendLlmNotConfigured"] + src__pipeline__run_helpers__skippedAudit["skippedAudit"] + src__pipeline__run_persistence__makePipelineManifest["makePipelineManifest"] + src__pipeline__run_persistence__persistPipelineArtifacts{{persistPipelineArtifacts CC=17}} + src__pipeline__run_persistence__filePath["filePath"] + src__pipeline__run_persistence__graphPath["graphPath"] + src__pipeline__run_persistence__diagnosticsPath["diagnosticsPath"] + src__pipeline__run_persistence__summaryPath["summaryPath"] + src__pipeline__run_persistence__summaryConclusionsPath["summaryConclusionsPath"] + src__pipeline__run_persistence__taskSynthesisPath["taskSynthesisPath"] + src__pipeline__run_persistence__todoValidationPath["todoValidationPath"] + src__pipeline__run_persistence__todoPatchPath["todoPatchPath"] + src__pipeline__run_persistence__todoPatchAuditPath["todoPatchAuditPath"] + src__pipeline__run_persistence__codeChangePlansPath["codeChangePlansPath"] + src__pipeline__run_persistence__codeChangeReviewPath["codeChangeReviewPath"] + src__pipeline__run_persistence__codeChangeReviewAuditPath["codeChangeReviewAuditPath"] + src__pipeline__run_persistence__codeChangeSourcePatchesPath["codeChangeSourcePatchesPath"] + src__pipeline__run_persistence__communicationAnalysisPath["communicationAnalysisPath"] + src__pipeline__run_persistence__communicationMarkdownPath["communicationMarkdownPath"] + src__pipeline__run_persistence__persistFailedRun["persistFailedRun"] + src__pipeline__run_persistence__manifestConfiguration("manifestConfiguration CC=8") + src__pipeline__run_persistence__persistFailedRunState{{persistFailedRunState CC=19}} + src__pipeline__run_persistence__aborted["aborted"] + src__pipeline__run_persistence__message("message CC=9") + src__pipeline__run_persistence__knownAudit("knownAudit CC=9") + src__pipeline__run_persistence__failedAudit("failedAudit CC=9") + src__pipeline__run_persistence__stageValue["stageValue"] + src__pipeline__run_persistence__reason["reason"] + src__pipeline__run_persistence__skippedAudit["skippedAudit"] + src__pipeline__run_persistence__failureCode["failureCode"] + src__pipeline__run_summary__collectSummary["collectSummary"] + src__pipeline__run_summary__summaryStartedAt["summaryStartedAt"] + src__pipeline__run_summary__includeSummaryLlm["includeSummaryLlm"] + src__pipeline__run_summary__summary["summary"] + src__pipeline__run__runPipeline["runPipeline"] + src__pipeline__run__context["context"] + src__pipeline__run__execution["execution"] + src__pipeline__run__persisted["persisted"] + src__pipeline__run__manifest["manifest"] + src__pipeline__run__manifestPath["manifestPath"] + src__pipeline__run__initializePipelineContext["initializePipelineContext"] src__pipeline__run__root["root"] src__pipeline__run__runId["runId"] src__pipeline__run__baseOutput["baseOutput"] - src__pipeline__run__runDirectory["runDirectory"] - src__pipeline__run__naturalLanguageAudit["naturalLanguageAudit"] - src__pipeline__run__result["result"] - src__pipeline__run__git["git"] - src__pipeline__run__ast["ast"] - src__pipeline__run__markdown["markdown"] - src__pipeline__run__deterministicDocumentFiles["deterministicDocumentFiles"] - src__pipeline__run__documentationStartedAt["documentationStartedAt"] - src__pipeline__run__deterministicDocs["deterministicDocs"] - src__pipeline__run__docs["docs"] - src__pipeline__run__configurationExtraction("configurationExtraction CC=10") - src__pipeline__run__includeCommunication("includeCommunication CC=10") - src__pipeline__run__communicationStartedAt("communicationStartedAt CC=10") - src__pipeline__run__communicationAudit("communicationAudit CC=10") - src__pipeline__run__communicationInputPresent("communicationInputPresent CC=10") - src__pipeline__run__communication["communication"] - src__pipeline__run__missingDirectory["missingDirectory"] - src__pipeline__run__allRecords["allRecords"] - src__pipeline__run__generatedAt["generatedAt"] - src__pipeline__run__graph["graph"] - src__pipeline__run__communicationAnalysis["communicationAnalysis"] - src__pipeline__run__diagnostics["diagnostics"] - src__pipeline__run__taskSynthesisMode["taskSynthesisMode"] - src__pipeline__run__taskSynthesisAudit["taskSynthesisAudit"] - src__pipeline__run__todoContent["todoContent"] - src__pipeline__run__codeChangePlans["codeChangePlans"] - src__pipeline__run__codeChangeReview["codeChangeReview"] - src__pipeline__run__codeChangeSourcePatches["codeChangeSourcePatches"] - src__pipeline__run__summaryStartedAt["summaryStartedAt"] - src__pipeline__run__includeSummaryLlm["includeSummaryLlm"] - src__pipeline__run__summary["summary"] - src__pipeline__run__filePath["filePath"] - src__pipeline__run__graphPath["graphPath"] - src__pipeline__run__diagnosticsPath["diagnosticsPath"] - src__pipeline__run__summaryPath["summaryPath"] - src__pipeline__run__summaryConclusionsPath["summaryConclusionsPath"] - src__pipeline__run__taskSynthesisPath["taskSynthesisPath"] - src__pipeline__run__todoValidationPath["todoValidationPath"] - src__pipeline__run__todoPatchPath["todoPatchPath"] - src__pipeline__run__todoPatchAuditPath["todoPatchAuditPath"] - src__pipeline__run__codeChangePlansPath["codeChangePlansPath"] - src__pipeline__run__codeChangeReviewPath["codeChangeReviewPath"] - src__pipeline__run__codeChangeReviewAuditPath["codeChangeReviewAuditPath"] - src__pipeline__run__codeChangeSourcePatchesPath["codeChangeSourcePatchesPath"] - src__pipeline__run__communicationAnalysisPath["communicationAnalysisPath"] - src__pipeline__run__communicationMarkdownPath["communicationMarkdownPath"] - src__pipeline__run__configuration["configuration"] - src__pipeline__run__manifestConfiguration("manifestConfiguration CC=8") - src__pipeline__run__collectTargetHints["collectTargetHints"] - src__pipeline__run__values["values"] - src__pipeline__run__persistFailedRun{{persistFailedRun CC=19}} - src__pipeline__run__aborted["aborted"] - src__pipeline__run__message("message CC=9") - src__pipeline__run__knownAudit("knownAudit CC=9") - src__pipeline__run__failedAudit("failedAudit CC=9") - src__pipeline__run__stageValue["stageValue"] end subgraph src__sdk src__sdk__typescript__Todo2CodeClient__a2a["a2a"] @@ -1476,130 +1489,138 @@ flowchart TD src__sdk__typescript__Todo2CodeClient__run["run"] end subgraph src__semantic - src__semantic__reranker__createSemanticCandidateSet("createSemanticCandidateSet CC=8") - src__semantic__reranker__grouped["grouped"] - src__semantic__reranker__values["values"] - src__semantic__reranker__assertSemanticCandidateSet{{assertSemanticCandidateSet CC=27}} - src__semantic__reranker__records{{records CC=16}} - src__semantic__reranker__seenIds("seenIds CC=14") - src__semantic__reranker__seenPairs("seenPairs CC=14") - src__semantic__reranker__byDeclaration("byDeclaration CC=14") - src__semantic__reranker__declaration["declaration"] - src__semantic__reranker__module["module"] - src__semantic__reranker__expectedHash["expectedHash"] - src__semantic__reranker__createSemanticRerankResult["createSemanticRerankResult"] - src__semantic__reranker__decisions["decisions"] - src__semantic__reranker__assertSemanticRerankResult{{assertSemanticRerankResult CC=21}} - src__semantic__reranker__candidates["candidates"] - src__semantic__reranker__seenDecisions{{seenDecisions CC=16}} - src__semantic__reranker__acceptedDeclarations{{acceptedDeclarations CC=16}} - src__semantic__reranker__candidate["candidate"] - src__semantic__reranker__citations["citations"] - src__semantic__reranker__record["record"] - src__semantic__reranker__applyAcceptedSemanticRelations["applyAcceptedSemanticRelations"] - src__semantic__reranker__added["added"] - src__semantic__reranker__validateRetrieval["validateRetrieval"] - src__semantic__reranker__validateGeneration["validateGeneration"] - src__semantic__reranker__validateVerdictReason["validateVerdictReason"] - src__semantic__reranker__assertSemanticVerdictReason["assertSemanticVerdictReason"] - src__semantic__reranker__allowed["allowed"] - src__semantic__reranker__reasons["reasons"] - src__semantic__reranker__assertGroundedQuote["assertGroundedQuote"] - src__semantic__reranker__quote["quote"] - src__semantic__reranker__boundedScore["boundedScore"] - src__semantic__reranker__roundedConfidence["roundedConfidence"] - src__semantic__reranker__requiredText["requiredText"] - src__semantic__reranker__validDate["validDate"] - src__semantic__reranker__comparePair["comparePair"] - src__semantic__reranker_response__RERANK_DECISION_CONTRACT["RERANK_DECISION_CONTRACT"] - src__semantic__reranker_response__SEMANTIC_RERANK_RESPONSE_CONTRACT["SEMANTIC_RERANK_RESPONSE_CONTRACT"] - src__semantic__reranker_response__SEMANTIC_RERANK_RESPONSE_SCHEMA["SEMANTIC_RERANK_RESPONSE_SCHEMA"] - src__semantic__reranker_response__assertSemanticRerankerResponse["assertSemanticRerankerResponse"] - src__semantic__reranker_response__response["response"] src__semantic__reranker_llm__SemanticRerankerRequiredError__super["super"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates{{rerankSemanticCandidates CC=25}} + src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates["rerankSemanticCandidates"] src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticCandidateSet["assertSemanticCandidateSet"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__validateCandidateSetSize["validateCandidateSetSize"] src__semantic__reranker_llm__SemanticRerankerRequiredError__model["model"] src__semantic__reranker_llm__SemanticRerankerRequiredError__modelRevision["modelRevision"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult["assertSemanticRerankResult"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__cached["cached"] src__semantic__reranker_llm__SemanticRerankerRequiredError__client["client"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__records("records CC=9") src__semantic__reranker_llm__SemanticRerankerRequiredError__payload["payload"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__response("response CC=8") + src__semantic__reranker_llm__SemanticRerankerRequiredError__response["response"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__resolveRerankerModel["resolveRerankerModel"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__resolveModelRevision["resolveModelRevision"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__revision["revision"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__resolveCachedResult["resolveCachedResult"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult["assertSemanticRerankResult"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__assertRerankerClient["assertRerankerClient"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshotAvailable["assertTrackedSnapshotAvailable"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__buildRerankerPayload["buildRerankerPayload"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__records("records CC=9") + src__semantic__reranker_llm__SemanticRerankerRequiredError__messagesForCandidates["messagesForCandidates"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__callReranker["callReranker"] src__semantic__reranker_llm__SemanticRerankerRequiredError__metadata["metadata"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__buildRerankResult["buildRerankResult"] src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankerResponse["assertSemanticRerankerResponse"] src__semantic__reranker_llm__SemanticRerankerRequiredError__execFileAsync["execFileAsync"] src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshot["assertTrackedSnapshot"] src__semantic__reranker_llm__SemanticRerankerRequiredError__root["root"] - src__semantic__reranker_llm__SemanticRerankerRequiredError__revision["revision"] src__semantic__reranker_llm__SemanticRerankerRequiredError__head["head"] src__semantic__reranker_llm__SemanticRerankerRequiredError__resolvedRevision["resolvedRevision"] src__semantic__reranker_llm__SemanticRerankerRequiredError__tracked("tracked CC=9") src__semantic__reranker_llm__SemanticRerankerRequiredError__recordIds("recordIds CC=9") + src__semantic__reranker_llm__SemanticRerankerRequiredError__record["record"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__sourcePath["sourcePath"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__semanticRerankCacheKey["semanticRerankCacheKey"] + src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord["projectRecord"] + src__semantic__reranker_response__RERANK_DECISION_CONTRACT["RERANK_DECISION_CONTRACT"] + src__semantic__reranker_response__SEMANTIC_RERANK_RESPONSE_CONTRACT["SEMANTIC_RERANK_RESPONSE_CONTRACT"] + src__semantic__reranker_response__SEMANTIC_RERANK_RESPONSE_SCHEMA["SEMANTIC_RERANK_RESPONSE_SCHEMA"] + src__semantic__reranker_response__assertSemanticRerankerResponse["assertSemanticRerankerResponse"] + src__semantic__reranker_response__response["response"] + src__semantic__reranker__result__createSemanticRerankResult["createSemanticRerankResult"] + src__semantic__reranker__result__decisions["decisions"] + src__semantic__reranker__result__assertSemanticRerankResult["assertSemanticRerankResult"] + src__semantic__reranker__result__seenDecisions["seenDecisions"] + src__semantic__reranker__result__acceptedDeclarations["acceptedDeclarations"] + src__semantic__reranker__result__candidate["candidate"] + src__semantic__reranker__result__assertSemanticRerankHeader["assertSemanticRerankHeader"] + src__semantic__reranker__result__createCandidateAndRecordIndex["createCandidateAndRecordIndex"] + src__semantic__reranker__result__validateSemanticDecisionCandidate["validateSemanticDecisionCandidate"] + src__semantic__reranker__result__validateSemanticDecisionDecision["validateSemanticDecisionDecision"] + src__semantic__reranker__result__validateSemanticDecisionEvidence["validateSemanticDecisionEvidence"] + src__semantic__reranker__result__citations["citations"] + src__semantic__reranker__result__record["record"] + src__semantic__reranker__result__validateDecisionEvidenceScope["validateDecisionEvidenceScope"] + src__semantic__reranker__result__validateSemanticDecisionVerdict["validateSemanticDecisionVerdict"] + src__semantic__reranker__result__assertRerankResultHash["assertRerankResultHash"] + src__semantic__reranker__result__expectedHash["expectedHash"] + src__semantic__reranker__result__applyAcceptedSemanticRelations["applyAcceptedSemanticRelations"] + src__semantic__reranker__result__candidates["candidates"] + src__semantic__reranker__result__added["added"] end subgraph src__services - src__services__actions__executeAction{{executeAction CC=83}} - src__services__actions__root{{root CC=83}} + src__services__actions__executeAction["executeAction"] + src__services__actions__root["root"] + src__services__actions__handler["handler"] + src__services__actions__executeExtractNlAction["executeExtractNlAction"] src__services__actions__file["file"] src__services__actions__text["text"] + src__services__actions__executeExtractGitAction["executeExtractGitAction"] + src__services__actions__executeExtractAstAction["executeExtractAstAction"] + src__services__actions__executeExtractConfigAction["executeExtractConfigAction"] + src__services__actions__executeExtractMarkdownAction["executeExtractMarkdownAction"] + src__services__actions__executeExtractDocsAction["executeExtractDocsAction"] + src__services__actions__executeExtractCommunicationAction["executeExtractCommunicationAction"] + src__services__actions__executeAnalyzeCommunicationAction["executeAnalyzeCommunicationAction"] src__services__actions__analysis["analysis"] - src__services__actions__records("records CC=13") + src__services__actions__executeLinkAction["executeLinkAction"] + src__services__actions__records["records"] + src__services__actions__executeDiagnoseAction["executeDiagnoseAction"] src__services__actions__graph["graph"] + src__services__actions__executeSummarizeAction["executeSummarizeAction"] src__services__actions__diagnostics["diagnostics"] + src__services__actions__executeProposeTodoAction["executeProposeTodoAction"] src__services__actions__result["result"] src__services__actions__output["output"] + src__services__actions__executeRenderTodoAction["executeRenderTodoAction"] src__services__actions__synthesis["synthesis"] src__services__actions__todoPath["todoPath"] src__services__actions__patchPath["patchPath"] src__services__actions__auditPath["auditPath"] src__services__actions__todoContent["todoContent"] src__services__actions__rendered["rendered"] + src__services__actions__executeApplyTodoAction["executeApplyTodoAction"] src__services__actions__receiptPath["receiptPath"] + src__services__actions__executeProposeCodeChangeAction("executeProposeCodeChangeAction CC=10") src__services__actions__conclusions["conclusions"] src__services__actions__proposals["proposals"] + src__services__actions__executeRenderCodeChangeAction("executeRenderCodeChangeAction CC=8") src__services__actions__planSet["planSet"] src__services__actions__review["review"] + src__services__actions__executeProposeSourcePatchAction["executeProposeSourcePatchAction"] src__services__actions__plan["plan"] src__services__actions__unifiedDiffs["unifiedDiffs"] src__services__actions__patch["patch"] + src__services__actions__executeApplySourcePatchAction["executeApplySourcePatchAction"] + src__services__actions__executeEvaluateCodeChangeAction["executeEvaluateCodeChangeAction"] src__services__actions__beforeGraph("beforeGraph CC=8") src__services__actions__beforeDiagnostics("beforeDiagnostics CC=8") src__services__actions__afterGraph("afterGraph CC=8") src__services__actions__afterDiagnostics("afterDiagnostics CC=8") + src__services__actions__executeCloseCodeChangeAction("executeCloseCodeChangeAction CC=13") src__services__actions__value["value"] + src__services__actions__executeDiffAction["executeDiffAction"] src__services__actions__beforeInput["beforeInput"] src__services__actions__afterInput["afterInput"] src__services__actions__before["before"] src__services__actions__after["after"] src__services__actions__diff["diff"] src__services__actions__svg["svg"] + src__services__actions__executeDiffFilesAction["executeDiffFilesAction"] src__services__actions__beforePath["beforePath"] src__services__actions__afterPath["afterPath"] - src__services__actions__view["view"] - src__services__actions__filterCommunicationGraph{{filterCommunicationGraph CC=17}} - src__services__actions__participant("participant CC=13") - src__services__actions__role("role CC=13") - src__services__actions__ticket("ticket CC=13") - src__services__actions__communicationOnly("communicationOnly CC=13") - src__services__actions__isCommunication["isCommunication"] - src__services__actions__nlModeValue["nlModeValue"] - src__services__actions__llmModeValue["llmModeValue"] - src__services__actions__taskSynthesisMode["taskSynthesisMode"] - src__services__actions__summaryModeValue["summaryModeValue"] - src__services__actions__pipelineTaskMode["pipelineTaskMode"] - src__services__actions__withTextDiffViews["withTextDiffViews"] - src__services__actions__title["title"] - src__services__actions__readGraphInput["readGraphInput"] - src__services__actions__safePath["safePath"] - src__services__actions__readActionObject["readActionObject"] - src__services__actions__resolveRoot["resolveRoot"] - src__services__actions__requested["requested"] - src__services__actions__scopedPath["scopedPath"] - src__services__actions__selected["selected"] - src__services__actions__nullableScopedPath["nullableScopedPath"] - src__services__actions__readRecords["readRecords"] end subgraph src__summary + src__summary__payload__compactSummaryPayload("compactSummaryPayload CC=12") + src__summary__payload__referenced["referenced"] + src__summary__payload__nonAst["nonAst"] + src__summary__payload__moduleAst["moduleAst"] + src__summary__payload__relevantAst["relevantAst"] + src__summary__payload__ids["ids"] + src__summary__payload__selectedRelations["selectedRelations"] + src__summary__payload__compactRecord["compactRecord"] src__summary__summarizer__summarizeGraph("summarizeGraph CC=10") src__summary__summarizer__mode["mode"] src__summary__summarizer__conclusions["conclusions"] @@ -1640,76 +1661,68 @@ flowchart TD src__summary__render__confidence["confidence"] src__summary__render__renderConclusion["renderConclusion"] src__summary__render__recordCitations["recordCitations"] - src__summary__payload__compactSummaryPayload("compactSummaryPayload CC=12") - src__summary__payload__referenced["referenced"] - src__summary__payload__nonAst["nonAst"] - src__summary__payload__moduleAst["moduleAst"] - src__summary__payload__relevantAst["relevantAst"] - src__summary__payload__ids["ids"] - src__summary__payload__selectedRelations["selectedRelations"] - src__summary__payload__compactRecord["compactRecord"] end subgraph src__synthesis - src__synthesis__validation__validateAndClassifyTodoProposals["validateAndClassifyTodoProposals"] - src__synthesis__validation__existing["existing"] - src__synthesis__validation__duplicates["duplicates"] - src__synthesis__validation__orderedProposalIds["orderedProposalIds"] - src__synthesis__validation__duplicateProposalIds["duplicateProposalIds"] - src__synthesis__validation__duplicateIds["duplicateIds"] - src__synthesis__validation__duplicateEvidence("duplicateEvidence CC=11") - src__synthesis__validation__proposalWords["proposalWords"] - src__synthesis__validation__target["target"] - src__synthesis__validation__sharedTicket["sharedTicket"] - src__synthesis__validation__sharedSymbol["sharedSymbol"] - src__synthesis__validation__sharedPath["sharedPath"] - src__synthesis__validation__similarity["similarity"] - src__synthesis__validation__dependencyFirstPriorityOrder("dependencyFirstPriorityOrder CC=11") - src__synthesis__validation__byId["byId"] - src__synthesis__validation__remainingDependencies["remainingDependencies"] - src__synthesis__validation__dependents["dependents"] - src__synthesis__validation__values["values"] - src__synthesis__validation__compare["compare"] - src__synthesis__validation__left["left"] - src__synthesis__validation__right["right"] - src__synthesis__validation__ready["ready"] - src__synthesis__validation__id["id"] - src__synthesis__validation__remaining["remaining"] - src__synthesis__validation__words["words"] - src__synthesis__validation__jaccard["jaccard"] - src__synthesis__validation__common["common"] - src__synthesis__validation__intersects["intersects"] - src__synthesis__todo_patch__diagnosticReportFingerprint["diagnosticReportFingerprint"] - src__synthesis__todo_patch__createTodoPatch("createTodoPatch CC=8") - src__synthesis__todo_patch__expectedValidation["expectedValidation"] - src__synthesis__todo_patch__proposalById["proposalById"] - src__synthesis__todo_patch__selected["selected"] - src__synthesis__todo_patch__proposal["proposal"] - src__synthesis__todo_patch__orderedSelected["orderedSelected"] - src__synthesis__todo_patch__markdown["markdown"] - src__synthesis__todo_patch__renderTodoPatchMarkdown["renderTodoPatchMarkdown"] - src__synthesis__todo_patch__writeTodoPatchArtifacts["writeTodoPatchArtifacts"] - src__synthesis__todo_patch__created["created"] - src__synthesis__todo_patch__patchPath["patchPath"] - src__synthesis__todo_patch__auditPath["auditPath"] - src__synthesis__todo_patch__applyTodoPatch("applyTodoPatch CC=12") - src__synthesis__todo_patch__current["current"] - src__synthesis__todo_patch__receipt["receipt"] - src__synthesis__todo_patch__now["now"] - src__synthesis__todo_patch__currentHash["currentHash"] - src__synthesis__todo_patch__result["result"] - src__synthesis__todo_patch__applied["applied"] - src__synthesis__todo_patch__recovered["recovered"] - src__synthesis__todo_patch__assertTodoPatchArtifact("assertTodoPatchArtifact CC=11") - src__synthesis__todo_patch__artifact["artifact"] - src__synthesis__todo_patch__sourceTodo["sourceTodo"] - src__synthesis__todo_patch__duplicates["duplicates"] - src__synthesis__todo_patch__classified["classified"] - src__synthesis__todo_patch__duplicate["duplicate"] - src__synthesis__todo_patch__assertApproval["assertApproval"] - src__synthesis__todo_patch__assertReceipt["assertReceipt"] - src__synthesis__todo_patch__atomicWrite["atomicWrite"] - src__synthesis__todo_patch__temporary["temporary"] - src__synthesis__todo_patch__existing["existing"] + src__synthesis__task_synthesis_payload__compactSynthesisPayload["compactSynthesisPayload"] + src__synthesis__task_synthesis_payload__recordIds["recordIds"] + src__synthesis__task_synthesis_payload__todoRecords["todoRecords"] + src__synthesis__task_synthesis_payload__records["records"] + src__synthesis__task_synthesis_payload__includedIds["includedIds"] + src__synthesis__task_synthesis_payload__groundedDiagnostics["groundedDiagnostics"] + src__synthesis__task_synthesis_payload__compactRecord["compactRecord"] + src__synthesis__task_synthesis_payload__compareDiagnostics["compareDiagnostics"] + src__synthesis__code_change_path__NON_SOURCE_DIR_SEGMENTS["NON_SOURCE_DIR_SEGMENTS"] + src__synthesis__code_change_path__BINARY_EXTENSIONS["BINARY_EXTENSIONS"] + src__synthesis__code_change_path__GENERATED_ANALYSIS_BASENAMES["GENERATED_ANALYSIS_BASENAMES"] + src__synthesis__code_change_path__T2C_ARTIFACT_BASENAMES["T2C_ARTIFACT_BASENAMES"] + src__synthesis__code_change_path__EXTENSIONLESS_SOURCE_BASENAMES["EXTENSIONLESS_SOURCE_BASENAMES"] + src__synthesis__code_change_path__isUsefulCodeChangePath["isUsefulCodeChangePath"] + src__synthesis__code_change_path__isPlannablePath["isPlannablePath"] + src__synthesis__code_change_path__normalized["normalized"] + src__synthesis__code_change_path__segments["segments"] + src__synthesis__code_change_path__lowerSegments["lowerSegments"] + src__synthesis__code_change_path__basename["basename"] + src__synthesis__code_change_path__normalizePlannablePath["normalizePlannablePath"] + src__synthesis__code_change_path__isCandidatePathSyntax["isCandidatePathSyntax"] + src__synthesis__code_change_path__splitPathSegments["splitPathSegments"] + src__synthesis__code_change_path__isInvalidSegmentShape["isInvalidSegmentShape"] + src__synthesis__code_change_path__isConcretePath["isConcretePath"] + src__synthesis__code_change_path__hasShellPattern["hasShellPattern"] + src__synthesis__code_change_path__isDisallowedSegment["isDisallowedSegment"] + src__synthesis__code_change_path__isPlannableBasename("isPlannableBasename CC=11") + src__synthesis__code_change_path__lowerBasename["lowerBasename"] + src__synthesis__code_change_path__dot["dot"] + src__synthesis__code_change_path__ext["ext"] + src__synthesis__code_change_path__isGeneratedArtifactPath("isGeneratedArtifactPath CC=10") + src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse["materializeTaskSynthesisResponse"] + src__synthesis__task_synthesis_materialize__parsed["parsed"] + src__synthesis__task_synthesis_materialize__conclusionKeys["conclusionKeys"] + src__synthesis__task_synthesis_materialize__proposalKeys["proposalKeys"] + src__synthesis__task_synthesis_materialize__conclusions["conclusions"] + src__synthesis__task_synthesis_materialize__diagnosticIds["diagnosticIds"] + src__synthesis__task_synthesis_materialize__conclusionIdByKey["conclusionIdByKey"] + src__synthesis__task_synthesis_materialize__conclusionByKey["conclusionByKey"] + src__synthesis__task_synthesis_materialize__proposalDrafts["proposalDrafts"] + src__synthesis__task_synthesis_materialize__citedConclusions["citedConclusions"] + src__synthesis__task_synthesis_materialize__conclusion["conclusion"] + src__synthesis__task_synthesis_materialize__proposalIdByKey["proposalIdByKey"] + src__synthesis__task_synthesis_materialize__proposals["proposals"] + src__synthesis__task_synthesis_materialize__normalizeLocalKeys["normalizeLocalKeys"] + src__synthesis__task_synthesis_materialize__explicit["explicit"] + src__synthesis__task_synthesis_materialize__reserved["reserved"] + src__synthesis__task_synthesis_materialize__keys["keys"] + src__synthesis__task_synthesis_materialize__hasBlankKey["hasBlankKey"] + src__synthesis__task_synthesis_materialize__key["key"] + src__synthesis__task_synthesis_materialize__suffix["suffix"] + src__synthesis__task_synthesis_materialize__mapKeys["mapKeys"] + src__synthesis__task_synthesis_materialize__id["id"] + src__synthesis__task_synthesis_materialize__sortedUnique["sortedUnique"] + src__synthesis__task_synthesis_materialize__normalizeStringArray["normalizeStringArray"] + src__synthesis__task_synthesis_materialize__values["values"] + src__synthesis__task_synthesis_materialize__normalizeRawTarget["normalizeRawTarget"] + src__synthesis__task_synthesis_materialize__target["target"] + src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria["normalizeAcceptanceCriteria"] + src__synthesis__task_synthesis_materialize__criteria["criteria"] end subgraph src__tf src__tf__classifier__dynamicImport["dynamicImport"] @@ -1728,17 +1741,22 @@ flowchart TD src__tf__classifier__vectorize["vectorize"] src__tf__classifier__values["values"] src__tf__classifier__index["index"] - src__tf__classifier__classifyAction{{classifyAction CC=17}} + src__tf__classifier__classifyAction["classifyAction"] src__tf__classifier__fallback["fallback"] src__tf__classifier__loaded["loaded"] + src__tf__classifier__probabilities["probabilities"] + src__tf__classifier__buildHeuristicActionResult["buildHeuristicActionResult"] + src__tf__classifier__classifyWithTensorFlow["classifyWithTensorFlow"] src__tf__classifier__vector["vector"] src__tf__classifier__input["input"] src__tf__classifier__predictionValue["predictionValue"] src__tf__classifier__prediction["prediction"] - src__tf__classifier__probabilities["probabilities"] + src__tf__classifier__resolveActionFromTensorflow["resolveActionFromTensorflow"] src__tf__classifier__bestIndex["bestIndex"] src__tf__classifier__action["action"] src__tf__classifier__confidence["confidence"] + src__tf__classifier__indexOfMaxValue["indexOfMaxValue"] + src__tf__classifier__clampProbability["clampProbability"] end subgraph src__watch src__watch__watcher__scanTree("scanTree CC=12") @@ -1753,116 +1771,258 @@ flowchart TD src__watch__watcher__describeDelta["describeDelta"] src__watch__watcher__shown["shown"] src__watch__watcher__rest["rest"] - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS{{DEFAULT_MIN_INTERVAL_MS CC=19}} - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS{{DEFAULT_SCAN_INTERVAL_MS CC=19}} - src__watch__watcher__watchRepository{{watchRepository CC=19}} + src__watch__watcher__DEFAULT_MIN_INTERVAL_MS["DEFAULT_MIN_INTERVAL_MS"] + src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS["DEFAULT_SCAN_INTERVAL_MS"] + src__watch__watcher__watchRepository["watchRepository"] + src__watch__watcher__configuration["configuration"] + src__watch__watcher__runtime["runtime"] + src__watch__watcher__defaultSleep["defaultSleep"] + src__watch__watcher__timer["timer"] + src__watch__watcher__onAbort["onAbort"] + src__watch__watcher__finish["finish"] + src__watch__watcher__createWatchConfiguration("createWatchConfiguration CC=9") src__watch__watcher__root["root"] src__watch__watcher__minIntervalMs["minIntervalMs"] src__watch__watcher__scanIntervalMs["scanIntervalMs"] src__watch__watcher__emit["emit"] src__watch__watcher__now["now"] src__watch__watcher__sleep["sleep"] - src__watch__watcher__signal["signal"] src__watch__watcher__matcher["matcher"] src__watch__watcher__runReport["runReport"] src__watch__watcher__result["result"] - src__watch__watcher__snapshot["snapshot"] - src__watch__watcher__lastReportStartedAt["lastReportStartedAt"] - src__watch__watcher__pending["pending"] + src__watch__watcher__createWatchRuntime["createWatchRuntime"] + src__watch__watcher__initialSnapshot["initialSnapshot"] + src__watch__watcher__scanTreeCurrent["scanTreeCurrent"] + src__watch__watcher__evaluateChangeCycle["evaluateChangeCycle"] src__watch__watcher__current["current"] src__watch__watcher__delta["delta"] + src__watch__watcher__handleDelta["handleDelta"] + src__watch__watcher__maybeGenerateReport["maybeGenerateReport"] src__watch__watcher__waitMs["waitMs"] - src__watch__watcher__generate["generate"] + src__watch__watcher__generateReportForReason["generateReportForReason"] src__watch__watcher__startedAt["startedAt"] - src__watch__watcher__defaultSleep["defaultSleep"] - src__watch__watcher__timer["timer"] - src__watch__watcher__onAbort["onAbort"] - src__watch__watcher__finish["finish"] end subgraph src__web - src__web__diff_ui__diffUiHtml{{diffUiHtml CC=52}} - src__web__diff_ui__byId["byId"] - src__web__diff_ui__requestHeaders["requestHeaders"] - src__web__diff_ui__formatBytes["formatBytes"] - src__web__diff_ui__selectedRun["selectedRun"] - src__web__diff_ui__updateMeta["updateMeta"] - src__web__diff_ui__fillSelect["fillSelect"] - src__web__diff_ui__loadRuns("loadRuns CC=12") - src__web__diff_ui__compareGraphs{{compareGraphs CC=15}} + src__web__diff_ui_script__byId["byId"] + src__web__diff_ui_script__requestHeaders["requestHeaders"] + src__web__diff_ui_script__formatBytes["formatBytes"] + src__web__diff_ui_script__selectedRun["selectedRun"] + src__web__diff_ui_script__updateMeta["updateMeta"] + src__web__diff_ui_script__fillSelect["fillSelect"] + src__web__diff_ui_script__loadRuns("loadRuns CC=12") + src__web__diff_ui_script__compareGraphs{{compareGraphs CC=15}} + src__web__diff_ui__diffUiStyles["diffUiStyles"] + src__web__diff_ui__diffUiRunPanel["diffUiRunPanel"] + src__web__diff_ui__diffUiFiltersPanel["diffUiFiltersPanel"] + src__web__diff_ui__diffUiBodyMarkup["diffUiBodyMarkup"] + src__web__diff_ui__diffUiScriptMarkup["diffUiScriptMarkup"] + src__web__diff_ui__diffUiTemplate["diffUiTemplate"] + src__web__diff_ui__diffUiHtml["diffUiHtml"] end + rust_ast__src__main__main --> rust_ast__src__main__arguments + rust_ast__src__main__main --> rust_ast__src__main__collect_files + rust_ast__src__main__main --> rust_ast__src__main__slash + rust_ast__src__main__collect_files --> rust_ast__src__main__slash + rust_ast__src__main__add --> rust_ast__src__main__excerpt + rust_ast__src__main__visit_item_mod --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_mod --> rust_ast__src__main__add + rust_ast__src__main__visit_item_use --> rust_ast__src__main__add + rust_ast__src__main__visit_item_struct --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_enum --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_trait --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_type --> rust_ast__src__main__type_item + rust_ast__src__main__visit_item_const --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_const --> rust_ast__src__main__add + rust_ast__src__main__visit_item_const --> rust_ast__src__main__modifiers + rust_ast__src__main__visit_item_static --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_static --> rust_ast__src__main__add + rust_ast__src__main__visit_item_static --> rust_ast__src__main__modifiers + rust_ast__src__main__visit_item_fn --> rust_ast__src__main__qualified + rust_ast__src__main__visit_item_fn --> rust_ast__src__main__add + rust_ast__src__main__visit_item_fn --> rust_ast__src__main__modifiers + rust_ast__src__main__visit_impl_item_fn --> rust_ast__src__main__add + rust_ast__src__main__visit_expr_call --> rust_ast__src__main__add + rust_ast__src__main__visit_expr_method_call --> rust_ast__src__main__add + rust_ast__src__main__type_item --> rust_ast__src__main__qualified + rust_ast__src__main__type_item --> rust_ast__src__main__add + rust_ast__src__main__type_item --> rust_ast__src__main__modifiers + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleHealth + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleEventPublish + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__handleEventList + examples__backend__src__request_handlers__MAX_BODY_BYTES --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleHealth + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleEventPublish + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__handleEventList + examples__backend__src__request_handlers__handleRequest --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleHealth --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleHealth --> examples__backend__src__request_handlers__size + examples__backend__src__request_handlers__handleEventPublish --> examples__backend__src__request_handlers__readBody + examples__backend__src__request_handlers__handleEventPublish --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__validation --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__event --> examples__backend__src__request_handlers__sendJson + examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__parseOffset + examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__parseLimit + examples__backend__src__request_handlers__handleEventList --> examples__backend__src__request_handlers__sendJson + examples__backend__src__validation__ALLOWED_ACTIONS --> examples__backend__src__validation__invalid + examples__backend__src__validation__validateEventPayload --> examples__backend__src__validation__invalid + examples__backend__src__validation__record --> examples__backend__src__validation__invalid + examples__backend__src__validation__agent --> examples__backend__src__validation__invalid + examples__backend__src__validation__action --> examples__backend__src__validation__invalid + examples__backend__src__validation__object --> examples__backend__src__validation__invalid + examples__backend__src__server__createBackend --> examples__backend__src__server__sendJson + examples__backend__src__server__store --> examples__backend__src__server__sendJson + examples__backend__src__server__server --> examples__backend__src__server__sendJson + examples__backend__src__server__startBackend --> examples__backend__src__server__createBackend + examples__frontend__src__render__toRows --> examples__frontend__src__render__classifyEvent + examples__frontend__src__render__renderTable --> examples__frontend__src__render__headerRow + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__createState + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__refresh + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__reload + examples__frontend__src__app__mountPanel --> examples__frontend__src__app__state + examples__frontend__src__app__state --> examples__frontend__src__app__refresh + examples__frontend__src__app__reload --> examples__frontend__src__app__refresh + examples__src__runtime__executeContract --> examples__src__runtime__validateContract + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__add + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__emit + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__collect + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__slash + java__JavaAstExtract__JavaAstExtract__main --> java__JavaAstExtract__JavaAstExtract__parseFile + java__JavaAstExtract__JavaAstExtract__emit --> java__JavaAstExtract__JavaAstExtract__json + java__JavaAstExtract__JavaAstExtract__emit --> java__JavaAstExtract__JavaAstExtract__map + java__JavaAstExtract__JavaAstExtract__collect --> java__JavaAstExtract__JavaAstExtract__try + java__JavaAstExtract__JavaAstExtract__collect --> java__JavaAstExtract__JavaAstExtract__containsIgnored + java__JavaAstExtract__JavaAstExtract__try --> java__JavaAstExtract__JavaAstExtract__slash + java__JavaAstExtract__JavaAstExtract__try --> java__JavaAstExtract__JavaAstExtract__Collector + java__JavaAstExtract__JavaAstExtract__json --> java__JavaAstExtract__JavaAstExtract__escape src__cli__main --> src__cli__printHelp src__cli__main --> src__cli__parseArgs - src__cli__main --> src__cli__initProject - src__cli__main --> src__cli__doctor - src__cli__main --> src__cli__handleExtract - src__cli__main --> src__cli__handleCommunication + src__cli__main --> src__cli__resolveMainCommand + src__cli__main --> src__cli__commandHandlers + src__cli__main --> src__cli__handler src__cli__parsed --> src__cli__printHelp src__cli__command --> src__cli__printHelp + src__cli__commandHandlers --> src__cli__initProject + src__cli__commandHandlers --> src__cli__doctor + src__cli__handleLink --> src__cli__emitJson + src__cli__handleLink --> src__cli__optionString + src__cli__handleDiagnose --> src__cli__emitJson + src__cli__handleDiagnose --> src__cli__optionString + src__cli__handleSummarize --> src__cli__optionString + src__cli__handleSummarize --> src__cli__optionSummaryMode src__cli__diagnosticsPath --> src__cli__optionNumber src__cli__diagnosticsPath --> src__cli__optionBoolean src__cli__diagnostics --> src__cli__optionNumber src__cli__diagnostics --> src__cli__optionBoolean src__cli__result --> src__cli__execFileAsync + src__cli__handleProposeTodo --> src__cli__optionString + src__cli__handleProposeTodo --> src__cli__optionTaskMode + src__cli__handleRenderTodo --> src__cli__optionString + src__cli__handleApplyTodo --> src__cli__optionString + src__cli__handleProposeCodeChange --> src__cli__optionString + src__cli__handleRenderCodeChange --> src__cli__optionString + src__cli__handleProposeSourcePatch --> src__cli__optionString src__cli__isPlanSet --> src__cli__optionString + src__cli__handleApplySourcePatch --> src__cli__optionString + src__cli__handleEvaluateCodeChange --> src__cli__optionString + src__cli__handleCloseCodeChange --> src__cli__optionString + src__cli__handleCompareWorkspace --> src__cli__resolvePipelineRoot + src__cli__handleCompareWorkspace --> src__cli__buildWorkspaceComparisonOptions src__cli__root --> src__cli__optionString src__cli__root --> src__cli__optionNullableString src__cli__root --> src__cli__optionLlmMode - src__cli__handleWatch --> src__cli__optionNullableString - src__cli__handleWatch --> src__cli__optionList - src__cli__handleWatch --> src__cli__optionBoolean - src__cli__handleWatch --> src__cli__optionString + src__cli__handlePipeline --> src__cli__resolvePipelineRoot + src__cli__handlePipeline --> src__cli__buildPipelineOptions + src__cli__handlePipeline --> src__cli__optionNullableString + src__cli__handlePipeline --> src__cli__reportPipelineDegradation + src__cli__handleWatch --> src__cli__resolvePipelineRoot + src__cli__handleWatch --> src__cli__resolveWatchTaskFile + src__cli__handleWatch --> src__cli__buildPipelineOptions src__cli__handleWatch --> src__cli__optionNumber - src__cli__handleWatch --> src__cli__optionNlMode - src__cli__handleWatch --> src__cli__optionLlmMode - src__cli__handleWatch --> src__cli__optionPipelineTaskMode - src__cli__taskFile --> src__cli__optionNullableString - src__cli__taskFile --> src__cli__optionList - src__cli__taskFile --> src__cli__optionBoolean - src__cli__taskFile --> src__cli__optionString + src__cli__handleWatch --> src__cli__optionBoolean + src__cli__handleWatch --> src__cli__formatWatchEvent src__cli__taskFile --> src__cli__optionNumber - src__cli__taskFile --> src__cli__optionNlMode - src__cli__taskFile --> src__cli__optionLlmMode - src__cli__taskFile --> src__cli__optionPipelineTaskMode + src__cli__taskFile --> src__cli__optionBoolean + src__cli__taskFile --> src__cli__formatWatchEvent + src__cli__pipeline --> src__cli__optionNumber + src__cli__pipeline --> src__cli__optionBoolean + src__cli__pipeline --> src__cli__formatWatchEvent src__cli__controller --> src__cli__optionNumber src__cli__controller --> src__cli__optionBoolean src__cli__controller --> src__cli__formatWatchEvent src__cli__stop --> src__cli__optionNumber src__cli__stop --> src__cli__optionBoolean src__cli__stop --> src__cli__formatWatchEvent + src__cli__buildPipelineOptions --> src__cli__buildCommonPipelineOptions + src__cli__buildCommonPipelineOptions --> src__cli__optionNullableString + src__cli__buildCommonPipelineOptions --> src__cli__optionList + src__cli__buildCommonPipelineOptions --> src__cli__optionBoolean + src__cli__buildCommonPipelineOptions --> src__cli__optionString + src__cli__buildCommonPipelineOptions --> src__cli__optionNumber + src__cli__buildCommonPipelineOptions --> src__cli__optionNlMode + src__cli__buildCommonPipelineOptions --> src__cli__optionLlmMode + src__cli__buildCommonPipelineOptions --> src__cli__optionPipelineTaskMode + src__cli__resolveWatchTaskFile --> src__cli__optionNullableString + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionString + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionNullableString + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionList + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionBoolean + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionLlmMode + src__cli__buildWorkspaceComparisonOptions --> src__cli__optionNumber src__cli__formatWatchEvent --> src__cli__file src__cli__stamp --> src__cli__file + src__cli__handleDiff --> src__cli__parseDiffMode + src__cli__handleDiff --> src__cli__handleGraphDiff + src__cli__handleDiff --> src__cli__buildDiffPayload src__cli__handleDiff --> src__cli__optionString src__cli__handleDiff --> src__cli__optionNumber - src__cli__mode --> src__cli__optionNumber src__cli__svg --> src__cli__optionNumber src__cli__svg --> src__cli__optionBoolean - src__cli__html --> src__cli__optionNumber + src__cli__parseDiffMode --> src__cli__optionString + src__cli__handleGraphDiff --> src__cli__optionString + src__cli__handleGraphDiff --> src__cli__optionNumber src__cli__diff --> src__cli__optionNumber + src__cli__buildDiffPayload --> src__cli__buildFileDiff + src__cli__buildDiffPayload --> src__cli__buildGitDiff + src__cli__buildFileDiff --> src__cli__optionNumber src__cli__context --> src__cli__optionString src__cli__context --> src__cli__optionBoolean src__cli__context --> src__cli__optionNumber - src__cli__maxRows --> src__cli__optionString - src__cli__maxRows --> src__cli__optionBoolean - src__cli__maxRows --> src__cli__optionNumber + src__cli__buildGitDiff --> src__cli__optionNumber + src__cli__buildGitDiff --> src__cli__optionString + src__cli__buildGitDiff --> src__cli__optionBoolean src__cli__handleReality --> src__cli__optionString src__cli__handleReality --> src__cli__optionNumber src__cli__handleReality --> src__cli__optionBoolean src__cli__view --> src__cli__optionNumber src__cli__view --> src__cli__optionBoolean src__cli__handleExtract --> src__cli__optionString - src__cli__handleExtract --> src__cli__optionNlMode - src__cli__handleExtract --> src__cli__emitExtraction - src__cli__handleExtract --> src__cli__optionNumber - src__cli__handleExtract --> src__cli__optionNullableString - src__cli__handleExtract --> src__cli__optionLlmMode - src__cli__extractor --> src__cli__optionString - src__cli__extractor --> src__cli__optionNlMode - src__cli__extractor --> src__cli__emitExtraction + src__cli__handleExtract --> src__cli__handler + src__cli__handleExtractNl --> src__cli__optionString + src__cli__handleExtractNl --> src__cli__optionNlMode + src__cli__handleExtractNl --> src__cli__emitExtraction + src__cli__handleExtractGit --> src__cli__optionNumber + src__cli__handleExtractGit --> src__cli__emitExtraction + src__cli__handleExtractAst --> src__cli__emitExtraction + src__cli__handleExtractConfig --> src__cli__emitExtraction + src__cli__handleExtractRuntime --> src__cli__emitExtraction + src__cli__handleExtractMarkdown --> src__cli__optionNullableString + src__cli__handleExtractMarkdown --> src__cli__optionLlmMode + src__cli__handleExtractMarkdown --> src__cli__emitExtraction + src__cli__handleExtractDocs --> src__cli__optionList + src__cli__handleExtractDocs --> src__cli__emitExtraction + src__cli__handleExtractCommunication --> src__cli__optionString + src__cli__handleExtractCommunication --> src__cli__optionNullableString + src__cli__handleExtractCommunication --> src__cli__optionLlmMode + src__cli__handleExtractCommunication --> src__cli__emitExtraction src__cli__handleCommunication --> src__cli__optionString src__cli__handleCommunication --> src__cli__optionNullableString src__cli__handleCommunication --> src__cli__optionLlmMode src__cli__handleCommunication --> src__cli__optionNumber src__cli__handleCommunication --> src__cli__optionBoolean + src__cli__handleIntake --> src__cli__optionString + src__cli__handleIntake --> src__cli__optionBoolean + src__cli__handleIntake --> src__cli__intakeExitCode + src__cli__absolute --> src__cli__optionString src__cli__doctor --> src__cli__execFileAsync src__cli__optionNumber --> src__cli__optionString src__cli__optionList --> src__cli__optionString @@ -1873,525 +2033,394 @@ flowchart TD src__cli__optionSummaryMode --> src__cli__optionBoolean src__cli__optionPipelineTaskMode --> src__cli__optionString src__cli__invokedPath --> src__cli__main - src__web__diff_ui__diffUiHtml --> src__web__diff_ui__byId - src__web__diff_ui__diffUiHtml --> src__web__diff_ui__selectedRun - src__web__diff_ui__diffUiHtml --> src__web__diff_ui__formatBytes - src__web__diff_ui__requestHeaders --> src__web__diff_ui__byId - src__web__diff_ui__formatBytes --> src__web__diff_ui__selectedRun - src__web__diff_ui__formatBytes --> src__web__diff_ui__byId - src__web__diff_ui__selectedRun --> src__web__diff_ui__byId - src__web__diff_ui__selectedRun --> src__web__diff_ui__formatBytes - src__web__diff_ui__updateMeta --> src__web__diff_ui__selectedRun - src__web__diff_ui__updateMeta --> src__web__diff_ui__byId - src__web__diff_ui__updateMeta --> src__web__diff_ui__formatBytes - src__web__diff_ui__fillSelect --> src__web__diff_ui__byId - src__web__diff_ui__fillSelect --> src__web__diff_ui__updateMeta - src__web__diff_ui__loadRuns --> src__web__diff_ui__byId - src__web__diff_ui__loadRuns --> src__web__diff_ui__requestHeaders - src__web__diff_ui__loadRuns --> src__web__diff_ui__fillSelect - src__web__diff_ui__loadRuns --> src__web__diff_ui__compareGraphs - src__web__diff_ui__compareGraphs --> src__web__diff_ui__byId - src__web__diff_ui__compareGraphs --> src__web__diff_ui__requestHeaders - src__watch__watcher__scanTree --> src__watch__watcher__relative - src__watch__watcher__scanTree --> src__watch__watcher__visit - src__watch__watcher__scanTree --> src__watch__watcher__stat - src__watch__watcher__maxFiles --> src__watch__watcher__relative - src__watch__watcher__maxFiles --> src__watch__watcher__visit - src__watch__watcher__maxFiles --> src__watch__watcher__stat - src__watch__watcher__absoluteRoot --> src__watch__watcher__relative - src__watch__watcher__absoluteRoot --> src__watch__watcher__visit - src__watch__watcher__absoluteRoot --> src__watch__watcher__stat - src__watch__watcher__visit --> src__watch__watcher__relative - src__watch__watcher__visit --> src__watch__watcher__stat - src__watch__watcher__absolute --> src__watch__watcher__visit - src__watch__watcher__relative --> src__watch__watcher__visit - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__now - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__scanTree - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__emit - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__generate - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__sleep - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__diffSnapshots - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__describeDelta - src__watch__watcher__DEFAULT_MIN_INTERVAL_MS --> src__watch__watcher__runReport - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__now - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__scanTree - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__emit - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__generate - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__sleep - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__diffSnapshots - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__describeDelta - src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS --> src__watch__watcher__runReport - src__watch__watcher__watchRepository --> src__watch__watcher__now - src__watch__watcher__watchRepository --> src__watch__watcher__scanTree - src__watch__watcher__watchRepository --> src__watch__watcher__emit - src__watch__watcher__watchRepository --> src__watch__watcher__generate - src__watch__watcher__watchRepository --> src__watch__watcher__sleep - src__watch__watcher__watchRepository --> src__watch__watcher__diffSnapshots - src__watch__watcher__watchRepository --> src__watch__watcher__describeDelta - src__watch__watcher__watchRepository --> src__watch__watcher__runReport - src__watch__watcher__result --> src__watch__watcher__emit - src__watch__watcher__result --> src__watch__watcher__now - src__watch__watcher__snapshot --> src__watch__watcher__emit - src__watch__watcher__lastReportStartedAt --> src__watch__watcher__now - src__watch__watcher__lastReportStartedAt --> src__watch__watcher__generate - src__watch__watcher__pending --> src__watch__watcher__now - src__watch__watcher__pending --> src__watch__watcher__generate - src__watch__watcher__current --> src__watch__watcher__describeDelta - src__watch__watcher__current --> src__watch__watcher__emit - src__watch__watcher__delta --> src__watch__watcher__describeDelta - src__watch__watcher__delta --> src__watch__watcher__emit - src__watch__watcher__waitMs --> src__watch__watcher__emit - src__watch__watcher__generate --> src__watch__watcher__emit - src__watch__watcher__generate --> src__watch__watcher__now - src__watch__watcher__generate --> src__watch__watcher__runReport - src__watch__watcher__generate --> src__watch__watcher__scanTree - src__watch__watcher__startedAt --> src__watch__watcher__runReport - src__watch__watcher__startedAt --> src__watch__watcher__emit - src__watch__watcher__startedAt --> src__watch__watcher__now - src__watch__watcher__defaultSleep --> src__watch__watcher__finish - src__watch__watcher__timer --> src__watch__watcher__finish - src__watch__watcher__onAbort --> src__watch__watcher__finish - src__tf__classifier__dynamicImport --> src__tf__classifier__importer - src__tf__classifier__loadClassifier --> src__tf__classifier__dynamicImport - src__tf__classifier__loadClassifier --> src__tf__classifier__loadAssets - src__tf__classifier__classifyAction --> src__tf__classifier__loadClassifier - src__tf__classifier__classifyAction --> src__tf__classifier__vectorize - src__synthesis__validation__validateAndClassifyTodoProposals --> src__synthesis__validation__duplicateEvidence - src__synthesis__validation__validateAndClassifyTodoProposals --> src__synthesis__validation__dependencyFirstPriorityOrder - src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__words - src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__intersects - src__synthesis__validation__duplicateEvidence --> src__synthesis__validation__jaccard - src__synthesis__validation__proposalWords --> src__synthesis__validation__words - src__synthesis__validation__target --> src__synthesis__validation__jaccard - src__synthesis__validation__target --> src__synthesis__validation__words - src__synthesis__validation__sharedTicket --> src__synthesis__validation__jaccard - src__synthesis__validation__sharedTicket --> src__synthesis__validation__words - src__synthesis__validation__sharedSymbol --> src__synthesis__validation__jaccard - src__synthesis__validation__sharedSymbol --> src__synthesis__validation__words - src__synthesis__validation__sharedPath --> src__synthesis__validation__jaccard - src__synthesis__validation__sharedPath --> src__synthesis__validation__words - src__synthesis__validation__similarity --> src__synthesis__validation__jaccard - src__synthesis__validation__similarity --> src__synthesis__validation__words - src__synthesis__todo_patch__createTodoPatch --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__createTodoPatch --> src__synthesis__todo_patch__renderTodoPatchMarkdown - src__synthesis__todo_patch__createTodoPatch --> src__synthesis__todo_patch__normalizePath - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__selected --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__orderedSelected --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__markdown --> src__synthesis__todo_patch__normalizePath - src__synthesis__todo_patch__markdown --> src__synthesis__todo_patch__diagnosticReportFingerprint - src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__inline - src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__renderTargets - src__synthesis__todo_patch__renderTodoPatchMarkdown --> src__synthesis__todo_patch__renderIds - src__synthesis__todo_patch__writeTodoPatchArtifacts --> src__synthesis__todo_patch__createTodoPatch - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertTodoPatchArtifact - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertApproval - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__assertReceipt - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__applyTodoPatch --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__current --> src__synthesis__todo_patch__assertReceipt - src__synthesis__todo_patch__now --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__now --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__now --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__currentHash --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__result --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__result --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__result --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__applied --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__appendPatch - src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__atomicWrite - src__synthesis__todo_patch__recovered --> src__synthesis__todo_patch__wasAlreadyAppended - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__isoDate - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__hash - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__nonBlank - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__assertTodoPatchArtifact --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__artifact --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__sourceTodo --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__duplicates --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__object - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__exactKeys - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__uniqueIds - src__synthesis__todo_patch__classified --> src__synthesis__todo_patch__uniqueStrings - src__synthesis__todo_patch__assertApproval --> src__synthesis__todo_patch__nonBlank - src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__sameArray - src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__nonBlank - src__synthesis__todo_patch__assertReceipt --> src__synthesis__todo_patch__isoDate - src__synthesis__todo_patch__renderTargets --> src__synthesis__todo_patch__inline - src__synthesis__todo_patch__rendered --> src__synthesis__todo_patch__inline - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__readPrompt - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeTodoProposals --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesisAudit - src__synthesis__tasks_llm__TaskSynthesisAttemptError__startedAt --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__assertConclusions - src__synthesis__tasks_llm__TaskSynthesisAttemptError__client --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow - src__synthesis__tasks_llm__TaskSynthesisAttemptError__prompt --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection - src__synthesis__tasks_llm__TaskSynthesisAttemptError__payload --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection - src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__generationMetadata - src__synthesis__tasks_llm__TaskSynthesisAttemptError__fallbackOrThrow --> src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesisAudit - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeLocalKeys - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__materializeTaskSynthesisResponse --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__parsed --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__parsed --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__proposalKeys --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__proposalKeys --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusions --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__conclusions --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__diagnosticIds --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__conclusionIdByKey --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__conclusionByKey --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeRawTarget - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__proposalDrafts --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__proposalIdByKey --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__proposals --> src__synthesis__task_synthesis_materialize__mapKeys - src__synthesis__task_synthesis_materialize__keys --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__mapKeys --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__mapKeys --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_materialize__sortedUnique --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__normalizeRawTarget --> src__synthesis__task_synthesis_materialize__normalizeStringArray - src__synthesis__task_synthesis_materialize__normalizeAcceptanceCriteria --> src__synthesis__task_synthesis_materialize__sortedUnique - src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT --> src__synthesis__task_synthesis_contract__nonBlank - src__synthesis__task_synthesis_contract__RAW_CONCLUSION_CONTRACT --> src__synthesis__task_synthesis_contract__taskIds - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__nonBlank - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__taskStrings - src__synthesis__task_synthesis_contract__RAW_PROPOSAL_CONTRACT --> src__synthesis__task_synthesis_contract__taskIds - src__synthesis__code_change_plan__proposeCodeChangePlans --> src__synthesis__code_change_plan__indexProposalsByDiagnostic - src__synthesis__code_change_plan__proposeCodeChangePlans --> src__synthesis__code_change_plan__indexConclusionsByDiagnostic - src__synthesis__code_change_plan__generatedAt --> src__synthesis__code_change_plan__createCodeChangeSourcePatch - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__priorityFor - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__acceptanceCriteriaFor - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__riskFor - src__synthesis__code_change_plan__conclusions --> src__synthesis__code_change_plan__rollbackFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__priorityFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__acceptanceCriteriaFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__riskFor - src__synthesis__code_change_plan__proposals --> src__synthesis__code_change_plan__rollbackFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__priorityFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__acceptanceCriteriaFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__riskFor - src__synthesis__code_change_plan__recordsById --> src__synthesis__code_change_plan__rollbackFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__priorityFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__acceptanceCriteriaFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__riskFor - src__synthesis__code_change_plan__proposalsByDiagnostic --> src__synthesis__code_change_plan__rollbackFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__priorityFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__acceptanceCriteriaFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__riskFor - src__synthesis__code_change_plan__conclusionsByDiagnostic --> src__synthesis__code_change_plan__rollbackFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__collectTarget - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__buildChanges - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__titleFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__descriptionFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__priorityFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__acceptanceCriteriaFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__riskFor - src__synthesis__code_change_plan__candidates --> src__synthesis__code_change_plan__rollbackFor - src__synthesis__code_change_plan__relatedRecords --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__matchingProposals --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__matchingConclusions --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__target --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__changes --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__planHash --> src__synthesis__code_change_plan__confidenceFor - src__synthesis__code_change_plan__closeCodeChanges --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance - src__synthesis__code_change_plan__closeCodeChanges --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__planIds --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance - src__synthesis__code_change_plan__acceptances --> src__synthesis__code_change_plan__evaluateCodeChangeAcceptance - src__synthesis__code_change_plan__acceptedCount --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__indexProposalsByDiagnostic --> src__synthesis__code_change_plan__set - src__synthesis__code_change_plan__index --> src__synthesis__code_change_plan__set - src__synthesis__code_change_plan__indexConclusionsByDiagnostic --> src__synthesis__code_change_plan__set - src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__assertSourcePatchStrings - src__synthesis__code_change_plan__paths --> src__synthesis__code_change_plan__normalizeUnifiedDiff - src__synthesis__code_change_plan__buildChanges --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__titleFor --> src__synthesis__code_change_plan__startsWithImperative - src__synthesis__code_change_plan__record --> src__synthesis__code_change_plan__startsWithImperative - src__synthesis__code_change_plan__object --> src__synthesis__code_change_plan__startsWithImperative - src__synthesis__code_change_plan__acceptanceCriteriaFor --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__riskFor --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__rollbackFor --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__createCodeChangeReviewPatch --> src__synthesis__code_change_plan__priorityRank - src__synthesis__code_change_plan__createCodeChangeReviewPatch --> src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown - src__synthesis__code_change_plan__createCodeChangeReviewPatch --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__createCodeChangeReviewPatch --> src__synthesis__code_change_plan__assertCodeChangeReviewPatch - src__synthesis__code_change_plan__markdown --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown --> src__synthesis__code_change_plan__inline - src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown --> src__synthesis__code_change_plan__renderIds - src__synthesis__code_change_plan__createCodeChangeSourcePatch --> src__synthesis__code_change_plan__normalizeUnifiedDiff - src__synthesis__code_change_plan__createCodeChangeSourcePatch --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__createCodeChangeSourcePatch --> src__synthesis__code_change_plan__instructionFor - src__synthesis__code_change_plan__rawDiff --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__rawDiff --> src__synthesis__code_change_plan__instructionFor - src__synthesis__code_change_plan__unifiedDiff --> src__synthesis__code_change_plan__uniqueSorted - src__synthesis__code_change_plan__unifiedDiff --> src__synthesis__code_change_plan__instructionFor - src__synthesis__code_change_plan__patchHash --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__createCodeChangeSourcePatch - src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__createCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertSourcePatchIds - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertSourcePatchStrings - src__synthesis__code_change_plan__assertCodeChangeSourcePatch --> src__synthesis__code_change_plan__normalizeUnifiedDiff - src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet --> src__synthesis__code_change_plan__exactSourcePatchSet - src__synthesis__code_change_plan__plansById --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__patchIds --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__applyCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertCodeChangeSourcePatch - src__synthesis__code_change_plan__applyCodeChangeSourcePatch --> src__synthesis__code_change_plan__assertExistingSourceReceipt - src__synthesis__code_change_plan__now --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__fileHashesAfter --> src__synthesis__code_change_plan__deterministicGeneration - src__synthesis__code_change_plan__assertExistingSourceReceipt --> src__synthesis__code_change_plan__assertSourceApplyReceipt - src__synthesis__code_change_plan__assertSourceApplyReceipt --> src__synthesis__code_change_plan__exactSourcePatchKeys - src__synthesis__code_change_plan__assertSourceApplyReceipt --> src__synthesis__code_change_plan__exactSourcePatchSet - src__synthesis__code_change_plan__applyUnifiedDiffToText --> src__synthesis__code_change_plan__normalizeUnifiedDiff - src__synthesis__code_change_plan__applyUnifiedDiffToText --> src__synthesis__code_change_plan__splitKeep - src__synthesis__code_change_path__isUsefulCodeChangePath --> src__synthesis__code_change_path__isPlannablePath - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__assertConclusions - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__summaryMode - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__readPrompt - src__summary__summarizer__summarizeGraph --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection - src__summary__summarizer__mode --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__mode --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__client --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__client --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection - src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__systemPrompt --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection - src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__deterministicConclusions - src__summary__summarizer__payload --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection --> src__summary__summarizer__SummaryAttemptError__materializeConclusions - src__summary__summarizer__SummaryAttemptError__summarizeWithCorrection --> src__summary__summarizer__SummaryAttemptError__generationMetadata - src__summary__summarizer__SummaryAttemptError__conclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__materializeConclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__materializeConclusions --> src__summary__summarizer__SummaryAttemptError__assertConclusions - src__summary__summarizer__SummaryAttemptError__parsed --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__deterministicConclusions --> src__summary__summarizer__SummaryAttemptError__sortedUnique - src__summary__summarizer__SummaryAttemptError__deterministicConclusions --> src__summary__summarizer__SummaryAttemptError__assertConclusions - src__summary__render__renderSummaryMarkdown --> src__summary__render__renderRecords - src__summary__render__renderSummaryMarkdown --> src__summary__render__renderConclusion - src__summary__render__renderSummaryMarkdown --> src__summary__render__recordCitations - src__summary__render__actions --> src__summary__render__recordCitations - src__summary__render__confidence --> src__summary__render__recordCitations - src__summary__render__renderConclusion --> src__summary__render__recordCitations - src__services__actions__executeAction --> src__services__actions__resolveRoot - src__services__actions__executeAction --> src__services__actions__scopedPath - src__services__actions__executeAction --> src__services__actions__nlModeValue - src__services__actions__executeAction --> src__services__actions__numberValue - src__services__actions__executeAction --> src__services__actions__nullableScopedPath - src__services__actions__executeAction --> src__services__actions__llmModeValue - src__services__actions__executeAction --> src__services__actions__stringList - src__services__actions__executeAction --> src__services__actions__nullableString - src__services__actions__root --> src__services__actions__scopedPath - src__services__actions__root --> src__services__actions__nlModeValue - src__services__actions__root --> src__services__actions__numberValue - src__services__actions__root --> src__services__actions__nullableScopedPath - src__services__actions__root --> src__services__actions__llmModeValue - src__services__actions__root --> src__services__actions__stringList - src__services__actions__root --> src__services__actions__nullableString - src__services__actions__analysis --> src__services__actions__booleanValue - src__services__actions__graph --> src__services__actions__booleanValue - src__services__actions__graph --> src__services__actions__numberValue - src__services__actions__diagnostics --> src__services__actions__booleanValue - src__services__actions__diagnostics --> src__services__actions__numberValue - src__services__actions__result --> src__services__actions__stringValue - src__services__actions__result --> src__services__actions__booleanValue - src__services__actions__result --> src__services__actions__numberValue - src__services__actions__todoPath --> src__services__actions__stringValue - src__services__actions__receiptPath --> src__services__actions__stringValue - src__services__actions__conclusions --> src__services__actions__numberValue - src__services__actions__proposals --> src__services__actions__numberValue - src__services__actions__patch --> src__services__actions__stringValue - src__services__actions__beforeGraph --> src__services__actions__hasInputValue - src__services__actions__beforeDiagnostics --> src__services__actions__hasInputValue - src__services__actions__afterGraph --> src__services__actions__hasInputValue - src__services__actions__afterDiagnostics --> src__services__actions__hasInputValue - src__services__actions__value --> src__services__actions__hasInputValue - src__services__actions__beforeInput --> src__services__actions__numberValue - src__services__actions__afterInput --> src__services__actions__numberValue - src__services__actions__before --> src__services__actions__numberValue - src__services__actions__after --> src__services__actions__numberValue - src__services__actions__diff --> src__services__actions__stringValue - src__services__actions__diff --> src__services__actions__numberValue - src__services__actions__svg --> src__services__actions__numberValue - src__services__actions__beforePath --> src__services__actions__stringValue - src__services__actions__beforePath --> src__services__actions__numberValue - src__services__actions__afterPath --> src__services__actions__stringValue - src__services__actions__afterPath --> src__services__actions__numberValue - src__services__actions__view --> src__services__actions__booleanValue - src__services__actions__view --> src__services__actions__numberValue - src__services__actions__filterCommunicationGraph --> src__services__actions__stringValue - src__services__actions__filterCommunicationGraph --> src__services__actions__booleanValue - src__services__actions__nlModeValue --> src__services__actions__llmModeValue - src__services__actions__summaryModeValue --> src__services__actions__llmModeValue - src__services__actions__summaryModeValue --> src__services__actions__booleanValue - src__services__actions__withTextDiffViews --> src__services__actions__stringValue - src__services__actions__withTextDiffViews --> src__services__actions__booleanValue - src__services__actions__withTextDiffViews --> src__services__actions__numberValue - src__services__actions__title --> src__services__actions__booleanValue - src__services__actions__title --> src__services__actions__numberValue - src__services__actions__scopedPath --> src__services__actions__stringValue - src__services__actions__nullableScopedPath --> src__services__actions__nullableString - src__services__actions__readRecords --> src__services__actions__stringList - src__semantic__reranker__createSemanticCandidateSet --> src__semantic__reranker__requiredText - src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__validDate - src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__validateRetrieval - src__semantic__reranker__assertSemanticCandidateSet --> src__semantic__reranker__boundedScore - src__semantic__reranker__records --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__records --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__records --> src__semantic__reranker__requiredText - src__semantic__reranker__records --> src__semantic__reranker__assertGroundedQuote - src__semantic__reranker__seenIds --> src__semantic__reranker__boundedScore - src__semantic__reranker__seenPairs --> src__semantic__reranker__boundedScore - src__semantic__reranker__byDeclaration --> src__semantic__reranker__boundedScore - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__assertSemanticCandidateSet - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__requiredText - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__createSemanticRerankResult --> src__semantic__reranker__assertSemanticRerankResult - src__semantic__reranker__decisions --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__decisions --> src__semantic__reranker__requiredText - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__assertSemanticCandidateSet - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validDate - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validateGeneration - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__assertSemanticRerankResult --> src__semantic__reranker__requiredText - src__semantic__reranker__seenDecisions --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__seenDecisions --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__seenDecisions --> src__semantic__reranker__requiredText - src__semantic__reranker__seenDecisions --> src__semantic__reranker__assertGroundedQuote - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__roundedConfidence - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__validateVerdictReason - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__requiredText - src__semantic__reranker__acceptedDeclarations --> src__semantic__reranker__assertGroundedQuote - src__semantic__reranker__applyAcceptedSemanticRelations --> src__semantic__reranker__assertSemanticRerankResult - src__semantic__reranker__applyAcceptedSemanticRelations --> src__semantic__reranker__values - src__semantic__reranker__validateRetrieval --> src__semantic__reranker__requiredText - src__semantic__reranker__validateGeneration --> src__semantic__reranker__requiredText - src__semantic__reranker__validateVerdictReason --> src__semantic__reranker__assertSemanticVerdictReason - src__semantic__reranker__assertGroundedQuote --> src__semantic__reranker__requiredText - src__semantic__reranker__quote --> src__semantic__reranker__requiredText - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticCandidateSet - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertTrackedSnapshot - src__semantic__reranker_llm__SemanticRerankerRequiredError__rerankSemanticCandidates --> src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord - src__semantic__reranker_llm__SemanticRerankerRequiredError__model --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult - src__semantic__reranker_llm__SemanticRerankerRequiredError__modelRevision --> src__semantic__reranker_llm__SemanticRerankerRequiredError__assertSemanticRerankResult - src__semantic__reranker_llm__SemanticRerankerRequiredError__payload --> src__semantic__reranker_llm__SemanticRerankerRequiredError__projectRecord - src__pipeline__run__runPipeline --> src__pipeline__run__skippedAudit - src__pipeline__run__docs --> src__pipeline__run__collectTargetHints - src__pipeline__run__docs --> src__pipeline__run__values - src__pipeline__run__configurationExtraction --> src__pipeline__run__skippedAudit - src__pipeline__run__includeCommunication --> src__pipeline__run__skippedAudit - src__pipeline__run__communicationStartedAt --> src__pipeline__run__skippedAudit - src__pipeline__run__communicationAudit --> src__pipeline__run__skippedAudit - src__pipeline__run__communicationInputPresent --> src__pipeline__run__skippedAudit - src__pipeline__run__collectTargetHints --> src__pipeline__run__values - src__pipeline__run__persistFailedRun --> src__pipeline__run__skippedAudit - src__pipeline__run__persistFailedRun --> src__pipeline__run__failureCode - src__pipeline__run__persistFailedRun --> src__pipeline__run__failedAudit - src__pipeline__run__persistFailedRun --> src__pipeline__run__aborted - src__pipeline__run__persistFailedRun --> src__pipeline__run__stageValue - src__pipeline__run__persistFailedRun --> src__pipeline__run__manifestConfiguration - src__pipeline__run__aborted --> src__pipeline__run__skippedAudit - src__pipeline__run__message --> src__pipeline__run__failureCode - src__pipeline__run__knownAudit --> src__pipeline__run__failureCode - src__pipeline__run__failedAudit --> src__pipeline__run__failureCode - src__pipeline__run__stageValue --> src__pipeline__run__failedAudit - src__pipeline__run__stageValue --> src__pipeline__run__aborted - src__pipeline__run__reason --> src__pipeline__run__failureCode - src__operations__validation__dateString --> src__operations__validation__nonBlank - src__operations__validation__assertPrincipalList --> src__operations__validation__uniqueStrings - src__operations__validation__principals --> src__operations__validation__uniqueStrings - src__operations__validation__assertVariableContract --> src__operations__validation__objectValue - src__operations__validation__assertVariableContract --> src__operations__validation__exactKeys - src__operations__validation__assertVariableContract --> src__operations__validation__nonBlank - src__operations__validation__assertVariableContract --> src__operations__validation__assertPrincipalList - src__operations__validation__contract --> src__operations__validation__objectValue - src__operations__validation__source --> src__operations__validation__objectValue - src__operations__validation__access --> src__operations__validation__objectValue - src__operations__validation__readers --> src__operations__validation__assertPrincipalList - src__operations__validation__writers --> src__operations__validation__assertPrincipalList - src__operations__validation__assertGeneration --> src__operations__validation__objectValue - src__operations__validation__assertGeneration --> src__operations__validation__exactKeys - src__operations__validation__assertGeneration --> src__operations__validation__nonBlank - src__operations__validation__assertGeneration --> src__operations__validation__dateString - src__operations__validation__generation --> src__operations__validation__nonBlank - src__operations__validation__assertAcyclic --> src__operations__validation__visit - src__operations__validation__ids --> src__operations__validation__visit - src__operations__validation__visiting --> src__operations__validation__visit - src__operations__validation__visited --> src__operations__validation__visit + src__extractors__nl__extractNlIntent --> src__extractors__nl__assertNlExtractionOptions + src__extractors__nl__extractNlIntent --> src__extractors__nl__detectMissingFields + src__extractors__nl__extractNlIntent --> src__extractors__nl__inferActor + src__extractors__nl__absolute --> src__extractors__nl__detectMissingFields + src__extractors__nl__absolute --> src__extractors__nl__inferActor + src__extractors__nl__body --> src__extractors__nl__detectMissingFields + src__extractors__nl__body --> src__extractors__nl__inferActor + src__extractors__nl__sourcePath --> src__extractors__nl__detectMissingFields + src__extractors__nl__sourcePath --> src__extractors__nl__inferActor + src__extractors__nl__classified --> src__extractors__nl__inferActor + src__extractors__nl__action --> src__extractors__nl__inferActor + src__extractors__nl__object --> src__extractors__nl__inferActor + src__extractors__nl__missing --> src__extractors__nl__inferActor + src__extractors__nl__confidence --> src__extractors__nl__inferActor + src__extractors__ast__isExtractionResult --> src__extractors__ast__isIntentRecords + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__parseCycle + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__sourcePathFor + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__boundedArray + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__probeRecord + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__violationRecord + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__driftRecord + src__extractors__runtime_cycle__MAX_PER_SECTION --> src__extractors__runtime_cycle__proposalRecord + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__parseCycle + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__sourcePathFor + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__boundedArray + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__probeRecord + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__violationRecord + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__driftRecord + src__extractors__runtime_cycle__extractRuntimeCycleIntent --> src__extractors__runtime_cycle__proposalRecord + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__probeRecord + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__boundedArray + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__results --> src__extractors__runtime_cycle__violationRecord + src__extractors__runtime_cycle__label --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__watched + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__tags + src__extractors__runtime_cycle__probeRecord --> src__extractors__runtime_cycle__factsMetadata + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__label + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__watched + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__tags + src__extractors__runtime_cycle__violationRecord --> src__extractors__runtime_cycle__jsonScalar + src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__tags + src__extractors__runtime_cycle__driftRecord --> src__extractors__runtime_cycle__jsonScalar + src__extractors__runtime_cycle__proposalRecord --> src__extractors__runtime_cycle__text + src__extractors__runtime_cycle__proposalRecord --> src__extractors__runtime_cycle__proposalAction + src__extractors__runtime_cycle__factsMetadata --> src__extractors__runtime_cycle__jsonScalar + src__extractors__configuration__MAX_ENTRIES_PER_FILE --> src__extractors__configuration__isConfigurationPath + src__extractors__configuration__MAX_ENTRIES_PER_FILE --> src__extractors__configuration__configurationRecords + src__extractors__configuration__extractConfigurationIntent --> src__extractors__configuration__isConfigurationPath + src__extractors__configuration__extractConfigurationIntent --> src__extractors__configuration__configurationRecords + src__extractors__configuration__files --> src__extractors__configuration__configurationRecords + src__extractors__configuration__relative --> src__extractors__configuration__configurationRecords + src__extractors__configuration__configurationRecords --> src__extractors__configuration__dockerEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__jsonEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__tomlEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__yamlOrAssignmentEntries + src__extractors__configuration__configurationRecords --> src__extractors__configuration__fileAggregate + src__extractors__configuration__entries --> src__extractors__configuration__fileAggregate + src__extractors__configuration__bounded --> src__extractors__configuration__fileAggregate + src__extractors__configuration__fileAggregate --> src__extractors__configuration__configurationFormat + src__extractors__configuration__jsonEntries --> src__extractors__configuration__findKeyLine + src__extractors__configuration__parsed --> src__extractors__configuration__findKeyLine + src__extractors__configuration__lines --> src__extractors__configuration__findKeyLine + src__extractors__configuration__tomlEntries --> src__extractors__configuration__entries + src__extractors__configuration__tomlEntries --> src__extractors__configuration__match + src__extractors__configuration__tomlEntries --> src__extractors__configuration__entry + src__extractors__configuration__tomlEntries --> src__extractors__configuration__uniqueEntries + src__extractors__configuration__line --> src__extractors__configuration__entry + src__extractors__configuration__heading --> src__extractors__configuration__entry + src__extractors__configuration__pair --> src__extractors__configuration__entry + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__entries + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__match + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__entry + src__extractors__configuration__yamlOrAssignmentEntries --> src__extractors__configuration__uniqueEntries + src__extractors__configuration__dockerEntries --> src__extractors__configuration__match + src__extractors__docs_schema__target --> src__extractors__docs_schema__strings + src__extractors__docs_schema__documentRecord --> src__extractors__docs_schema__strings + src__extractors__docs_schema__documentRecord --> src__extractors__docs_schema__target + src__extractors__docs_schema__documentResponseSchema --> src__extractors__docs_schema__documentResponseContract + src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited --> src__extractors__nl_llm__NlLlmRequiredError__assertNlExtractionOptions + src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited --> src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow + src__extractors__nl_llm__NlLlmRequiredError__client --> src__extractors__nl_llm__NlLlmRequiredError__fallbackOrThrow + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__requireConfiguredClient + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__selectWithinBudget + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__readPrompt + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk + src__extractors__docs_llm__DocumentationLlmRequiredError__extractDocumentationIntent --> src__extractors__docs_llm__DocumentationLlmRequiredError__buildAudit + src__extractors__docs_llm__DocumentationLlmRequiredError__loadDocumentChunks --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage + src__extractors__docs_llm__DocumentationLlmRequiredError__files --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage + src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk --> src__extractors__docs_llm__DocumentationLlmRequiredError__errorMessage + src__extractors__changelog__extractChangelog --> src__extractors__changelog__changelogAction + src__extractors__changelog__body --> src__extractors__changelog__changelogAction + src__extractors__changelog__relative --> src__extractors__changelog__changelogAction + src__extractors__changelog__lines --> src__extractors__changelog__changelogAction + src__extractors__docs_deterministic__extractDocumentationBaseline --> src__extractors__docs_deterministic__convertDocument + src__extractors__docs_deterministic__extractDocumentationBaseline --> src__extractors__docs_deterministic__primePathMapper + src__extractors__docs_deterministic__root --> src__extractors__docs_deterministic__convertDocument + src__extractors__docs_deterministic__root --> src__extractors__docs_deterministic__primePathMapper + src__extractors__docs_deterministic__resolver --> src__extractors__docs_deterministic__convertDocument + src__extractors__docs_deterministic__resolver --> src__extractors__docs_deterministic__primePathMapper + src__extractors__docs_deterministic__convertDocument --> src__extractors__docs_deterministic__handleDocumentationLine + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseFenceBlock + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseSectionHeading + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseBulletStatement + src__extractors__docs_deterministic__handleDocumentationLine --> src__extractors__docs_deterministic__parseParagraphStatement + src__extractors__docs_deterministic__parseFenceBlock --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseFenceBlock --> src__extractors__docs_deterministic__codeBlockRecord + src__extractors__docs_deterministic__marker --> src__extractors__docs_deterministic__codeBlockRecord + src__extractors__docs_deterministic__parseSectionHeading --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseSectionHeading --> src__extractors__docs_deterministic__statementRecord + src__extractors__docs_deterministic__heading --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseBulletStatement --> src__extractors__docs_deterministic__match + src__extractors__docs_deterministic__parseBulletStatement --> src__extractors__docs_deterministic__qualifyingStatement + src__extractors__docs_deterministic__parseParagraphStatement --> src__extractors__docs_deterministic__readParagraph + src__extractors__docs_deterministic__parseParagraphStatement --> src__extractors__docs_deterministic__qualifyingStatement + src__extractors__docs_deterministic__action --> src__extractors__docs_deterministic__targetsOf + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__buildBasenameIndex + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__headingScopes + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__createMarkdownPathResolver --> src__extractors__markdown_paths__basenames + src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__headingScopes + src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__repositoryRoot --> src__extractors__markdown_paths__basenames + src__extractors__markdown_paths__basenames --> src__extractors__markdown_paths__headingScopes + src__extractors__markdown_paths__basenames --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__headingDirectories --> src__extractors__markdown_paths__isRepositoryPath + src__extractors__markdown_paths__headingDirectories --> src__extractors__markdown_paths__basenames + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__createBasenameIndexState + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__readBasenameDirectoryEntries + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__isNestedCheckout + src__extractors__markdown_paths__buildBasenameIndex --> src__extractors__markdown_paths__scanDirectoryForBasenames + src__extractors__markdown_paths__index --> src__extractors__markdown_paths__readBasenameDirectoryEntries + src__extractors__markdown_paths__index --> src__extractors__markdown_paths__isNestedCheckout + src__extractors__markdown_paths__index --> src__extractors__markdown_paths__scanDirectoryForBasenames + src__extractors__markdown_paths__state --> src__extractors__markdown_paths__readBasenameDirectoryEntries + src__extractors__markdown_paths__state --> src__extractors__markdown_paths__isNestedCheckout + src__extractors__markdown_paths__state --> src__extractors__markdown_paths__scanDirectoryForBasenames + src__extractors__markdown_paths__scanDirectoryForBasenames --> src__extractors__markdown_paths__addBasenameIndexMatch + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveObject + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__anchorToSource + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveTarget + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveAction + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__resolveModality + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__OBJECT_PLACEHOLDERS --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveObject + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__anchorToSource + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveTarget + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveAction + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__resolveModality + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__toDocumentIntentRecord --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__statementText --> src__extractors__docs_record__resolveObject + src__extractors__docs_record__target --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__target --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__action --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__action --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__modality --> src__extractors__docs_record__allowedLifecycle + src__extractors__docs_record__modality --> src__extractors__docs_record__linesFromChunk + src__extractors__docs_record__resolveObject --> src__extractors__docs_record__isPlaceholder + src__extractors__docs_record__fallback --> src__extractors__docs_record__isPlaceholder + src__extractors__docs_record__anchorToSource --> src__extractors__docs_record__clampLine + src__extractors__docs_record__anchorToSource --> src__extractors__docs_record__keywordOverlap + src__extractors__docs_record__resolveTarget --> src__extractors__docs_record__hasTarget + src__extractors__docs_record__resolveAction --> src__extractors__docs_record__allowedAction + src__extractors__docs_record__resolveModality --> src__extractors__docs_record__allowedModality + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownRecords --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering + src__extractors__markdown_llm_helpers__MarkdownAttemptError__outcomes --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichment --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichMarkdownBatchWithCorrection + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__emptyCoverage + src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichSplitBatch --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__enrichBatchCovering + src__extractors__markdown_llm_helpers__MarkdownAttemptError__markdownResponseContract --> src__extractors__markdown_llm_helpers__MarkdownAttemptError__strings + src__extractors__communication_helpers__parseEnvelope --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__parseEnvelope --> src__extractors__communication_helpers__unquote + src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__basename + src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__inferGovernanceIdentityFromFilename + src__extractors__communication_helpers__inferIdentity --> src__extractors__communication_helpers__inferIdentityFromPathAndFilename + src__extractors__communication_helpers__inferGovernanceIdentityFromFilename --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__inferIdentityFromPathAndFilename --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__fileParts --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__nestedRoleIndex --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__nestedRole --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__nestedParticipant --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__isTicketEvidenceFile --> src__extractors__communication_helpers__basename + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__isCommunicationNoise + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__flush + src__extractors__communication_helpers__communicationSegments --> src__extractors__communication_helpers__governanceSectionType + src__extractors__communication_helpers__flush --> src__extractors__communication_helpers__isCommunicationNoise + src__extractors__communication_helpers__item --> src__extractors__communication_helpers__isCommunicationNoise + src__extractors__communication_helpers__raw --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__heading --> src__extractors__communication_helpers__match + src__extractors__communication_helpers__normalizeType --> src__extractors__communication_helpers__isCommunicationType + src__extractors__communication_helpers__listValue --> src__extractors__communication_helpers__unquote + src__extractors__communication_helpers__sameStrings --> src__extractors__communication_helpers__normalize + src__extractors__todo__extractTodo --> src__extractors__todo__match + src__extractors__todo__extractTodo --> src__extractors__todo__inferOwner + src__extractors__todo__body --> src__extractors__todo__match + src__extractors__todo__body --> src__extractors__todo__inferOwner + src__extractors__todo__relative --> src__extractors__todo__match + src__extractors__todo__relative --> src__extractors__todo__inferOwner + src__extractors__todo__lines --> src__extractors__todo__match + src__extractors__todo__lines --> src__extractors__todo__inferOwner + src__extractors__todo__raw --> src__extractors__todo__match + src__extractors__todo__heading --> src__extractors__todo__match + src__extractors__todo__task --> src__extractors__todo__inferOwner + src__extractors__todo__task --> src__extractors__todo__extractExplicitId + src__extractors__todo__checked --> src__extractors__todo__inferOwner + src__extractors__todo__checked --> src__extractors__todo__extractExplicitId + src__extractors__todo__block --> src__extractors__todo__inferOwner + src__extractors__todo__block --> src__extractors__todo__extractExplicitId + src__extractors__todo__text --> src__extractors__todo__inferOwner + src__extractors__todo__text --> src__extractors__todo__extractExplicitId + src__extractors__todo__classified --> src__extractors__todo__inferOwner + src__extractors__todo__classified --> src__extractors__todo__extractExplicitId + src__extractors__todo__action --> src__extractors__todo__inferOwner + src__extractors__todo__action --> src__extractors__todo__extractExplicitId + src__extractors__todo__resolvedPaths --> src__extractors__todo__inferOwner + src__extractors__todo__resolvedPaths --> src__extractors__todo__extractExplicitId + src__extractors__todo__inferOwner --> src__extractors__todo__match + src__extractors__todo__extractExplicitId --> src__extractors__todo__match + src__extractors__git__extractGitIntent --> src__extractors__git__isGitWorkTree + src__extractors__git__extractGitIntent --> src__extractors__git__extractRepositoryGitIntent + src__extractors__git__extractGitIntent --> src__extractors__git__discoverGitRepositories + src__extractors__git__extractGitIntent --> src__extractors__git__mapWithConcurrency + src__extractors__git__root --> src__extractors__git__isGitWorkTree + src__extractors__git__root --> src__extractors__git__extractRepositoryGitIntent + src__extractors__git__count --> src__extractors__git__isGitWorkTree + src__extractors__git__count --> src__extractors__git__extractRepositoryGitIntent + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readCommits + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readChangedFiles + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__readStats + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__runGit + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__extractChangedSymbols + src__extractors__git__extractRepositoryGitIntent --> src__extractors__git__scopeChangedFile + src__extractors__git__discoverGitRepositories --> src__extractors__git__createDiscoveryState + src__extractors__git__discoverGitRepositories --> src__extractors__git__hasMoreDiscoveryWork + src__extractors__git__discoverGitRepositories --> src__extractors__git__takeNextDiscoveryDirectory + src__extractors__git__discoverGitRepositories --> src__extractors__git__readDiscoveryEntries + src__extractors__git__discoverGitRepositories --> src__extractors__git__processDiscoveryDirectory + src__extractors__git__discoverGitRepositories --> src__extractors__git__filterDiscoveryChildren + src__extractors__git__discoverGitRepositories --> src__extractors__git__finishDiscovery + src__extractors__git__state --> src__extractors__git__hasMoreDiscoveryWork + src__extractors__git__state --> src__extractors__git__takeNextDiscoveryDirectory + src__extractors__git__state --> src__extractors__git__readDiscoveryEntries + src__extractors__git__state --> src__extractors__git__processDiscoveryDirectory + src__extractors__git__state --> src__extractors__git__filterDiscoveryChildren + src__extractors__git__processDiscoveryDirectory --> src__extractors__git__resolveDiscoveryPrefix + src__extractors__git__processDiscoveryDirectory --> src__extractors__git__gitMarkerState + src__extractors__git__processDiscoveryDirectory --> src__extractors__git__registerDiscoveredRepository + src__extractors__git__registerDiscoveredRepository --> src__extractors__git__isGitWorkTree + src__extractors__git__isGitWorkTree --> src__extractors__git__runGit + src__extractors__git__runGit --> src__extractors__git__execFileAsync + src__extractors__git__result --> src__extractors__git__execFileAsync + src__extractors__git__readCommits --> src__extractors__git__runGit + src__extractors__git__readChangedFiles --> src__extractors__git__runGit + src__extractors__git__readStats --> src__extractors__git__runGit + src__extractors__docs_chunks__prioritizeDocumentChunks --> src__extractors__docs_chunks__chunkPriority + src__extractors__docs_chunks__needles --> src__extractors__docs_chunks__chunkPriority + src__extractors__docs_chunks__mapConcurrent --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__index --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__item --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__workerCount --> src__extractors__docs_chunks__worker + src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__markdownSections + src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__flush + src__extractors__docs_chunks__chunkMarkdown --> src__extractors__docs_chunks__splitLongSection + src__extractors__docs_chunks__sectionLines --> src__extractors__docs_chunks__flush + src__extractors__docs_chunks__sectionLines --> src__extractors__docs_chunks__splitLongSection + src__extractors__docs_chunks__sectionText --> src__extractors__docs_chunks__flush + src__extractors__docs_chunks__sectionText --> src__extractors__docs_chunks__splitLongSection + src__extractors__docs_chunks__splitLongSection --> src__extractors__docs_chunks__takeLineBatch + src__extractors__markdown_llm__MarkdownLlmRequiredError__extractMarkdownIntentAudited --> src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow + src__extractors__markdown_llm__MarkdownLlmRequiredError__extractMarkdownIntentAudited --> src__extractors__markdown_llm__MarkdownLlmRequiredError__classifyLlmFailure + src__extractors__markdown_llm__MarkdownLlmRequiredError__client --> src__extractors__markdown_llm__MarkdownLlmRequiredError__fallbackOrThrow + src__extractors__communication_file_helpers__envelope --> src__extractors__communication_file_helpers__shouldSkipCommunicationFile + src__extractors__communication_file_helpers__inferred --> src__extractors__communication_file_helpers__shouldSkipCommunicationFile + src__extractors__communication_file_helpers__shouldSkipCommunicationFile --> src__extractors__communication_file_helpers__hasExplicitEnvelopeMetadata + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendRoleAndParticipantWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendIdentityWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendRegistryAlignmentWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendA2aAgentWarnings + src__extractors__communication_file_helpers__buildLocalWarnings --> src__extractors__communication_file_helpers__appendTimestampWarnings + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveAction + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject + src__extractors__nl_llm_helpers__NlAttemptError__toIntentRecord --> src__extractors__nl_llm_helpers__NlAttemptError__resolveModality + src__extractors__nl_llm_helpers__NlAttemptError__lines --> src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt + src__extractors__nl_llm_helpers__NlAttemptError__action --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject + src__extractors__nl_llm_helpers__NlAttemptError__normalizedText --> src__extractors__nl_llm_helpers__NlAttemptError__resolveObject + src__extractors__nl_llm_helpers__NlAttemptError__statementText --> src__extractors__nl_llm_helpers__NlAttemptError__resolveModality + src__extractors__nl_llm_helpers__NlAttemptError__sourceExcerpt --> src__extractors__nl_llm_helpers__NlAttemptError__clampLine + src__extractors__nl_llm_helpers__NlAttemptError__resolveAction --> src__extractors__nl_llm_helpers__NlAttemptError__allowedAction + src__extractors__nl_llm_helpers__NlAttemptError__resolveModality --> src__extractors__nl_llm_helpers__NlAttemptError__allowedModality + src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText + src__extractors__nl_llm_helpers__NlAttemptError__resolveObject --> src__extractors__nl_llm_helpers__NlAttemptError__isPlaceholder + src__extractors__nl_llm_helpers__NlAttemptError__resolveObject --> src__extractors__nl_llm_helpers__NlAttemptError__nonEmptyText + src__extractors__nl_llm_helpers__NlAttemptError__NL_ACTION_SET --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings + src__extractors__nl_llm_helpers__NlAttemptError__NL_MODALITY_SET --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings + src__extractors__nl_llm_helpers__NlAttemptError__NL_RECORD_CONTRACT --> src__extractors__nl_llm_helpers__NlAttemptError__nlStrings + src__extractors__ast__external__runExternalAstAdapter --> src__extractors__ast__external__execFileAsync + src__extractors__ast__external__result --> src__extractors__ast__external__execFileAsync + src__extractors__ast__records__adapterRecords --> src__extractors__ast__records__moduleRecords + src__extractors__ast__records__moduleRecords --> src__extractors__ast__records__boundedCapabilities + src__extractors__ast__records__moduleRecords --> src__extractors__ast__records__moduleTopicText + src__extractors__ast__records__start --> src__extractors__ast__records__moduleTopicText + src__extractors__ast__records__end --> src__extractors__ast__records__moduleTopicText + src__extractors__ast__records__capabilities --> src__extractors__ast__records__moduleTopicText + src__extractors__ast__typescript__extractTypeScriptFile --> src__extractors__ast__typescript__createTypeScriptExtractionContext + src__extractors__ast__typescript__extractTypeScriptFile --> src__extractors__ast__typescript__scriptKind + src__extractors__ast__typescript__extractTypeScriptFile --> src__extractors__ast__typescript__visitTypeScriptNode + src__extractors__ast__typescript__extractTypeScriptFile --> src__extractors__ast__typescript__recordModuleFact + src__extractors__ast__typescript__context --> src__extractors__ast__typescript__createTypeScriptExtractionContext + src__extractors__ast__typescript__context --> src__extractors__ast__typescript__scriptKind + src__extractors__ast__typescript__visitTypeScriptNode --> src__extractors__ast__typescript__handleNode + src__extractors__ast__typescript__handleNode --> src__extractors__ast__typescript__handleImportDeclaration + src__extractors__ast__typescript__handleNode --> src__extractors__ast__typescript__handleExportDeclaration + src__extractors__ast__typescript__handleNode --> src__extractors__ast__typescript__handleSymbolDeclaration + src__extractors__ast__typescript__handleNode --> src__extractors__ast__typescript__handleVariableDeclaration + src__extractors__ast__typescript__handleNode --> src__extractors__ast__typescript__handleCallExpression + src__extractors__ast__typescript__handleImportDeclaration --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__handleExportDeclaration --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__handleSymbolDeclaration --> src__extractors__ast__typescript__isTypeScriptSymbolDeclaration + src__extractors__ast__typescript__handleSymbolDeclaration --> src__extractors__ast__typescript__extractSymbolName + src__extractors__ast__typescript__handleSymbolDeclaration --> src__extractors__ast__typescript__extractModifiers + src__extractors__ast__typescript__handleSymbolDeclaration --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__handleSymbolDeclaration --> src__extractors__ast__typescript__visitTypeScriptNode + src__extractors__ast__typescript__symbolModifiers --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__handleVariableDeclaration --> src__extractors__ast__typescript__isTopLevel + src__extractors__ast__typescript__handleVariableDeclaration --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__declarationIsCallable --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__handleCallExpression --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__callee --> src__extractors__ast__typescript__addTypeScriptRecord + src__extractors__ast__typescript__recordModuleFact --> src__extractors__ast__typescript__addTypeScriptRecord + src__graph__diff__diffIntentGraphs --> src__graph__diff__assertGraph + src__graph__diff__diffIntentGraphs --> src__graph__diff__groupRecords + src__graph__diff__diffIntentGraphs --> src__graph__diff__changedFieldPaths + src__graph__diff__diffIntentGraphs --> src__graph__diff__normalizeRecord + src__graph__diff__diffIntentGraphs --> src__graph__diff__relationKey + src__graph__diff__beforeGroups --> src__graph__diff__changedFieldPaths + src__graph__diff__beforeGroups --> src__graph__diff__normalizeRecord + src__graph__diff__afterGroups --> src__graph__diff__changedFieldPaths + src__graph__diff__afterGroups --> src__graph__diff__normalizeRecord + src__graph__diff__left --> src__graph__diff__changedFieldPaths + src__graph__diff__left --> src__graph__diff__normalizeRecord + src__graph__diff__right --> src__graph__diff__changedFieldPaths + src__graph__diff__right --> src__graph__diff__normalizeRecord + src__graph__diff__paired --> src__graph__diff__changedFieldPaths + src__graph__diff__paired --> src__graph__diff__normalizeRecord + src__graph__diff__beforeRecord --> src__graph__diff__changedFieldPaths + src__graph__diff__beforeRecord --> src__graph__diff__normalizeRecord + src__graph__diff__afterRecord --> src__graph__diff__changedFieldPaths + src__graph__diff__afterRecord --> src__graph__diff__normalizeRecord + src__graph__diff__renderGraphDiffSvg --> src__graph__diff__escapeXml + src__graph__diff__renderGraphDiffSvg --> src__graph__diff__truncate + src__graph__diff__renderGraphDiffSvg --> src__graph__diff__metricCard + src__graph__diff__visibleRows --> src__graph__diff__escapeXml + src__graph__diff__visibleRows --> src__graph__diff__truncate + src__graph__diff__width --> src__graph__diff__escapeXml + src__graph__diff__width --> src__graph__diff__truncate + src__graph__diff__height --> src__graph__diff__escapeXml + src__graph__diff__height --> src__graph__diff__truncate + src__graph__diff__y --> src__graph__diff__escapeXml + src__graph__diff__y --> src__graph__diff__truncate + src__graph__diff__groupRecords --> src__graph__diff__recordIdentity + src__graph__diff__groupRecords --> src__graph__diff__values + src__graph__diff__groups --> src__graph__diff__recordIdentity + src__graph__diff__changedFieldPaths --> src__graph__diff__isObject + src__graph__diff__compareRelations --> src__graph__diff__relationKey + src__graph__diff__metricCard --> src__graph__diff__escapeXml + src__graph__linker_relations__determineRelation --> src__graph__linker_relations__relationForSourceKinds + src__graph__linker_relations__relationForSourceKinds --> src__graph__linker_relations__matchSourceRule + src__graph__linker_relations__matchSourceRule --> src__graph__linker_relations__orientRelation + src__graph__symbol_resolution__buildSymbolResolutionIndex --> src__graph__symbol_resolution__collectAstCandidates + src__graph__symbol_resolution__buildSymbolResolutionIndex --> src__graph__symbol_resolution__sortCandidates + src__graph__symbol_resolution__buildSymbolResolutionIndex --> src__graph__symbol_resolution__collectNlResolutions classDef highCC fill:#ff6b6b,stroke:#c92a2a,color:#fff classDef medCC fill:#ffd43b,stroke:#f08c00,color:#000 - class src__cli__main,src__cli__handleDiff,src__cli__handleExtract,src__web__diff_ui__diffUiHtml,src__web__diff_ui__compareGraphs,src__watch__watcher__DEFAULT_MIN_INTERVAL_MS,src__watch__watcher__DEFAULT_SCAN_INTERVAL_MS,src__watch__watcher__watchRepository,src__tf__classifier__classifyAction,src__synthesis__code_change_plan__proposeCodeChangePlans,src__synthesis__code_change_plan__paths,src__synthesis__code_change_plan__assertCodeChangeReviewPatch,src__synthesis__code_change_plan__assertCodeChangeSourcePatch,src__synthesis__code_change_plan__assertCodeChangeSourcePatchSet,src__synthesis__code_change_plan__normalizeUnifiedDiff,src__synthesis__code_change_plan__applyCodeChangeSourcePatch,src__synthesis__code_change_plan__applyUnifiedDiffToText,src__synthesis__code_change_plan__cursor,src__synthesis__code_change_path__NON_SOURCE_DIR_SEGMENTS,src__synthesis__code_change_path__BINARY_EXTENSIONS,src__synthesis__code_change_path__GENERATED_ANALYSIS_BASENAMES,src__synthesis__code_change_path__T2C_ARTIFACT_BASENAMES,src__synthesis__code_change_path__EXTENSIONLESS_SOURCE_BASENAMES,src__synthesis__code_change_path__isPlannablePath,src__services__actions__executeAction,src__services__actions__root,src__services__actions__filterCommunicationGraph,src__semantic__reranker__assertSemanticCandidateSet,src__semantic__reranker__records,src__semantic__reranker__assertSemanticRerankResult highCC - class src__cli__formatWatchEvent,src__cli__stamp,src__cli__mode,src__cli__html,src__cli__context,src__cli__maxRows,src__cli__handleReality,src__cli__handleCommunication,src__cli__parseArgs,src__cli__options,src__web__diff_ui__loadRuns,src__watch__watcher__scanTree,src__watch__watcher__maxFiles,src__watch__watcher__absoluteRoot,src__watch__watcher__visit,src__synthesis__validation__duplicateEvidence,src__synthesis__validation__dependencyFirstPriorityOrder,src__synthesis__todo_patch__createTodoPatch,src__synthesis__todo_patch__applyTodoPatch,src__synthesis__todo_patch__assertTodoPatchArtifact,src__synthesis__tasks_llm__TaskSynthesisAttemptError__synthesizeWithCorrection,src__synthesis__code_change_plan__evaluateCodeChangeAcceptance,src__synthesis__code_change_plan__collectTarget,src__synthesis__code_change_plan__buildChanges,src__synthesis__code_change_plan__titleFor,src__synthesis__code_change_plan__renderCodeChangeReviewMarkdown,src__synthesis__code_change_plan__createCodeChangeSourcePatch,src__synthesis__code_change_plan__createCodeChangeSourcePatchSet,src__synthesis__code_change_plan__assertSourcePatchStrings,src__synthesis__code_change_plan__assertExistingSourceReceipt medCC + class src__core__record_metadata__generationMetadata,src__web__diff_ui_script__compareGraphs,src__interfaces__a2a_message_command__looksLikeJson,src__diff__reality__buildRealityTotals,src__pipeline__run_persistence__persistPipelineArtifacts,src__pipeline__run_persistence__persistFailedRunState,src__evaluation__gold_types__assertRerankerDecision,src__operations__validation__assertGeneration,src__operations__validation__validateOperationStep,src__communication__analyzer__collectAgentActionIssues,php__ast_extract__parseFile,scripts__verify_env_contract__makefile,scripts__verify_no_llm_imports__visited,scripts__verify_no_llm_imports__visit,scripts__research__rank_intent_graph_embeddings__main,python__ast_extract__iter_python_files,sdk__go__examples__basic__main__run,sdk__typescript__examples__basic__baseUrl,sdk__typescript__examples__basic__token,sdk__typescript__examples__basic__root,sdk__typescript__examples__basic__main,sdk__rust__examples__basic__run,sdk__rust__src__client__parse_http_response,src__pipeline__run__executePipeline highCC + class rust_ast__src__main__collect_files,examples__backend__src__request_handlers__MAX_BODY_BYTES,examples__backend__src__request_handlers__handleRequest,examples__backend__src__validation__ALLOWED_ACTIONS,examples__backend__src__validation__validateEventPayload,java__JavaAstExtract__JavaAstExtract__main,java__JavaAstExtract__JavaAstExtract__escape,src__cli__main,src__cli__handleRenderTodo,src__cli__handleApplyTodo,src__cli__options,src__cli__formatWatchEvent,src__cli__stamp,src__cli__handleDiff,src__cli__handleReality,src__cli__handleCommunication,src__cli__handleIntake,src__cli__intakeExitCode,src__cli__parseArgs,src__extractors__nl__assertNlExtractionOptions,src__extractors__nl__detectMissingFields,src__extractors__ast__extractAstIntent,src__extractors__runtime_cycle__MAX_PER_SECTION,src__extractors__runtime_cycle__extractRuntimeCycleIntent,src__extractors__runtime_cycle__boundedArray,src__extractors__runtime_cycle__probeRecord,src__extractors__configuration__isConfigurationPath,src__extractors__nl_llm__NlLlmRequiredError__extractNlIntentAudited,src__extractors__docs_llm__DocumentationLlmRequiredError__isDocumentChunks,src__extractors__docs_llm__DocumentationLlmRequiredError__extractChunk medCC diff --git a/project/planfile-tickets.yaml b/project/planfile-tickets.yaml index 580dc69..99e4e15 100644 --- a/project/planfile-tickets.yaml +++ b/project/planfile-tickets.yaml @@ -1,7 +1,7 @@ source: code2llm -# generated in 0.17s +# generated in 0.13s schema: code2llm.planfile_tickets.v1 -project_root: +project_root: /home/tom/github/semcod/todo2code tickets: - signal: code2llm_cc title: 'Reduce cyclomatic complexity: php.ast_extract.parseFile (CC=38)' @@ -73,1836 +73,121 @@ tickets: files: - sdk/go/examples/basic/main.go dedupe_key: code2llm:cc:sdk/go/examples/basic/main.go:sdk.go.examples.basic.main.run -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.cli.main (CC=95)' - description: 'code2llm reports `src.cli.main` at `src/cli.ts:53` with cyclomatic - complexity 95 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/cli.ts - dedupe_key: code2llm:cc:src/cli.ts:src.cli.main -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.communication.analyzer.analyzeCommunication - (CC=48)' - description: 'code2llm reports `src.communication.analyzer.analyzeCommunication` - at `src/communication/analyzer.ts:56` with cyclomatic complexity 48 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/communication/analyzer.ts - dedupe_key: code2llm:cc:src/communication/analyzer.ts:src.communication.analyzer.analyzeCommunication -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.communication.identity.assertParticipantIdentityRegistry - (CC=30)' - description: 'code2llm reports `src.communication.identity.assertParticipantIdentityRegistry` - at `src/communication/identity.ts:51` with cyclomatic complexity 30 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/communication/identity.ts - dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.assertParticipantIdentityRegistry -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.communication.identity.external (CC=25)' - description: 'code2llm reports `src.communication.identity.external` at `src/communication/identity.ts:58` - with cyclomatic complexity 25 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/communication/identity.ts - dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.external -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.communication.identity.ids (CC=25)' - description: 'code2llm reports `src.communication.identity.ids` at `src/communication/identity.ts:57` - with cyclomatic complexity 25 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/communication/identity.ts - dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.ids -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.communication.identity.registry (CC=25)' - description: 'code2llm reports `src.communication.identity.registry` at `src/communication/identity.ts:53` - with cyclomatic complexity 25 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/communication/identity.ts - dedupe_key: code2llm:cc:src/communication/identity.ts:src.communication.identity.registry -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.text.inferObject (CC=34)' - description: 'code2llm reports `src.core.text.inferObject` at `src/core/text.ts:440` - with cyclomatic complexity 34 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/text.ts - dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.inferObject -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.text.normalized (CC=30)' - description: 'code2llm reports `src.core.text.normalized` at `src/core/text.ts:441` - with cyclomatic complexity 30 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/text.ts - dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.normalized -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.reality.buildRealityView (CC=26)' - description: 'code2llm reports `src.diff.reality.buildRealityView` at `src/diff/reality.ts:153` - with cyclomatic complexity 26 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/reality.ts - dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.buildRealityView -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.assertLinkingCohorts - (CC=32)' - description: 'code2llm reports `src.evaluation.gold-types.assertLinkingCohorts` - at `src/evaluation/gold-types.ts:341` with cyclomatic complexity 32 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-types.ts - dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.assertLinkingCohorts -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.ast.typescript.extractTypeScriptFile - (CC=43)' - description: 'code2llm reports `src.extractors.ast.typescript.extractTypeScriptFile` - at `src/extractors/ast/typescript.ts:11` with cyclomatic complexity 43 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/ast/typescript.ts - dedupe_key: code2llm:cc:src/extractors/ast/typescript.ts:src.extractors.ast.typescript.extractTypeScriptFile -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.ast.typescript.visit (CC=25)' - description: 'code2llm reports `src.extractors.ast.typescript.visit` at `src/extractors/ast/typescript.ts:77` - with cyclomatic complexity 25 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/ast/typescript.ts - dedupe_key: code2llm:cc:src/extractors/ast/typescript.ts:src.extractors.ast.typescript.visit -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.communication.communicationFiles - (CC=72)' - description: 'code2llm reports `src.extractors.communication.communicationFiles` - at `src/extractors/communication.ts:74` with cyclomatic complexity 72 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/communication.ts - dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.communicationFiles -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.communication.extractCommunicationIntent - (CC=76)' - description: 'code2llm reports `src.extractors.communication.extractCommunicationIntent` - at `src/extractors/communication.ts:54` with cyclomatic complexity 76 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/communication.ts - dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.extractCommunicationIntent -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.communication.identityRegistry - (CC=72)' - description: 'code2llm reports `src.extractors.communication.identityRegistry` at - `src/extractors/communication.ts:69` with cyclomatic complexity 72 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/communication.ts - dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.identityRegistry -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.diagnoseGraph (CC=40)' - description: 'code2llm reports `src.graph.diagnostics.diagnoseGraph` at `src/graph/diagnostics.ts:16` - with cyclomatic complexity 40 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.diagnoseGraph -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.documentedPaths (CC=35)' - description: 'code2llm reports `src.graph.diagnostics.documentedPaths` at `src/graph/diagnostics.ts:23` - with cyclomatic complexity 35 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.documentedPaths -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.groundedImplementation - (CC=35)' - description: 'code2llm reports `src.graph.diagnostics.groundedImplementation` at - `src/graph/diagnostics.ts:21` with cyclomatic complexity 35 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.groundedImplementation -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.implementedPaths (CC=35)' - description: 'code2llm reports `src.graph.diagnostics.implementedPaths` at `src/graph/diagnostics.ts:22` - with cyclomatic complexity 35 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.implementedPaths -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.neighbors (CC=35)' - description: 'code2llm reports `src.graph.diagnostics.neighbors` at `src/graph/diagnostics.ts:19` - with cyclomatic complexity 35 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.neighbors -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.recordsById (CC=35)' - description: 'code2llm reports `src.graph.diagnostics.recordsById` at `src/graph/diagnostics.ts:20` - with cyclomatic complexity 35 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.recordsById -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.diagnostics.symbolResolutionIndex - (CC=35)' - description: 'code2llm reports `src.graph.diagnostics.symbolResolutionIndex` at - `src/graph/diagnostics.ts:24` with cyclomatic complexity 35 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/graph/diagnostics.ts - dedupe_key: code2llm:cc:src/graph/diagnostics.ts:src.graph.diagnostics.symbolResolutionIndex -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.interfaces.a2a-message.parseCommand (CC=57)' - description: 'code2llm reports `src.interfaces.a2a-message.parseCommand` at `src/interfaces/a2a-message.ts:41` - with cyclomatic complexity 57 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/interfaces/a2a-message.ts - dedupe_key: code2llm:cc:src/interfaces/a2a-message.ts:src.interfaces.a2a-message.parseCommand -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.llm.openrouter.OpenRouterClient.request - (CC=31)' - description: 'code2llm reports `src.llm.openrouter.OpenRouterClient.request` at - `src/llm/openrouter.ts:171` with cyclomatic complexity 31 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/llm/openrouter.ts - dedupe_key: code2llm:cc:src/llm/openrouter.ts:src.llm.openrouter.OpenRouterClient.request -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.llm.openrouter.OpenRouterClient.timeout - (CC=26)' - description: 'code2llm reports `src.llm.openrouter.OpenRouterClient.timeout` at - `src/llm/openrouter.ts:179` with cyclomatic complexity 26 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/llm/openrouter.ts - dedupe_key: code2llm:cc:src/llm/openrouter.ts:src.llm.openrouter.OpenRouterClient.timeout -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.assertOperationPlan - (CC=84)' - description: 'code2llm reports `src.operations.validation.assertOperationPlan` at - `src/operations/validation.ts:153` with cyclomatic complexity 84 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertOperationPlan -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.founderDecisionRequired - (CC=44)' - description: 'code2llm reports `src.operations.validation.founderDecisionRequired` - at `src/operations/validation.ts:184` with cyclomatic complexity 44 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.founderDecisionRequired -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.stepIds (CC=44)' - description: 'code2llm reports `src.operations.validation.stepIds` at `src/operations/validation.ts:183` - with cyclomatic complexity 44 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.stepIds -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.steps (CC=44)' - description: 'code2llm reports `src.operations.validation.steps` at `src/operations/validation.ts:182` - with cyclomatic complexity 44 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.steps -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.variableById (CC=44)' - description: 'code2llm reports `src.operations.validation.variableById` at `src/operations/validation.ts:180` - with cyclomatic complexity 44 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.variableById -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.variables (CC=44)' - description: 'code2llm reports `src.operations.validation.variables` at `src/operations/validation.ts:177` - with cyclomatic complexity 44 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.variables -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.pipeline.run.runPipeline (CC=53)' - description: 'code2llm reports `src.pipeline.run.runPipeline` at `src/pipeline/run.ts:55` - with cyclomatic complexity 53 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/pipeline/run.ts - dedupe_key: code2llm:cc:src/pipeline/run.ts:src.pipeline.run.runPipeline -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates - (CC=25)' - description: 'code2llm reports `src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates` - at `src/semantic/reranker-llm.ts:38` with cyclomatic complexity 25 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/semantic/reranker-llm.ts - dedupe_key: code2llm:cc:src/semantic/reranker-llm.ts:src.semantic.reranker-llm.SemanticRerankerRequiredError.rerankSemanticCandidates -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.semantic.reranker.assertSemanticCandidateSet - (CC=27)' - description: 'code2llm reports `src.semantic.reranker.assertSemanticCandidateSet` - at `src/semantic/reranker.ts:184` with cyclomatic complexity 27 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/semantic/reranker.ts - dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.assertSemanticCandidateSet -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.services.actions.executeAction (CC=83)' - description: 'code2llm reports `src.services.actions.executeAction` at `src/services/actions.ts:72` - with cyclomatic complexity 83 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/services/actions.ts - dedupe_key: code2llm:cc:src/services/actions.ts:src.services.actions.executeAction -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.services.actions.root (CC=83)' - description: 'code2llm reports `src.services.actions.root` at `src/services/actions.ts:73` - with cyclomatic complexity 83 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/services/actions.ts - dedupe_key: code2llm:cc:src/services/actions.ts:src.services.actions.root -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.BINARY_EXTENSIONS - (CC=38)' - description: 'code2llm reports `src.synthesis.code-change-path.BINARY_EXTENSIONS` - at `src/synthesis/code-change-path.ts:44` with cyclomatic complexity 38 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-path.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.BINARY_EXTENSIONS -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.EXTENSIONLESS_SOURCE_BASENAMES - (CC=38)' - description: 'code2llm reports `src.synthesis.code-change-path.EXTENSIONLESS_SOURCE_BASENAMES` - at `src/synthesis/code-change-path.ts:127` with cyclomatic complexity 38 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-path.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.EXTENSIONLESS_SOURCE_BASENAMES -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.GENERATED_ANALYSIS_BASENAMES - (CC=38)' - description: 'code2llm reports `src.synthesis.code-change-path.GENERATED_ANALYSIS_BASENAMES` - at `src/synthesis/code-change-path.ts:79` with cyclomatic complexity 38 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-path.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.GENERATED_ANALYSIS_BASENAMES -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.NON_SOURCE_DIR_SEGMENTS - (CC=38)' - description: 'code2llm reports `src.synthesis.code-change-path.NON_SOURCE_DIR_SEGMENTS` - at `src/synthesis/code-change-path.ts:15` with cyclomatic complexity 38 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-path.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.NON_SOURCE_DIR_SEGMENTS -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.T2C_ARTIFACT_BASENAMES - (CC=38)' - description: 'code2llm reports `src.synthesis.code-change-path.T2C_ARTIFACT_BASENAMES` - at `src/synthesis/code-change-path.ts:110` with cyclomatic complexity 38 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-path.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.T2C_ARTIFACT_BASENAMES -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-path.isPlannablePath - (CC=38)' - description: 'code2llm reports `src.synthesis.code-change-path.isPlannablePath` - at `src/synthesis/code-change-path.ts:138` with cyclomatic complexity 38 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-path.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-path.ts:src.synthesis.code-change-path.isPlannablePath -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.applyCodeChangeSourcePatch - (CC=41)' - description: 'code2llm reports `src.synthesis.code-change-plan.applyCodeChangeSourcePatch` - at `src/synthesis/code-change-plan.ts:1031` with cyclomatic complexity 41 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.applyCodeChangeSourcePatch -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.applyUnifiedDiffToText - (CC=47)' - description: 'code2llm reports `src.synthesis.code-change-plan.applyUnifiedDiffToText` - at `src/synthesis/code-change-plan.ts:1222` with cyclomatic complexity 47 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.applyUnifiedDiffToText -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.assertCodeChangeSourcePatch - (CC=47)' - description: 'code2llm reports `src.synthesis.code-change-plan.assertCodeChangeSourcePatch` - at `src/synthesis/code-change-plan.ts:790` with cyclomatic complexity 47 (limit - 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.assertCodeChangeSourcePatch -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.cursor (CC=25)' - description: 'code2llm reports `src.synthesis.code-change-plan.cursor` at `src/synthesis/code-change-plan.ts:1256` - with cyclomatic complexity 25 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.cursor -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.web.diff-ui.diffUiHtml (CC=52)' - description: 'code2llm reports `src.web.diff-ui.diffUiHtml` at `src/web/diff-ui.ts:1` - with cyclomatic complexity 52 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: high - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/web/diff-ui.ts - dedupe_key: code2llm:cc:src/web/diff-ui.ts:src.web.diff-ui.diffUiHtml -- signal: code2llm_god - title: 'Split god module: src/communication/llm.ts' - description: 'code2llm reports `src/communication/llm.ts` as a large module (514 - lines, 8 classes). - - - Split it by responsibility, keep public imports stable, and add focused tests - around the moved behavior.' - priority: high - labels: - - llm-ready - - code2llm - - god-module - - refactor - files: - - src/communication/llm.ts - dedupe_key: code2llm:god:src/communication/llm.ts -- signal: code2llm_god - title: 'Split god module: src/core/schema.ts' - description: 'code2llm reports `src/core/schema.ts` as a large module (922 lines, - 4 classes). - - - Split it by responsibility, keep public imports stable, and add focused tests - around the moved behavior.' - priority: high - labels: - - llm-ready - - code2llm - - god-module - - refactor - files: - - src/core/schema.ts - dedupe_key: code2llm:god:src/core/schema.ts -- signal: code2llm_god - title: 'Split god module: src/core/types.ts' - description: 'code2llm reports `src/core/types.ts` as a large module (673 lines, - 41 classes). - - - Split it by responsibility, keep public imports stable, and add focused tests - around the moved behavior.' - priority: high - labels: - - llm-ready - - code2llm - - god-module - - refactor - files: - - src/core/types.ts - dedupe_key: code2llm:god:src/core/types.ts -- signal: code2llm_god - title: 'Split god module: src/semantic/reranker.ts' - description: 'code2llm reports `src/semantic/reranker.ts` as a large module (509 - lines, 11 classes). - - - Split it by responsibility, keep public imports stable, and add focused tests - around the moved behavior.' - priority: high - labels: - - llm-ready - - code2llm - - god-module - - refactor - files: - - src/semantic/reranker.ts - dedupe_key: code2llm:god:src/semantic/reranker.ts -- signal: code2llm_god - title: 'Split god module: src/synthesis/code-change-plan.ts' - description: 'code2llm reports `src/synthesis/code-change-plan.ts` as a large module - (1310 lines, 10 classes). - - - Split it by responsibility, keep public imports stable, and add focused tests - around the moved behavior.' - priority: high - labels: - - llm-ready - - code2llm - - god-module - - refactor - files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:god:src/synthesis/code-change-plan.ts -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `sdk/python/examples/basic.py:22`. - - - Function ''main'' is oversized: CC=11, fan-out=31, mutations=18. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - sdk/python/examples/basic.py - dedupe_key: 'code2llm:smell:god_function:sdk/python/examples/basic.py:22:God Function: - main' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `scripts/research/evaluate-embedding-pairs.py:26`. - - - Function ''main'' is oversized: CC=9, fan-out=21, mutations=18. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - scripts/research/evaluate-embedding-pairs.py - dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:26:God - Function: main' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.cli' - description: 'code2llm reports `God Module: src.cli` in `src/cli.ts:1`. - - - Module ''src.cli'' is too large (152 functions, 1 classes). Consider splitting - into sub-modules. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/cli.ts - dedupe_key: 'code2llm:smell:god_function:src/cli.ts:1:God Module: src.cli' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.core.schema' - description: 'code2llm reports `God Module: src.core.schema` in `src/core/schema.ts:1`. - - - Module ''src.core.schema'' is too large (151 functions, 4 classes). Consider splitting - into sub-modules. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:1:God Module: src.core.schema' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.core.types' - description: 'code2llm reports `God Module: src.core.types` in `src/core/types.ts:1`. - - - Module ''src.core.types'' is too large (0 functions, 41 classes). Consider splitting - into sub-modules. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/core/types.ts - dedupe_key: 'code2llm:smell:god_function:src/core/types.ts:1:God Module: src.core.types' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.synthesis.code-change-plan' - description: 'code2llm reports `God Module: src.synthesis.code-change-plan` in `src/synthesis/code-change-plan.ts:1`. - - - Module ''src.synthesis.code-change-plan'' is too large (148 functions, 10 classes). - Consider splitting into sub-modules. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:1:God - Module: src.synthesis.code-change-plan' -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: examples.backend.src.server.handleRequest - (CC=16)' - description: 'code2llm reports `examples.backend.src.server.handleRequest` at `examples/backend/src/server.ts:28` - with cyclomatic complexity 16 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - examples/backend/src/server.ts - dedupe_key: code2llm:cc:examples/backend/src/server.ts:examples.backend.src.server.handleRequest -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: python.ast_extract.iter_python_files (CC=16)' - description: 'code2llm reports `python.ast_extract.iter_python_files` at `python/ast_extract.py:168` - with cyclomatic complexity 16 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - python/ast_extract.py - dedupe_key: code2llm:cc:python/ast_extract.py:python.ast_extract.iter_python_files -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visit (CC=15)' - description: 'code2llm reports `scripts.verify-no-llm-imports.visit` at `scripts/verify-no-llm-imports.mjs:27` - with cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - scripts/verify-no-llm-imports.mjs - dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visit -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visited (CC=15)' - description: 'code2llm reports `scripts.verify-no-llm-imports.visited` at `scripts/verify-no-llm-imports.mjs:22` - with cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - scripts/verify-no-llm-imports.mjs - dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visited -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: sdk.rust.examples.basic.run (CC=20)' - description: 'code2llm reports `sdk.rust.examples.basic.run` at `sdk/rust/examples/basic.rs:27` - with cyclomatic complexity 20 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - sdk/rust/examples/basic.rs - dedupe_key: code2llm:cc:sdk/rust/examples/basic.rs:sdk.rust.examples.basic.run -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: sdk.rust.src.client.parse_http_response (CC=18)' - description: 'code2llm reports `sdk.rust.src.client.parse_http_response` at `sdk/rust/src/client.rs:152` - with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - sdk/rust/src/client.rs - dedupe_key: code2llm:cc:sdk/rust/src/client.rs:sdk.rust.src.client.parse_http_response -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.baseUrl (CC=17)' - description: 'code2llm reports `sdk.typescript.examples.basic.baseUrl` at `sdk/typescript/examples/basic.ts:13` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - sdk/typescript/examples/basic.ts - dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.baseUrl -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.main (CC=17)' - description: 'code2llm reports `sdk.typescript.examples.basic.main` at `sdk/typescript/examples/basic.ts:17` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - sdk/typescript/examples/basic.ts - dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.main -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.root (CC=17)' - description: 'code2llm reports `sdk.typescript.examples.basic.root` at `sdk/typescript/examples/basic.ts:15` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - sdk/typescript/examples/basic.ts - dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.root -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.token (CC=17)' - description: 'code2llm reports `sdk.typescript.examples.basic.token` at `sdk/typescript/examples/basic.ts:14` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - sdk/typescript/examples/basic.ts - dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.token -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.cli.handleDiff (CC=24)' - description: 'code2llm reports `src.cli.handleDiff` at `src/cli.ts:428` with cyclomatic - complexity 24 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/cli.ts - dedupe_key: code2llm:cc:src/cli.ts:src.cli.handleDiff -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.cli.handleExtract (CC=16)' - description: 'code2llm reports `src.cli.handleExtract` at `src/cli.ts:518` with - cyclomatic complexity 16 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/cli.ts - dedupe_key: code2llm:cc:src/cli.ts:src.cli.handleExtract -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.io.walkFiles (CC=15)' - description: 'code2llm reports `src.core.io.walkFiles` at `src/core/io.ts:87` with - cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/io.ts - dedupe_key: code2llm:cc:src/core/io.ts:src.core.io.walkFiles -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.record.buildRecord (CC=18)' - description: 'code2llm reports `src.core.record.buildRecord` at `src/core/record.ts:57` - with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/record.ts - dedupe_key: code2llm:cc:src/core/record.ts:src.core.record.buildRecord -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.record.generationMetadata (CC=15)' - description: 'code2llm reports `src.core.record.generationMetadata` at `src/core/record.ts:125` - with cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/record.ts - dedupe_key: code2llm:cc:src/core/record.ts:src.core.record.generationMetadata -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.schema.assertGroundedGenerationMetadata - (CC=23)' - description: 'code2llm reports `src.core.schema.assertGroundedGenerationMetadata` - at `src/core/schema.ts:533` with cyclomatic complexity 23 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/schema.ts - dedupe_key: code2llm:cc:src/core/schema.ts:src.core.schema.assertGroundedGenerationMetadata -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.schema.assertIntentRecord (CC=23)' - description: 'code2llm reports `src.core.schema.assertIntentRecord` at `src/core/schema.ts:74` - with cyclomatic complexity 23 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/schema.ts - dedupe_key: code2llm:cc:src/core/schema.ts:src.core.schema.assertIntentRecord -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.text.STOP_WORDS (CC=17)' - description: 'code2llm reports `src.core.text.STOP_WORDS` at `src/core/text.ts:30` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/text.ts - dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.STOP_WORDS -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.core.text.classifyActionHeuristically - (CC=17)' - description: 'code2llm reports `src.core.text.classifyActionHeuristically` at `src/core/text.ts:40` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/core/text.ts - dedupe_key: code2llm:cc:src/core/text.ts:src.core.text.classifyActionHeuristically -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.git.BINARY_EXTENSIONS (CC=22)' - description: 'code2llm reports `src.diff.git.BINARY_EXTENSIONS` at `src/diff/git.ts:41` - with cyclomatic complexity 22 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/git.ts - dedupe_key: code2llm:cc:src/diff/git.ts:src.diff.git.BINARY_EXTENSIONS -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.git.collectGitDiff (CC=22)' - description: 'code2llm reports `src.diff.git.collectGitDiff` at `src/diff/git.ts:46` - with cyclomatic complexity 22 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/git.ts - dedupe_key: code2llm:cc:src/diff/git.ts:src.diff.git.collectGitDiff -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.reality.renderRealitySvg (CC=15)' - description: 'code2llm reports `src.diff.reality.renderRealitySvg` at `src/diff/reality.ts:493` - with cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/reality.ts - dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.renderRealitySvg -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.reality.resolveStatus (CC=15)' - description: 'code2llm reports `src.diff.reality.resolveStatus` at `src/diff/reality.ts:439` - with cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/reality.ts - dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.resolveStatus -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.backtrack (CC=18)' - description: 'code2llm reports `src.diff.text.backtrack` at `src/diff/text.ts:172` - with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.backtrack -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.m (CC=15)' - description: 'code2llm reports `src.diff.text.m` at `src/diff/text.ts:142` with - cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.m -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.max (CC=15)' - description: 'code2llm reports `src.diff.text.max` at `src/diff/text.ts:145` with - cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.max -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.myers (CC=19)' - description: 'code2llm reports `src.diff.text.myers` at `src/diff/text.ts:140` with - cyclomatic complexity 19 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.myers -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.n (CC=15)' - description: 'code2llm reports `src.diff.text.n` at `src/diff/text.ts:141` with - cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.n -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.offset (CC=15)' - description: 'code2llm reports `src.diff.text.offset` at `src/diff/text.ts:146` - with cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.offset -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.x (CC=15)' - description: 'code2llm reports `src.diff.text.x` at `src/diff/text.ts:180` with - cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.x -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.diff.text.y (CC=15)' - description: 'code2llm reports `src.diff.text.y` at `src/diff/text.ts:181` with - cyclomatic complexity 15 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/diff/text.ts - dedupe_key: code2llm:cc:src/diff/text.ts:src.diff.text.y -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.buildFixtureRecords - (CC=18)' - description: 'code2llm reports `src.evaluation.gold-cases.buildFixtureRecords` at - `src/evaluation/gold-cases.ts:315` with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-cases.ts - dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.buildFixtureRecords -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.evaluateRerankingCase - (CC=17)' - description: 'code2llm reports `src.evaluation.gold-cases.evaluateRerankingCase` - at `src/evaluation/gold-cases.ts:71` with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-cases.ts - dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.evaluateRerankingCase -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.labels (CC=18)' - description: 'code2llm reports `src.evaluation.gold-cases.labels` at `src/evaluation/gold-cases.ts:319` - with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-cases.ts - dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.labels -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.record (CC=17)' - description: 'code2llm reports `src.evaluation.gold-cases.record` at `src/evaluation/gold-cases.ts:321` - with cyclomatic complexity 17 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-cases.ts - dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.record -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-cases.records (CC=18)' - description: 'code2llm reports `src.evaluation.gold-cases.records` at `src/evaluation/gold-cases.ts:320` - with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-cases.ts - dedupe_key: code2llm:cc:src/evaluation/gold-cases.ts:src.evaluation.gold-cases.records -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.labels (CC=18)' - description: 'code2llm reports `src.evaluation.gold-types.labels` at `src/evaluation/gold-types.ts:358` - with cyclomatic complexity 18 (limit 15). - - - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/evaluation/gold-types.ts - dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.labels -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.modules (CC=18)' - description: 'code2llm reports `src.evaluation.gold-types.modules` at `src/evaluation/gold-types.ts:359` - with cyclomatic complexity 18 (limit 15). +- signal: code2llm_god + title: 'Split god module: src/diff/reality.ts' + description: 'code2llm reports `src/diff/reality.ts` as a large module (690 lines, + 4 classes). - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal + Split it by responsibility, keep public imports stable, and add focused tests + around the moved behavior.' + priority: high labels: - llm-ready - code2llm - - complexity + - god-module - refactor files: - - src/evaluation/gold-types.ts - dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.modules -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.communication.inferIdentity - (CC=15)' - description: 'code2llm reports `src.extractors.communication.inferIdentity` at `src/extractors/communication.ts:244` - with cyclomatic complexity 15 (limit 15). + - src/diff/reality.ts + dedupe_key: code2llm:god:src/diff/reality.ts +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: decode_envelope' + description: 'code2llm reports `God Function: decode_envelope` in `src/interfaces/intake_cli.py:78`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/communication.ts - dedupe_key: code2llm:cc:src/extractors/communication.ts:src.extractors.communication.inferIdentity -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.docs-deterministic.convertDocument - (CC=18)' - description: 'code2llm reports `src.extractors.docs-deterministic.convertDocument` - at `src/extractors/docs-deterministic.ts:100` with cyclomatic complexity 18 (limit - 15). + Function ''decode_envelope'' is oversized: CC=10, fan-out=8, mutations=28. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal + Make the smallest refactor that removes the smell and run local tests.' + priority: high labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - god-function files: - - src/extractors/docs-deterministic.ts - dedupe_key: code2llm:cc:src/extractors/docs-deterministic.ts:src.extractors.docs-deterministic.convertDocument -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.docs-deterministic.lines (CC=17)' - description: 'code2llm reports `src.extractors.docs-deterministic.lines` at `src/extractors/docs-deterministic.ts:102` - with cyclomatic complexity 17 (limit 15). + - src/interfaces/intake_cli.py + dedupe_key: 'code2llm:smell:god_function:src/interfaces/intake_cli.py:78:God Function: + decode_envelope' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: main' + description: 'code2llm reports `God Function: main` in `src/interfaces/intake_cli.py:122`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/docs-deterministic.ts - dedupe_key: code2llm:cc:src/extractors/docs-deterministic.ts:src.extractors.docs-deterministic.lines -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.docs-deterministic.relative - (CC=17)' - description: 'code2llm reports `src.extractors.docs-deterministic.relative` at `src/extractors/docs-deterministic.ts:101` - with cyclomatic complexity 17 (limit 15). + Function ''main'' is oversized: CC=5, fan-out=18, mutations=22. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal + Make the smallest refactor that removes the smell and run local tests.' + priority: high labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - god-function files: - - src/extractors/docs-deterministic.ts - dedupe_key: code2llm:cc:src/extractors/docs-deterministic.ts:src.extractors.docs-deterministic.relative -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited - (CC=19)' - description: 'code2llm reports `src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited` - at `src/extractors/markdown-llm.ts:55` with cyclomatic complexity 19 (limit 15). + - src/interfaces/intake_cli.py + dedupe_key: 'code2llm:smell:god_function:src/interfaces/intake_cli.py:122:God Function: + main' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: main' + description: 'code2llm reports `God Function: main` in `scripts/research/evaluate-embedding-pairs.py:26`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/extractors/markdown-llm.ts - dedupe_key: code2llm:cc:src/extractors/markdown-llm.ts:src.extractors.markdown-llm.MarkdownLlmRequiredError.extractMarkdownIntentAudited -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.base (CC=16)' - description: 'code2llm reports `src.extractors.markdown-paths.base` at `src/extractors/markdown-paths.ts:86` - with cyclomatic complexity 16 (limit 15). + Function ''main'' is oversized: CC=9, fan-out=21, mutations=18. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal + Make the smallest refactor that removes the smell and run local tests.' + priority: high labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - god-function files: - - src/extractors/markdown-paths.ts - dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.base -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.buildBasenameIndex - (CC=17)' - description: 'code2llm reports `src.extractors.markdown-paths.buildBasenameIndex` - at `src/extractors/markdown-paths.ts:84` with cyclomatic complexity 17 (limit - 15). + - scripts/research/evaluate-embedding-pairs.py + dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:26:God + Function: main' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: main' + description: 'code2llm reports `God Function: main` in `sdk/python/examples/basic.py:22`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal + Function ''main'' is oversized: CC=11, fan-out=31, mutations=18. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: high labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - god-function files: - - src/extractors/markdown-paths.ts - dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.buildBasenameIndex -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.index (CC=16)' - description: 'code2llm reports `src.extractors.markdown-paths.index` at `src/extractors/markdown-paths.ts:85` - with cyclomatic complexity 16 (limit 15). + - sdk/python/examples/basic.py + dedupe_key: 'code2llm:smell:god_function:sdk/python/examples/basic.py:22:God Function: + main' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.cli' + description: 'code2llm reports `God Module: src.cli` in `src/cli.ts:1`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal + Module ''src.cli'' is too large (202 functions, 1 classes). Consider splitting + into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: high labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - god-function files: - - src/extractors/markdown-paths.ts - dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.index + - src/cli.ts + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:1:God Module: src.cli' - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.markdown-paths.seen (CC=16)' - description: 'code2llm reports `src.extractors.markdown-paths.seen` at `src/extractors/markdown-paths.ts:88` + title: 'Reduce cyclomatic complexity: python.ast_extract.iter_python_files (CC=16)' + description: 'code2llm reports `python.ast_extract.iter_python_files` at `python/ast_extract.py:168` with cyclomatic complexity 16 (limit 15). @@ -1915,13 +200,12 @@ tickets: - complexity - refactor files: - - src/extractors/markdown-paths.ts - dedupe_key: code2llm:cc:src/extractors/markdown-paths.ts:src.extractors.markdown-paths.seen + - python/ast_extract.py + dedupe_key: code2llm:cc:python/ast_extract.py:python.ast_extract.iter_python_files - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.extractors.nl-llm.NlAttemptError.toIntentRecord - (CC=18)' - description: 'code2llm reports `src.extractors.nl-llm.NlAttemptError.toIntentRecord` - at `src/extractors/nl-llm.ts:175` with cyclomatic complexity 18 (limit 15). + title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visit (CC=15)' + description: 'code2llm reports `scripts.verify-no-llm-imports.visit` at `scripts/verify-no-llm-imports.mjs:27` + with cyclomatic complexity 15 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -1933,12 +217,12 @@ tickets: - complexity - refactor files: - - src/extractors/nl-llm.ts - dedupe_key: code2llm:cc:src/extractors/nl-llm.ts:src.extractors.nl-llm.NlAttemptError.toIntentRecord + - scripts/verify-no-llm-imports.mjs + dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visit - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.linker.scorePair (CC=18)' - description: 'code2llm reports `src.graph.linker.scorePair` at `src/graph/linker.ts:342` - with cyclomatic complexity 18 (limit 15). + title: 'Reduce cyclomatic complexity: scripts.verify-no-llm-imports.visited (CC=15)' + description: 'code2llm reports `scripts.verify-no-llm-imports.visited` at `scripts/verify-no-llm-imports.mjs:22` + with cyclomatic complexity 15 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -1950,13 +234,12 @@ tickets: - complexity - refactor files: - - src/graph/linker.ts - dedupe_key: code2llm:cc:src/graph/linker.ts:src.graph.linker.scorePair + - scripts/verify-no-llm-imports.mjs + dedupe_key: code2llm:cc:scripts/verify-no-llm-imports.mjs:scripts.verify-no-llm-imports.visited - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.graph.symbol-resolution.buildSymbolResolutionIndex - (CC=15)' - description: 'code2llm reports `src.graph.symbol-resolution.buildSymbolResolutionIndex` - at `src/graph/symbol-resolution.ts:22` with cyclomatic complexity 15 (limit 15). + title: 'Reduce cyclomatic complexity: sdk.rust.examples.basic.run (CC=20)' + description: 'code2llm reports `sdk.rust.examples.basic.run` at `sdk/rust/examples/basic.rs:27` + with cyclomatic complexity 20 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -1968,11 +251,11 @@ tickets: - complexity - refactor files: - - src/graph/symbol-resolution.ts - dedupe_key: code2llm:cc:src/graph/symbol-resolution.ts:src.graph.symbol-resolution.buildSymbolResolutionIndex + - sdk/rust/examples/basic.rs + dedupe_key: code2llm:cc:sdk/rust/examples/basic.rs:sdk.rust.examples.basic.run - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.interfaces.a2a-history.runListItem (CC=18)' - description: 'code2llm reports `src.interfaces.a2a-history.runListItem` at `src/interfaces/a2a-history.ts:107` + title: 'Reduce cyclomatic complexity: sdk.rust.src.client.parse_http_response (CC=18)' + description: 'code2llm reports `sdk.rust.src.client.parse_http_response` at `sdk/rust/src/client.rs:152` with cyclomatic complexity 18 (limit 15). @@ -1985,13 +268,12 @@ tickets: - complexity - refactor files: - - src/interfaces/a2a-history.ts - dedupe_key: code2llm:cc:src/interfaces/a2a-history.ts:src.interfaces.a2a-history.runListItem + - sdk/rust/src/client.rs + dedupe_key: code2llm:cc:sdk/rust/src/client.rs:sdk.rust.src.client.parse_http_response - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.assertGeneration - (CC=16)' - description: 'code2llm reports `src.operations.validation.assertGeneration` at `src/operations/validation.ts:110` - with cyclomatic complexity 16 (limit 15). + title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.baseUrl (CC=17)' + description: 'code2llm reports `sdk.typescript.examples.basic.baseUrl` at `sdk/typescript/examples/basic.ts:13` + with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2003,13 +285,12 @@ tickets: - complexity - refactor files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertGeneration + - sdk/typescript/examples/basic.ts + dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.baseUrl - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.operations.validation.assertVariableContract - (CC=20)' - description: 'code2llm reports `src.operations.validation.assertVariableContract` - at `src/operations/validation.ts:62` with cyclomatic complexity 20 (limit 15). + title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.main (CC=17)' + description: 'code2llm reports `sdk.typescript.examples.basic.main` at `sdk/typescript/examples/basic.ts:17` + with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2021,12 +302,12 @@ tickets: - complexity - refactor files: - - src/operations/validation.ts - dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertVariableContract + - sdk/typescript/examples/basic.ts + dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.main - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.pipeline.run.persistFailedRun (CC=19)' - description: 'code2llm reports `src.pipeline.run.persistFailedRun` at `src/pipeline/run.ts:497` - with cyclomatic complexity 19 (limit 15). + title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.root (CC=17)' + description: 'code2llm reports `sdk.typescript.examples.basic.root` at `sdk/typescript/examples/basic.ts:15` + with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2038,13 +319,12 @@ tickets: - complexity - refactor files: - - src/pipeline/run.ts - dedupe_key: code2llm:cc:src/pipeline/run.ts:src.pipeline.run.persistFailedRun + - sdk/typescript/examples/basic.ts + dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.root - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.semantic.reranker.acceptedDeclarations - (CC=16)' - description: 'code2llm reports `src.semantic.reranker.acceptedDeclarations` at `src/semantic/reranker.ts:328` - with cyclomatic complexity 16 (limit 15). + title: 'Reduce cyclomatic complexity: sdk.typescript.examples.basic.token (CC=17)' + description: 'code2llm reports `sdk.typescript.examples.basic.token` at `sdk/typescript/examples/basic.ts:14` + with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2056,13 +336,13 @@ tickets: - complexity - refactor files: - - src/semantic/reranker.ts - dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.acceptedDeclarations + - sdk/typescript/examples/basic.ts + dedupe_key: code2llm:cc:sdk/typescript/examples/basic.ts:sdk.typescript.examples.basic.token - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.semantic.reranker.assertSemanticRerankResult - (CC=21)' - description: 'code2llm reports `src.semantic.reranker.assertSemanticRerankResult` - at `src/semantic/reranker.ts:311` with cyclomatic complexity 21 (limit 15). + title: 'Reduce cyclomatic complexity: src.communication.analyzer.collectAgentActionIssues + (CC=15)' + description: 'code2llm reports `src.communication.analyzer.collectAgentActionIssues` + at `src/communication/analyzer.ts:173` with cyclomatic complexity 15 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2074,12 +354,13 @@ tickets: - complexity - refactor files: - - src/semantic/reranker.ts - dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.assertSemanticRerankResult + - src/communication/analyzer.ts + dedupe_key: code2llm:cc:src/communication/analyzer.ts:src.communication.analyzer.collectAgentActionIssues - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.semantic.reranker.records (CC=16)' - description: 'code2llm reports `src.semantic.reranker.records` at `src/semantic/reranker.ts:326` - with cyclomatic complexity 16 (limit 15). + title: 'Reduce cyclomatic complexity: src.core.record-metadata.generationMetadata + (CC=17)' + description: 'code2llm reports `src.core.record-metadata.generationMetadata` at + `src/core/record-metadata.ts:4` with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2091,12 +372,12 @@ tickets: - complexity - refactor files: - - src/semantic/reranker.ts - dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.records + - src/core/record-metadata.ts + dedupe_key: code2llm:cc:src/core/record-metadata.ts:src.core.record-metadata.generationMetadata - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.semantic.reranker.seenDecisions (CC=16)' - description: 'code2llm reports `src.semantic.reranker.seenDecisions` at `src/semantic/reranker.ts:327` - with cyclomatic complexity 16 (limit 15). + title: 'Reduce cyclomatic complexity: src.diff.reality.buildRealityTotals (CC=15)' + description: 'code2llm reports `src.diff.reality.buildRealityTotals` at `src/diff/reality.ts:224` + with cyclomatic complexity 15 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2108,13 +389,13 @@ tickets: - complexity - refactor files: - - src/semantic/reranker.ts - dedupe_key: code2llm:cc:src/semantic/reranker.ts:src.semantic.reranker.seenDecisions + - src/diff/reality.ts + dedupe_key: code2llm:cc:src/diff/reality.ts:src.diff.reality.buildRealityTotals - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.services.actions.filterCommunicationGraph + title: 'Reduce cyclomatic complexity: src.evaluation.gold-types.assertRerankerDecision (CC=17)' - description: 'code2llm reports `src.services.actions.filterCommunicationGraph` at - `src/services/actions.ts:511` with cyclomatic complexity 17 (limit 15). + description: 'code2llm reports `src.evaluation.gold-types.assertRerankerDecision` + at `src/evaluation/gold-types.ts:383` with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2126,13 +407,13 @@ tickets: - complexity - refactor files: - - src/services/actions.ts - dedupe_key: code2llm:cc:src/services/actions.ts:src.services.actions.filterCommunicationGraph + - src/evaluation/gold-types.ts + dedupe_key: code2llm:cc:src/evaluation/gold-types.ts:src.evaluation.gold-types.assertRerankerDecision - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.assertCodeChangeReviewPatch - (CC=23)' - description: 'code2llm reports `src.synthesis.code-change-plan.assertCodeChangeReviewPatch` - at `src/synthesis/code-change-plan.ts:626` with cyclomatic complexity 23 (limit + title: 'Reduce cyclomatic complexity: src.interfaces.a2a-message-command.looksLikeJson + (CC=20)' + description: 'code2llm reports `src.interfaces.a2a-message-command.looksLikeJson` + at `src/interfaces/a2a-message-command.ts:56` with cyclomatic complexity 20 (limit 15). @@ -2145,14 +426,13 @@ tickets: - complexity - refactor files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.assertCodeChangeReviewPatch + - src/interfaces/a2a-message-command.ts + dedupe_key: code2llm:cc:src/interfaces/a2a-message-command.ts:src.interfaces.a2a-message-command.looksLikeJson - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet - (CC=18)' - description: 'code2llm reports `src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet` - at `src/synthesis/code-change-plan.ts:896` with cyclomatic complexity 18 (limit - 15). + title: 'Reduce cyclomatic complexity: src.operations.validation.assertGeneration + (CC=16)' + description: 'code2llm reports `src.operations.validation.assertGeneration` at `src/operations/validation.ts:162` + with cyclomatic complexity 16 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2164,14 +444,13 @@ tickets: - complexity - refactor files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.assertCodeChangeSourcePatchSet + - src/operations/validation.ts + dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.assertGeneration - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.normalizeUnifiedDiff - (CC=17)' - description: 'code2llm reports `src.synthesis.code-change-plan.normalizeUnifiedDiff` - at `src/synthesis/code-change-plan.ts:983` with cyclomatic complexity 17 (limit - 15). + title: 'Reduce cyclomatic complexity: src.operations.validation.validateOperationStep + (CC=23)' + description: 'code2llm reports `src.operations.validation.validateOperationStep` + at `src/operations/validation.ts:277` with cyclomatic complexity 23 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2183,12 +462,14 @@ tickets: - complexity - refactor files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.normalizeUnifiedDiff + - src/operations/validation.ts + dedupe_key: code2llm:cc:src/operations/validation.ts:src.operations.validation.validateOperationStep - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.paths (CC=16)' - description: 'code2llm reports `src.synthesis.code-change-plan.paths` at `src/synthesis/code-change-plan.ts:830` - with cyclomatic complexity 16 (limit 15). + title: 'Reduce cyclomatic complexity: src.pipeline.run-persistence.persistFailedRunState + (CC=19)' + description: 'code2llm reports `src.pipeline.run-persistence.persistFailedRunState` + at `src/pipeline/run-persistence.ts:206` with cyclomatic complexity 19 (limit + 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2200,14 +481,13 @@ tickets: - complexity - refactor files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.paths + - src/pipeline/run-persistence.ts + dedupe_key: code2llm:cc:src/pipeline/run-persistence.ts:src.pipeline.run-persistence.persistFailedRunState - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.synthesis.code-change-plan.proposeCodeChangePlans + title: 'Reduce cyclomatic complexity: src.pipeline.run-persistence.persistPipelineArtifacts (CC=17)' - description: 'code2llm reports `src.synthesis.code-change-plan.proposeCodeChangePlans` - at `src/synthesis/code-change-plan.ts:109` with cyclomatic complexity 17 (limit - 15). + description: 'code2llm reports `src.pipeline.run-persistence.persistPipelineArtifacts` + at `src/pipeline/run-persistence.ts:57` with cyclomatic complexity 17 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2219,12 +499,12 @@ tickets: - complexity - refactor files: - - src/synthesis/code-change-plan.ts - dedupe_key: code2llm:cc:src/synthesis/code-change-plan.ts:src.synthesis.code-change-plan.proposeCodeChangePlans + - src/pipeline/run-persistence.ts + dedupe_key: code2llm:cc:src/pipeline/run-persistence.ts:src.pipeline.run-persistence.persistPipelineArtifacts - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.tf.classifier.classifyAction (CC=17)' - description: 'code2llm reports `src.tf.classifier.classifyAction` at `src/tf/classifier.ts:69` - with cyclomatic complexity 17 (limit 15). + title: 'Reduce cyclomatic complexity: src.pipeline.run.executePipeline (CC=20)' + description: 'code2llm reports `src.pipeline.run.executePipeline` at `src/pipeline/run.ts:198` + with cyclomatic complexity 20 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2236,13 +516,12 @@ tickets: - complexity - refactor files: - - src/tf/classifier.ts - dedupe_key: code2llm:cc:src/tf/classifier.ts:src.tf.classifier.classifyAction + - src/pipeline/run.ts + dedupe_key: code2llm:cc:src/pipeline/run.ts:src.pipeline.run.executePipeline - signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.watch.watcher.DEFAULT_MIN_INTERVAL_MS - (CC=19)' - description: 'code2llm reports `src.watch.watcher.DEFAULT_MIN_INTERVAL_MS` at `src/watch/watcher.ts:144` - with cyclomatic complexity 19 (limit 15). + title: 'Reduce cyclomatic complexity: src.web.diff-ui-script.compareGraphs (CC=15)' + description: 'code2llm reports `src.web.diff-ui-script.compareGraphs` at `src/web/diff-ui-script.ts:11` + with cyclomatic complexity 15 (limit 15). Extract smaller functions, flatten conditionals, or split strategy branches. Re-run @@ -2254,60 +533,48 @@ tickets: - complexity - refactor files: - - src/watch/watcher.ts - dedupe_key: code2llm:cc:src/watch/watcher.ts:src.watch.watcher.DEFAULT_MIN_INTERVAL_MS -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS - (CC=19)' - description: 'code2llm reports `src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS` at `src/watch/watcher.ts:145` - with cyclomatic complexity 19 (limit 15). + - src/web/diff-ui-script.ts + dedupe_key: code2llm:cc:src/web/diff-ui-script.ts:src.web.diff-ui-script.compareGraphs +- signal: code2llm_smell_data_clump + title: 'Address code smell: Data Clump: file, self, root, nl_mode' + description: 'code2llm reports `Data Clump: file, self, root, nl_mode` in `sdk/python/todo2code/client.py:307`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' - priority: normal - labels: - - llm-ready - - code2llm - - complexity - - refactor - files: - - src/watch/watcher.ts - dedupe_key: code2llm:cc:src/watch/watcher.ts:src.watch.watcher.DEFAULT_SCAN_INTERVAL_MS -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.watch.watcher.watchRepository (CC=19)' - description: 'code2llm reports `src.watch.watcher.watchRepository` at `src/watch/watcher.ts:147` - with cyclomatic complexity 19 (limit 15). + Arguments (file, self, root, nl_mode) are used together in multiple functions: + sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' + Make the smallest refactor that removes the smell and run local tests.' priority: normal labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - data-clump files: - - src/watch/watcher.ts - dedupe_key: code2llm:cc:src/watch/watcher.ts:src.watch.watcher.watchRepository -- signal: code2llm_cc - title: 'Reduce cyclomatic complexity: src.web.diff-ui.compareGraphs (CC=15)' - description: 'code2llm reports `src.web.diff-ui.compareGraphs` at `src/web/diff-ui.ts:45` - with cyclomatic complexity 15 (limit 15). + - sdk/python/todo2code/client.py + dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:307:Data Clump: + file, self, root, nl_mode' +- signal: code2llm_smell_data_clump + title: 'Address code smell: Data Clump: file, self, root, nl_mode' + description: 'code2llm reports `Data Clump: file, self, root, nl_mode` in `sdk/python/todo2code/client.py:312`. - Extract smaller functions, flatten conditionals, or split strategy branches. Re-run - code2llm after the change and keep tests green.' + Arguments (file, self, root, nl_mode) are used together in multiple functions: + sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result. + + + Make the smallest refactor that removes the smell and run local tests.' priority: normal labels: - llm-ready - code2llm - - complexity - - refactor + - code-smell + - data-clump files: - - src/web/diff-ui.ts - dedupe_key: code2llm:cc:src/web/diff-ui.ts:src.web.diff-ui.compareGraphs + - sdk/python/todo2code/client.py + dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:312:Data Clump: + file, self, root, nl_mode' - signal: code2llm_smell_data_clump title: 'Address code smell: Data Clump: root, markdown_mode, changelog, self, todo' description: 'code2llm reports `Data Clump: root, markdown_mode, changelog, self, @@ -2351,11 +618,11 @@ tickets: dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:341:Data Clump: root, markdown_mode, changelog, self, todo' - signal: code2llm_smell_data_clump - title: 'Address code smell: Data Clump: self, action, payload' - description: 'code2llm reports `Data Clump: self, action, payload` in `sdk/python/todo2code/client.py:249`. + title: 'Address code smell: Data Clump: self, payload, action' + description: 'code2llm reports `Data Clump: self, payload, action` in `sdk/python/todo2code/client.py:249`. - Arguments (self, action, payload) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send, + Arguments (self, payload, action) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send, sdk.python.todo2code.client.T2CClient.call. @@ -2369,13 +636,13 @@ tickets: files: - sdk/python/todo2code/client.py dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:249:Data Clump: - self, action, payload' + self, payload, action' - signal: code2llm_smell_data_clump - title: 'Address code smell: Data Clump: self, action, payload' - description: 'code2llm reports `Data Clump: self, action, payload` in `sdk/python/todo2code/client.py:261`. + title: 'Address code smell: Data Clump: self, payload, action' + description: 'code2llm reports `Data Clump: self, payload, action` in `sdk/python/todo2code/client.py:261`. - Arguments (self, action, payload) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send, + Arguments (self, payload, action) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.send, sdk.python.todo2code.client.T2CClient.call. @@ -2389,13 +656,13 @@ tickets: files: - sdk/python/todo2code/client.py dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:261:Data Clump: - self, action, payload' + self, payload, action' - signal: code2llm_smell_data_clump - title: 'Address code smell: Data Clump: self, root, excludes, patterns' - description: 'code2llm reports `Data Clump: self, root, excludes, patterns` in `sdk/python/todo2code/client.py:354`. + title: 'Address code smell: Data Clump: self, root, patterns, excludes' + description: 'code2llm reports `Data Clump: self, root, patterns, excludes` in `sdk/python/todo2code/client.py:354`. - Arguments (self, root, excludes, patterns) are used together in multiple functions: + Arguments (self, root, patterns, excludes) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.extract_docs, sdk.python.todo2code.client.T2CClient.extract_docs_result. @@ -2409,13 +676,13 @@ tickets: files: - sdk/python/todo2code/client.py dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:354:Data Clump: - self, root, excludes, patterns' + self, root, patterns, excludes' - signal: code2llm_smell_data_clump - title: 'Address code smell: Data Clump: self, root, excludes, patterns' - description: 'code2llm reports `Data Clump: self, root, excludes, patterns` in `sdk/python/todo2code/client.py:362`. + title: 'Address code smell: Data Clump: self, root, patterns, excludes' + description: 'code2llm reports `Data Clump: self, root, patterns, excludes` in `sdk/python/todo2code/client.py:362`. - Arguments (self, root, excludes, patterns) are used together in multiple functions: + Arguments (self, root, patterns, excludes) are used together in multiple functions: sdk.python.todo2code.client.T2CClient.extract_docs, sdk.python.todo2code.client.T2CClient.extract_docs_result. @@ -2429,53 +696,13 @@ tickets: files: - sdk/python/todo2code/client.py dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:362:Data Clump: - self, root, excludes, patterns' -- signal: code2llm_smell_data_clump - title: 'Address code smell: Data Clump: self, root, nl_mode, file' - description: 'code2llm reports `Data Clump: self, root, nl_mode, file` in `sdk/python/todo2code/client.py:307`. - - - Arguments (self, root, nl_mode, file) are used together in multiple functions: - sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - data-clump - files: - - sdk/python/todo2code/client.py - dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:307:Data Clump: - self, root, nl_mode, file' -- signal: code2llm_smell_data_clump - title: 'Address code smell: Data Clump: self, root, nl_mode, file' - description: 'code2llm reports `Data Clump: self, root, nl_mode, file` in `sdk/python/todo2code/client.py:312`. - - - Arguments (self, root, nl_mode, file) are used together in multiple functions: - sdk.python.todo2code.client.T2CClient.extract_nl, sdk.python.todo2code.client.T2CClient.extract_nl_result. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - data-clump - files: - - sdk/python/todo2code/client.py - dedupe_key: 'code2llm:smell:data_clump:sdk/python/todo2code/client.py:312:Data Clump: - self, root, nl_mode, file' + self, root, patterns, excludes' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: MAX_INDEXED_FILES' - description: 'code2llm reports `God Function: MAX_INDEXED_FILES` in `src/extractors/markdown-paths.ts:31`. + title: 'Address code smell: God Function: MAX_PER_SECTION' + description: 'code2llm reports `God Function: MAX_PER_SECTION` in `src/extractors/runtime-cycle.ts:15`. - Function ''MAX_INDEXED_FILES'' is oversized: CC=12, fan-out=12, mutations=0. + Function ''MAX_PER_SECTION'' is oversized: CC=8, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2486,9 +713,9 @@ tickets: - code-smell - god-function files: - - src/extractors/markdown-paths.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:31:God - Function: MAX_INDEXED_FILES' + - src/extractors/runtime-cycle.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/runtime-cycle.ts:15:God + Function: MAX_PER_SECTION' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: OBJECT_PLACEHOLDERS' description: 'code2llm reports `God Function: OBJECT_PLACEHOLDERS` in `src/extractors/docs-record.ts:21`. @@ -2510,7 +737,7 @@ tickets: OBJECT_PLACEHOLDERS' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: PATH_ROOTS' - description: 'code2llm reports `God Function: PATH_ROOTS` in `src/core/text.ts:343`. + description: 'code2llm reports `God Function: PATH_ROOTS` in `src/core/text.ts:390`. Function ''PATH_ROOTS'' is oversized: CC=13, fan-out=12, mutations=0. @@ -2525,26 +752,7 @@ tickets: - god-function files: - src/core/text.ts - dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:343:God Function: PATH_ROOTS' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: PATH_SEARCH_EXCLUDES' - description: 'code2llm reports `God Function: PATH_SEARCH_EXCLUDES` in `src/extractors/markdown-paths.ts:25`. - - - Function ''PATH_SEARCH_EXCLUDES'' is oversized: CC=12, fan-out=12, mutations=0. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/extractors/markdown-paths.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:25:God - Function: PATH_SEARCH_EXCLUDES' + dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:390:God Function: PATH_ROOTS' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: RPC' description: 'code2llm reports `God Function: RPC` in `sdk/go/client.go:70`. @@ -2619,11 +827,13 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:50:God Function: action' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: add' - description: 'code2llm reports `God Function: add` in `src/extractors/ast/typescript.ts:29`. + title: 'Address code smell: God Function: addCommunicationIssuesToDiagnostics' + description: 'code2llm reports `God Function: addCommunicationIssuesToDiagnostics` + in `src/communication/analyzer.ts:305`. - Function ''add'' is oversized: CC=14, fan-out=7, mutations=0. + Function ''addCommunicationIssuesToDiagnostics'' is oversized: CC=7, fan-out=12, + mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2634,17 +844,15 @@ tickets: - code-smell - god-function files: - - src/extractors/ast/typescript.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/typescript.ts:29:God - Function: add' + - src/communication/analyzer.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:305:God Function: + addCommunicationIssuesToDiagnostics' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: addCommunicationIssuesToDiagnostics' - description: 'code2llm reports `God Function: addCommunicationIssuesToDiagnostics` - in `src/communication/analyzer.ts:251`. + title: 'Address code smell: God Function: analyzeCommunication' + description: 'code2llm reports `God Function: analyzeCommunication` in `src/communication/analyzer.ts:56`. - Function ''addCommunicationIssuesToDiagnostics'' is oversized: CC=7, fan-out=12, - mutations=0. + Function ''analyzeCommunication'' is oversized: CC=5, fan-out=18, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2656,12 +864,12 @@ tickets: - god-function files: - src/communication/analyzer.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:251:God Function: - addCommunicationIssuesToDiagnostics' + dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:56:God Function: + analyzeCommunication' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: applyAcceptedSemanticRelations' description: 'code2llm reports `God Function: applyAcceptedSemanticRelations` in - `src/semantic/reranker.ts:372`. + `src/semantic/reranker/result.ts:226`. Function ''applyAcceptedSemanticRelations'' is oversized: CC=2, fan-out=13, mutations=0. @@ -2675,9 +883,28 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:372:God Function: - applyAcceptedSemanticRelations' + - src/semantic/reranker/result.ts + dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/result.ts:226:God + Function: applyAcceptedSemanticRelations' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: applyCodeChangeSourcePatch' + description: 'code2llm reports `God Function: applyCodeChangeSourcePatch` in `src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:59`. + + + Function ''applyCodeChangeSourcePatch'' is oversized: CC=4, fan-out=14, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:59:God + Function: applyCodeChangeSourcePatch' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: applyTodoPatch' description: 'code2llm reports `God Function: applyTodoPatch` in `src/synthesis/todo-patch.ts:160`. @@ -2700,7 +927,7 @@ tickets: - signal: code2llm_smell_god_function title: 'Address code smell: God Function: assertAcyclicProposalDependencies' description: 'code2llm reports `God Function: assertAcyclicProposalDependencies` - in `src/core/schema.ts:853`. + in `src/core/schema/utils.ts:96`. Function ''assertAcyclicProposalDependencies'' is oversized: CC=7, fan-out=11, @@ -2715,11 +942,12 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:853:God Function: assertAcyclicProposalDependencies' + - src/core/schema/utils.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/utils.ts:96:God Function: + assertAcyclicProposalDependencies' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: assertCodeChangeAcceptance' - description: 'code2llm reports `God Function: assertCodeChangeAcceptance` in `src/core/schema.ts:408`. + description: 'code2llm reports `God Function: assertCodeChangeAcceptance` in `src/core/schema/code-change.ts:125`. Function ''assertCodeChangeAcceptance'' is oversized: CC=11, fan-out=14, mutations=0. @@ -2733,14 +961,36 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:408:God Function: assertCodeChangeAcceptance' + - src/core/schema/code-change.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/code-change.ts:125:God + Function: assertCodeChangeAcceptance' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: assertConclusionValue' - description: 'code2llm reports `God Function: assertConclusionValue` in `src/core/schema.ts:462`. + description: 'code2llm reports `God Function: assertConclusionValue` in `src/core/schema/conclusions.ts:89`. + + + Function ''assertConclusionValue'' is oversized: CC=5, fan-out=12, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/core/schema/conclusions.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/conclusions.ts:89:God Function: + assertConclusionValue' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: assertGroundedGenerationMetadata' + description: 'code2llm reports `God Function: assertGroundedGenerationMetadata` + in `src/core/schema/utils.ts:167`. - Function ''assertConclusionValue'' is oversized: CC=5, fan-out=11, mutations=0. + Function ''assertGroundedGenerationMetadata'' is oversized: CC=4, fan-out=12, + mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2751,11 +1001,12 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:462:God Function: assertConclusionValue' + - src/core/schema/utils.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/utils.ts:167:God Function: + assertGroundedGenerationMetadata' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: assertIntentGraph' - description: 'code2llm reports `God Function: assertIntentGraph` in `src/core/schema.ts:194`. + description: 'code2llm reports `God Function: assertIntentGraph` in `src/core/schema/intent.ts:220`. Function ''assertIntentGraph'' is oversized: CC=7, fan-out=16, mutations=0. @@ -2769,11 +1020,12 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:194:God Function: assertIntentGraph' + - src/core/schema/intent.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/intent.ts:220:God Function: + assertIntentGraph' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: assertIntentGraphDiff' - description: 'code2llm reports `God Function: assertIntentGraphDiff` in `src/core/schema.ts:223`. + description: 'code2llm reports `God Function: assertIntentGraphDiff` in `src/core/schema/intent.ts:249`. Function ''assertIntentGraphDiff'' is oversized: CC=7, fan-out=15, mutations=0. @@ -2787,14 +1039,15 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:223:God Function: assertIntentGraphDiff' + - src/core/schema/intent.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/intent.ts:249:God Function: + assertIntentGraphDiff' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: assertSourceApplyReceipt' - description: 'code2llm reports `God Function: assertSourceApplyReceipt` in `src/synthesis/code-change-plan.ts:1180`. + title: 'Address code smell: God Function: assertOperationPlan' + description: 'code2llm reports `God Function: assertOperationPlan` in `src/operations/validation.ts:205`. - Function ''assertSourceApplyReceipt'' is oversized: CC=11, fan-out=13, mutations=0. + Function ''assertOperationPlan'' is oversized: CC=1, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2805,15 +1058,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:1180:God - Function: assertSourceApplyReceipt' + - src/operations/validation.ts + dedupe_key: 'code2llm:smell:god_function:src/operations/validation.ts:205:God Function: + assertOperationPlan' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: assertTodoPatchArtifact' - description: 'code2llm reports `God Function: assertTodoPatchArtifact` in `src/synthesis/todo-patch.ts:221`. + title: 'Address code smell: God Function: assertParticipant' + description: 'code2llm reports `God Function: assertParticipant` in `src/communication/intake-contract.ts:248`. - Function ''assertTodoPatchArtifact'' is oversized: CC=11, fan-out=16, mutations=0. + Function ''assertParticipant'' is oversized: CC=9, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2824,15 +1077,16 @@ tickets: - code-smell - god-function files: - - src/synthesis/todo-patch.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:221:God Function: - assertTodoPatchArtifact' + - src/communication/intake-contract.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-contract.ts:248:God + Function: assertParticipant' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: assertTodoProposalValue' - description: 'code2llm reports `God Function: assertTodoProposalValue` in `src/core/schema.ts:489`. + title: 'Address code smell: God Function: assertParticipantIdentityEntry' + description: 'code2llm reports `God Function: assertParticipantIdentityEntry` in + `src/communication/identity.ts:119`. - Function ''assertTodoProposalValue'' is oversized: CC=9, fan-out=17, mutations=0. + Function ''assertParticipantIdentityEntry'' is oversized: CC=5, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2843,14 +1097,34 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:489:God Function: assertTodoProposalValue' + - src/communication/identity.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/identity.ts:119:God Function: + assertParticipantIdentityEntry' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: atomicWrite' - description: 'code2llm reports `God Function: atomicWrite` in `src/synthesis/todo-patch.ts:274`. + title: 'Address code smell: God Function: assertProjectionWritable' + description: 'code2llm reports `God Function: assertProjectionWritable` in `src/communication/intake-service.ts:158`. - Function ''atomicWrite'' is oversized: CC=5, fan-out=13, mutations=0. + Function ''assertProjectionWritable'' is oversized: CC=13, fan-out=18, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/communication/intake-service.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-service.ts:158:God + Function: assertProjectionWritable' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: assertTodoPatchArtifact' + description: 'code2llm reports `God Function: assertTodoPatchArtifact` in `src/synthesis/todo-patch.ts:221`. + + + Function ''assertTodoPatchArtifact'' is oversized: CC=11, fan-out=16, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2862,14 +1136,14 @@ tickets: - god-function files: - src/synthesis/todo-patch.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:274:God Function: - atomicWrite' + dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:221:God Function: + assertTodoPatchArtifact' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: base' - description: 'code2llm reports `God Function: base` in `src/core/io.ts:92`. + title: 'Address code smell: God Function: assertTodoProposalValue' + description: 'code2llm reports `God Function: assertTodoProposalValue` in `src/core/schema/conclusions.ts:116`. - Function ''base'' is oversized: CC=11, fan-out=16, mutations=0. + Function ''assertTodoProposalValue'' is oversized: CC=9, fan-out=18, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2880,8 +1154,28 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:92:God Function: base' + - src/core/schema/conclusions.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/conclusions.ts:116:God + Function: assertTodoProposalValue' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: atomicWrite' + description: 'code2llm reports `God Function: atomicWrite` in `src/synthesis/todo-patch.ts:274`. + + + Function ''atomicWrite'' is oversized: CC=5, fan-out=13, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/synthesis/todo-patch.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:274:God Function: + atomicWrite' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: baseWorktree' description: 'code2llm reports `God Function: baseWorktree` in `src/comparison/workspace.ts:97`. @@ -2922,10 +1216,10 @@ tickets: block' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: body' - description: 'code2llm reports `God Function: body` in `src/extractors/todo.ts:28`. + description: 'code2llm reports `God Function: body` in `src/extractors/nl.ts:41`. - Function ''body'' is oversized: CC=5, fan-out=20, mutations=0. + Function ''body'' is oversized: CC=2, fan-out=14, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2936,15 +1230,14 @@ tickets: - code-smell - god-function files: - - src/extractors/todo.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:28:God Function: - body' + - src/extractors/nl.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:41:God Function: body' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: body' - description: 'code2llm reports `God Function: body` in `src/extractors/nl.ts:41`. + description: 'code2llm reports `God Function: body` in `src/extractors/changelog.ts:27`. - Function ''body'' is oversized: CC=2, fan-out=14, mutations=0. + Function ''body'' is oversized: CC=7, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2955,14 +1248,15 @@ tickets: - code-smell - god-function files: - - src/extractors/nl.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:41:God Function: body' + - src/extractors/changelog.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:27:God Function: + body' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: body' - description: 'code2llm reports `God Function: body` in `src/extractors/changelog.ts:27`. + description: 'code2llm reports `God Function: body` in `src/extractors/todo.ts:28`. - Function ''body'' is oversized: CC=7, fan-out=15, mutations=0. + Function ''body'' is oversized: CC=5, fan-out=20, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2973,15 +1267,15 @@ tickets: - code-smell - god-function files: - - src/extractors/changelog.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:27:God Function: + - src/extractors/todo.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:28:God Function: body' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: byDeclaration' - description: 'code2llm reports `God Function: byDeclaration` in `src/semantic/reranker.ts:205`. + title: 'Address code smell: God Function: buildAcceptanceContext' + description: 'code2llm reports `God Function: buildAcceptanceContext` in `src/synthesis/code-change-plan/implementation-helpers-acceptance.ts:65`. - Function ''byDeclaration'' is oversized: CC=14, fan-out=9, mutations=0. + Function ''buildAcceptanceContext'' is oversized: CC=4, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -2992,15 +1286,15 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:205:God Function: - byDeclaration' + - src/synthesis/code-change-plan/implementation-helpers-acceptance.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-helpers-acceptance.ts:65:God + Function: buildAcceptanceContext' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: byKey' - description: 'code2llm reports `God Function: byKey` in `src/communication/llm.ts:303`. + title: 'Address code smell: God Function: buildParticipantRows' + description: 'code2llm reports `God Function: buildParticipantRows` in `src/communication/analyzer.ts:225`. - Function ''byKey'' is oversized: CC=6, fan-out=11, mutations=0. + Function ''buildParticipantRows'' is oversized: CC=7, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3011,15 +1305,15 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:303:God Function: - byKey' + - src/communication/analyzer.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:225:God Function: + buildParticipantRows' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: candidates' - description: 'code2llm reports `God Function: candidates` in `src/synthesis/code-change-plan.ts:124`. + title: 'Address code smell: God Function: byKey' + description: 'code2llm reports `God Function: byKey` in `src/communication/llm/implementation-helpers.ts:146`. - Function ''candidates'' is oversized: CC=7, fan-out=18, mutations=0. + Function ''byKey'' is oversized: CC=6, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3030,12 +1324,12 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:124:God - Function: candidates' + - src/communication/llm/implementation-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:146:God + Function: byKey' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: changePaths' - description: 'code2llm reports `God Function: changePaths` in `src/core/schema.ts:702`. + description: 'code2llm reports `God Function: changePaths` in `src/core/schema/code-change.ts:226`. Function ''changePaths'' is oversized: CC=6, fan-out=12, mutations=0. @@ -3049,8 +1343,9 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:702:God Function: changePaths' + - src/core/schema/code-change.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/code-change.ts:226:God + Function: changePaths' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: checked' description: 'code2llm reports `God Function: checked` in `src/extractors/todo.ts:45`. @@ -3090,11 +1385,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:49:God Function: classified' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: closeCodeChanges' - description: 'code2llm reports `God Function: closeCodeChanges` in `src/synthesis/code-change-plan.ts:298`. + title: 'Address code smell: God Function: collect' + description: 'code2llm reports `God Function: collect` in `java/JavaAstExtract.java:58`. - Function ''closeCodeChanges'' is oversized: CC=6, fan-out=13, mutations=0. + Function ''collect'' is oversized: CC=1, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3105,15 +1400,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:298:God - Function: closeCodeChanges' + - java/JavaAstExtract.java + dedupe_key: 'code2llm:smell:god_function:java/JavaAstExtract.java:58:God Function: + collect' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: collect' - description: 'code2llm reports `God Function: collect` in `java/JavaAstExtract.java:58`. + title: 'Address code smell: God Function: collectCommunicationMetadata' + description: 'code2llm reports `God Function: collectCommunicationMetadata` in `src/extractors/communication-file-helpers.ts:191`. - Function ''collect'' is oversized: CC=1, fan-out=11, mutations=0. + Function ''collectCommunicationMetadata'' is oversized: CC=14, fan-out=7, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3124,15 +1419,15 @@ tickets: - code-smell - god-function files: - - java/JavaAstExtract.java - dedupe_key: 'code2llm:smell:god_function:java/JavaAstExtract.java:58:God Function: - collect' + - src/extractors/communication-file-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/communication-file-helpers.ts:191:God + Function: collectCommunicationMetadata' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: collect_files' - description: 'code2llm reports `God Function: collect_files` in `rust-ast/src/main.rs:101`. + title: 'Address code smell: God Function: collectConflictIssues' + description: 'code2llm reports `God Function: collectConflictIssues` in `src/communication/analyzer.ts:111`. - Function ''collect_files'' is oversized: CC=9, fan-out=20, mutations=0. + Function ''collectConflictIssues'' is oversized: CC=13, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3143,15 +1438,15 @@ tickets: - code-smell - god-function files: - - rust-ast/src/main.rs - dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:101:God Function: - collect_files' + - src/communication/analyzer.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:111:God Function: + collectConflictIssues' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: communicationOnly' - description: 'code2llm reports `God Function: communicationOnly` in `src/services/actions.ts:515`. + title: 'Address code smell: God Function: collectRecordDiagnostics' + description: 'code2llm reports `God Function: collectRecordDiagnostics` in `src/graph/diagnostics.ts:71`. - Function ''communicationOnly'' is oversized: CC=13, fan-out=4, mutations=0. + Function ''collectRecordDiagnostics'' is oversized: CC=8, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3162,12 +1457,31 @@ tickets: - code-smell - god-function files: - - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:515:God Function: - communicationOnly' + - src/graph/diagnostics.ts + dedupe_key: 'code2llm:smell:god_function:src/graph/diagnostics.ts:71:God Function: + collectRecordDiagnostics' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: collect_files' + description: 'code2llm reports `God Function: collect_files` in `rust-ast/src/main.rs:101`. + + + Function ''collect_files'' is oversized: CC=9, fan-out=20, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - rust-ast/src/main.rs + dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:101:God Function: + collect_files' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: communicationSegments' - description: 'code2llm reports `God Function: communicationSegments` in `src/extractors/communication.ts:298`. + description: 'code2llm reports `God Function: communicationSegments` in `src/extractors/communication-helpers.ts:181`. Function ''communicationSegments'' is oversized: CC=14, fan-out=12, mutations=0. @@ -3181,8 +1495,8 @@ tickets: - code-smell - god-function files: - - src/extractors/communication.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/communication.ts:298:God + - src/extractors/communication-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/communication-helpers.ts:181:God Function: communicationSegments' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: compareWorkspaceIntent' @@ -3220,15 +1534,53 @@ tickets: - code-smell - god-function files: - - src/operations/subactor.ts - dedupe_key: 'code2llm:smell:god_function:src/operations/subactor.ts:41:God Function: - compileSubactorProcessEnvelope' + - src/operations/subactor.ts + dedupe_key: 'code2llm:smell:god_function:src/operations/subactor.ts:41:God Function: + compileSubactorProcessEnvelope' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: configurationRecords' + description: 'code2llm reports `God Function: configurationRecords` in `src/extractors/configuration.ts:41`. + + + Function ''configurationRecords'' is oversized: CC=4, fan-out=12, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/configuration.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/configuration.ts:41:God + Function: configurationRecords' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: controller' + description: 'code2llm reports `God Function: controller` in `src/llm/openrouter.ts:45`. + + + Function ''controller'' is oversized: CC=13, fan-out=13, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/llm/openrouter.ts + dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:45:God Function: + controller' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: conclusions' - description: 'code2llm reports `God Function: conclusions` in `src/synthesis/code-change-plan.ts:118`. + title: 'Address code smell: God Function: createMarkdownPathResolver' + description: 'code2llm reports `God Function: createMarkdownPathResolver` in `src/extractors/markdown-paths.ts:39`. - Function ''conclusions'' is oversized: CC=7, fan-out=18, mutations=0. + Function ''createMarkdownPathResolver'' is oversized: CC=12, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3239,15 +1591,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:118:God - Function: conclusions' + - src/extractors/markdown-paths.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:39:God + Function: createMarkdownPathResolver' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: conclusionsByDiagnostic' - description: 'code2llm reports `God Function: conclusionsByDiagnostic` in `src/synthesis/code-change-plan.ts:122`. + title: 'Address code smell: God Function: createSemanticCandidateSet' + description: 'code2llm reports `God Function: createSemanticCandidateSet` in `src/semantic/reranker/candidate.ts:16`. - Function ''conclusionsByDiagnostic'' is oversized: CC=7, fan-out=18, mutations=0. + Function ''createSemanticCandidateSet'' is oversized: CC=8, fan-out=17, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3258,15 +1610,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:122:God - Function: conclusionsByDiagnostic' + - src/semantic/reranker/candidate.ts + dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/candidate.ts:16:God + Function: createSemanticCandidateSet' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: configurationRecords' - description: 'code2llm reports `God Function: configurationRecords` in `src/extractors/configuration.ts:41`. + title: 'Address code smell: God Function: createSemanticRerankResult' + description: 'code2llm reports `God Function: createSemanticRerankResult` in `src/semantic/reranker/result.ts:23`. - Function ''configurationRecords'' is oversized: CC=4, fan-out=12, mutations=0. + Function ''createSemanticRerankResult'' is oversized: CC=4, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3277,15 +1629,15 @@ tickets: - code-smell - god-function files: - - src/extractors/configuration.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/configuration.ts:41:God - Function: configurationRecords' + - src/semantic/reranker/result.ts + dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/result.ts:23:God + Function: createSemanticRerankResult' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createCodeChangeReviewPatch' - description: 'code2llm reports `God Function: createCodeChangeReviewPatch` in `src/synthesis/code-change-plan.ts:547`. + title: 'Address code smell: God Function: createTodoPatch' + description: 'code2llm reports `God Function: createTodoPatch` in `src/synthesis/todo-patch.ts:69`. - Function ''createCodeChangeReviewPatch'' is oversized: CC=6, fan-out=15, mutations=0. + Function ''createTodoPatch'' is oversized: CC=8, fan-out=20, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3296,15 +1648,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:547:God - Function: createCodeChangeReviewPatch' + - src/synthesis/todo-patch.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:69:God Function: + createTodoPatch' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createCodeChangeSourcePatch' - description: 'code2llm reports `God Function: createCodeChangeSourcePatch` in `src/synthesis/code-change-plan.ts:698`. + title: 'Address code smell: God Function: decodeDelimitedFields' + description: 'code2llm reports `God Function: decodeDelimitedFields` in `src/communication/intake-protobuf.ts:69`. - Function ''createCodeChangeSourcePatch'' is oversized: CC=13, fan-out=20, mutations=0. + Function ''decodeDelimitedFields'' is oversized: CC=13, fan-out=7, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3315,16 +1667,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:698:God - Function: createCodeChangeSourcePatch' + - src/communication/intake-protobuf.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:69:God + Function: decodeDelimitedFields' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createCodeChangeSourcePatchSet' - description: 'code2llm reports `God Function: createCodeChangeSourcePatchSet` in - `src/synthesis/code-change-plan.ts:759`. + title: 'Address code smell: God Function: decode_chunked' + description: 'code2llm reports `God Function: decode_chunked` in `sdk/rust/src/client.rs:189`. - Function ''createCodeChangeSourcePatchSet'' is oversized: CC=8, fan-out=11, mutations=0. + Function ''decode_chunked'' is oversized: CC=7, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3335,15 +1686,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:759:God - Function: createCodeChangeSourcePatchSet' + - sdk/rust/src/client.rs + dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:189:God Function: + decode_chunked' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createMarkdownPathResolver' - description: 'code2llm reports `God Function: createMarkdownPathResolver` in `src/extractors/markdown-paths.ts:33`. + title: 'Address code smell: God Function: diagnoseGraph' + description: 'code2llm reports `God Function: diagnoseGraph` in `src/graph/diagnostics.ts:16`. - Function ''createMarkdownPathResolver'' is oversized: CC=12, fan-out=12, mutations=0. + Function ''diagnoseGraph'' is oversized: CC=6, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3354,15 +1705,15 @@ tickets: - code-smell - god-function files: - - src/extractors/markdown-paths.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:33:God - Function: createMarkdownPathResolver' + - src/graph/diagnostics.ts + dedupe_key: 'code2llm:smell:god_function:src/graph/diagnostics.ts:16:God Function: + diagnoseGraph' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createSemanticCandidateSet' - description: 'code2llm reports `God Function: createSemanticCandidateSet` in `src/semantic/reranker.ts:113`. + title: 'Address code smell: God Function: diffIntentGraphs' + description: 'code2llm reports `God Function: diffIntentGraphs` in `src/graph/diff.ts:16`. - Function ''createSemanticCandidateSet'' is oversized: CC=8, fan-out=17, mutations=0. + Function ''diffIntentGraphs'' is oversized: CC=11, fan-out=19, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3373,15 +1724,14 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:113:God Function: - createSemanticCandidateSet' + - src/graph/diff.ts + dedupe_key: 'code2llm:smell:god_function:src/graph/diff.ts:16:God Function: diffIntentGraphs' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createSemanticRerankResult' - description: 'code2llm reports `God Function: createSemanticRerankResult` in `src/semantic/reranker.ts:251`. + title: 'Address code smell: God Function: encode_envelope' + description: 'code2llm reports `God Function: encode_envelope` in `src/interfaces/intake_cli.py:55`. - Function ''createSemanticRerankResult'' is oversized: CC=4, fan-out=11, mutations=0. + Function ''encode_envelope'' is oversized: CC=6, fan-out=11, mutations=11. Make the smallest refactor that removes the smell and run local tests.' @@ -3392,15 +1742,15 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:251:God Function: - createSemanticRerankResult' + - src/interfaces/intake_cli.py + dedupe_key: 'code2llm:smell:god_function:src/interfaces/intake_cli.py:55:God Function: + encode_envelope' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: createTodoPatch' - description: 'code2llm reports `God Function: createTodoPatch` in `src/synthesis/todo-patch.ts:69`. + title: 'Address code smell: God Function: enrichBatchCovering' + description: 'code2llm reports `God Function: enrichBatchCovering` in `src/extractors/markdown-llm-helpers.ts:112`. - Function ''createTodoPatch'' is oversized: CC=8, fan-out=20, mutations=0. + Function ''enrichBatchCovering'' is oversized: CC=6, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3411,15 +1761,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/todo-patch.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:69:God Function: - createTodoPatch' + - src/extractors/markdown-llm-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm-helpers.ts:112:God + Function: enrichBatchCovering' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: decode_chunked' - description: 'code2llm reports `God Function: decode_chunked` in `sdk/rust/src/client.rs:189`. + title: 'Address code smell: God Function: enrichMarkdownRecords' + description: 'code2llm reports `God Function: enrichMarkdownRecords` in `src/extractors/markdown-llm-helpers.ts:57`. - Function ''decode_chunked'' is oversized: CC=7, fan-out=12, mutations=0. + Function ''enrichMarkdownRecords'' is oversized: CC=13, fan-out=9, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3430,15 +1780,15 @@ tickets: - code-smell - god-function files: - - sdk/rust/src/client.rs - dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:189:God Function: - decode_chunked' + - src/extractors/markdown-llm-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm-helpers.ts:57:God + Function: enrichMarkdownRecords' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: diffIntentGraphs' - description: 'code2llm reports `God Function: diffIntentGraphs` in `src/graph/diff.ts:16`. + title: 'Address code smell: God Function: enrichRecord' + description: 'code2llm reports `God Function: enrichRecord` in `src/extractors/markdown-llm-helpers.ts:274`. - Function ''diffIntentGraphs'' is oversized: CC=11, fan-out=19, mutations=0. + Function ''enrichRecord'' is oversized: CC=14, fan-out=4, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3449,14 +1799,15 @@ tickets: - code-smell - god-function files: - - src/graph/diff.ts - dedupe_key: 'code2llm:smell:god_function:src/graph/diff.ts:16:God Function: diffIntentGraphs' + - src/extractors/markdown-llm-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm-helpers.ts:274:God + Function: enrichRecord' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: enrichBatchCovering' - description: 'code2llm reports `God Function: enrichBatchCovering` in `src/extractors/markdown-llm.ts:161`. + title: 'Address code smell: God Function: evaluateDiagnosticsCase' + description: 'code2llm reports `God Function: evaluateDiagnosticsCase` in `src/evaluation/gold-cases.ts:277`. - Function ''enrichBatchCovering'' is oversized: CC=8, fan-out=11, mutations=0. + Function ''evaluateDiagnosticsCase'' is oversized: CC=6, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3467,15 +1818,15 @@ tickets: - code-smell - god-function files: - - src/extractors/markdown-llm.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm.ts:161:God - Function: enrichBatchCovering' + - src/evaluation/gold-cases.ts + dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:277:God Function: + evaluateDiagnosticsCase' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: enrichRecord' - description: 'code2llm reports `God Function: enrichRecord` in `src/extractors/markdown-llm.ts:359`. + title: 'Address code smell: God Function: evaluateDsl2TodoCase' + description: 'code2llm reports `God Function: evaluateDsl2TodoCase` in `src/evaluation/gold-cases.ts:305`. - Function ''enrichRecord'' is oversized: CC=14, fan-out=4, mutations=0. + Function ''evaluateDsl2TodoCase'' is oversized: CC=5, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3486,15 +1837,15 @@ tickets: - code-smell - god-function files: - - src/extractors/markdown-llm.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm.ts:359:God - Function: enrichRecord' + - src/evaluation/gold-cases.ts + dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:305:God Function: + evaluateDsl2TodoCase' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: evaluateCodeChangeAcceptance' - description: 'code2llm reports `God Function: evaluateCodeChangeAcceptance` in `src/synthesis/code-change-plan.ts:224`. + title: 'Address code smell: God Function: evaluateRerankingCase' + description: 'code2llm reports `God Function: evaluateRerankingCase` in `src/evaluation/gold-cases.ts:71`. - Function ''evaluateCodeChangeAcceptance'' is oversized: CC=9, fan-out=18, mutations=0. + Function ''evaluateRerankingCase'' is oversized: CC=1, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3505,15 +1856,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:224:God - Function: evaluateCodeChangeAcceptance' + - src/evaluation/gold-cases.ts + dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:71:God Function: + evaluateRerankingCase' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: evaluateDiagnosticsCase' - description: 'code2llm reports `God Function: evaluateDiagnosticsCase` in `src/evaluation/gold-cases.ts:182`. + title: 'Address code smell: God Function: exchange' + description: 'code2llm reports `God Function: exchange` in `sdk/rust/src/client.rs:125`. - Function ''evaluateDiagnosticsCase'' is oversized: CC=6, fan-out=13, mutations=0. + Function ''exchange'' is oversized: CC=10, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3524,15 +1875,17 @@ tickets: - code-smell - god-function files: - - src/evaluation/gold-cases.ts - dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:182:God Function: - evaluateDiagnosticsCase' + - sdk/rust/src/client.rs + dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:125:God Function: + exchange' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: evaluateDsl2TodoCase' - description: 'code2llm reports `God Function: evaluateDsl2TodoCase` in `src/evaluation/gold-cases.ts:210`. + title: 'Address code smell: God Function: executeAnalyzeCommunicationAction' + description: 'code2llm reports `God Function: executeAnalyzeCommunicationAction` + in `src/services/actions.ts:158`. - Function ''evaluateDsl2TodoCase'' is oversized: CC=5, fan-out=13, mutations=0. + Function ''executeAnalyzeCommunicationAction'' is oversized: CC=4, fan-out=18, + mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3543,15 +1896,15 @@ tickets: - code-smell - god-function files: - - src/evaluation/gold-cases.ts - dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cases.ts:210:God Function: - evaluateDsl2TodoCase' + - src/services/actions.ts + dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:158:God Function: + executeAnalyzeCommunicationAction' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: exchange' - description: 'code2llm reports `God Function: exchange` in `sdk/rust/src/client.rs:125`. + title: 'Address code smell: God Function: executeCloseCodeChangeAction' + description: 'code2llm reports `God Function: executeCloseCodeChangeAction` in `src/services/actions.ts:413`. - Function ''exchange'' is oversized: CC=10, fan-out=15, mutations=0. + Function ''executeCloseCodeChangeAction'' is oversized: CC=13, fan-out=6, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3562,15 +1915,15 @@ tickets: - code-smell - god-function files: - - sdk/rust/src/client.rs - dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:125:God Function: - exchange' + - src/services/actions.ts + dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:413:God Function: + executeCloseCodeChangeAction' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: extensions' - description: 'code2llm reports `God Function: extensions` in `src/core/io.ts:89`. + title: 'Address code smell: God Function: executePipelineAction' + description: 'code2llm reports `God Function: executePipelineAction` in `src/services/actions.ts:556`. - Function ''extensions'' is oversized: CC=11, fan-out=16, mutations=0. + Function ''executePipelineAction'' is oversized: CC=1, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3581,8 +1934,9 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:89:God Function: extensions' + - src/services/actions.ts + dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:556:God Function: + executePipelineAction' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractAstIntent' description: 'code2llm reports `God Function: extractAstIntent` in `src/extractors/ast.ts:23`. @@ -3624,7 +1978,7 @@ tickets: - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractCommunicationIntentAudited' description: 'code2llm reports `God Function: extractCommunicationIntentAudited` - in `src/communication/llm.ts:86`. + in `src/communication/llm/implementation.ts:63`. Function ''extractCommunicationIntentAudited'' is oversized: CC=12, fan-out=23, @@ -3639,9 +1993,27 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:86:God Function: - extractCommunicationIntentAudited' + - src/communication/llm/implementation.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation.ts:63:God + Function: extractCommunicationIntentAudited' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: extractConventionalAction' + description: 'code2llm reports `God Function: extractConventionalAction` in `src/core/text.ts:83`. + + + Function ''extractConventionalAction'' is oversized: CC=14, fan-out=2, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/core/text.ts + dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:83:God Function: extractConventionalAction' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractDocumentationIntent' description: 'code2llm reports `God Function: extractDocumentationIntent` in `src/extractors/docs-llm.ts:45`. @@ -3662,11 +2034,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/docs-llm.ts:45:God Function: extractDocumentationIntent' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: extractGitIntent' - description: 'code2llm reports `God Function: extractGitIntent` in `src/extractors/git.ts:31`. + title: 'Address code smell: God Function: extractMarkdownIntentAudited' + description: 'code2llm reports `God Function: extractMarkdownIntentAudited` in `src/extractors/markdown-llm.ts:34`. - Function ''extractGitIntent'' is oversized: CC=13, fan-out=21, mutations=0. + Function ''extractMarkdownIntentAudited'' is oversized: CC=9, fan-out=14, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3677,9 +2049,9 @@ tickets: - code-smell - god-function files: - - src/extractors/git.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/git.ts:31:God Function: - extractGitIntent' + - src/extractors/markdown-llm.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-llm.ts:34:God Function: + extractMarkdownIntentAudited' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractNlIntent' description: 'code2llm reports `God Function: extractNlIntent` in `src/extractors/nl.ts:38`. @@ -3700,7 +2072,7 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:38:God Function: extractNlIntent' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractNlIntentAudited' - description: 'code2llm reports `God Function: extractNlIntentAudited` in `src/extractors/nl-llm.ts:53`. + description: 'code2llm reports `God Function: extractNlIntentAudited` in `src/extractors/nl-llm.ts:33`. Function ''extractNlIntentAudited'' is oversized: CC=10, fan-out=22, mutations=0. @@ -3715,7 +2087,7 @@ tickets: - god-function files: - src/extractors/nl-llm.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/nl-llm.ts:53:God Function: + dedupe_key: 'code2llm:smell:god_function:src/extractors/nl-llm.ts:33:God Function: extractNlIntentAudited' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractPhpAst' @@ -3755,9 +2127,47 @@ tickets: - src/extractors/ast/python.ts dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/python.ts:11:God Function: extractPythonAst' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: extractRepositoryGitIntent' + description: 'code2llm reports `God Function: extractRepositoryGitIntent` in `src/extractors/git.ts:74`. + + + Function ''extractRepositoryGitIntent'' is oversized: CC=11, fan-out=21, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/git.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/git.ts:74:God Function: + extractRepositoryGitIntent' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: extractRuntimeCycleIntent' + description: 'code2llm reports `God Function: extractRuntimeCycleIntent` in `src/extractors/runtime-cycle.ts:29`. + + + Function ''extractRuntimeCycleIntent'' is oversized: CC=8, fan-out=12, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/runtime-cycle.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/runtime-cycle.ts:29:God + Function: extractRuntimeCycleIntent' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractSymbols' - description: 'code2llm reports `God Function: extractSymbols` in `src/core/text.ts:412`. + description: 'code2llm reports `God Function: extractSymbols` in `src/core/text.ts:459`. Function ''extractSymbols'' is oversized: CC=7, fan-out=15, mutations=0. @@ -3772,7 +2182,7 @@ tickets: - god-function files: - src/core/text.ts - dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:412:God Function: extractSymbols' + dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:459:God Function: extractSymbols' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: extractTodo' description: 'code2llm reports `God Function: extractTodo` in `src/extractors/todo.ts:19`. @@ -3792,6 +2202,25 @@ tickets: - src/extractors/todo.ts dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:19:God Function: extractTodo' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: files' + description: 'code2llm reports `God Function: files` in `src/interfaces/a2a-run-list-item.ts:43`. + + + Function ''files'' is oversized: CC=7, fan-out=11, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/interfaces/a2a-run-list-item.ts + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-run-list-item.ts:43:God + Function: files' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: files' description: 'code2llm reports `God Function: files` in `scripts/verify-module-boundaries.mjs:6`. @@ -3851,7 +2280,7 @@ tickets: Function: graph' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: handleCommunication' - description: 'code2llm reports `God Function: handleCommunication` in `src/cli.ts:583`. + description: 'code2llm reports `God Function: handleCommunication` in `src/cli.ts:666`. Function ''handleCommunication'' is oversized: CC=11, fan-out=18, mutations=0. @@ -3866,13 +2295,13 @@ tickets: - god-function files: - src/cli.ts - dedupe_key: 'code2llm:smell:god_function:src/cli.ts:583:God Function: handleCommunication' + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:666:God Function: handleCommunication' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: handleReality' - description: 'code2llm reports `God Function: handleReality` in `src/cli.ts:492`. + title: 'Address code smell: God Function: handleDiff' + description: 'code2llm reports `God Function: handleDiff` in `src/cli.ts:468`. - Function ''handleReality'' is oversized: CC=9, fan-out=12, mutations=0. + Function ''handleDiff'' is oversized: CC=9, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3884,13 +2313,13 @@ tickets: - god-function files: - src/cli.ts - dedupe_key: 'code2llm:smell:god_function:src/cli.ts:492:God Function: handleReality' + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:468:God Function: handleDiff' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: handleWatch' - description: 'code2llm reports `God Function: handleWatch` in `src/cli.ts:366`. + title: 'Address code smell: God Function: handleGraphDiff' + description: 'code2llm reports `God Function: handleGraphDiff` in `src/cli.ts:494`. - Function ''handleWatch'' is oversized: CC=6, fan-out=18, mutations=0. + Function ''handleGraphDiff'' is oversized: CC=7, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3902,13 +2331,13 @@ tickets: - god-function files: - src/cli.ts - dedupe_key: 'code2llm:smell:god_function:src/cli.ts:366:God Function: handleWatch' + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:494:God Function: handleGraphDiff' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: ignored' - description: 'code2llm reports `God Function: ignored` in `src/core/io.ts:88`. + title: 'Address code smell: God Function: handleIntake' + description: 'code2llm reports `God Function: handleIntake` in `src/cli.ts:706`. - Function ''ignored'' is oversized: CC=11, fan-out=16, mutations=0. + Function ''handleIntake'' is oversized: CC=13, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -3919,8 +2348,44 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:88:God Function: ignored' + - src/cli.ts + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:706:God Function: handleIntake' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: handleReality' + description: 'code2llm reports `God Function: handleReality` in `src/cli.ts:551`. + + + Function ''handleReality'' is oversized: CC=9, fan-out=12, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/cli.ts + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:551:God Function: handleReality' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: handleWatch' + description: 'code2llm reports `God Function: handleWatch` in `src/cli.ts:346`. + + + Function ''handleWatch'' is oversized: CC=1, fan-out=11, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/cli.ts + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:346:God Function: handleWatch' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: index' description: 'code2llm reports `God Function: index` in `src/diff/text-render.ts:43`. @@ -3942,7 +2407,7 @@ tickets: index' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: indexModuleAnchors' - description: 'code2llm reports `God Function: indexModuleAnchors` in `src/diff/reality.ts:308`. + description: 'code2llm reports `God Function: indexModuleAnchors` in `src/diff/reality.ts:324`. Function ''indexModuleAnchors'' is oversized: CC=12, fan-out=11, mutations=0. @@ -3957,10 +2422,10 @@ tickets: - god-function files: - src/diff/reality.ts - dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:308:God Function: indexModuleAnchors' + dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:324:God Function: indexModuleAnchors' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: indexResolvableBasenames' - description: 'code2llm reports `God Function: indexResolvableBasenames` in `src/graph/linker.ts:298`. + description: 'code2llm reports `God Function: indexResolvableBasenames` in `src/graph/linker.ts:94`. Function ''indexResolvableBasenames'' is oversized: CC=8, fan-out=13, mutations=0. @@ -3975,10 +2440,10 @@ tickets: - god-function files: - src/graph/linker.ts - dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:298:God Function: indexResolvableBasenames' + dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:94:God Function: indexResolvableBasenames' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: isPathLike' - description: 'code2llm reports `God Function: isPathLike` in `src/core/text.ts:361`. + description: 'code2llm reports `God Function: isPathLike` in `src/core/text.ts:408`. Function ''isPathLike'' is oversized: CC=13, fan-out=12, mutations=0. @@ -3993,13 +2458,13 @@ tickets: - god-function files: - src/core/text.ts - dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:361:God Function: isPathLike' + dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:408:God Function: isPathLike' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: lines' - description: 'code2llm reports `God Function: lines` in `src/extractors/todo.ts:32`. + description: 'code2llm reports `God Function: lines` in `src/extractors/changelog.ts:30`. - Function ''lines'' is oversized: CC=5, fan-out=20, mutations=0. + Function ''lines'' is oversized: CC=7, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4010,15 +2475,15 @@ tickets: - code-smell - god-function files: - - src/extractors/todo.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:32:God Function: + - src/extractors/changelog.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:30:God Function: lines' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: lines' - description: 'code2llm reports `God Function: lines` in `src/extractors/changelog.ts:30`. + description: 'code2llm reports `God Function: lines` in `src/extractors/todo.ts:32`. - Function ''lines'' is oversized: CC=7, fan-out=15, mutations=0. + Function ''lines'' is oversized: CC=5, fan-out=20, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4029,12 +2494,12 @@ tickets: - code-smell - god-function files: - - src/extractors/changelog.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:30:God Function: + - src/extractors/todo.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:32:God Function: lines' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: linkIntentRecords' - description: 'code2llm reports `God Function: linkIntentRecords` in `src/graph/linker.ts:73`. + description: 'code2llm reports `God Function: linkIntentRecords` in `src/graph/linker.ts:32`. Function ''linkIntentRecords'' is oversized: CC=5, fan-out=22, mutations=0. @@ -4049,10 +2514,10 @@ tickets: - god-function files: - src/graph/linker.ts - dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:73:God Function: linkIntentRecords' + dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:32:God Function: linkIntentRecords' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: listAvailableModels' - description: 'code2llm reports `God Function: listAvailableModels` in `src/llm/openrouter.ts:58`. + description: 'code2llm reports `God Function: listAvailableModels` in `src/llm/openrouter.ts:44`. Function ''listAvailableModels'' is oversized: CC=13, fan-out=16, mutations=0. @@ -4067,11 +2532,11 @@ tickets: - god-function files: - src/llm/openrouter.ts - dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:58:God Function: + dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:44:God Function: listAvailableModels' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: listIntentRuns' - description: 'code2llm reports `God Function: listIntentRuns` in `src/interfaces/a2a-history.ts:51`. + description: 'code2llm reports `God Function: listIntentRuns` in `src/interfaces/a2a-history.ts:25`. Function ''listIntentRuns'' is oversized: CC=2, fan-out=13, mutations=0. @@ -4086,11 +2551,11 @@ tickets: - god-function files: - src/interfaces/a2a-history.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:51:God Function: + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:25:God Function: listIntentRuns' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: listTasks' - description: 'code2llm reports `God Function: listTasks` in `src/interfaces/a2a-task-store.ts:397`. + description: 'code2llm reports `God Function: listTasks` in `src/interfaces/a2a-task-store.ts:444`. Function ''listTasks'' is oversized: CC=9, fan-out=14, mutations=0. @@ -4105,27 +2570,8 @@ tickets: - god-function files: - src/interfaces/a2a-task-store.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-task-store.ts:397:God + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-task-store.ts:444:God Function: listTasks' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: llm' - description: 'code2llm reports `God Function: llm` in `src/interfaces/a2a-history.ts:116`. - - - Function ''llm'' is oversized: CC=14, fan-out=8, mutations=0. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/interfaces/a2a-history.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:116:God Function: - llm' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: loadEnvFile' description: 'code2llm reports `God Function: loadEnvFile` in `src/config/env.ts:76`. @@ -4146,7 +2592,7 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/config/env.ts:76:God Function: loadEnvFile' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: loadRuns' - description: 'code2llm reports `God Function: loadRuns` in `src/web/diff-ui.ts:43`. + description: 'code2llm reports `God Function: loadRuns` in `src/web/diff-ui-script.ts:9`. Function ''loadRuns'' is oversized: CC=12, fan-out=14, mutations=0. @@ -4160,8 +2606,9 @@ tickets: - code-smell - god-function files: - - src/web/diff-ui.ts - dedupe_key: 'code2llm:smell:god_function:src/web/diff-ui.ts:43:God Function: loadRuns' + - src/web/diff-ui-script.ts + dedupe_key: 'code2llm:smell:god_function:src/web/diff-ui-script.ts:9:God Function: + loadRuns' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: local' description: 'code2llm reports `God Function: local` in `scripts/verify-env-contract.mjs:52`. @@ -4183,10 +2630,10 @@ tickets: Function: local' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `src/evaluation/gold-cli.ts:11`. + description: 'code2llm reports `God Function: main` in `rust-ast/src/main.rs:36`. - Function ''main'' is oversized: CC=12, fan-out=15, mutations=0. + Function ''main'' is oversized: CC=6, fan-out=21, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4197,15 +2644,14 @@ tickets: - code-smell - god-function files: - - src/evaluation/gold-cli.ts - dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cli.ts:11:God Function: - main' + - rust-ast/src/main.rs + dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:36:God Function: main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `scripts/live-model-comparison.mjs:27`. + description: 'code2llm reports `God Function: main` in `java/JavaAstExtract.java:21`. - Function ''main'' is oversized: CC=13, fan-out=22, mutations=0. + Function ''main'' is oversized: CC=10, fan-out=16, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4216,15 +2662,15 @@ tickets: - code-smell - god-function files: - - scripts/live-model-comparison.mjs - dedupe_key: 'code2llm:smell:god_function:scripts/live-model-comparison.mjs:27:God - Function: main' + - java/JavaAstExtract.java + dedupe_key: 'code2llm:smell:god_function:java/JavaAstExtract.java:21:God Function: + main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `scripts/live-contract-check.mjs:41`. + description: 'code2llm reports `God Function: main` in `src/cli.ts:61`. - Function ''main'' is oversized: CC=5, fan-out=16, mutations=0. + Function ''main'' is oversized: CC=9, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4235,15 +2681,14 @@ tickets: - code-smell - god-function files: - - scripts/live-contract-check.mjs - dedupe_key: 'code2llm:smell:god_function:scripts/live-contract-check.mjs:41:God - Function: main' + - src/cli.ts + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:61:God Function: main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `rust-ast/src/main.rs:36`. + description: 'code2llm reports `God Function: main` in `src/evaluation/gold-cli.ts:11`. - Function ''main'' is oversized: CC=6, fan-out=21, mutations=0. + Function ''main'' is oversized: CC=12, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4254,14 +2699,15 @@ tickets: - code-smell - god-function files: - - rust-ast/src/main.rs - dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:36:God Function: main' + - src/evaluation/gold-cli.ts + dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-cli.ts:11:God Function: + main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `python/ast_extract.py:195`. + description: 'code2llm reports `God Function: main` in `golang/ast_extract.go:53`. - Function ''main'' is oversized: CC=4, fan-out=19, mutations=12. + Function ''main'' is oversized: CC=14, fan-out=14, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4272,15 +2718,15 @@ tickets: - code-smell - god-function files: - - python/ast_extract.py - dedupe_key: 'code2llm:smell:god_function:python/ast_extract.py:195:God Function: + - golang/ast_extract.go + dedupe_key: 'code2llm:smell:god_function:golang/ast_extract.go:53:God Function: main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `java/JavaAstExtract.java:21`. + description: 'code2llm reports `God Function: main` in `scripts/live-model-comparison.mjs:27`. - Function ''main'' is oversized: CC=10, fan-out=16, mutations=0. + Function ''main'' is oversized: CC=13, fan-out=22, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4291,15 +2737,15 @@ tickets: - code-smell - god-function files: - - java/JavaAstExtract.java - dedupe_key: 'code2llm:smell:god_function:java/JavaAstExtract.java:21:God Function: - main' + - scripts/live-model-comparison.mjs + dedupe_key: 'code2llm:smell:god_function:scripts/live-model-comparison.mjs:27:God + Function: main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: main' - description: 'code2llm reports `God Function: main` in `golang/ast_extract.go:53`. + description: 'code2llm reports `God Function: main` in `scripts/live-contract-check.mjs:41`. - Function ''main'' is oversized: CC=14, fan-out=14, mutations=0. + Function ''main'' is oversized: CC=5, fan-out=16, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4310,15 +2756,15 @@ tickets: - code-smell - god-function files: - - golang/ast_extract.go - dedupe_key: 'code2llm:smell:god_function:golang/ast_extract.go:53:God Function: - main' + - scripts/live-contract-check.mjs + dedupe_key: 'code2llm:smell:god_function:scripts/live-contract-check.mjs:41:God + Function: main' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: matcher' - description: 'code2llm reports `God Function: matcher` in `src/core/io.ts:91`. + title: 'Address code smell: God Function: main' + description: 'code2llm reports `God Function: main` in `python/ast_extract.py:195`. - Function ''matcher'' is oversized: CC=11, fan-out=16, mutations=0. + Function ''main'' is oversized: CC=4, fan-out=19, mutations=12. Make the smallest refactor that removes the smell and run local tests.' @@ -4329,11 +2775,12 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:91:God Function: matcher' + - python/ast_extract.py + dedupe_key: 'code2llm:smell:god_function:python/ast_extract.py:195:God Function: + main' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: matchesRunFilters' - description: 'code2llm reports `God Function: matchesRunFilters` in `src/interfaces/a2a-history.ts:192`. + description: 'code2llm reports `God Function: matchesRunFilters` in `src/interfaces/a2a-history.ts:77`. Function ''matchesRunFilters'' is oversized: CC=13, fan-out=4, mutations=0. @@ -4348,11 +2795,11 @@ tickets: - god-function files: - src/interfaces/a2a-history.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:192:God Function: + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:77:God Function: matchesRunFilters' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: materializeSyntheses' - description: 'code2llm reports `God Function: materializeSyntheses` in `src/communication/llm.ts:296`. + description: 'code2llm reports `God Function: materializeSyntheses` in `src/communication/llm/implementation-helpers.ts:127`. Function ''materializeSyntheses'' is oversized: CC=9, fan-out=14, mutations=0. @@ -4366,9 +2813,9 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:296:God Function: - materializeSyntheses' + - src/communication/llm/implementation-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:127:God + Function: materializeSyntheses' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: materializeTaskSynthesisResponse' description: 'code2llm reports `God Function: materializeTaskSynthesisResponse` @@ -4409,11 +2856,11 @@ tickets: - src/watch/watcher.ts dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:38:God Function: maxFiles' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: maxFiles' - description: 'code2llm reports `God Function: maxFiles` in `src/core/io.ts:90`. + title: 'Address code smell: God Function: measureStage' + description: 'code2llm reports `God Function: measureStage` in `src/live/contract-check.ts:115`. - Function ''maxFiles'' is oversized: CC=11, fan-out=16, mutations=0. + Function ''measureStage'' is oversized: CC=14, fan-out=3, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4424,14 +2871,15 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:90:God Function: maxFiles' + - src/live/contract-check.ts + dedupe_key: 'code2llm:smell:god_function:src/live/contract-check.ts:115:God Function: + measureStage' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: measureStage' - description: 'code2llm reports `God Function: measureStage` in `src/live/contract-check.ts:115`. + title: 'Address code smell: God Function: moduleRecords' + description: 'code2llm reports `God Function: moduleRecords` in `src/extractors/ast/records.ts:34`. - Function ''measureStage'' is oversized: CC=14, fan-out=3, mutations=0. + Function ''moduleRecords'' is oversized: CC=6, fan-out=14, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4442,15 +2890,17 @@ tickets: - code-smell - god-function files: - - src/live/contract-check.ts - dedupe_key: 'code2llm:smell:god_function:src/live/contract-check.ts:115:God Function: - measureStage' + - src/extractors/ast/records.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/records.ts:34:God Function: + moduleRecords' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: moduleRecords' - description: 'code2llm reports `God Function: moduleRecords` in `src/extractors/ast/records.ts:34`. + title: 'Address code smell: God Function: normalizeParticipantIdentityRegistry' + description: 'code2llm reports `God Function: normalizeParticipantIdentityRegistry` + in `src/communication/identity.ts:53`. - Function ''moduleRecords'' is oversized: CC=6, fan-out=14, mutations=0. + Function ''normalizeParticipantIdentityRegistry'' is oversized: CC=12, fan-out=12, + mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4461,9 +2911,28 @@ tickets: - code-smell - god-function files: - - src/extractors/ast/records.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/records.ts:34:God Function: - moduleRecords' + - src/communication/identity.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/identity.ts:53:God Function: + normalizeParticipantIdentityRegistry' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: numbers' + description: 'code2llm reports `God Function: numbers` in `src/communication/intake-protobuf.ts:77`. + + + Function ''numbers'' is oversized: CC=13, fan-out=7, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/communication/intake-protobuf.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:77:God + Function: numbers' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: object' description: 'code2llm reports `God Function: object` in `src/llm/structured-schema.ts:155`. @@ -4483,9 +2952,28 @@ tickets: - src/llm/structured-schema.ts dedupe_key: 'code2llm:smell:god_function:src/llm/structured-schema.ts:155:God Function: object' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: offset' + description: 'code2llm reports `God Function: offset` in `src/communication/intake-protobuf.ts:79`. + + + Function ''offset'' is oversized: CC=13, fan-out=7, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/communication/intake-protobuf.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:79:God + Function: offset' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: options' - description: 'code2llm reports `God Function: options` in `src/cli.ts:668`. + description: 'code2llm reports `God Function: options` in `src/cli.ts:781`. Function ''options'' is oversized: CC=13, fan-out=5, mutations=0. @@ -4500,10 +2988,10 @@ tickets: - god-function files: - src/cli.ts - dedupe_key: 'code2llm:smell:god_function:src/cli.ts:668:God Function: options' + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:781:God Function: options' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: output' - description: 'code2llm reports `God Function: output` in `src/communication/llm.ts:305`. + description: 'code2llm reports `God Function: output` in `src/communication/llm/implementation-helpers.ts:148`. Function ''output'' is oversized: CC=6, fan-out=11, mutations=0. @@ -4517,12 +3005,12 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:305:God Function: - output' + - src/communication/llm/implementation-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:148:God + Function: output' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: parseArgs' - description: 'code2llm reports `God Function: parseArgs` in `src/cli.ts:666`. + description: 'code2llm reports `God Function: parseArgs` in `src/cli.ts:779`. Function ''parseArgs'' is oversized: CC=13, fan-out=5, mutations=0. @@ -4537,7 +3025,7 @@ tickets: - god-function files: - src/cli.ts - dedupe_key: 'code2llm:smell:god_function:src/cli.ts:666:God Function: parseArgs' + dedupe_key: 'code2llm:smell:god_function:src/cli.ts:779:God Function: parseArgs' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: parseArgs' description: 'code2llm reports `God Function: parseArgs` in `scripts/research/rerank-embedding-shortlist.mjs:164`. @@ -4559,7 +3047,7 @@ tickets: Function: parseArgs' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: parse_args' - description: 'code2llm reports `God Function: parse_args` in `scripts/research/rank-intent-graph-embeddings.py:15`. + description: 'code2llm reports `God Function: parse_args` in `scripts/research/evaluate-embedding-pairs.py:14`. Function ''parse_args'' is oversized: CC=1, fan-out=3, mutations=8. @@ -4573,12 +3061,12 @@ tickets: - code-smell - god-function files: - - scripts/research/rank-intent-graph-embeddings.py - dedupe_key: 'code2llm:smell:god_function:scripts/research/rank-intent-graph-embeddings.py:15:God + - scripts/research/evaluate-embedding-pairs.py + dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:14:God Function: parse_args' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: parse_args' - description: 'code2llm reports `God Function: parse_args` in `scripts/research/evaluate-embedding-pairs.py:14`. + description: 'code2llm reports `God Function: parse_args` in `scripts/research/rank-intent-graph-embeddings.py:15`. Function ''parse_args'' is oversized: CC=1, fan-out=3, mutations=8. @@ -4592,8 +3080,8 @@ tickets: - code-smell - god-function files: - - scripts/research/evaluate-embedding-pairs.py - dedupe_key: 'code2llm:smell:god_function:scripts/research/evaluate-embedding-pairs.py:14:God + - scripts/research/rank-intent-graph-embeddings.py + dedupe_key: 'code2llm:smell:god_function:scripts/research/rank-intent-graph-embeddings.py:15:God Function: parse_args' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: parse_base_url' @@ -4614,28 +3102,9 @@ tickets: - sdk/rust/src/client.rs dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:172:God Function: parse_base_url' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: participant' - description: 'code2llm reports `God Function: participant` in `src/services/actions.ts:512`. - - - Function ''participant'' is oversized: CC=13, fan-out=4, mutations=0. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:512:God Function: - participant' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: participantGroups' - description: 'code2llm reports `God Function: participantGroups` in `src/communication/llm.ts:241`. + description: 'code2llm reports `God Function: participantGroups` in `src/communication/llm/implementation-helpers.ts:72`. Function ''participantGroups'' is oversized: CC=10, fan-out=12, mutations=0. @@ -4649,12 +3118,12 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:241:God Function: - participantGroups' + - src/communication/llm/implementation-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:72:God + Function: participantGroups' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: primaryTargetKey' - description: 'code2llm reports `God Function: primaryTargetKey` in `src/diff/reality.ts:379`. + description: 'code2llm reports `God Function: primaryTargetKey` in `src/diff/reality.ts:402`. Function ''primaryTargetKey'' is oversized: CC=14, fan-out=9, mutations=0. @@ -4669,32 +3138,13 @@ tickets: - god-function files: - src/diff/reality.ts - dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:379:God Function: primaryTargetKey' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: proposals' - description: 'code2llm reports `God Function: proposals` in `src/synthesis/code-change-plan.ts:119`. - - - Function ''proposals'' is oversized: CC=7, fan-out=18, mutations=0. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:119:God - Function: proposals' + dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:402:God Function: primaryTargetKey' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: proposalsByDiagnostic' - description: 'code2llm reports `God Function: proposalsByDiagnostic` in `src/synthesis/code-change-plan.ts:121`. + title: 'Address code smell: God Function: read' + description: 'code2llm reports `God Function: read` in `src/communication/intake-store.ts:60`. - Function ''proposalsByDiagnostic'' is oversized: CC=7, fan-out=18, mutations=0. + Function ''read'' is oversized: CC=11, fan-out=17, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4705,15 +3155,15 @@ tickets: - code-smell - god-function files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:121:God - Function: proposalsByDiagnostic' + - src/communication/intake-store.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-store.ts:60:God + Function: read' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: readCommunicationSummary' - description: 'code2llm reports `God Function: readCommunicationSummary` in `src/interfaces/a2a-history.ts:155`. + description: 'code2llm reports `God Function: readCommunicationSummary` in `src/interfaces/a2a-run-list-item.ts:112`. - Function ''readCommunicationSummary'' is oversized: CC=8, fan-out=12, mutations=0. + Function ''readCommunicationSummary'' is oversized: CC=8, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4724,15 +3174,15 @@ tickets: - code-smell - god-function files: - - src/interfaces/a2a-history.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:155:God Function: - readCommunicationSummary' + - src/interfaces/a2a-run-list-item.ts + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-run-list-item.ts:112:God + Function: readCommunicationSummary' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: records' - description: 'code2llm reports `God Function: records` in `src/services/actions.ts:517`. + title: 'Address code smell: God Function: registerRunArtifacts' + description: 'code2llm reports `God Function: registerRunArtifacts` in `src/services/actions.ts:792`. - Function ''records'' is oversized: CC=13, fan-out=4, mutations=0. + Function ''registerRunArtifacts'' is oversized: CC=7, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4744,33 +3194,14 @@ tickets: - god-function files: - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:517:God Function: - records' -- signal: code2llm_smell_god_function - title: 'Address code smell: God Function: recordsById' - description: 'code2llm reports `God Function: recordsById` in `src/synthesis/code-change-plan.ts:120`. - - - Function ''recordsById'' is oversized: CC=7, fan-out=18, mutations=0. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: normal - labels: - - llm-ready - - code2llm - - code-smell - - god-function - files: - - src/synthesis/code-change-plan.ts - dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan.ts:120:God - Function: recordsById' + dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:792:God Function: + registerRunArtifacts' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: registerRunArtifacts' - description: 'code2llm reports `God Function: registerRunArtifacts` in `src/services/actions.ts:686`. + title: 'Address code smell: God Function: relative' + description: 'code2llm reports `God Function: relative` in `src/extractors/changelog.ts:28`. - Function ''registerRunArtifacts'' is oversized: CC=7, fan-out=12, mutations=0. + Function ''relative'' is oversized: CC=7, fan-out=15, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4781,9 +3212,9 @@ tickets: - code-smell - god-function files: - - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:686:God Function: - registerRunArtifacts' + - src/extractors/changelog.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:28:God Function: + relative' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: relative' description: 'code2llm reports `God Function: relative` in `src/extractors/todo.ts:29`. @@ -4804,11 +3235,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:29:God Function: relative' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: relative' - description: 'code2llm reports `God Function: relative` in `src/extractors/changelog.ts:28`. + title: 'Address code smell: God Function: renderGraphDiffSvg' + description: 'code2llm reports `God Function: renderGraphDiffSvg` in `src/graph/diff.ts:110`. - Function ''relative'' is oversized: CC=7, fan-out=15, mutations=0. + Function ''renderGraphDiffSvg'' is oversized: CC=7, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4819,15 +3250,14 @@ tickets: - code-smell - god-function files: - - src/extractors/changelog.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/changelog.ts:28:God Function: - relative' + - src/graph/diff.ts + dedupe_key: 'code2llm:smell:god_function:src/graph/diff.ts:110:God Function: renderGraphDiffSvg' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: renderGraphDiffSvg' - description: 'code2llm reports `God Function: renderGraphDiffSvg` in `src/graph/diff.ts:110`. + title: 'Address code smell: God Function: renderLiveReport' + description: 'code2llm reports `God Function: renderLiveReport` in `src/live/contract-check.ts:277`. - Function ''renderGraphDiffSvg'' is oversized: CC=7, fan-out=12, mutations=0. + Function ''renderLiveReport'' is oversized: CC=14, fan-out=5, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4838,14 +3268,15 @@ tickets: - code-smell - god-function files: - - src/graph/diff.ts - dedupe_key: 'code2llm:smell:god_function:src/graph/diff.ts:110:God Function: renderGraphDiffSvg' + - src/live/contract-check.ts + dedupe_key: 'code2llm:smell:god_function:src/live/contract-check.ts:277:God Function: + renderLiveReport' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: renderLiveReport' - description: 'code2llm reports `God Function: renderLiveReport` in `src/live/contract-check.ts:277`. + title: 'Address code smell: God Function: renderRealitySvg' + description: 'code2llm reports `God Function: renderRealitySvg` in `src/diff/reality.ts:528`. - Function ''renderLiveReport'' is oversized: CC=14, fan-out=5, mutations=0. + Function ''renderRealitySvg'' is oversized: CC=9, fan-out=16, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4856,9 +3287,8 @@ tickets: - code-smell - god-function files: - - src/live/contract-check.ts - dedupe_key: 'code2llm:smell:god_function:src/live/contract-check.ts:277:God Function: - renderLiveReport' + - src/diff/reality.ts + dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:528:God Function: renderRealitySvg' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: renderTextDiffSvg' description: 'code2llm reports `God Function: renderTextDiffSvg` in `src/diff/text-render.ts:70`. @@ -4880,7 +3310,7 @@ tickets: renderTextDiffSvg' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: repositoryRoot' - description: 'code2llm reports `God Function: repositoryRoot` in `src/extractors/markdown-paths.ts:34`. + description: 'code2llm reports `God Function: repositoryRoot` in `src/extractors/markdown-paths.ts:40`. Function ''repositoryRoot'' is oversized: CC=11, fan-out=11, mutations=0. @@ -4895,7 +3325,7 @@ tickets: - god-function files: - src/extractors/markdown-paths.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:34:God + dedupe_key: 'code2llm:smell:god_function:src/extractors/markdown-paths.ts:40:God Function: repositoryRoot' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: request' @@ -4917,11 +3347,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:sdk/php/src/Client.php:331:God Function: request' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: resolveGlobs' - description: 'code2llm reports `God Function: resolveGlobs` in `src/core/io.ts:152`. + title: 'Address code smell: God Function: requestOpenRouter' + description: 'code2llm reports `God Function: requestOpenRouter` in `src/llm/openrouter-request.ts:40`. - Function ''resolveGlobs'' is oversized: CC=4, fan-out=14, mutations=0. + Function ''requestOpenRouter'' is oversized: CC=7, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4932,14 +3362,15 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:152:God Function: resolveGlobs' + - src/llm/openrouter-request.ts + dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter-request.ts:40:God Function: + requestOpenRouter' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: resolvedPaths' - description: 'code2llm reports `God Function: resolvedPaths` in `src/extractors/todo.ts:51`. + title: 'Address code smell: God Function: rerankSemanticCandidates' + description: 'code2llm reports `God Function: rerankSemanticCandidates` in `src/semantic/reranker-llm.ts:39`. - Function ''resolvedPaths'' is oversized: CC=2, fan-out=12, mutations=0. + Function ''rerankSemanticCandidates'' is oversized: CC=2, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4950,15 +3381,15 @@ tickets: - code-smell - god-function files: - - src/extractors/todo.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:51:God Function: - resolvedPaths' + - src/semantic/reranker-llm.ts + dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker-llm.ts:39:God Function: + rerankSemanticCandidates' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: role' - description: 'code2llm reports `God Function: role` in `src/services/actions.ts:513`. + title: 'Address code smell: God Function: resolveGlobs' + description: 'code2llm reports `God Function: resolveGlobs` in `src/core/io.ts:186`. - Function ''role'' is oversized: CC=13, fan-out=4, mutations=0. + Function ''resolveGlobs'' is oversized: CC=4, fan-out=14, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -4969,9 +3400,27 @@ tickets: - code-smell - god-function files: - - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:513:God Function: - role' + - src/core/io.ts + dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:186:God Function: resolveGlobs' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: resolvedPaths' + description: 'code2llm reports `God Function: resolvedPaths` in `src/extractors/todo.ts:51`. + + + Function ''resolvedPaths'' is oversized: CC=2, fan-out=12, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/todo.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:51:God Function: + resolvedPaths' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: rpc' description: 'code2llm reports `God Function: rpc` in `sdk/rust/src/client.rs:55`. @@ -4992,11 +3441,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:sdk/rust/src/client.rs:55:God Function: rpc' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: runtime' - description: 'code2llm reports `God Function: runtime` in `src/interfaces/a2a-history.ts:117`. + title: 'Address code smell: God Function: runListItem' + description: 'code2llm reports `God Function: runListItem` in `src/interfaces/a2a-run-list-item.ts:35`. - Function ''runtime'' is oversized: CC=14, fan-out=8, mutations=0. + Function ''runListItem'' is oversized: CC=7, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5007,12 +3456,12 @@ tickets: - code-smell - god-function files: - - src/interfaces/a2a-history.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:117:God Function: - runtime' + - src/interfaces/a2a-run-list-item.ts + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-run-list-item.ts:35:God + Function: runListItem' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: saveTaskStore' - description: 'code2llm reports `God Function: saveTaskStore` in `src/interfaces/a2a-task-store.ts:256`. + description: 'code2llm reports `God Function: saveTaskStore` in `src/interfaces/a2a-task-store.ts:257`. Function ''saveTaskStore'' is oversized: CC=2, fan-out=12, mutations=0. @@ -5027,7 +3476,7 @@ tickets: - god-function files: - src/interfaces/a2a-task-store.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-task-store.ts:256:God + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-task-store.ts:257:God Function: saveTaskStore' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: scanTree' @@ -5047,9 +3496,27 @@ tickets: files: - src/watch/watcher.ts dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:37:God Function: scanTree' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: scorePair' + description: 'code2llm reports `God Function: scorePair` in `src/graph/linker.ts:138`. + + + Function ''scorePair'' is oversized: CC=1, fan-out=11, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/graph/linker.ts + dedupe_key: 'code2llm:smell:god_function:src/graph/linker.ts:138:God Function: scorePair' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: seen' - description: 'code2llm reports `God Function: seen` in `src/communication/llm.ts:304`. + description: 'code2llm reports `God Function: seen` in `src/communication/llm/implementation-helpers.ts:147`. Function ''seen'' is oversized: CC=6, fan-out=11, mutations=0. @@ -5063,15 +3530,15 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:304:God Function: - seen' + - src/communication/llm/implementation-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/llm/implementation-helpers.ts:147:God + Function: seen' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: seenIds' - description: 'code2llm reports `God Function: seenIds` in `src/semantic/reranker.ts:203`. + title: 'Address code smell: God Function: sourcePath' + description: 'code2llm reports `God Function: sourcePath` in `src/extractors/nl.ts:42`. - Function ''seenIds'' is oversized: CC=14, fan-out=9, mutations=0. + Function ''sourcePath'' is oversized: CC=2, fan-out=14, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5082,15 +3549,14 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:203:God Function: - seenIds' + - src/extractors/nl.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:42:God Function: sourcePath' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: seenPairs' - description: 'code2llm reports `God Function: seenPairs` in `src/semantic/reranker.ts:204`. + title: 'Address code smell: God Function: sourceRoot' + description: 'code2llm reports `God Function: sourceRoot` in `scripts/verify-module-boundaries.mjs:5`. - Function ''seenPairs'' is oversized: CC=14, fan-out=9, mutations=0. + Function ''sourceRoot'' is oversized: CC=7, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5101,15 +3567,15 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:204:God Function: - seenPairs' + - scripts/verify-module-boundaries.mjs + dedupe_key: 'code2llm:smell:god_function:scripts/verify-module-boundaries.mjs:5:God + Function: sourceRoot' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: sourcePath' - description: 'code2llm reports `God Function: sourcePath` in `src/extractors/nl.ts:42`. + title: 'Address code smell: God Function: startA2aServer' + description: 'code2llm reports `God Function: startA2aServer` in `src/interfaces/a2a.ts:19`. - Function ''sourcePath'' is oversized: CC=2, fan-out=14, mutations=0. + Function ''startA2aServer'' is oversized: CC=8, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5120,14 +3586,15 @@ tickets: - code-smell - god-function files: - - src/extractors/nl.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/nl.ts:42:God Function: sourcePath' + - src/interfaces/a2a.ts + dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a.ts:19:God Function: + startA2aServer' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: sourceRoot' - description: 'code2llm reports `God Function: sourceRoot` in `scripts/verify-module-boundaries.mjs:5`. + title: 'Address code smell: God Function: startMcpServer' + description: 'code2llm reports `God Function: startMcpServer` in `src/interfaces/mcp.ts:33`. - Function ''sourceRoot'' is oversized: CC=7, fan-out=11, mutations=0. + Function ''startMcpServer'' is oversized: CC=8, fan-out=11, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5138,15 +3605,15 @@ tickets: - code-smell - god-function files: - - scripts/verify-module-boundaries.mjs - dedupe_key: 'code2llm:smell:god_function:scripts/verify-module-boundaries.mjs:5:God - Function: sourceRoot' + - src/interfaces/mcp.ts + dedupe_key: 'code2llm:smell:god_function:src/interfaces/mcp.ts:33:God Function: + startMcpServer' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: startMcpServer' - description: 'code2llm reports `God Function: startMcpServer` in `src/interfaces/mcp.ts:33`. + title: 'Address code smell: God Function: strings' + description: 'code2llm reports `God Function: strings` in `src/communication/intake-protobuf.ts:76`. - Function ''startMcpServer'' is oversized: CC=8, fan-out=11, mutations=0. + Function ''strings'' is oversized: CC=13, fan-out=7, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5157,9 +3624,9 @@ tickets: - code-smell - god-function files: - - src/interfaces/mcp.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/mcp.ts:33:God Function: - startMcpServer' + - src/communication/intake-protobuf.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:76:God + Function: strings' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: summarizeGraph' description: 'code2llm reports `God Function: summarizeGraph` in `src/summary/summarizer.ts:57`. @@ -5256,11 +3723,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/todo.ts:48:God Function: text' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: ticket' - description: 'code2llm reports `God Function: ticket` in `src/services/actions.ts:514`. + title: 'Address code smell: God Function: timeout' + description: 'code2llm reports `God Function: timeout` in `src/llm/openrouter.ts:46`. - Function ''ticket'' is oversized: CC=13, fan-out=4, mutations=0. + Function ''timeout'' is oversized: CC=13, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5271,9 +3738,9 @@ tickets: - code-smell - god-function files: - - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:514:God Function: - ticket' + - src/llm/openrouter.ts + dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:46:God Function: + timeout' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: toDocumentIntentRecord' description: 'code2llm reports `God Function: toDocumentIntentRecord` in `src/extractors/docs-record.ts:25`. @@ -5293,6 +3760,25 @@ tickets: - src/extractors/docs-record.ts dedupe_key: 'code2llm:smell:god_function:src/extractors/docs-record.ts:25:God Function: toDocumentIntentRecord' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: toIntentRecord' + description: 'code2llm reports `God Function: toIntentRecord` in `src/extractors/nl-llm-helpers.ts:85`. + + + Function ''toIntentRecord'' is oversized: CC=11, fan-out=11, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/nl-llm-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/nl-llm-helpers.ts:85:God + Function: toIntentRecord' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: toSideBySideRows' description: 'code2llm reports `God Function: toSideBySideRows` in `src/diff/text-render.ts:41`. @@ -5351,11 +3837,12 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/extractors/ast/unsupported.ts:11:God Function: unsupportedSourceWarning' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: used' - description: 'code2llm reports `God Function: used` in `src/core/record.ts:130`. + title: 'Address code smell: God Function: validateCodeChangePlanContext' + description: 'code2llm reports `God Function: validateCodeChangePlanContext` in + `src/core/schema/code-change.ts:278`. - Function ''used'' is oversized: CC=13, fan-out=0, mutations=0. + Function ''validateCodeChangePlanContext'' is oversized: CC=11, fan-out=12, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5366,15 +3853,15 @@ tickets: - code-smell - god-function files: - - src/core/record.ts - dedupe_key: 'code2llm:smell:god_function:src/core/record.ts:130:God Function: used' + - src/core/schema/code-change.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/code-change.ts:278:God + Function: validateCodeChangePlanContext' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: validateCodeChangePlanContext' - description: 'code2llm reports `God Function: validateCodeChangePlanContext` in - `src/core/schema.ts:621`. + title: 'Address code smell: God Function: validateIntakeEnvelopeHeader' + description: 'code2llm reports `God Function: validateIntakeEnvelopeHeader` in `src/communication/intake-contract.ts:149`. - Function ''validateCodeChangePlanContext'' is oversized: CC=11, fan-out=12, mutations=0. + Function ''validateIntakeEnvelopeHeader'' is oversized: CC=14, fan-out=6, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5385,14 +3872,16 @@ tickets: - code-smell - god-function files: - - src/core/schema.ts - dedupe_key: 'code2llm:smell:god_function:src/core/schema.ts:621:God Function: validateCodeChangePlanContext' + - src/communication/intake-contract.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-contract.ts:149:God + Function: validateIntakeEnvelopeHeader' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: visit' - description: 'code2llm reports `God Function: visit` in `src/watch/watcher.ts:42`. + title: 'Address code smell: God Function: validateOperationExpectations' + description: 'code2llm reports `God Function: validateOperationExpectations` in + `src/operations/validation.ts:371`. - Function ''visit'' is oversized: CC=11, fan-out=13, mutations=0. + Function ''validateOperationExpectations'' is oversized: CC=11, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5403,14 +3892,72 @@ tickets: - code-smell - god-function files: - - src/watch/watcher.ts - dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:42:God Function: visit' + - src/operations/validation.ts + dedupe_key: 'code2llm:smell:god_function:src/operations/validation.ts:371:God Function: + validateOperationExpectations' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: validatePatchTargetForEdit' + description: 'code2llm reports `God Function: validatePatchTargetForEdit` in `src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:210`. + + + Function ''validatePatchTargetForEdit'' is oversized: CC=13, fan-out=3, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:210:God + Function: validatePatchTargetForEdit' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: validateProjection' + description: 'code2llm reports `God Function: validateProjection` in `src/communication/intake-service.ts:183`. + + + Function ''validateProjection'' is oversized: CC=9, fan-out=20, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/communication/intake-service.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-service.ts:183:God + Function: validateProjection' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Function: values' + description: 'code2llm reports `God Function: values` in `src/communication/intake-protobuf.ts:75`. + + + Function ''values'' is oversized: CC=13, fan-out=7, mutations=0. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/communication/intake-protobuf.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-protobuf.ts:75:God + Function: values' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: visit' - description: 'code2llm reports `God Function: visit` in `src/core/io.ts:95`. + description: 'code2llm reports `God Function: visit` in `src/watch/watcher.ts:42`. - Function ''visit'' is oversized: CC=11, fan-out=15, mutations=0. + Function ''visit'' is oversized: CC=11, fan-out=13, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5421,8 +3968,8 @@ tickets: - code-smell - god-function files: - - src/core/io.ts - dedupe_key: 'code2llm:smell:god_function:src/core/io.ts:95:God Function: visit' + - src/watch/watcher.ts + dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:42:God Function: visit' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: visit_item_fn' description: 'code2llm reports `God Function: visit_item_fn` in `rust-ast/src/main.rs:257`. @@ -5462,11 +4009,11 @@ tickets: dedupe_key: 'code2llm:smell:god_function:rust-ast/src/main.rs:206:God Function: visit_item_mod' - signal: code2llm_smell_god_function - title: 'Address code smell: God Function: warnings' - description: 'code2llm reports `God Function: warnings` in `src/interfaces/a2a-history.ts:118`. + title: 'Address code smell: God Function: writeProjection' + description: 'code2llm reports `God Function: writeProjection` in `src/communication/intake-service.ts:132`. - Function ''warnings'' is oversized: CC=14, fan-out=8, mutations=0. + Function ''writeProjection'' is oversized: CC=12, fan-out=18, mutations=0. Make the smallest refactor that removes the smell and run local tests.' @@ -5477,9 +4024,9 @@ tickets: - code-smell - god-function files: - - src/interfaces/a2a-history.ts - dedupe_key: 'code2llm:smell:god_function:src/interfaces/a2a-history.ts:118:God Function: - warnings' + - src/communication/intake-service.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-service.ts:132:God + Function: writeProjection' - signal: code2llm_smell_god_function title: 'Address code smell: God Module: sdk.go.types' description: 'code2llm reports `God Module: sdk.go.types` in `sdk/go/types.go:1`. @@ -5563,7 +4110,7 @@ tickets: description: 'code2llm reports `God Module: src.communication.analyzer` in `src/communication/analyzer.ts:1`. - Module ''src.communication.analyzer'' is too large (79 functions, 3 classes). + Module ''src.communication.analyzer'' is too large (88 functions, 3 classes). Consider splitting into sub-modules. @@ -5579,12 +4126,34 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/communication/analyzer.ts:1:God Module: src.communication.analyzer' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.communication.llm' - description: 'code2llm reports `God Module: src.communication.llm` in `src/communication/llm.ts:1`. + title: 'Address code smell: God Module: src.communication.intake-contract' + description: 'code2llm reports `God Module: src.communication.intake-contract` in + `src/communication/intake-contract.ts:1`. - Module ''src.communication.llm'' is too large (55 functions, 8 classes). Consider - splitting into sub-modules. + Module ''src.communication.intake-contract'' is too large (76 functions, 7 classes). + Consider splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/communication/intake-contract.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-contract.ts:1:God + Module: src.communication.intake-contract' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.communication.intake-service' + description: 'code2llm reports `God Module: src.communication.intake-service` in + `src/communication/intake-service.ts:1`. + + + Module ''src.communication.intake-service'' is too large (82 functions, 2 classes). + Consider splitting into sub-modules. Make the smallest refactor that removes the smell and run local tests.' @@ -5595,15 +4164,15 @@ tickets: - code-smell - god-function files: - - src/communication/llm.ts - dedupe_key: 'code2llm:smell:god_function:src/communication/llm.ts:1:God Module: - src.communication.llm' + - src/communication/intake-service.ts + dedupe_key: 'code2llm:smell:god_function:src/communication/intake-service.ts:1:God + Module: src.communication.intake-service' - signal: code2llm_smell_god_function title: 'Address code smell: God Module: src.comparison.workspace' description: 'code2llm reports `God Module: src.comparison.workspace` in `src/comparison/workspace.ts:1`. - Module ''src.comparison.workspace'' is too large (55 functions, 3 classes). Consider + Module ''src.comparison.workspace'' is too large (56 functions, 3 classes). Consider splitting into sub-modules. @@ -5618,12 +4187,72 @@ tickets: - src/comparison/workspace.ts dedupe_key: 'code2llm:smell:god_function:src/comparison/workspace.ts:1:God Module: src.comparison.workspace' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.core.schema.code-change' + description: 'code2llm reports `God Module: src.core.schema.code-change` in `src/core/schema/code-change.ts:1`. + + + Module ''src.core.schema.code-change'' is too large (44 functions, 0 classes). + Consider splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/core/schema/code-change.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/code-change.ts:1:God Module: + src.core.schema.code-change' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.core.schema.intent' + description: 'code2llm reports `God Module: src.core.schema.intent` in `src/core/schema/intent.ts:1`. + + + Module ''src.core.schema.intent'' is too large (44 functions, 4 classes). Consider + splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/core/schema/intent.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/intent.ts:1:God Module: + src.core.schema.intent' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.core.schema.utils' + description: 'code2llm reports `God Module: src.core.schema.utils` in `src/core/schema/utils.ts:1`. + + + Module ''src.core.schema.utils'' is too large (42 functions, 0 classes). Consider + splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/core/schema/utils.ts + dedupe_key: 'code2llm:smell:god_function:src/core/schema/utils.ts:1:God Module: + src.core.schema.utils' - signal: code2llm_smell_god_function title: 'Address code smell: God Module: src.core.text' description: 'code2llm reports `God Module: src.core.text` in `src/core/text.ts:1`. - Module ''src.core.text'' is too large (56 functions, 0 classes). Consider splitting + Module ''src.core.text'' is too large (66 functions, 0 classes). Consider splitting into sub-modules. @@ -5638,12 +4267,12 @@ tickets: - src/core/text.ts dedupe_key: 'code2llm:smell:god_function:src/core/text.ts:1:God Module: src.core.text' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.diff.reality' - description: 'code2llm reports `God Module: src.diff.reality` in `src/diff/reality.ts:1`. + title: 'Address code smell: God Module: src.core.types.code-change' + description: 'code2llm reports `God Module: src.core.types.code-change` in `src/core/types/code-change.ts:1`. - Module ''src.diff.reality'' is too large (77 functions, 3 classes). Consider splitting - into sub-modules. + Module ''src.core.types.code-change'' is too large (0 functions, 19 classes). + Consider splitting into sub-modules. Make the smallest refactor that removes the smell and run local tests.' @@ -5654,14 +4283,35 @@ tickets: - code-smell - god-function files: - - src/diff/reality.ts - dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:1:God Module: src.diff.reality' + - src/core/types/code-change.ts + dedupe_key: 'code2llm:smell:god_function:src/core/types/code-change.ts:1:God Module: + src.core.types.code-change' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.core.types.intent' + description: 'code2llm reports `God Module: src.core.types.intent` in `src/core/types/intent.ts:1`. + + + Module ''src.core.types.intent'' is too large (0 functions, 13 classes). Consider + splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/core/types/intent.ts + dedupe_key: 'code2llm:smell:god_function:src/core/types/intent.ts:1:God Module: + src.core.types.intent' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.diff.text' - description: 'code2llm reports `God Module: src.diff.text` in `src/diff/text.ts:1`. + title: 'Address code smell: God Module: src.diff.reality' + description: 'code2llm reports `God Module: src.diff.reality` in `src/diff/reality.ts:1`. - Module ''src.diff.text'' is too large (53 functions, 1 classes). Consider splitting + Module ''src.diff.reality'' is too large (97 functions, 4 classes). Consider splitting into sub-modules. @@ -5673,14 +4323,14 @@ tickets: - code-smell - god-function files: - - src/diff/text.ts - dedupe_key: 'code2llm:smell:god_function:src/diff/text.ts:1:God Module: src.diff.text' + - src/diff/reality.ts + dedupe_key: 'code2llm:smell:god_function:src/diff/reality.ts:1:God Module: src.diff.reality' - signal: code2llm_smell_god_function title: 'Address code smell: God Module: src.evaluation.gold-cases' description: 'code2llm reports `God Module: src.evaluation.gold-cases` in `src/evaluation/gold-cases.ts:1`. - Module ''src.evaluation.gold-cases'' is too large (57 functions, 4 classes). Consider + Module ''src.evaluation.gold-cases'' is too large (75 functions, 4 classes). Consider splitting into sub-modules. @@ -5700,7 +4350,7 @@ tickets: description: 'code2llm reports `God Module: src.evaluation.gold-types` in `src/evaluation/gold-types.ts:1`. - Module ''src.evaluation.gold-types'' is too large (11 functions, 15 classes). + Module ''src.evaluation.gold-types'' is too large (17 functions, 15 classes). Consider splitting into sub-modules. @@ -5716,11 +4366,54 @@ tickets: dedupe_key: 'code2llm:smell:god_function:src/evaluation/gold-types.ts:1:God Module: src.evaluation.gold-types' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.extractors.communication' - description: 'code2llm reports `God Module: src.extractors.communication` in `src/extractors/communication.ts:1`. + title: 'Address code smell: God Module: src.extractors.communication-file-helpers' + description: 'code2llm reports `God Module: src.extractors.communication-file-helpers` + in `src/extractors/communication-file-helpers.ts:1`. + + + Module ''src.extractors.communication-file-helpers'' is too large (47 functions, + 2 classes). Consider splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/communication-file-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/communication-file-helpers.ts:1:God + Module: src.extractors.communication-file-helpers' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.extractors.communication-helpers' + description: 'code2llm reports `God Module: src.extractors.communication-helpers` + in `src/extractors/communication-helpers.ts:1`. + + + Module ''src.extractors.communication-helpers'' is too large (49 functions, 3 + classes). Consider splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/extractors/communication-helpers.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/communication-helpers.ts:1:God + Module: src.extractors.communication-helpers' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.extractors.docs-deterministic' + description: 'code2llm reports `God Module: src.extractors.docs-deterministic` in + `src/extractors/docs-deterministic.ts:1`. - Module ''src.extractors.communication'' is too large (75 functions, 4 classes). + Module ''src.extractors.docs-deterministic'' is too large (46 functions, 3 classes). Consider splitting into sub-modules. @@ -5732,15 +4425,15 @@ tickets: - code-smell - god-function files: - - src/extractors/communication.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/communication.ts:1:God Module: - src.extractors.communication' + - src/extractors/docs-deterministic.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/docs-deterministic.ts:1:God + Module: src.extractors.docs-deterministic' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.extractors.nl-llm' - description: 'code2llm reports `God Module: src.extractors.nl-llm` in `src/extractors/nl-llm.ts:1`. + title: 'Address code smell: God Module: src.extractors.git' + description: 'code2llm reports `God Module: src.extractors.git` in `src/extractors/git.ts:1`. - Module ''src.extractors.nl-llm'' is too large (45 functions, 5 classes). Consider + Module ''src.extractors.git'' is too large (64 functions, 6 classes). Consider splitting into sub-modules. @@ -5752,15 +4445,14 @@ tickets: - code-smell - god-function files: - - src/extractors/nl-llm.ts - dedupe_key: 'code2llm:smell:god_function:src/extractors/nl-llm.ts:1:God Module: - src.extractors.nl-llm' + - src/extractors/git.ts + dedupe_key: 'code2llm:smell:god_function:src/extractors/git.ts:1:God Module: src.extractors.git' - signal: code2llm_smell_god_function title: 'Address code smell: God Module: src.graph.diagnostics' description: 'code2llm reports `God Module: src.graph.diagnostics` in `src/graph/diagnostics.ts:1`. - Module ''src.graph.diagnostics'' is too large (42 functions, 0 classes). Consider + Module ''src.graph.diagnostics'' is too large (61 functions, 1 classes). Consider splitting into sub-modules. @@ -5780,7 +4472,7 @@ tickets: description: 'code2llm reports `God Module: src.graph.linker` in `src/graph/linker.ts:1`. - Module ''src.graph.linker'' is too large (75 functions, 4 classes). Consider splitting + Module ''src.graph.linker'' is too large (55 functions, 1 classes). Consider splitting into sub-modules. @@ -5799,7 +4491,7 @@ tickets: description: 'code2llm reports `God Module: src.interfaces.a2a` in `src/interfaces/a2a.ts:1`. - Module ''src.interfaces.a2a'' is too large (46 functions, 0 classes). Consider + Module ''src.interfaces.a2a'' is too large (48 functions, 0 classes). Consider splitting into sub-modules. @@ -5818,7 +4510,7 @@ tickets: description: 'code2llm reports `God Module: src.interfaces.a2a-task-store` in `src/interfaces/a2a-task-store.ts:1`. - Module ''src.interfaces.a2a-task-store'' is too large (92 functions, 3 classes). + Module ''src.interfaces.a2a-task-store'' is too large (101 functions, 3 classes). Consider splitting into sub-modules. @@ -5853,11 +4545,11 @@ tickets: - src/interfaces/mcp.ts dedupe_key: 'code2llm:smell:god_function:src/interfaces/mcp.ts:1:God Module: src.interfaces.mcp' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.llm.openrouter' - description: 'code2llm reports `God Module: src.llm.openrouter` in `src/llm/openrouter.ts:1`. + title: 'Address code smell: God Module: src.operations.validation' + description: 'code2llm reports `God Module: src.operations.validation` in `src/operations/validation.ts:1`. - Module ''src.llm.openrouter'' is too large (49 functions, 7 classes). Consider + Module ''src.operations.validation'' is too large (75 functions, 0 classes). Consider splitting into sub-modules. @@ -5869,14 +4561,15 @@ tickets: - code-smell - god-function files: - - src/llm/openrouter.ts - dedupe_key: 'code2llm:smell:god_function:src/llm/openrouter.ts:1:God Module: src.llm.openrouter' + - src/operations/validation.ts + dedupe_key: 'code2llm:smell:god_function:src/operations/validation.ts:1:God Module: + src.operations.validation' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.operations.validation' - description: 'code2llm reports `God Module: src.operations.validation` in `src/operations/validation.ts:1`. + title: 'Address code smell: God Module: src.semantic.reranker-llm' + description: 'code2llm reports `God Module: src.semantic.reranker-llm` in `src/semantic/reranker-llm.ts:1`. - Module ''src.operations.validation'' is too large (47 functions, 0 classes). Consider + Module ''src.semantic.reranker-llm'' is too large (43 functions, 2 classes). Consider splitting into sub-modules. @@ -5888,16 +4581,16 @@ tickets: - code-smell - god-function files: - - src/operations/validation.ts - dedupe_key: 'code2llm:smell:god_function:src/operations/validation.ts:1:God Module: - src.operations.validation' + - src/semantic/reranker-llm.ts + dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker-llm.ts:1:God Module: + src.semantic.reranker-llm' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.pipeline.run' - description: 'code2llm reports `God Module: src.pipeline.run` in `src/pipeline/run.ts:1`. + title: 'Address code smell: God Module: src.semantic.reranker.types' + description: 'code2llm reports `God Module: src.semantic.reranker.types` in `src/semantic/reranker/types.ts:1`. - Module ''src.pipeline.run'' is too large (64 functions, 1 classes). Consider splitting - into sub-modules. + Module ''src.semantic.reranker.types'' is too large (0 functions, 11 classes). + Consider splitting into sub-modules. Make the smallest refactor that removes the smell and run local tests.' @@ -5908,14 +4601,15 @@ tickets: - code-smell - god-function files: - - src/pipeline/run.ts - dedupe_key: 'code2llm:smell:god_function:src/pipeline/run.ts:1:God Module: src.pipeline.run' + - src/semantic/reranker/types.ts + dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker/types.ts:1:God Module: + src.semantic.reranker.types' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.semantic.reranker' - description: 'code2llm reports `God Module: src.semantic.reranker` in `src/semantic/reranker.ts:1`. + title: 'Address code smell: God Module: src.services.actions' + description: 'code2llm reports `God Module: src.services.actions` in `src/services/actions.ts:1`. - Module ''src.semantic.reranker'' is too large (40 functions, 11 classes). Consider + Module ''src.services.actions'' is too large (145 functions, 1 classes). Consider splitting into sub-modules. @@ -5927,16 +4621,16 @@ tickets: - code-smell - god-function files: - - src/semantic/reranker.ts - dedupe_key: 'code2llm:smell:god_function:src/semantic/reranker.ts:1:God Module: - src.semantic.reranker' + - src/services/actions.ts + dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:1:God Module: src.services.actions' - signal: code2llm_smell_god_function - title: 'Address code smell: God Module: src.services.actions' - description: 'code2llm reports `God Module: src.services.actions` in `src/services/actions.ts:1`. + title: 'Address code smell: God Module: src.synthesis.code-change-plan.implementation-source-patch-apply-core' + description: 'code2llm reports `God Module: src.synthesis.code-change-plan.implementation-source-patch-apply-core` + in `src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:1`. - Module ''src.services.actions'' is too large (113 functions, 0 classes). Consider - splitting into sub-modules. + Module ''src.synthesis.code-change-plan.implementation-source-patch-apply-core'' + is too large (54 functions, 6 classes). Consider splitting into sub-modules. Make the smallest refactor that removes the smell and run local tests.' @@ -5947,8 +4641,30 @@ tickets: - code-smell - god-function files: - - src/services/actions.ts - dedupe_key: 'code2llm:smell:god_function:src/services/actions.ts:1:God Module: src.services.actions' + - src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts:1:God + Module: src.synthesis.code-change-plan.implementation-source-patch-apply-core' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.synthesis.code-change-plan.implementation-source-patch-assert' + description: 'code2llm reports `God Module: src.synthesis.code-change-plan.implementation-source-patch-assert` + in `src/synthesis/code-change-plan/implementation-source-patch-assert.ts:1`. + + + Module ''src.synthesis.code-change-plan.implementation-source-patch-assert'' is + too large (55 functions, 2 classes). Consider splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/synthesis/code-change-plan/implementation-source-patch-assert.ts + dedupe_key: 'code2llm:smell:god_function:src/synthesis/code-change-plan/implementation-source-patch-assert.ts:1:God + Module: src.synthesis.code-change-plan.implementation-source-patch-assert' - signal: code2llm_smell_god_function title: 'Address code smell: God Module: src.synthesis.todo-patch' description: 'code2llm reports `God Module: src.synthesis.todo-patch` in `src/synthesis/todo-patch.ts:1`. @@ -5969,5 +4685,24 @@ tickets: - src/synthesis/todo-patch.ts dedupe_key: 'code2llm:smell:god_function:src/synthesis/todo-patch.ts:1:God Module: src.synthesis.todo-patch' +- signal: code2llm_smell_god_function + title: 'Address code smell: God Module: src.watch.watcher' + description: 'code2llm reports `God Module: src.watch.watcher` in `src/watch/watcher.ts:1`. + + + Module ''src.watch.watcher'' is too large (43 functions, 6 classes). Consider + splitting into sub-modules. + + + Make the smallest refactor that removes the smell and run local tests.' + priority: normal + labels: + - llm-ready + - code2llm + - code-smell + - god-function + files: + - src/watch/watcher.ts + dedupe_key: 'code2llm:smell:god_function:src/watch/watcher.ts:1:God Module: src.watch.watcher' applied: [] skipped: [] diff --git a/project/project.toon.yaml b/project/project.toon.yaml index 342b9fd..6c3ad74 100644 --- a/project/project.toon.yaml +++ b/project/project.toon.yaml @@ -1,52 +1,52 @@ -# todo2code | 3285 func | 152f | 45160L | typescript | 2026-08-01 +# todo2code | 4129 func | 197f | 43441L | typescript | 2026-08-04 # generated in 0.00s HEALTH: - CCΜ„=4.0 critical=276 (limit:10) dup=28 cycles=0 + CCΜ„=3.1 critical=187 (limit:10) dup=29 cycles=0 ALERTS[20]: - !!! cc_exceeded main = 95 (limit:15) - !!! cc_exceeded assertOperationPlan = 84 (limit:15) - !!! cc_exceeded executeAction = 83 (limit:15) - !!! cc_exceeded root = 83 (limit:15) - !!! cc_exceeded extractCommunicationIntent = 76 (limit:15) - !!! cc_exceeded identityRegistry = 72 (limit:15) - !!! cc_exceeded communicationFiles = 72 (limit:15) - !!! high_fan_out executeAction = 65 (limit:10) - !!! high_fan_out root = 64 (limit:10) - !!! cc_exceeded parseCommand = 57 (limit:15) + !!! high_fan_out compareWorkspaceIntent = 40 (limit:10) + !!! cc_exceeded parseFile = 38 (limit:15) + !!! high_fan_out Client.parse_http_response = 37 (limit:10) + !!! high_fan_out run = 33 (limit:10) + !!! high_fan_out main = 31 (limit:10) + !!! high_fan_out executePipeline = 31 (limit:10) + !!! cc_exceeded makefile = 28 (limit:15) + !!! cc_exceeded main = 27 (limit:15) + !!! cc_exceeded run = 26 (limit:15) + !!! high_fan_out temporaryParent = 25 (limit:10) -MODULES[262] (top by size): +MODULES[281] (top by size): M[evaluation/gold/v2/dataset.json] 2410L C:0 F:0 CC↑0 D:0 (json) - M[src/synthesis/code-change-plan.ts] 1310L C:10 F:127 CC↑47 D:6 (typescript) - M[src/core/schema.ts] 922L C:4 F:124 CC↑23 D:0 (typescript) - M[docs/SYSTEM_MONITOROWANIA_INTENCJI_I_PRACY_AGENTOW.md] 872L C:0 F:0 CC↑0 D:0 (md) - M[docs/reference/original-monitoring-design.md] 872L C:0 F:0 CC↑0 D:0 (md) - M[README.md] 871L C:0 F:0 CC↑0 D:0 (md) - M[src/cli.ts] 827L C:1 F:83 CC↑95 D:0 (typescript) + M[src/cli.ts] 942L C:1 F:124 CC↑13 D:0 (typescript) + M[src/services/actions.ts] 806L C:1 F:106 CC↑13 D:0 (typescript) M[evaluation/gold/v1/dataset.json] 761L C:0 F:0 CC↑0 D:0 (json) - M[src/services/actions.ts] 700L C:0 F:74 CC↑83 D:0 (typescript) - M[src/core/types.ts] 673L C:41 F:0 CC↑0 D:0 (typescript) - M[CHANGELOG.md] 670L C:0 F:0 CC↑0 D:0 (md) - M[src/diff/reality.ts] 609L C:3 F:73 CC↑26 D:0 (typescript) - M[src/pipeline/run.ts] 602L C:1 F:64 CC↑53 D:0 (typescript) - M[docs/TEST_REPORT.md] 587L C:0 F:0 CC↑0 D:0 (md) + M[src/diff/reality.ts] 690L C:4 F:89 CC↑15 D:0 (typescript) + M[src/communication/analyzer.ts] 596L C:3 F:81 CC↑15 D:0 (typescript) M[schemas/gold-dataset.schema.json] 585L C:0 F:0 CC↑0 D:0 (json) - LANGS: typescript:117/md:52/json:32/javascript:15/python:15/rust:7/go:6/shell:6/php:4/other:2/yml:2/toml:2/java:1/txt:1 + M[src/interfaces/a2a-task-store.ts] 560L C:3 F:88 CC↑11 D:0 (typescript) + M[src/core/text.ts] 530L C:0 F:61 CC↑14 D:0 (typescript) + M[goal.yaml] 530L C:0 F:0 CC↑0 D:0 (yaml) + M[src/evaluation/gold-cases.ts] 489L C:4 F:62 CC↑8 D:0 (typescript) + M[sdk/python/todo2code/client.py] 469L C:7 F:45 CC↑7 D:0 (python) + M[src/graph/diagnostics.ts] 459L C:1 F:59 CC↑11 D:0 (typescript) + M[src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts] 434L C:6 F:50 CC↑13 D:0 (typescript) + M[src/operations/validation.ts] 429L C:0 F:69 CC↑23 D:0 (typescript) + LANGS: typescript:173/json:40/python:16/javascript:15/shell:8/rust:7/go:6/php:4/toml:3/other:2/yml:2/yaml:2/java:1/txt:1/proto:1 HOTSPOTS[10]: - β˜… executeAction fan=65 // Orchestrates 65 calls - β˜… root fan=64 // Orchestrates 64 calls - β˜… runPipeline fan=54 // Orchestrates 54 calls - β˜… main fan=44 // Orchestrates 44 calls - β˜… extractTypeScriptFile fan=44 // Orchestrates 44 calls + β˜… compareWorkspaceIntent fan=40 // Orchestrates 40 calls + β˜… Client.parse_http_response fan=37 // Orchestrates 37 calls + β˜… run fan=33 // Orchestrates 33 calls + β˜… main fan=31 // Orchestrates 31 calls + β˜… executePipeline fan=31 // Orchestrates 31 calls REFACTOR[15]: - [1] H/L Split main (CC=95) - [2] H/L Split diffUiHtml (CC=52) - [3] H/L Split assertCodeChangeSourcePatch (CC=47) - [4] H/L Split applyCodeChangeSourcePatch (CC=41) - [5] H/L Split applyUnifiedDiffToText (CC=47) + [1] H/L Split parseFile (CC=38) + [2] H/L Split makefile (CC=28) + [3] H/L Split main (CC=27) + [4] H/L Split run (CC=26) + [5] H/H Split god module src/communication/analyzer.ts (596L, 3 classes) EVOLUTION: - 2026-08-01 CCΜ„=4.0 crit=276 45160L // Automated analysis + 2026-08-04 CCΜ„=3.1 crit=187 43441L // Automated analysis diff --git a/project/prompt.txt b/project/prompt.txt index 41409cd..6bb72d0 100644 --- a/project/prompt.txt +++ b/project/prompt.txt @@ -8,14 +8,12 @@ we are in project path: todo2code Files for analysis: Note: project/validation.toon.yaml and project/duplication.toon.yaml are generated by external tools (vallm and redup) -- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [24KB] -- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [136KB] +- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [25KB] +- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [181KB] - evolution.toon.yaml (Refactoring queue - ranked actions by impact/effort, risks, metrics targets, history) [2KB] - project.toon.yaml (Compact project overview - generated from project.yaml data) [2KB] - context.md (LLM narrative - architecture summary and project context) [33KB] - -Missing files (not generated in this run): -- README.md +- README.md (Generated documentation - overview and usage guide) [9KB] Task: - Treat this prompt as a refactoring brief: identify the highest-priority changes and prepare concrete edits. diff --git a/project/ticket-018/README.md b/project/ticket-018/README.md index 526a549..af1f82a 100644 --- a/project/ticket-018/README.md +++ b/project/ticket-018/README.md @@ -3,7 +3,7 @@ - **ID**: ticket-018 - **Owner**: unresolved:human - **Status**: IN_PROGRESS -- **Workflow state**: EDIT +- **Workflow state**: WAIT_FOR_APPROVAL - **Created**: 2026-08-01 ## Goal and scope @@ -157,11 +157,11 @@ agent self-approved. - [x] AC-23: The workflow uses least-privilege read permissions, never uses `pull_request_target`, and treats fork PRs without secrets as requiring a trusted rerun rather than exposing organization credentials. -- [ ] AC-24: A repository ruleset requires `governance / enforce` and +- [x] AC-24: A repository ruleset requires `governance / enforce` and `koru / code-review`, blocks direct updates to `main`, dismisses stale evidence after new commits and cannot be bypassed by the implementation agent. -- [ ] AC-25: Workflow syntax, local Koru/Vallm probes, negative failure paths, +- [x] AC-25: Workflow syntax, local Koru/Vallm probes, negative failure paths, `npm run verify`, governance and relevant Docker checks pass; the pre-existing ticket-019 findings remain separately attributed. diff --git a/project/ticket-018/changelog.md b/project/ticket-018/changelog.md index cf4007f..4ccd9cf 100644 --- a/project/ticket-018/changelog.md +++ b/project/ticket-018/changelog.md @@ -1,5 +1,17 @@ # Ticket Changelog (ticket-018) +## [0.3.0] - 2026-08-04 + +- Confirmed and recorded `koru / code-review` + `governance / enforce` as the + required checks for the `main` ruleset `20186914`; enforced state is active, + `current_user_can_bypass: never`, and bypass actors are empty. +- Re-ran required evidence paths after deployment: PR-dispatch workflow syntax, + positive and negative Koru probes, attestation upload path, workflow failure + handling and local/CI verification commands now satisfy AC-24/AC-25. +- Advanced `ticket-018` workflow state to `IN_PROGRESS / WAIT_FOR_APPROVAL` with + AC-24 and AC-25 checked; AC-17 and the pre-existing `ticket-019` blockers + remain tracked separately. + ## [0.2.0] - 2026-08-01 - Evolved the plan for concurrent humans/agents: named workstreams, diff --git a/project/ticket-020/README.md b/project/ticket-020/README.md index 520e90b..510d3fb 100644 --- a/project/ticket-020/README.md +++ b/project/ticket-020/README.md @@ -2,8 +2,8 @@ - **ID**: ticket-020 - **Owner**: unresolved:human -- **Status**: BLOCKED -- **Workflow state**: VALIDATION +- **Status**: DONE +- **Workflow state**: COMPLETE - **Created**: 2026-08-01 ## Goal and scope @@ -176,8 +176,7 @@ not trusted merge evidence. - `make e2e-core`: PASS in network-isolated Docker; 335 tests, 328 passed, 7 explicit optional-toolchain skips, both gold datasets, CLI, MCP, A2A and available SDK examples passed. -- `make governance` now uses policy 0.8.0 and raises no finding for parallel - tickets 018 (`governance`) and 020 (`interfaces`). The global gate still - reports four findings owned by ticket-019: its explicit conflict and unmet - dependency on ticket-018, concrete paths outside `sdk`, and the overlapping - `Makefile` claim. Ticket-020 itself no longer hits a single-ticket limit. +- `make governance` under policy 0.8.0 returns only the remaining independent + findings owned by ticket-019 (`GOV-DEPENDENCY-002`, `GOV-CONFLICT-001`, + `GOV-WORKSTREAM-003`, `GOV-WORKSTREAM-004`). Ticket-020 itself no longer + contributes to a single-ticket or overlap violation. diff --git a/project/ticket-022/README.md b/project/ticket-022/README.md new file mode 100644 index 0000000..472a79c --- /dev/null +++ b/project/ticket-022/README.md @@ -0,0 +1,115 @@ +# Ticket 022: Git evidence for umbrella workspaces + +- **ID**: ticket-022 +- **Owner**: unresolved:human +- **Status**: DONE +- **Workflow state**: DONE +- **Created**: 2026-08-01 + +## Goal and scope + +Allow the existing deterministic Git extractor to analyze an umbrella directory +whose children are independent Git repositories. Today the Subactor root is not +itself a work tree, so the pipeline emits `Git repository not available` and +loses the history of 41 repository roots that supply its code. + +The extractor will discover bounded, nested repository roots, extract each +history independently and express changed paths relative to the umbrella root. +It remains read-only and does not add an executor, ticket publisher, MCP/A2A +mutation, checkout, fetch, commit or push operation. + +## Planned behavior + +1. Preserve target-path, commit ordering and count behavior for a root that is + already one Git repository, apart from the added repository provenance and + audited extractor-version increment. +2. When the root is not a repository, walk real directories in deterministic + order, without following symlinks. Stop descending as soon as a repository + root is found so vendored/worktree repositories inside it are not counted. +3. Bound discovery to 100 repositories and four concurrent repository readers; + report truncation and per-repository failures without hiding successful + evidence from other repositories. +4. Interpret `count` per discovered repository. Prefix changed and previous + paths with the repository path relative to the umbrella root so they align + with AST, TODO and documentation paths in the shared graph. +5. Record the repository-relative root in metadata and bump deterministic Git + extraction provenance from `t2c/git@1` to `t2c/git@2`. +6. Add isolated regression tests for nested repositories, path collisions, + nested-repository pruning, symlink refusal, empty histories and the unchanged + single-repository contract. +7. Repeat the deterministic Subactor pipeline and compare Git record count, + warnings, graph links and downstream diagnostics against the ticket-021 + baseline. + +## Acceptance criteria + +- [x] AC-01: A human approves this exact plan before source or test edits. +- [x] AC-02: A normal single Git repository retains unprefixed target paths and + the requested commit ordering/count. +- [x] AC-03: An umbrella root discovers every bounded top-level/nested repository + exactly once and does not follow symlinks or descend into a discovered repo. +- [x] AC-04: Same-named files from different repositories receive distinct, + umbrella-relative paths and stable record IDs. +- [x] AC-05: One empty or unreadable repository produces a scoped warning while + evidence from healthy siblings remains available. +- [x] AC-06: Discovery and extraction are deterministic and bounded; no analyzed + repository or its Git state is modified. +- [x] AC-07: Focused tests, `npm run verify`, `make governance` and Docker smoke + pass or report only independently owned pre-existing governance findings. +- [x] AC-08: A comparable Subactor run replaces the root-level Git-unavailable + warning with grounded child-repository history and does not regress the + autonomy-safety result from ticket-021. + +## Participants + +- Human participant: unresolved; no human-owned file was created. +- Agent participant: [ai-codex.md](ai-codex.md) + +## Approval boundary + +- Current state: `DONE / COMPLETE`. +- Approval evidence: user response `zatwierdzam ticket 022 i kolejne` on + 2026-08-01 after the exact bounded plan was presented. This approves ticket + 022; future unknown scopes still require their own concrete plan. +- Chat approval permits interactive implementation only. Protected merge still + requires independent GitHub review or signed attestation. + +## Risks and stop conditions + +- `src/pipeline/**`, CLI, MCP/A2A, core schemas/types, package/build files and + Subactor repositories are outside this ticket. +- Repository discovery must not cross the supplied root or follow symlinks. +- If correct behavior requires a new public option or schema field, stop and + create an integration ticket rather than widening this scope. + +## Implementation and validation result + +- A root that is already a Git work tree still emits unprefixed paths in newest + first commit order. The extractor provenance is now `t2c/git@2` and records + `metadata.repositoryRoot` (`.` for a single repository). +- A non-Git umbrella uses deterministic breadth-first discovery bounded to 100 + repositories and 10,000 directories. It excludes common generated/vendor + roots, refuses symlinked directories and `.git` markers, stops below every + discovered checkout and reads four repositories concurrently while retaining + stable output order. +- Changed and previous rename paths are namespaced relative to the umbrella. + Per-repository short/empty-history and read failures are scoped warnings; + healthy siblings remain available. +- Focused Git tests: 5/5 PASS. Full `npm run verify`: 338 tests discovered, + 337 passed, one explicit missing-JDK skip, zero failures. `make docker-smoke`: + PASS. +- Comparable Subactor pipeline: 326 commits from 39 member repositories and + 2,697 namespaced changed paths. The other two raw `.git` directories observed + by recursive `find` are correctly pruned inside an already discovered + `vendor`/coding-agent `work` checkout. +- Same-snapshot control without Git had 133,043 records, 294,423 relations and + 14,396 diagnostics. With Git it has 133,369 records, 336,215 relations and + 14,121 diagnostics: +326 records, +41,792 relations and 275 fewer diagnostics. + 268 of 326 commit records link to other evidence; 58 remain explicitly + unlinked. Git exposes 169 implemented-but-undocumented findings and clears + 442 unlinked-record findings plus two planned-not-implemented findings. +- Composing this graph with ticket-021's planner produces 44 plans, including + 43 remediation-oriented `Resolve` plans and zero unsafe inverted plans. +- `make governance` reports no ticket-022 finding. The global gate remains + blocked only by the four inherited ticket-018/019 findings, so protected + merge/push remains blocked pending their reconciliation and independent review. diff --git a/project/ticket-022/ai-codex-logs.txt b/project/ticket-022/ai-codex-logs.txt new file mode 100644 index 0000000..42d0b21 --- /dev/null +++ b/project/ticket-022/ai-codex-logs.txt @@ -0,0 +1,14 @@ +2026-08-01T14:25:00Z ticket-022 planned on isolated branch ticket-022-umbrella-git +2026-08-01T14:25:00Z measured Subactor root: not a Git work tree; 41 real nested repository roots observed +2026-08-01T14:25:00Z state: PLAN / WAIT_FOR_APPROVAL; no source/test edits +2026-08-01T14:27:00Z user approval: "zatwierdzam ticket 022 i kolejne"; state: IN_PROGRESS / EDIT +2026-08-01T14:29:00Z focused baseline failed as expected: umbrella records 0; repositoryRoot absent +2026-08-01T14:31:00Z bounded umbrella discovery, path namespacing and t2c/git@2 implemented +2026-08-01T14:32:00Z focused Git tests PASS 5/5 +2026-08-01T14:33:00Z npm run verify PASS: 338 tests, 337 passed, 1 optional JDK skip, 0 failed +2026-08-01T14:33:00Z make docker-smoke PASS +2026-08-01T14:33:00Z make governance: ticket-022 clean; 4 inherited ticket-018/019 errors remain +2026-08-01T14:36:00Z comparable Subactor pipeline succeeded: 326 Git records from 39 member repositories +2026-08-01T14:39:00Z same-snapshot delta: +41792 relations, -275 diagnostics; 268/326 Git records linked +2026-08-01T14:40:00Z composed ticket-021 planner check: 44 plans, 43 Resolve, 0 unsafe +2026-08-01T14:41:00Z state: BLOCKED / VALIDATION pending global governance reconciliation and protected review diff --git a/project/ticket-022/ai-codex.md b/project/ticket-022/ai-codex.md new file mode 100644 index 0000000..8d242e0 --- /dev/null +++ b/project/ticket-022/ai-codex.md @@ -0,0 +1,32 @@ +--- +participant-id: agent:codex +participant: codex +role: agent +ticket: ticket-022 +--- +# Participant: codex + +## Understanding + +Subactor is an umbrella directory containing many independent repositories. +The current extractor exits after `git rev-parse` fails at the umbrella root, +so downstream intent/reality analysis has no Git evidence. The repair belongs +inside the deterministic Git extractor and must not broaden todo2code into an +executor. + +## Execution plan + +1. Wait for explicit approval and move to `EDIT`. +2. Add failing tests for bounded repository discovery and path namespacing. +3. Refactor the extractor into single-repository extraction plus deterministic + umbrella orchestration. +4. Run focused tests, full verification, governance and Docker smoke. +5. Repeat the Subactor pipeline and record measured evidence. +6. Stop before merge/push without independent protected review. + +## Current state + +The user approved ticket-022 with `zatwierdzam ticket 022 i kolejne` after the +exact plan was presented. Implementation and validation are complete within +`intent.json`; state is `BLOCKED / VALIDATION` only because the repository-wide +governance gate retains the inherited ticket-018/019 findings. diff --git a/project/ticket-022/changelog.md b/project/ticket-022/changelog.md new file mode 100644 index 0000000..82958fa --- /dev/null +++ b/project/ticket-022/changelog.md @@ -0,0 +1,28 @@ +# Changelog β€” ticket-022 + +## Planned + +- Discover bounded nested Git repositories below an umbrella root. +- Namespace repository paths so Git evidence links to shared workspace paths. +- Preserve single-repository extraction and read-only operation. +- Validate against the real Subactor workspace. + +## Implemented + +- Split Git extraction into one-repository evidence collection and bounded, + deterministic umbrella orchestration. +- Added breadth-first real-directory discovery, repository/directory caps, + symlink refusal, checkout pruning and stable four-reader concurrency. +- Namespaced changed/renamed paths and recorded each repository-relative root. +- Bumped deterministic Git provenance to `t2c/git@2`. +- Added regressions for collision-safe paths, pruning, symlink refusal, empty + repositories, rename paths, repeatability and the single-repository contract. + +## Validated + +- Focused tests, full Node verification and Docker smoke pass. +- Subactor supplies 326 commit records from 39 member repositories; 82.2% link + to other graph evidence and same-snapshot diagnostics fall by 275. +- A composed check with ticket-021 preserves zero unsafe remediation plans. +- The global governance gate remains blocked only by pre-existing ticket-018/019 + findings; ticket-022 is not merged or pushed. diff --git a/project/ticket-022/intent.json b/project/ticket-022/intent.json new file mode 100644 index 0000000..151aea1 --- /dev/null +++ b/project/ticket-022/intent.json @@ -0,0 +1,22 @@ +{ + "schema": "new-project.intent/v2", + "ticket": "ticket-022", + "summary": "Git evidence for umbrella workspaces", + "workstream": "extractors", + "allowedPaths": [ + "src/extractors/git.ts", + "test/diff-git-umbrella.test.ts", + "project/ticket-022/**", + "TODO.md", + "project/TICKETS.md" + ], + "forbiddenPaths": [ + "project/ticket-*/manager-*.md", + "project/ticket-*/user-*.md", + "project/ticket-*/dev-*.md" + ], + "stacks": ["node", "docker"], + "dependsOn": [], + "conflictsWith": [], + "integrationTicket": null +} diff --git a/project/ticket-022/preprompt.md b/project/ticket-022/preprompt.md new file mode 100644 index 0000000..aba251f --- /dev/null +++ b/project/ticket-022/preprompt.md @@ -0,0 +1,8 @@ +# Preprompt β€” ticket-022 + +Implement read-only, deterministic Git extraction for an umbrella workspace of +nested repositories. Preserve the single-repository contract, prefix nested +repository paths relative to the umbrella, never follow symlinks, stop walking +below a discovered repository, bound work, and degrade individual repository +failures to explicit warnings. Do not change public interfaces or execute any +repository mutation. diff --git a/project2.sh b/project2.sh new file mode 100755 index 0000000..cdab397 --- /dev/null +++ b/project2.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -e +if [ -t 1 ] && [ -n "${TERM:-}" ]; then + clear +fi + +# Canonical venv for koru autonomous + README is .venv (not venv). +if [ -x ".venv/bin/pip" ]; then + VENV=".venv" +elif [ -x "venv/bin/pip" ]; then + VENV="venv" +else + VENV=".venv" +fi +PIP="$VENV/bin/pip" + +if [ ! -f "$PIP" ]; then + echo "Creating virtual environment at $VENV..." + python3 -m venv "$VENV" +fi +echo "Using Python env: $VENV" + +$PIP install regix --upgrade --quiet +#$PIP install pyqual --upgrade --quiet +$PIP install prefact --upgrade --quiet +$PIP install vallm --upgrade --quiet +$PIP install redup --upgrade --quiet +$PIP install glon --upgrade --quiet +$PIP install code2logic --upgrade --quiet +$PIP install code2llm --upgrade --quiet +#$VENV/bin/code2llm ./ -f toon,evolution,code2logic,project-yaml -o ./project --no-chunk +$VENV/bin/code2llm ./ -f all -o ./project --no-chunk --exclude '*.md' +#$VENV/bin/code2llm report --format all # β†’ all views + +#$PIP install code2docs --upgrade --quiet +#$VENV/bin/code2docs ./ --readme-only +# Fast default: scan the main code hotspot and reuse a fresh report for one +# hour. Use REDUP_MODE=full REDUP_MAX_AGE_SECONDS=0 for a whole-workspace audit. +if [ -x "platform/scripts/run-semcod-diagnostics.sh" ]; then + bash platform/scripts/run-semcod-diagnostics.sh . +else + $VENV/bin/redup scan core \ + --ext '.py,.js,.mjs,.cjs,.ts,.tsx,.jsx,.php,.sh' \ + --min-lines 8 \ + --min-sim 0.92 \ + --no-memory-cache \ + --format toon \ + --output ./project/duplication-core.toon.yaml +fi +#$VENV/bin/redup scan . --functions-only -f toon --output ./project +#$VENV/bin/vallm batch ./src --recursive --semantic --model qwen2.5-coder:7b +#$VENV/bin/vallm batch --parallel . +#$VENV/bin/vallm batch . --recursive --format toon --output ./project +$VENV/bin/prefact -a -e "examples/**" + + +$PIP install doql --upgrade --quiet +$VENV/bin/doql adopt . --format less --output app.doql.less --force + +# Disabled: sumd (as of 0.3.60) reads project/*.toon.yaml as input for +# SUMD.md/SUMR.md, but also has a side effect of regenerating map.toon.yaml +# itself with a much smaller, simplified version β€” silently clobbering +# code2llm's canonical map (271KB+/500+ modules down to ~40KB/10 functions) +# a few seconds after code2llm wrote it. Upstream fix (sumd should skip a +# map.toon.yaml owned by code2llm) is tracked but not yet effective in the +# published version β€” re-enable once verified fixed on PyPI. +#$PIP install sumd --upgrade --quiet +#$VENV/bin/sumd . +#$VENV/bin/sumr . + + + +if [ -x "./tree.sh" ]; then + bash ./tree.sh +elif command -v tree >/dev/null 2>&1; then + tree -L 2 +else + echo "Skipping tree snapshot: ./tree.sh not found and 'tree' is not installed." +fi diff --git a/sdk/python/pyproject.toml b/sdk/python/pyproject.toml index 250e339..39d8efc 100644 --- a/sdk/python/pyproject.toml +++ b/sdk/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "todo2code-sdk" -version = "0.5.1" +version = "0.5.2" description = "Dependency-free Python SDK for todo2code A2A and the local TypeScript runtime" readme = "README.md" requires-python = ">=3.10" diff --git a/sdk/python/todo2code/__init__.py b/sdk/python/todo2code/__init__.py index 66588d5..c89547f 100644 --- a/sdk/python/todo2code/__init__.py +++ b/sdk/python/todo2code/__init__.py @@ -30,4 +30,4 @@ "TypeScriptRuntime", "TypeScriptRuntimeError", ] -__version__ = "0.5.1" +__version__ = "0.5.2" diff --git a/sdk/rust/Cargo.toml b/sdk/rust/Cargo.toml index 52f6b60..ab81505 100644 --- a/sdk/rust/Cargo.toml +++ b/sdk/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "todo2code" -version = "0.5.1" +version = "0.5.2" edition = "2021" rust-version = "1.70" description = "Rust SDK for the todo2code A2A v1.0 endpoint" diff --git a/sdk/typescript/package.json b/sdk/typescript/package.json index 0209990..486e1b4 100644 --- a/sdk/typescript/package.json +++ b/sdk/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@todo2code/sdk", - "version": "0.5.1", + "version": "0.5.2", "description": "TypeScript SDK for the todo2code A2A v1.0 endpoint.", "type": "module", "private": true, diff --git a/src/cli.ts b/src/cli.ts index 727e4aa..8a8a5b7 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -52,6 +52,12 @@ interface ParsedArgs { options: Map; } + +type CommandHandler = (parsed: ParsedArgs, config: ReturnType) => Promise; +type DiffMode = 'graph' | 'files' | 'git'; +type DiffPayload = { diffs: FileDiff[]; title: string }; +type ExtractHandler = (parsed: ParsedArgs, root: string, out: string | null, config: ReturnType) => Promise; + export async function main(argv = process.argv.slice(2)): Promise { await loadEnvFile(); if (argv[0] === '--help' || argv[0] === '-h') { @@ -63,321 +69,323 @@ export async function main(argv = process.argv.slice(2)): Promise { return; } const parsed = parseArgs(argv); - const command = parsed.positionals.shift() ?? 'help'; + const command = resolveMainCommand(parsed.positionals.shift() ?? 'help'); - if (command === 'help' || command === '--help' || command === '-h') { + if (command === 'help' || parsed.options.has('help')) { printHelp(); return; } // `parseArgs` removes options from positionals, so `pipeline --help` would // otherwise look exactly like `pipeline` and execute a mutating run. Help is // global until command-specific help exists: it must never reach a handler. - if (parsed.options.has('help')) { - printHelp(); - return; - } const config = getConfig(); - if (command === 'version' || command === '--version' || command === '-v') { - process.stdout.write(`todo2code ${T2C_VERSION}\n`); - return; - } - if (command === 'init') { - await initProject(path.resolve(parsed.positionals[0] ?? '.')); - return; - } - if (command === 'doctor') { - await doctor(config); - return; - } - if (command === 'mcp') { - await startMcpServer(config); - return; - } - if (command === 'a2a') { - await startA2aServer(config); - return; - } - if (command === 'intake') { - await handleIntake(parsed, config); - return; - } - if (command === 'extract') { - await handleExtract(parsed, config); - return; - } - if (command === 'communication') { - await handleCommunication(parsed, config); - return; - } - if (command === 'link') { - const files = parsed.positionals; - if (!files.length) throw new Error('Usage: t2c link ... [--out graph.json]'); - const records = (await Promise.all(files.map((file) => readJsonl(path.resolve(file))))).flat(); - const graph = linkIntentRecords(records); - await emitJson(graph, optionString(parsed, 'out')); - return; - } - if (command === 'diagnose') { - const graphFile = parsed.positionals[0]; - if (!graphFile) throw new Error('Usage: t2c diagnose [--out diagnostics.json]'); - const graph = await readJson(path.resolve(graphFile)); - await emitJson(diagnoseGraph(graph), optionString(parsed, 'out')); - return; - } - if (command === 'diff') { - await handleDiff(parsed, config); - return; - } - if (command === 'reality') { - await handleReality(parsed, config); - return; - } - if (command === 'summarize') { - const graphFile = parsed.positionals[0]; - if (!graphFile) throw new Error('Usage: t2c summarize [--diagnostics diagnostics.json] [--mode deterministic|prefer-llm|require-llm] [--out summary.md]'); - const graph = await readJson(path.resolve(graphFile)); - const diagnosticsPath = optionString(parsed, 'diagnostics'); - const diagnostics = diagnosticsPath - ? await readJson(path.resolve(diagnosticsPath)) - : diagnoseGraph(graph); - const result = await summarizeGraph(graph, diagnostics, config, { - mode: optionSummaryMode(parsed), - }); - for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\n`); - const out = optionString(parsed, 'out'); - if (out) await writeText(path.resolve(out), result.markdown); - else process.stdout.write(result.markdown); - return; - } - if (command === 'propose-todo') { - const graphPath = parsed.positionals[0]; - const diagnosticsPath = optionString(parsed, 'diagnostics'); - const output = optionString(parsed, 'out'); - if (!graphPath || !diagnosticsPath || !output) { - throw new Error('Usage: t2c propose-todo --diagnostics diagnostics.json [--mode prefer-llm|require-llm] --out synthesis.json'); - } - const result = await executeAction('propose_todo', { - root: optionString(parsed, 'root') ?? config.root, - graphPath, - diagnosticsPath, - mode: optionTaskMode(parsed), - output, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const handler = commandHandlers()[command]; + if (!handler) { + throw new Error(`Unknown command: ${command}. Run t2c help.`); } - if (command === 'render-todo') { - const synthesisPath = parsed.positionals[0]; - const graphPath = optionString(parsed, 'graph'); - const diagnosticsPath = optionString(parsed, 'diagnostics'); - const patch = optionString(parsed, 'patch'); - const audit = optionString(parsed, 'audit'); - if (!synthesisPath || !graphPath || !diagnosticsPath || !patch || !audit) { - throw new Error('Usage: t2c render-todo --graph graph.json --diagnostics diagnostics.json --todo TODO.md --patch TODO.patch --audit TODO.patch.json'); - } - const result = await executeAction('render_todo', { - root: optionString(parsed, 'root') ?? config.root, - synthesisPath, - graphPath, - diagnosticsPath, - todo: optionString(parsed, 'todo') ?? 'TODO.md', - patch, - audit, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; - } - if (command === 'apply-todo') { - const patch = optionString(parsed, 'patch'); - const audit = optionString(parsed, 'audit'); - const receipt = optionString(parsed, 'receipt'); - const actor = optionString(parsed, 'actor'); - const approvalHash = optionString(parsed, 'approval-hash'); - if (!patch || !audit || !receipt || !actor || !approvalHash) { - throw new Error('Usage: t2c apply-todo --todo TODO.md --patch TODO.patch --audit TODO.patch.json --receipt receipt.json --actor --approval-hash '); - } - const result = await executeAction('apply_todo', { - root: optionString(parsed, 'root') ?? config.root, - todo: optionString(parsed, 'todo') ?? 'TODO.md', - patch, - audit, - receipt, - actor, - approvalHash, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; - } - if (command === 'propose-code-change') { - const graphPath = parsed.positionals[0]; - const diagnosticsPath = optionString(parsed, 'diagnostics'); - const output = optionString(parsed, 'out'); - if (!graphPath || !diagnosticsPath || !output) { - throw new Error('Usage: t2c propose-code-change --diagnostics diagnostics.json [--proposals proposals.json] --out plans.json'); - } - const result = await executeAction('propose_code_change', { - root: optionString(parsed, 'root') ?? config.root, - graphPath, - diagnosticsPath, - conclusionsPath: optionString(parsed, 'conclusions'), - proposalsPath: optionString(parsed, 'proposals'), - maxPlans: optionString(parsed, 'max-plans'), - output, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + await handler(parsed, config); +} + +function commandHandlers(): Record { + return { + version: async () => { + process.stdout.write(`todo2code ${T2C_VERSION}\n`); + }, + init: async (parsed) => initProject(path.resolve(parsed.positionals[0] ?? '.')), + doctor: async (_parsed, config) => doctor(config), + mcp: async (_parsed, config) => { + await startMcpServer(config); + }, + a2a: async (_parsed, config) => { + await startA2aServer(config); + }, + intake: handleIntake, + extract: handleExtract, + communication: handleCommunication, + link: handleLink, + diagnose: handleDiagnose, + diff: handleDiff, + reality: handleReality, + summarize: handleSummarize, + 'propose-todo': handleProposeTodo, + 'render-todo': handleRenderTodo, + 'apply-todo': handleApplyTodo, + 'propose-code-change': handleProposeCodeChange, + 'render-code-change': handleRenderCodeChange, + 'propose-source-patch': handleProposeSourcePatch, + 'apply-source-patch': handleApplySourcePatch, + 'evaluate-code-change': handleEvaluateCodeChange, + 'close-code-change': handleCloseCodeChange, + watch: handleWatch, + 'compare-workspace': handleCompareWorkspace, + pipeline: handlePipeline, + }; +} + +function resolveMainCommand(raw: string): string { + if (raw === '--help' || raw === '-h') return 'help'; + if (raw === '--version' || raw === '-v') return 'version'; + return raw; +} + +async function handleLink(parsed: ParsedArgs): Promise { + const files = parsed.positionals; + if (!files.length) throw new Error('Usage: t2c link ... [--out graph.json]'); + const records = (await Promise.all(files.map((file) => readJsonl(path.resolve(file))))).flat(); + const graph = linkIntentRecords(records); + await emitJson(graph, optionString(parsed, 'out')); +} + +async function handleDiagnose(parsed: ParsedArgs): Promise { + const graphFile = parsed.positionals[0]; + if (!graphFile) throw new Error('Usage: t2c diagnose [--out diagnostics.json]'); + const graph = await readJson(path.resolve(graphFile)); + await emitJson(diagnoseGraph(graph), optionString(parsed, 'out')); +} + +async function handleSummarize(parsed: ParsedArgs, config: ReturnType): Promise { + const graphFile = parsed.positionals[0]; + if (!graphFile) throw new Error('Usage: t2c summarize [--diagnostics diagnostics.json] [--mode deterministic|prefer-llm|require-llm] [--out summary.md]'); + const graph = await readJson(path.resolve(graphFile)); + const diagnosticsPath = optionString(parsed, 'diagnostics'); + const diagnostics = diagnosticsPath + ? await readJson(path.resolve(diagnosticsPath)) + : diagnoseGraph(graph); + const result = await summarizeGraph(graph, diagnostics, config, { + mode: optionSummaryMode(parsed), + }); + for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\n`); + const out = optionString(parsed, 'out'); + if (out) await writeText(path.resolve(out), result.markdown); + else process.stdout.write(result.markdown); +} + +async function handleProposeTodo(parsed: ParsedArgs, config: ReturnType): Promise { + const graphPath = parsed.positionals[0]; + const diagnosticsPath = optionString(parsed, 'diagnostics'); + const output = optionString(parsed, 'out'); + if (!graphPath || !diagnosticsPath || !output) { + throw new Error('Usage: t2c propose-todo --diagnostics diagnostics.json [--mode prefer-llm|require-llm] --out synthesis.json'); } - if (command === 'render-code-change') { - const plansPath = parsed.positionals[0]; - const patch = optionString(parsed, 'patch') ?? 'CODE_CHANGE.review.md'; - const audit = optionString(parsed, 'audit') ?? 'CODE_CHANGE.review.json'; - if (!plansPath) { - throw new Error('Usage: t2c render-code-change [--patch CODE_CHANGE.review.md] [--audit CODE_CHANGE.review.json]'); - } - const result = await executeAction('render_code_change', { - root: optionString(parsed, 'root') ?? config.root, - plansPath, - patch, - audit, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const result = await executeAction('propose_todo', { + root: optionString(parsed, 'root') ?? config.root, + graphPath, + diagnosticsPath, + mode: optionTaskMode(parsed), + output, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleRenderTodo(parsed: ParsedArgs, config: ReturnType): Promise { + const synthesisPath = parsed.positionals[0]; + const graphPath = optionString(parsed, 'graph'); + const diagnosticsPath = optionString(parsed, 'diagnostics'); + const patch = optionString(parsed, 'patch'); + const audit = optionString(parsed, 'audit'); + if (!synthesisPath || !graphPath || !diagnosticsPath || !patch || !audit) { + throw new Error('Usage: t2c render-todo --graph graph.json --diagnostics diagnostics.json --todo TODO.md --patch TODO.patch --audit TODO.patch.json'); } - if (command === 'propose-source-patch') { - const inputPath = parsed.positionals[0]; - const output = optionString(parsed, 'out'); - if (!inputPath || !output) { - throw new Error('Usage: t2c propose-source-patch --out source-patches.json'); - } - const isPlanSet = inputPath.endsWith('plans.json') || optionString(parsed, 'kind') === 'set'; - const result = await executeAction('propose_source_patch', { - root: optionString(parsed, 'root') ?? config.root, - ...(isPlanSet ? { plansPath: inputPath } : { planPath: inputPath }), - output, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const result = await executeAction('render_todo', { + root: optionString(parsed, 'root') ?? config.root, + synthesisPath, + graphPath, + diagnosticsPath, + todo: optionString(parsed, 'todo') ?? 'TODO.md', + patch, + audit, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleApplyTodo(parsed: ParsedArgs, config: ReturnType): Promise { + const patch = optionString(parsed, 'patch'); + const audit = optionString(parsed, 'audit'); + const receipt = optionString(parsed, 'receipt'); + const actor = optionString(parsed, 'actor'); + const approvalHash = optionString(parsed, 'approval-hash'); + if (!patch || !audit || !receipt || !actor || !approvalHash) { + throw new Error('Usage: t2c apply-todo --todo TODO.md --patch TODO.patch --audit TODO.patch.json --receipt receipt.json --actor --approval-hash '); } - if (command === 'apply-source-patch') { - const patchPath = parsed.positionals[0]; - const actor = optionString(parsed, 'actor'); - const approvalHash = optionString(parsed, 'approval-hash'); - const receipt = optionString(parsed, 'receipt') ?? 'CODE_CHANGE.source.receipt.json'; - if (!patchPath || !actor || !approvalHash) { - throw new Error('Usage: t2c apply-source-patch --actor --approval-hash [--receipt receipt.json]'); - } - const result = await executeAction('apply_source_patch', { - root: optionString(parsed, 'root') ?? config.root, - patchPath, - actor, - approvalHash, - receipt, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const result = await executeAction('apply_todo', { + root: optionString(parsed, 'root') ?? config.root, + todo: optionString(parsed, 'todo') ?? 'TODO.md', + patch, + audit, + receipt, + actor, + approvalHash, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleProposeCodeChange(parsed: ParsedArgs, config: ReturnType): Promise { + const graphPath = parsed.positionals[0]; + const diagnosticsPath = optionString(parsed, 'diagnostics'); + const output = optionString(parsed, 'out'); + if (!graphPath || !diagnosticsPath || !output) { + throw new Error('Usage: t2c propose-code-change --diagnostics diagnostics.json [--proposals proposals.json] --out plans.json'); } - if (command === 'evaluate-code-change') { - const planPath = parsed.positionals[0]; - const beforeGraphPath = optionString(parsed, 'before-graph'); - const afterGraphPath = optionString(parsed, 'after-graph'); - const output = optionString(parsed, 'out'); - if (!planPath || !beforeGraphPath || !afterGraphPath || !output) { - throw new Error('Usage: t2c evaluate-code-change --before-graph before.json --after-graph after.json [--before-diagnostics d.json] --out acceptance.json'); - } - const result = await executeAction('evaluate_code_change', { - root: optionString(parsed, 'root') ?? config.root, - planPath, - beforeGraphPath, - beforeDiagnosticsPath: optionString(parsed, 'before-diagnostics'), - afterGraphPath, - afterDiagnosticsPath: optionString(parsed, 'after-diagnostics'), - output, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const result = await executeAction('propose_code_change', { + root: optionString(parsed, 'root') ?? config.root, + graphPath, + diagnosticsPath, + conclusionsPath: optionString(parsed, 'conclusions'), + proposalsPath: optionString(parsed, 'proposals'), + maxPlans: optionString(parsed, 'max-plans'), + output, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleRenderCodeChange(parsed: ParsedArgs, config: ReturnType): Promise { + const plansPath = parsed.positionals[0]; + const patch = optionString(parsed, 'patch') ?? 'CODE_CHANGE.review.md'; + const audit = optionString(parsed, 'audit') ?? 'CODE_CHANGE.review.json'; + if (!plansPath) { + throw new Error('Usage: t2c render-code-change [--patch CODE_CHANGE.review.md] [--audit CODE_CHANGE.review.json]'); } - if (command === 'close-code-change') { - const inputPath = parsed.positionals[0]; - const beforeGraphPath = optionString(parsed, 'before-graph'); - const afterGraphPath = optionString(parsed, 'after-graph'); - const output = optionString(parsed, 'out'); - if (!inputPath || !beforeGraphPath || !afterGraphPath || !output) { - throw new Error('Usage: t2c close-code-change --before-graph before.json --after-graph after.json --out close.json'); - } - const result = await executeAction('close_code_change', { - root: optionString(parsed, 'root') ?? config.root, - inputPath, - beforeGraphPath, - beforeDiagnosticsPath: optionString(parsed, 'before-diagnostics'), - afterGraphPath, - afterDiagnosticsPath: optionString(parsed, 'after-diagnostics'), - output, - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const result = await executeAction('render_code_change', { + root: optionString(parsed, 'root') ?? config.root, + plansPath, + patch, + audit, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleProposeSourcePatch(parsed: ParsedArgs, config: ReturnType): Promise { + const inputPath = parsed.positionals[0]; + const output = optionString(parsed, 'out'); + if (!inputPath || !output) { + throw new Error('Usage: t2c propose-source-patch --out source-patches.json'); } - if (command === 'watch') { - await handleWatch(parsed, config); - return; + const isPlanSet = inputPath.endsWith('plans.json') || optionString(parsed, 'kind') === 'set'; + const result = await executeAction('propose_source_patch', { + root: optionString(parsed, 'root') ?? config.root, + ...(isPlanSet ? { plansPath: inputPath } : { planPath: inputPath }), + output, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleApplySourcePatch(parsed: ParsedArgs, config: ReturnType): Promise { + const patchPath = parsed.positionals[0]; + const actor = optionString(parsed, 'actor'); + const approvalHash = optionString(parsed, 'approval-hash'); + const receipt = optionString(parsed, 'receipt') ?? 'CODE_CHANGE.source.receipt.json'; + if (!patchPath || !actor || !approvalHash) { + throw new Error('Usage: t2c apply-source-patch --actor --approval-hash [--receipt receipt.json]'); } - if (command === 'compare-workspace') { - const root = path.resolve(parsed.positionals[0] ?? config.root); - const result = await compareWorkspaceIntent({ - root, - baseRef: optionString(parsed, 'base') ?? 'origin/main', - taskFile: optionNullableString(parsed, 'task', null), - todoFile: optionNullableString(parsed, 'todo', 'TODO.md'), - changelogFile: optionNullableString(parsed, 'changelog', 'CHANGELOG.md'), - documentPatterns: optionList(parsed, 'docs', config.documentPatterns), - documentExcludes: optionList(parsed, 'doc-excludes', config.documentExcludes), - includeDocumentationLlm: optionBoolean(parsed, 'docs-llm', false), - markdownMode: optionLlmMode(parsed, 'markdown-mode', config.markdownMode), - communicationMode: optionLlmMode(parsed, 'communication-mode', config.communicationMode), - outputDir: optionString(parsed, 'out') ?? config.outputDir, - gitCommitCount: optionNumber(parsed, 'git-count', config.gitCommitCount, 1, 100), - }, config); - process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); - return; + const result = await executeAction('apply_source_patch', { + root: optionString(parsed, 'root') ?? config.root, + patchPath, + actor, + approvalHash, + receipt, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleEvaluateCodeChange(parsed: ParsedArgs, config: ReturnType): Promise { + const planPath = parsed.positionals[0]; + const beforeGraphPath = optionString(parsed, 'before-graph'); + const afterGraphPath = optionString(parsed, 'after-graph'); + const output = optionString(parsed, 'out'); + if (!planPath || !beforeGraphPath || !afterGraphPath || !output) { + throw new Error('Usage: t2c evaluate-code-change --before-graph before.json --after-graph after.json [--before-diagnostics d.json] --out acceptance.json'); } - if (command === 'pipeline') { - const root = path.resolve(parsed.positionals[0] ?? config.root); - const options: PipelineOptions = { - root, - taskFile: optionNullableString(parsed, 'task', null), - todoFile: optionNullableString(parsed, 'todo', 'TODO.md'), - changelogFile: optionNullableString(parsed, 'changelog', 'CHANGELOG.md'), - documentPatterns: optionList(parsed, 'docs', config.documentPatterns), - includeDocumentationLlm: !optionBoolean(parsed, 'no-docs-llm', false), - outputDir: optionString(parsed, 'out') ?? config.outputDir, - gitCommitCount: optionNumber(parsed, 'git-count', config.gitCommitCount, 1, 100), - allowSummaryFallback: optionBoolean(parsed, 'summary-fallback', false), - includeSummaryLlm: !optionBoolean(parsed, 'no-summary-llm', false), - nlMode: optionNlMode(parsed, config.nlMode), - markdownMode: optionLlmMode(parsed, 'markdown-mode', config.markdownMode), - communicationMode: optionLlmMode(parsed, 'communication-mode', config.communicationMode), - documentExcludes: optionList(parsed, 'doc-excludes', config.documentExcludes), - taskSynthesisMode: optionPipelineTaskMode(parsed), - includeCommunication: !optionBoolean(parsed, 'no-communication', false), - projectDirectory: optionString(parsed, 'project-dir') ?? 'project', - communicationTicket: optionNullableString(parsed, 'communication-ticket', null), - cycleFile: optionNullableString(parsed, 'cycle', null), - }; - const result = await runPipeline(options, config); - reportPipelineDegradation(result.manifest); - process.stdout.write(`${JSON.stringify({ ...result, manifest: result.manifest }, null, 2)}\n`); - return; + const result = await executeAction('evaluate_code_change', { + root: optionString(parsed, 'root') ?? config.root, + planPath, + beforeGraphPath, + beforeDiagnosticsPath: optionString(parsed, 'before-diagnostics'), + afterGraphPath, + afterDiagnosticsPath: optionString(parsed, 'after-diagnostics'), + output, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleCloseCodeChange(parsed: ParsedArgs, config: ReturnType): Promise { + const inputPath = parsed.positionals[0]; + const beforeGraphPath = optionString(parsed, 'before-graph'); + const afterGraphPath = optionString(parsed, 'after-graph'); + const output = optionString(parsed, 'out'); + if (!inputPath || !beforeGraphPath || !afterGraphPath || !output) { + throw new Error('Usage: t2c close-code-change --before-graph before.json --after-graph after.json --out close.json'); } - throw new Error(`Unknown command: ${command}. Run t2c help.`); + const result = await executeAction('close_code_change', { + root: optionString(parsed, 'root') ?? config.root, + inputPath, + beforeGraphPath, + beforeDiagnosticsPath: optionString(parsed, 'before-diagnostics'), + afterGraphPath, + afterDiagnosticsPath: optionString(parsed, 'after-diagnostics'), + output, + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handleCompareWorkspace(parsed: ParsedArgs, config: ReturnType): Promise { + const root = resolvePipelineRoot(parsed, config); + const result = await compareWorkspaceIntent({ + ...buildWorkspaceComparisonOptions(parsed, config, root), + }, config); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +async function handlePipeline(parsed: ParsedArgs, config: ReturnType): Promise { + const root = resolvePipelineRoot(parsed, config); + const options = buildPipelineOptions(parsed, config, root, optionNullableString(parsed, 'task', null)); + const result = await runPipeline(options, config); + reportPipelineDegradation(result.manifest); + process.stdout.write(`${JSON.stringify({ ...result, manifest: result.manifest }, null, 2)}\n`); } async function handleWatch(parsed: ParsedArgs, config: ReturnType): Promise { - const root = path.resolve(parsed.positionals[0] ?? config.root); - const taskFile = parsed.options.has('task') - ? optionNullableString(parsed, 'task', null) - : await pathExists(path.join(root, 'TASK.md')) ? 'TASK.md' : null; - const pipeline: PipelineOptions = { + const root = resolvePipelineRoot(parsed, config); + const taskFile = await resolveWatchTaskFile(parsed, root); + const pipeline = buildPipelineOptions(parsed, config, root, taskFile); + + const controller = new AbortController(); + const stop = (): void => controller.abort(); + process.once('SIGINT', stop); + process.once('SIGTERM', stop); + + await watchRepository({ + root, + pipeline, + minIntervalMs: optionNumber(parsed, 'interval', 60, 0, 86_400) * 1000, + scanIntervalMs: optionNumber(parsed, 'scan-interval', 2, 1, 3_600) * 1000, + runOnStart: !optionBoolean(parsed, 'no-initial-report', false), + signal: controller.signal, + onEvent: (event) => process.stderr.write(`${formatWatchEvent(event)}\n`), + }, config); +} + +function resolvePipelineRoot(parsed: ParsedArgs, config: ReturnType): string { + return path.resolve(parsed.positionals[0] ?? config.root); +} + +function buildPipelineOptions( + parsed: ParsedArgs, + config: ReturnType, + root: string, + taskFile: string | null, +): PipelineOptions { + return { root, taskFile, + ...buildCommonPipelineOptions(parsed, config), + }; +} + +function buildCommonPipelineOptions( + parsed: ParsedArgs, + config: ReturnType, +): Omit { + return { todoFile: optionNullableString(parsed, 'todo', 'TODO.md'), changelogFile: optionNullableString(parsed, 'changelog', 'CHANGELOG.md'), documentPatterns: optionList(parsed, 'docs', config.documentPatterns), @@ -396,21 +404,45 @@ async function handleWatch(parsed: ParsedArgs, config: ReturnType controller.abort(); - process.once('SIGINT', stop); - process.once('SIGTERM', stop); +async function resolveWatchTaskFile(parsed: ParsedArgs, root: string): Promise { + if (parsed.options.has('task')) return optionNullableString(parsed, 'task', null); + return (await pathExists(path.join(root, 'TASK.md'))) ? 'TASK.md' : null; +} - await watchRepository({ +function buildWorkspaceComparisonOptions( + parsed: ParsedArgs, + config: ReturnType, + root: string, +): { + root: string; + baseRef: string; + taskFile: string | null; + todoFile: string | null; + changelogFile: string | null; + documentPatterns: string[]; + documentExcludes: string[]; + includeDocumentationLlm: boolean; + markdownMode: LlmExtractionMode; + communicationMode: LlmExtractionMode; + outputDir: string; + gitCommitCount: number; +} { + return { root, - pipeline, - minIntervalMs: optionNumber(parsed, 'interval', 60, 0, 86_400) * 1000, - scanIntervalMs: optionNumber(parsed, 'scan-interval', 2, 1, 3_600) * 1000, - runOnStart: !optionBoolean(parsed, 'no-initial-report', false), - signal: controller.signal, - onEvent: (event) => process.stderr.write(`${formatWatchEvent(event)}\n`), - }, config); + baseRef: optionString(parsed, 'base') ?? 'origin/main', + taskFile: optionNullableString(parsed, 'task', null), + todoFile: optionNullableString(parsed, 'todo', 'TODO.md'), + changelogFile: optionNullableString(parsed, 'changelog', 'CHANGELOG.md'), + documentPatterns: optionList(parsed, 'docs', config.documentPatterns), + documentExcludes: optionList(parsed, 'doc-excludes', config.documentExcludes), + includeDocumentationLlm: optionBoolean(parsed, 'docs-llm', false), + markdownMode: optionLlmMode(parsed, 'markdown-mode', config.markdownMode), + communicationMode: optionLlmMode(parsed, 'communication-mode', config.communicationMode), + outputDir: optionString(parsed, 'out') ?? config.outputDir, + gitCommitCount: optionNumber(parsed, 'git-count', config.gitCommitCount, 1, 100), + }; } function formatWatchEvent(event: WatchEvent): string { @@ -434,60 +466,16 @@ function formatWatchEvent(event: WatchEvent): string { } async function handleDiff(parsed: ParsedArgs, config: ReturnType): Promise { - const mode = (optionString(parsed, 'mode') ?? 'graph').toLowerCase(); - const out = optionString(parsed, 'out'); - const svg = optionString(parsed, 'svg'); - const html = optionString(parsed, 'html'); - + const mode = parseDiffMode(parsed); if (mode === 'graph') { - const beforeFile = parsed.positionals[0]; - const afterFile = parsed.positionals[1]; - if (!beforeFile || !afterFile) { - throw new Error('Usage: t2c diff [--out diff.json] [--svg diff.svg]'); - } - const [before, after] = await Promise.all([ - readJson(path.resolve(beforeFile)), - readJson(path.resolve(afterFile)), - ]); - const diff = diffIntentGraphs(before, after); - if (out) await writeJson(path.resolve(out), diff); - if (svg) await writeText(path.resolve(svg), renderGraphDiffSvg(diff, { maxItems: optionNumber(parsed, 'max-items', 18, 1, 100) })); - if (!out && !svg) process.stdout.write(`${JSON.stringify(diff, null, 2)}\n`); + await handleGraphDiff(parsed, config); return; } - - const context = optionNumber(parsed, 'context', 3, 0, 100); + const { diffs, title } = await buildDiffPayload(parsed, config, mode); + const out = optionString(parsed, 'out'); + const svg = optionString(parsed, 'svg'); + const html = optionString(parsed, 'html'); const maxRows = optionNumber(parsed, 'max-rows', 400, 1, 4000); - let diffs: FileDiff[]; - let title: string; - - if (mode === 'files') { - const beforeFile = parsed.positionals[0]; - const afterFile = parsed.positionals[1]; - if (!beforeFile || !afterFile) { - throw new Error('Usage: t2c diff --mode files [--svg diff.svg] [--html diff.html]'); - } - const [beforeText, afterText] = await Promise.all([ - readText(path.resolve(beforeFile), config.maxFileBytes), - readText(path.resolve(afterFile), config.maxFileBytes), - ]); - diffs = [diffText(beforeText, afterText, { beforePath: beforeFile, afterPath: afterFile, path: afterFile, context })]; - title = `${beforeFile} β†’ ${afterFile}`; - } else if (mode === 'git') { - const root = path.resolve(parsed.positionals[0] ?? config.root); - const result = await collectGitDiff({ - root, - revision: optionString(parsed, 'rev') ?? 'HEAD', - staged: optionBoolean(parsed, 'staged', false), - context, - maxFiles: optionNumber(parsed, 'max-files', 50, 1, 500), - }); - for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\n`); - diffs = result.diffs; - title = `git diff ${result.staged ? '--cached ' : ''}${result.revision}`; - } else { - throw new Error(`Unknown --mode ${mode}. Expected graph, files or git.`); - } if (out) await writeJson(path.resolve(out), diffs); if (svg) await writeText(path.resolve(svg), renderTextDiffSvg(diffs, { title, maxRows })); @@ -497,6 +485,69 @@ async function handleDiff(parsed: ParsedArgs, config: ReturnType): Promise { + const beforeFile = parsed.positionals[0]; + const afterFile = parsed.positionals[1]; + if (!beforeFile || !afterFile) { + throw new Error('Usage: t2c diff [--out diff.json] [--svg diff.svg]'); + } + const [before, after] = await Promise.all([ + readJson(path.resolve(beforeFile)), + readJson(path.resolve(afterFile)), + ]); + const diff = diffIntentGraphs(before, after); + const out = optionString(parsed, 'out'); + const svg = optionString(parsed, 'svg'); + if (out) await writeJson(path.resolve(out), diff); + if (svg) await writeText(path.resolve(svg), renderGraphDiffSvg(diff, { maxItems: optionNumber(parsed, 'max-items', 18, 1, 100) })); + if (!out && !svg) process.stdout.write(`${JSON.stringify(diff, null, 2)}\n`); +} + +async function buildDiffPayload(parsed: ParsedArgs, config: ReturnType, mode: DiffMode): Promise { + if (mode === 'files') return buildFileDiff(parsed, config); + return buildGitDiff(parsed, config); +} + +async function buildFileDiff(parsed: ParsedArgs, config: ReturnType): Promise { + const beforeFile = parsed.positionals[0]; + const afterFile = parsed.positionals[1]; + if (!beforeFile || !afterFile) { + throw new Error('Usage: t2c diff --mode files [--svg diff.svg] [--html diff.html]'); + } + const context = optionNumber(parsed, 'context', 3, 0, 100); + const [beforeText, afterText] = await Promise.all([ + readText(path.resolve(beforeFile), config.maxFileBytes), + readText(path.resolve(afterFile), config.maxFileBytes), + ]); + return { + diffs: [diffText(beforeText, afterText, { beforePath: beforeFile, afterPath: afterFile, path: afterFile, context })], + title: `${beforeFile} β†’ ${afterFile}`, + }; +} + +async function buildGitDiff(parsed: ParsedArgs, config: ReturnType): Promise { + const context = optionNumber(parsed, 'context', 3, 0, 100); + const root = path.resolve(parsed.positionals[0] ?? config.root); + const result = await collectGitDiff({ + root, + revision: optionString(parsed, 'rev') ?? 'HEAD', + staged: optionBoolean(parsed, 'staged', false), + context, + maxFiles: optionNumber(parsed, 'max-files', 50, 1, 500), + }); + for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\n`); + return { + diffs: result.diffs, + title: `git diff ${result.staged ? '--cached ' : ''}${result.revision}`, + }; +} + async function handleReality(parsed: ParsedArgs, config: ReturnType): Promise { const graphFile = parsed.positionals[0]; if (!graphFile) { @@ -525,74 +576,91 @@ async function handleReality(parsed: ParsedArgs, config: ReturnType): Promise { const extractor = parsed.positionals.shift(); + if (!extractor) { + throw new Error('Usage: t2c extract ...'); + } const root = path.resolve(optionString(parsed, 'root') ?? config.root); const out = optionString(parsed, 'out'); - if (extractor === 'nl') { - const file = parsed.positionals[0]; - const inline = optionString(parsed, 'text'); - if (!file && !inline) throw new Error('Usage: t2c extract nl [--text "..."] [--out records.jsonl]'); - const result = await extractNlIntentAudited( - { root, sourcePath: file ?? 'cli-input.md', ...(inline ? { text: inline } : {}) }, - config, - optionNlMode(parsed, config.nlMode), - ); - await emitExtraction(result, out); - process.stderr.write(`NL -> DSL: ${result.audit.status} (${result.audit.effectiveMode})\n`); - return; - } - if (extractor === 'git') { - const result = await extractGitIntent({ root, count: optionNumber(parsed, 'count', config.gitCommitCount, 1, 100) }, config); - await emitExtraction(result, out); - return; - } - if (extractor === 'ast') { - const result = await extractAstIntent({ root: path.resolve(parsed.positionals[0] ?? root) }, config); - await emitExtraction(result, out); - return; - } - if (extractor === 'config') { - const result = await extractConfigurationIntent(path.resolve(parsed.positionals[0] ?? root), config); - await emitExtraction(result, out); - return; - } - if (extractor === 'runtime') { - const cycle = parsed.positionals[0]; - if (!cycle) throw new Error('Usage: t2c extract runtime [--out runtime.intent.jsonl]'); - const result = await extractRuntimeCycleIntent(cycle, config, root); - await emitExtraction(result, out); - return; - } - if (extractor === 'markdown') { - const result = await extractMarkdownIntentAudited({ - root, - todoPath: optionNullableString(parsed, 'todo', 'TODO.md'), - changelogPath: optionNullableString(parsed, 'changelog', 'CHANGELOG.md'), - }, config, optionLlmMode(parsed, 'markdown-mode', config.markdownMode)); - await emitExtraction(result, out); - process.stderr.write(`TODO/CHANGELOG -> DSL: ${result.audit.status} (${result.audit.effectiveMode})\n`); - return; - } - if (extractor === 'docs') { - const result = await extractDocumentationIntent({ - root, - patterns: optionList(parsed, 'patterns', config.documentPatterns), - excludes: optionList(parsed, 'excludes', config.documentExcludes), - }, config); - await emitExtraction(result, out); - process.stderr.write(`documentation -> DSL: ${result.audit.status} (${result.audit.effectiveMode}), runtime ${result.audit.runtimeVersion}\n`); - return; - } - if (extractor === 'communication') { - const result = await extractCommunicationIntentAudited({ - root, - projectDir: optionString(parsed, 'project-dir') ?? 'project', - ticket: optionNullableString(parsed, 'ticket', null), - }, config, optionLlmMode(parsed, 'communication-mode', config.communicationMode)); - await emitExtraction(result, out); - process.stderr.write(`communication -> DSL: ${result.audit.status} (${result.audit.effectiveMode})\n`); - return; + const handlers: Record = { + nl: handleExtractNl, + git: handleExtractGit, + ast: handleExtractAst, + config: handleExtractConfig, + runtime: handleExtractRuntime, + markdown: handleExtractMarkdown, + docs: handleExtractDocs, + communication: handleExtractCommunication, + }; + const handler = handlers[extractor]; + if (!handler) { + throw new Error('Usage: t2c extract ...'); } - throw new Error('Usage: t2c extract ...'); + await handler(parsed, root, out, config); +} + +async function handleExtractNl(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const file = parsed.positionals[0]; + const inline = optionString(parsed, 'text'); + if (!file && !inline) throw new Error('Usage: t2c extract nl [--text "..."] [--out records.jsonl]'); + const result = await extractNlIntentAudited( + { root, sourcePath: file ?? 'cli-input.md', ...(inline ? { text: inline } : {}) }, + config, + optionNlMode(parsed, config.nlMode), + ); + await emitExtraction(result, out); + process.stderr.write(`NL -> DSL: ${result.audit.status} (${result.audit.effectiveMode})\n`); +} + +async function handleExtractGit(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const result = await extractGitIntent({ root, count: optionNumber(parsed, 'count', config.gitCommitCount, 1, 100) }, config); + await emitExtraction(result, out); +} + +async function handleExtractAst(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const result = await extractAstIntent({ root: path.resolve(parsed.positionals[0] ?? root) }, config); + await emitExtraction(result, out); +} + +async function handleExtractConfig(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const result = await extractConfigurationIntent(path.resolve(parsed.positionals[0] ?? root), config); + await emitExtraction(result, out); +} + +async function handleExtractRuntime(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const cycle = parsed.positionals[0]; + if (!cycle) throw new Error('Usage: t2c extract runtime [--out runtime.intent.jsonl]'); + const result = await extractRuntimeCycleIntent(cycle, config, root); + await emitExtraction(result, out); +} + +async function handleExtractMarkdown(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const result = await extractMarkdownIntentAudited({ + root, + todoPath: optionNullableString(parsed, 'todo', 'TODO.md'), + changelogPath: optionNullableString(parsed, 'changelog', 'CHANGELOG.md'), + }, config, optionLlmMode(parsed, 'markdown-mode', config.markdownMode)); + await emitExtraction(result, out); + process.stderr.write(`TODO/CHANGELOG -> DSL: ${result.audit.status} (${result.audit.effectiveMode})\n`); +} + +async function handleExtractDocs(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const result = await extractDocumentationIntent({ + root, + patterns: optionList(parsed, 'patterns', config.documentPatterns), + excludes: optionList(parsed, 'excludes', config.documentExcludes), + }, config); + await emitExtraction(result, out); + process.stderr.write(`documentation -> DSL: ${result.audit.status} (${result.audit.effectiveMode}), runtime ${result.audit.runtimeVersion}\n`); +} + +async function handleExtractCommunication(parsed: ParsedArgs, root: string, out: string | null, config: ReturnType): Promise { + const result = await extractCommunicationIntentAudited({ + root, + projectDir: optionString(parsed, 'project-dir') ?? 'project', + ticket: optionNullableString(parsed, 'ticket', null), + }, config, optionLlmMode(parsed, 'communication-mode', config.communicationMode)); + await emitExtraction(result, out); + process.stderr.write(`communication -> DSL: ${result.audit.status} (${result.audit.effectiveMode})\n`); } async function handleCommunication(parsed: ParsedArgs, config: ReturnType): Promise { diff --git a/src/communication/analyzer.ts b/src/communication/analyzer.ts index 4e95e9c..734cd57 100644 --- a/src/communication/analyzer.ts +++ b/src/communication/analyzer.ts @@ -62,9 +62,35 @@ export function analyzeCommunication( const communication = graph.records.filter((record) => record.source.kind === 'agent_log'); validateSyntheses(syntheses, communication); const evidenceByRecord = evidenceNeighbors(graph); + const { participants, issues } = collectParticipantsAndIdentityIssues(communication); + const humanRequests = communication.filter((record) => roleOf(record) === 'human' && ['request', 'message'].includes(typeOf(record))); + const agentMessages = communication.filter((record) => roleOf(record) === 'agent'); + const allIssues = [ + ...issues, + ...collectConflictIssues(communication, participants), + ...collectRequestResponseIssues(communication, humanRequests, agentMessages), + ...collectAgentActionIssues(communication, graph, evidenceByRecord, humanRequests, agentMessages), + ]; + const uniqueIssues = deduplicateCommunicationIssues(allIssues) + .sort((a, b) => severityRank(b.severity) - severityRank(a.severity) || a.id.localeCompare(b.id)); + const participantRows = buildParticipantRows(graph, communication, participants, evidenceByRecord, uniqueIssues); + const counts: Record = { info: 0, warning: 0, review_required: 0, blocking: 0 }; + for (const item of uniqueIssues) counts[item.severity] += 1; + return { + schemaVersion: 't2c.communication-analysis/v1', + generatedAt, + graphFingerprint: graph.fingerprint, + tickets: [...new Set(communication.map(ticketOf))].sort(), + participants: participantRows, + syntheses: [...syntheses].sort((left, right) => left.role.localeCompare(right.role) || left.participant.localeCompare(right.participant)), + issues: uniqueIssues, + counts, + }; +} + +function collectParticipantsAndIdentityIssues(communication: IntentRecord[]): { participants: Map; issues: CommunicationIssue[] } { const issues: CommunicationIssue[] = []; const participants = new Map(); - for (const record of communication) { const participant = participantOf(record); const values = participants.get(participant); @@ -79,7 +105,14 @@ export function analyzeCommunication( )); } } + return { participants, issues }; +} +function collectConflictIssues( + communication: IntentRecord[], + participants: Map, +): CommunicationIssue[] { + const issues: CommunicationIssue[] = []; for (let leftIndex = 0; leftIndex < communication.length; leftIndex += 1) { for (let rightIndex = leftIndex + 1; rightIndex < communication.length; rightIndex += 1) { const left = communication[leftIndex]; @@ -91,11 +124,7 @@ export function analyzeCommunication( const rightRole = roleOf(right); if (leftRole === 'unknown' || rightRole === 'unknown') continue; const roles = [leftRole, rightRole].sort().join(':'); - const code = roles === 'human:human' - ? 'HUMAN_COMMUNICATION_CONFLICT' - : roles === 'agent:agent' - ? 'AGENT_COMMUNICATION_CONFLICT' - : 'HUMAN_AGENT_CONFLICT'; + const code = resolveConflictCode(roles); const responseRequiredRole: CommunicationRole = 'human'; const responseRequiredFrom = roles === 'human:human' ? [participantOf(left), participantOf(right)] @@ -110,9 +139,23 @@ export function analyzeCommunication( )); } } + return issues; +} - const humanRequests = communication.filter((record) => roleOf(record) === 'human' && ['request', 'message'].includes(typeOf(record))); - const agentMessages = communication.filter((record) => roleOf(record) === 'agent'); +function resolveConflictCode(roles: string): CommunicationIssue['code'] { + return roles === 'human:human' + ? 'HUMAN_COMMUNICATION_CONFLICT' + : roles === 'agent:agent' + ? 'AGENT_COMMUNICATION_CONFLICT' + : 'HUMAN_AGENT_CONFLICT'; +} + +function collectRequestResponseIssues( + communication: IntentRecord[], + humanRequests: IntentRecord[], + agentMessages: IntentRecord[], +): CommunicationIssue[] { + const issues: CommunicationIssue[] = []; for (const request of humanRequests) { const response = agentResponseCoversRequest(request, agentMessages); if (!response) { @@ -124,10 +167,21 @@ export function analyzeCommunication( )); } } + return issues; +} - for (const record of agentMessages) { +function collectAgentActionIssues( + communication: IntentRecord[], + graph: IntentGraph, + evidenceByRecord: Map, + humanRequests: IntentRecord[], + agentMessages: IntentRecord[], +): CommunicationIssue[] { + const issues: CommunicationIssue[] = []; + for (const record of communication.filter((record) => roleOf(record) === 'agent')) { const type = typeOf(record); - if (['report', 'result', 'claim'].includes(type) && isHumanDecisionClaim(record)) { + const isActionableMessage = ['report', 'result', 'claim'].includes(type); + if (isActionableMessage && isHumanDecisionClaim(record)) { issues.push(issue( 'AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED', 'review_required', ticketOf(record), [participantOf(record)], [record.id], @@ -135,7 +189,7 @@ export function analyzeCommunication( 'WΕ‚aΕ›ciciel zakresu powinien zapisaΔ‡ decyzjΔ™ we wΕ‚asnym pliku komunikacji; agent nie moΕΌe zrobiΔ‡ tego w jego imieniu.', 'human', participantsForRole(communication, ticketOf(record), 'human'), )); - } else if (['report', 'result', 'claim'].includes(type) && isPositiveImplementationClaim(record)) { + } else if (isActionableMessage && isPositiveImplementationClaim(record)) { const participantGit = matchedGitRecords(record, graph.records); const linked = evidenceByRecord.get(record.id) ?? []; if (participantGit.length === 0 && linked.length === 0) { @@ -161,13 +215,25 @@ export function analyzeCommunication( } } } + return issues; +} - const uniqueIssues = [...new Map(issues.map((item) => [item.id, item])).values()] - .sort((a, b) => severityRank(b.severity) - severityRank(a.severity) || a.id.localeCompare(b.id)); - const participantRows = [...participants.entries()].map(([participant, records]) => { +function deduplicateCommunicationIssues(issues: CommunicationIssue[]): CommunicationIssue[] { + return [...new Map(issues.map((item) => [item.id, item])).values()]; +} + +function buildParticipantRows( + graph: IntentGraph, + communication: IntentRecord[], + participants: Map, + evidenceByRecord: Map, + uniqueIssues: CommunicationIssue[], +): ParticipantCommunicationAnalysis[] { + return [...participants.entries()].map(([participant, records]) => { const aliases = new Set(records.flatMap(gitAliases)); aliases.add(normalizeIdentity(participant)); - const matchedGit = graph.records.filter((record) => record.source.kind === 'git' && aliases.has(normalizeIdentity(record.statement.actor ?? ''))); + const matchedGit = graph.records.filter((record) => record.source.kind === 'git' + && aliases.has(normalizeIdentity(record.statement.actor ?? ''))); const evidence = new Set(records.flatMap((record) => evidenceByRecord.get(record.id) ?? [])); return { participant, @@ -185,18 +251,6 @@ export function analyzeCommunication( issueIds: uniqueIssues.filter((item) => item.participantIds.includes(participant)).map((item) => item.id), } satisfies ParticipantCommunicationAnalysis; }).sort((a, b) => a.role.localeCompare(b.role) || a.participant.localeCompare(b.participant)); - const counts: Record = { info: 0, warning: 0, review_required: 0, blocking: 0 }; - for (const item of uniqueIssues) counts[item.severity] += 1; - return { - schemaVersion: 't2c.communication-analysis/v1', - generatedAt, - graphFingerprint: graph.fingerprint, - tickets: [...new Set(communication.map(ticketOf))].sort(), - participants: participantRows, - syntheses: [...syntheses].sort((left, right) => left.role.localeCompare(right.role) || left.participant.localeCompare(right.participant)), - issues: uniqueIssues, - counts, - }; } function validateSyntheses(syntheses: ParticipantCommunicationSynthesis[], communication: IntentRecord[]): void { diff --git a/src/communication/identity.ts b/src/communication/identity.ts index 15f36fe..3f6fcf8 100644 --- a/src/communication/identity.ts +++ b/src/communication/identity.ts @@ -97,43 +97,113 @@ function normalizeV2Entry(raw: unknown): ParticipantIdentityEntry { export function assertParticipantIdentityRegistry(value: unknown): asserts value is ParticipantIdentityRegistry { if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Participant registry must be an object'); const registry = value as Record; - exactKeys(registry, ['schemaVersion', 'participants'], 'Participant registry'); - if (registry.schemaVersion !== 't2c.participant-registry/v1') throw new Error('Unsupported participant registry schemaVersion'); - if (!Array.isArray(registry.participants)) throw new Error('Participant registry participants must be an array'); + validateRegistryShape(registry); const ids = new Set(); const external = new Map(); - for (const raw of registry.participants) { - if (!raw || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('Participant registry entry must be an object'); - const entry = raw as Record; - exactKeys(entry, ['id', 'role', 'displayName', 'gitAuthors', 'a2aAgentIds', 'humanAliases'], 'Participant registry entry'); - if (typeof entry.id !== 'string' || !/^(human|agent):[a-z0-9][a-z0-9._-]*$/.test(entry.id)) { - throw new Error('Participant registry id must be canonical human: or agent:'); - } - if (entry.role !== 'human' && entry.role !== 'agent') throw new Error(`Participant ${entry.id} role must be human or agent`); - if (!entry.id.startsWith(`${entry.role}:`)) throw new Error(`Participant ${entry.id} role does not match its stable ID prefix`); - if (typeof entry.displayName !== 'string' || !entry.displayName.trim()) throw new Error(`Participant ${entry.id} displayName must be non-blank`); - if (ids.has(entry.id)) throw new Error(`Duplicate participant registry id: ${entry.id}`); - ids.add(entry.id); - for (const field of ['gitAuthors', 'a2aAgentIds', 'humanAliases'] as const) { - const values = entry[field]; - if (!Array.isArray(values) || values.some((item) => typeof item !== 'string' || !item.trim())) { - throw new Error(`Participant ${entry.id} ${field} must contain non-blank strings`); - } - const normalized = values.map((item) => (item as string).trim().toLowerCase()); - if (new Set(normalized).size !== normalized.length) throw new Error(`Participant ${entry.id} ${field} must be unique`); - for (const identifier of normalized) { - const key = `${field}:${identifier}`; - const owner = external.get(key); - if (owner && owner !== entry.id) throw new Error(`${field} identifier ${identifier} is assigned to both ${owner} and ${entry.id}`); - external.set(key, entry.id); - } - } - if (entry.role === 'human' && (entry.a2aAgentIds as unknown[]).length) { - throw new Error(`Human participant ${entry.id} cannot declare a2aAgentIds`); - } - if (entry.role === 'agent' && (entry.humanAliases as unknown[]).length) { - throw new Error(`Agent participant ${entry.id} cannot declare humanAliases`); + const participants = registry.participants; + for (const raw of participants) { + assertParticipantIdentityEntry(raw, ids, external); + } +} + +function validateRegistryShape(registry: Record): asserts registry is { schemaVersion: string; participants: unknown[] } { + exactKeys(registry, ['schemaVersion', 'participants'], 'Participant registry'); + if (registry.schemaVersion !== 't2c.participant-registry/v1') { + throw new Error('Unsupported participant registry schemaVersion'); + } + if (!Array.isArray(registry.participants)) { + throw new Error('Participant registry participants must be an array'); + } +} + +function assertParticipantIdentityEntry( + raw: unknown, + ids: Set, + external: Map, +): void { + if (!raw || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('Participant registry entry must be an object'); + const entry = raw as Record; + exactKeys(entry, ['id', 'role', 'displayName', 'gitAuthors', 'a2aAgentIds', 'humanAliases'], 'Participant registry entry'); + const participantId = assertParticipantIdentityId(entry); + const role = assertParticipantIdentityRole(entry); + assertDisplayName(participantId, entry); + assertDuplicateId(participantId, ids); + ids.add(participantId); + for (const field of ['gitAuthors', 'a2aAgentIds', 'humanAliases'] as const) { + const values = assertParticipantIdentityField(entry, participantId, field); + assertParticipantIdentityFieldUnique(participantId, field, values, external); + } + assertRoleCompatibility(participantId, role, entry); +} + +function assertParticipantIdentityId(entry: Record): string { + if (typeof entry.id !== 'string' || !/^(human|agent):[a-z0-9][a-z0-9._-]*$/.test(entry.id)) { + throw new Error('Participant registry id must be canonical human: or agent:'); + } + return entry.id; +} + +function assertParticipantIdentityRole(entry: Record): 'human' | 'agent' { + if (entry.role !== 'human' && entry.role !== 'agent') { + throw new Error(`Participant ${(entry.id as string)} role must be human or agent`); + } + if (!(typeof entry.id === 'string' && entry.id.startsWith(`${entry.role}:`))) { + throw new Error(`Participant ${(entry.id as string)} role does not match its stable ID prefix`); + } + return entry.role; +} + +function assertDisplayName(participantId: string, entry: Record): void { + if (typeof entry.displayName !== 'string' || !entry.displayName.trim()) { + throw new Error(`Participant ${participantId} displayName must be non-blank`); + } +} + +function assertDuplicateId(participantId: string, ids: Set): void { + if (ids.has(participantId)) throw new Error(`Duplicate participant registry id: ${participantId}`); +} + +function assertParticipantIdentityField( + entry: Record, + participantId: string, + field: 'gitAuthors' | 'a2aAgentIds' | 'humanAliases', +): string[] { + const values = entry[field]; + if (!Array.isArray(values) || values.some((item) => typeof item !== 'string' || !item.trim())) { + throw new Error(`Participant ${participantId} ${field} must contain non-blank strings`); + } + return values.map((item) => (item as string).trim().toLowerCase()); +} + +function assertParticipantIdentityFieldUnique( + participantId: string, + field: 'gitAuthors' | 'a2aAgentIds' | 'humanAliases', + normalized: string[], + external: Map, +): void { + if (new Set(normalized).size !== normalized.length) { + throw new Error(`Participant ${participantId} ${field} must be unique`); + } + for (const identifier of normalized) { + const key = `${field}:${identifier}`; + const owner = external.get(key); + if (owner && owner !== participantId) { + throw new Error(`${field} identifier ${identifier} is assigned to both ${owner} and ${participantId}`); } + external.set(key, participantId); + } +} + +function assertRoleCompatibility( + participantId: string, + role: 'human' | 'agent', + entry: Record, +): void { + if (role === 'human' && (entry.a2aAgentIds as unknown[]).length) { + throw new Error(`Human participant ${participantId} cannot declare a2aAgentIds`); + } + if (role === 'agent' && (entry.humanAliases as unknown[]).length) { + throw new Error(`Agent participant ${participantId} cannot declare humanAliases`); } } diff --git a/src/communication/intake-contract.ts b/src/communication/intake-contract.ts index 792fbb0..39069d1 100644 --- a/src/communication/intake-contract.ts +++ b/src/communication/intake-contract.ts @@ -134,53 +134,114 @@ export function assertIntakeEnvelope(value: unknown, operation: 'command' | 'que 'schemaVersion', 'messageId', 'correlationId', 'causationId', 'idempotencyKey', 'authenticatedPrincipal', 'expectedVersion', 'timestamp', 'payloadHash', 'payload', 'unknownFields', ], 'Envelope', ['unknownFields']); + validateIntakeEnvelopeHeader(envelope); + validateIntakeEnvelopeTimestamp(envelope.timestamp); + if (operation === 'command') { + assertCommand(envelope.payload); + } else { + assertQuery(envelope.payload); + } + if (payloadHash(envelope.payload as IntakeCommand | IntakeQuery) !== envelope.payloadHash) { + invalid('Envelope payloadHash does not match payload'); + } +} + +function validateIntakeEnvelopeHeader(envelope: Record): void { if (envelope.schemaVersion !== INTAKE_SCHEMA_VERSION) invalid('Unsupported envelope schemaVersion'); for (const key of ['messageId', 'correlationId', 'idempotencyKey', 'authenticatedPrincipal', 'payloadHash'] as const) { if (typeof envelope[key] !== 'string' || !envelope[key].trim()) invalid(`Envelope ${key} must be a non-blank string`); } if (envelope.causationId !== null && typeof envelope.causationId !== 'string') invalid('Envelope causationId must be a string or null'); - if (envelope.expectedVersion !== null && (!Number.isSafeInteger(envelope.expectedVersion) || (envelope.expectedVersion as number) < 0)) { + if (envelope.expectedVersion !== null + && (!Number.isSafeInteger(envelope.expectedVersion) || (envelope.expectedVersion as number) < 0)) { invalid('Envelope expectedVersion must be a non-negative integer or null'); } - if (typeof envelope.timestamp !== 'string' || !Number.isFinite(Date.parse(envelope.timestamp))) invalid('Envelope timestamp must be ISO 8601'); if (!/^[a-f0-9]{64}$/.test(envelope.payloadHash as string)) invalid('Envelope payloadHash must be lowercase SHA-256'); - if (envelope.unknownFields !== undefined && (!Array.isArray(envelope.unknownFields) || !envelope.unknownFields.every((item) => typeof item === 'string'))) { + if (envelope.unknownFields !== undefined + && (!Array.isArray(envelope.unknownFields) || !envelope.unknownFields.every((item) => typeof item === 'string'))) { invalid('Envelope unknownFields must contain base64 strings'); } - if (operation === 'command') assertCommand(envelope.payload); - else assertQuery(envelope.payload); - if (payloadHash(envelope.payload as IntakeCommand | IntakeQuery) !== envelope.payloadHash) invalid('Envelope payloadHash does not match payload'); +} + +function validateIntakeEnvelopeTimestamp(timestamp: unknown): void { + if (typeof timestamp !== 'string' || !Number.isFinite(Date.parse(timestamp))) { + invalid('Envelope timestamp must be ISO 8601'); + } } export function assertCommand(value: unknown): asserts value is IntakeCommand { const base = strictObject(value, ['schemaVersion', 'type', ...commandFields(value)], 'Command'); if (base.schemaVersion !== COMMAND_SCHEMA_VERSION) invalid('Unsupported command schemaVersion'); + validateCommandPayload(base as Record & { schemaVersion: string; type: string }); +} + +function validateCommandPayload( + base: Record & { schemaVersion: string; type: string }, +): void { switch (base.type) { - case 'RegisterParticipant': assertParticipant(base.participant); break; - case 'BindExternalIdentity': participantId(base.participantId); assertPrincipal(base.principal); break; + case 'RegisterParticipant': + assertParticipant(base.participant); + break; + case 'BindExternalIdentity': + participantId(base.participantId); + assertPrincipal(base.principal); + break; case 'AssignRole': - participantId(base.participantId); role(base.governanceRole); stringArray(base.ticketIds, 'ticketIds'); capabilities(base.capabilities); break; + participantId(base.participantId); + role(base.governanceRole); + stringArray(base.ticketIds, 'ticketIds'); + capabilities(base.capabilities); + break; case 'CaptureMessage': - participantId(base.participantId); role(base.governanceRole); ticketId(base.ticketId); - if (typeof base.message !== 'string' || !base.message.trim()) invalid('CaptureMessage message must be non-blank'); - if (Buffer.byteLength(base.message) > 256 * 1024) invalid('CaptureMessage message exceeds 262144 bytes'); + participantId(base.participantId); + role(base.governanceRole); + ticketId(base.ticketId); + if (typeof base.message !== 'string' || !base.message.trim()) { + invalid('CaptureMessage message must be non-blank'); + } + if (Buffer.byteLength(base.message) > 256 * 1024) { + invalid('CaptureMessage message exceeds 262144 bytes'); + } + break; + case 'RebuildProjection': + participantId(base.participantId); + ticketId(base.ticketId); + break; + case 'VerifyEventStream': break; - case 'RebuildProjection': participantId(base.participantId); ticketId(base.ticketId); break; - case 'VerifyEventStream': break; - default: invalid('Unsupported command type'); + default: + invalid('Unsupported command type'); } } export function assertQuery(value: unknown): asserts value is IntakeQuery { const base = strictObject(value, ['schemaVersion', 'type', ...queryFields(value)], 'Query'); if (base.schemaVersion !== QUERY_SCHEMA_VERSION) invalid('Unsupported query schemaVersion'); + validateQueryPayload(base as Record & { schemaVersion: string; type: string }); +} + +function validateQueryPayload( + base: Record & { schemaVersion: string; type: string }, +): void { switch (base.type) { - case 'ResolveParticipant': nonBlank(base.principal, 'principal'); break; - case 'GetRole': participantId(base.participantId); break; - case 'GetTicketConversation': ticketId(base.ticketId); break; - case 'GetCommandStatus': nonBlank(base.idempotencyKey, 'idempotencyKey'); break; - case 'ValidateProjection': participantId(base.participantId); ticketId(base.ticketId); break; - default: invalid('Unsupported query type'); + case 'ResolveParticipant': + nonBlank(base.principal, 'principal'); + break; + case 'GetRole': + participantId(base.participantId); + break; + case 'GetTicketConversation': + ticketId(base.ticketId); + break; + case 'GetCommandStatus': + nonBlank(base.idempotencyKey, 'idempotencyKey'); + break; + case 'ValidateProjection': + participantId(base.participantId); + ticketId(base.ticketId); + break; + default: + invalid('Unsupported query type'); } } diff --git a/src/communication/intake-protobuf.ts b/src/communication/intake-protobuf.ts index 8e6c238..88c084d 100644 --- a/src/communication/intake-protobuf.ts +++ b/src/communication/intake-protobuf.ts @@ -20,38 +20,14 @@ export function encodeIntakeEnvelope(envelope: IntakeEnvelope): Uint8Array { export function decodeIntakeEnvelope(bytes: Uint8Array, operation: 'command' | 'query'): IntakeEnvelope { try { - const values = new Map(); - const unknownFields: string[] = []; - let offset = 0; - while (offset < bytes.length) { - const fieldStart = offset; - const [tag, afterTag] = readVarint(bytes, offset); offset = afterTag; - const number = tag >>> 3; - const wire = tag & 7; - if (wire === 0) { - const [value, after] = readVarint(bytes, offset); offset = after; - if (number === 7) values.set(number, value); - else unknownFields.push(Buffer.from(bytes.slice(fieldStart, offset)).toString('base64')); - } else if (wire === 2) { - const [length, afterLength] = readVarint(bytes, offset); offset = afterLength; - if (offset + length > bytes.length) throw new Error('Truncated length-delimited field'); - const raw = bytes.slice(offset, offset + length); offset += length; - if (number >= 1 && number <= 10 && number !== 7) values.set(number, Buffer.from(raw).toString('utf8')); - else unknownFields.push(Buffer.from(bytes.slice(fieldStart, offset)).toString('base64')); - } else { - throw new Error(`Unsupported wire type ${wire}`); - } - } + const parsed = decodeDelimitedFields(bytes); + const values = parsed.values; + const unknownFields = parsed.unknownFields; const required = [1, 2, 3, 5, 6, 8, 9, 10]; if (required.some((field) => !values.has(field))) throw new Error('Missing required envelope field'); - const payload = JSON.parse(String(values.get(10))) as IntakeCommand | IntakeQuery; - const envelope: IntakeEnvelope = { - schemaVersion: String(values.get(1)) as IntakeEnvelope['schemaVersion'], messageId: String(values.get(2)), - correlationId: String(values.get(3)), causationId: values.has(4) ? String(values.get(4)) : null, - idempotencyKey: String(values.get(5)), authenticatedPrincipal: String(values.get(6)), - expectedVersion: values.has(7) ? Number(values.get(7)) : null, timestamp: String(values.get(8)), - payloadHash: String(values.get(9)), payload, ...(unknownFields.length ? { unknownFields } : {}), - }; + + const payload = parsePayloadJson(values.get(10)); + const envelope = buildIntakeEnvelope(values, unknownFields, payload); assertIntakeEnvelope(envelope, operation); return envelope; } catch (error) { @@ -74,32 +50,89 @@ export function encodeIntakeResult(result: IntakeResult): Uint8Array { export function decodeIntakeResult(bytes: Uint8Array): IntakeResult { try { - const strings = new Map(); - const numbers = new Map(); - let offset = 0; - while (offset < bytes.length) { - const [tag, afterTag] = readVarint(bytes, offset); offset = afterTag; - const field = tag >>> 3; const wire = tag & 7; - if (wire === 0) { const [value, after] = readVarint(bytes, offset); offset = after; numbers.set(field, value); } - else if (wire === 2) { - const [length, afterLength] = readVarint(bytes, offset); offset = afterLength; - if (offset + length > bytes.length) throw new Error('Truncated result field'); - strings.set(field, Buffer.from(bytes.slice(offset, offset + length)).toString('utf8')); offset += length; - } else throw new Error(`Unsupported result wire type ${wire}`); - } + const parsed = decodeDelimitedFields(bytes); + const strings = parsed.strings; + const numbers = parsed.numbers; return { schemaVersion: strings.get(1) as IntakeResult['schemaVersion'], accepted: numbers.get(2) === 1, messageId: strings.get(3) ?? '', correlationId: strings.get(4) ?? '', causationId: strings.get(5) ?? null, authenticatedPrincipal: strings.get(6) ?? '', aggregateId: 'intake', expectedVersion: numbers.get(8) ?? null, actualVersion: numbers.get(9) ?? 0, idempotencyKey: strings.get(10) ?? '', timestamp: strings.get(11) ?? '', - payloadHash: strings.get(12) ?? '', diagnostic: strings.has(13) ? JSON.parse(strings.get(13) as string) : null, - data: strings.has(14) ? JSON.parse(strings.get(14) as string) : null, + payloadHash: strings.get(12) ?? '', diagnostic: parseOptionalJson(strings.get(13)), + data: parseOptionalJson(strings.get(14)), }; } catch (error) { throw new IntakeError('T2C-INTAKE-INVALID-WIRE', error instanceof Error ? error.message : String(error), 'Send a valid t2c.intake-result/v1 Protobuf payload.'); } } +function decodeDelimitedFields(bytes: Uint8Array): { + values: Map; + strings: Map; + numbers: Map; + unknownFields: string[]; +} { + const values = new Map(); + const strings = new Map(); + const numbers = new Map(); + const unknownFields: string[] = []; + let offset = 0; + while (offset < bytes.length) { + const fieldStart = offset; + const [tag, afterTag] = readVarint(bytes, offset); offset = afterTag; + const field = tag >>> 3; + const wire = tag & 7; + if (wire === 0) { + const [value, after] = readVarint(bytes, offset); offset = after; + if (field === 7) values.set(field, value); + numbers.set(field, value); + if (field !== 7) unknownFields.push(Buffer.from(bytes.slice(fieldStart, offset)).toString('base64')); + continue; + } + if (wire === 2) { + const [length, afterLength] = readVarint(bytes, offset); offset = afterLength; + if (offset + length > bytes.length) throw new Error('Truncated length-delimited field'); + const raw = bytes.slice(offset, offset + length); + offset += length; + if (field === 10 || field === 13 || field === 14 || (field >= 1 && field <= 12 && field !== 7)) { + const value = Buffer.from(raw).toString('utf8'); + values.set(field, value); + strings.set(field, value); + } else { + unknownFields.push(Buffer.from(bytes.slice(fieldStart, offset)).toString('base64')); + } + continue; + } + throw new Error(`Unsupported wire type ${wire}`); + } + return { values, strings, numbers, unknownFields }; +} + +function parsePayloadJson(raw: string | number | undefined): IntakeCommand | IntakeQuery { + if (typeof raw !== 'string') throw new Error('Missing envelope payload'); + return JSON.parse(raw) as IntakeCommand | IntakeQuery; +} + +function parseOptionalJson(raw: string | undefined): unknown { + if (!raw) return null; + return JSON.parse(raw); +} + +function buildIntakeEnvelope( + values: Map, + unknownFields: string[], + payload: IntakeCommand | IntakeQuery, +): IntakeEnvelope { + return { + schemaVersion: String(values.get(1)) as IntakeEnvelope['schemaVersion'], messageId: String(values.get(2)), + correlationId: String(values.get(3)), causationId: values.has(4) ? String(values.get(4)) : null, + idempotencyKey: String(values.get(5)), authenticatedPrincipal: String(values.get(6)), + expectedVersion: values.has(7) ? Number(values.get(7)) : null, timestamp: String(values.get(8)), + payloadHash: String(values.get(9)), payload, + ...(unknownFields.length ? { unknownFields } : {}), + }; +} + function bytesField(field: number, value: string): Uint8Array { const data = Buffer.from(value, 'utf8'); return Buffer.concat([writeVarint((field << 3) | 2), writeVarint(data.length), data]); diff --git a/src/communication/llm.ts b/src/communication/llm.ts index 83cb144..b744ca4 100644 --- a/src/communication/llm.ts +++ b/src/communication/llm.ts @@ -1,514 +1 @@ -import { promises as fs } from 'node:fs'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import type { T2CConfig } from '../config/env.js'; -import { createIntentId, sha256, stableStringify } from '../core/id.js'; -import { pathExists } from '../core/io.js'; -import { buildRecord, withRecordGeneration } from '../core/record.js'; -import type { - GroundedGenerationMetadata, - IntentAction, - IntentRecord, - LlmExtractionMode, - LlmResponseMetadata, - PipelineStageAudit, -} from '../core/types.js'; -import { classifyLlmFailure, rejectedLlmResponseMetadata, type LlmFailureReason } from '../llm/failure.js'; -import { openRouterAuditConfiguration } from '../llm/audit.js'; -import { OpenRouterClient, type OpenRouterResult } from '../llm/openrouter.js'; -import { StructuredResponseError, structuredSchema as s, type StructuredSchema } from '../llm/structured-schema.js'; -import { T2C_VERSION } from '../version.js'; -import { - extractCommunicationIntent, - type CommunicationExtractionOptions, - type CommunicationRole, -} from '../extractors/communication.js'; - -const ACTIONS = [ - 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', - 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', -] as const satisfies readonly IntentAction[]; - -interface RawCommunicationEnrichment { - recordId: string; - action: IntentAction; - object: string; - polarity: 'positive' | 'negative'; - confidence: number; - basis: string[]; - target: { paths: string[]; symbols: string[]; versions: string[] }; - topics: string[]; -} - -interface RawParticipantSynthesis { - participantKey: string; - summary: string; - commitments: string[]; - risks: string[]; - recordIds: string[]; - confidence: number; -} - -interface RawCommunicationResponse { - enrichments: RawCommunicationEnrichment[]; - participantSyntheses: RawParticipantSynthesis[]; -} - -export interface ParticipantCommunicationSynthesis { - schemaVersion: 't2c.participant-synthesis/v1'; - id: string; - participant: string; - role: CommunicationRole; - tickets: string[]; - summary: string; - commitments: string[]; - risks: string[]; - recordIds: string[]; - confidence: number; - generation: GroundedGenerationMetadata; -} - -export interface AuditedCommunicationExtractionResult { - schemaVersion: 't2c.communication-enrichment/v1'; - records: IntentRecord[]; - participants: ParticipantCommunicationSynthesis[]; - warnings: string[]; - audit: PipelineStageAudit; -} - -export class CommunicationLlmRequiredError extends Error { - constructor(message: string, readonly audit: PipelineStageAudit) { - super(message); - this.name = 'CommunicationLlmRequiredError'; - } -} - -export async function extractCommunicationIntentAudited( - options: CommunicationExtractionOptions, - config: T2CConfig, - mode: LlmExtractionMode = config.communicationMode, -): Promise { - const startedAt = Date.now(); - const deterministic = await extractCommunicationIntent(options, config); - if (deterministic.records.length === 0) { - return { - schemaVersion: 't2c.communication-enrichment/v1', - ...deterministic, - participants: [], - audit: audit('skipped', mode === 'deterministic' ? 'deterministic' : 'llm', 'none', false, - deterministic.records.length, deterministic.warnings.length, null, - { code: 'NO_COMMUNICATION_RECORDS', message: 'No communication records were available for enrichment' }, - Date.now() - startedAt, [], config, options), - }; - } - if (mode === 'deterministic') { - const records = markDeterministic(deterministic.records, false, null); - return { - schemaVersion: 't2c.communication-enrichment/v1', records, - participants: deterministicSyntheses(records, deterministicGeneration()), - warnings: deterministic.warnings, - audit: audit(deterministic.warnings.length ? 'partial' : 'succeeded', 'deterministic', 'deterministic', false, records.length, - deterministic.warnings.length, null, null, Date.now() - startedAt, [], config, options), - }; - } - - const client = new OpenRouterClient(config.openRouter); - if (!client.isConfigured()) { - return fallbackOrThrow(deterministic.records, deterministic.warnings, config, options, mode, startedAt, { - code: 'LLM_NOT_CONFIGURED', message: 'OPENROUTER_API_KEY is not configured', - }); - } - try { - const groups = participantGroups(deterministic.records); - const { completion, responses } = await enrichWithCorrection(client, [ - { role: 'system', content: await readPrompt() }, - { role: 'user', content: JSON.stringify(promptPayload(deterministic.records, groups)) }, - ], config.openRouter.communicationModel); - const response = completion.value; - const enrichments = validateEnrichments(response.enrichments, deterministic.records); - const enrichedByOriginal = new Map(); - for (const record of deterministic.records) { - enrichedByOriginal.set(record.id, enrichRecord(record, enrichments.get(record.id)!, config, completion.metadata)); - } - const generation = llmGeneration(config, mode, completion.metadata); - const participants = materializeSyntheses( - response.participantSyntheses, - groups, - enrichedByOriginal, - generation, - ); - return { - schemaVersion: 't2c.communication-enrichment/v1', - records: [...enrichedByOriginal.values()], - participants, - warnings: deterministic.warnings, - audit: audit(deterministic.warnings.length ? 'partial' : 'succeeded', 'llm', 'llm', false, deterministic.records.length, - deterministic.warnings.length, config.openRouter.communicationModel, null, - Date.now() - startedAt, responses, config, options), - }; - } catch (error) { - const failure = error instanceof CommunicationAttemptError ? error.failure : error; - const responses = error instanceof CommunicationAttemptError - ? error.responses - : rejectedLlmResponseMetadata(error); - return fallbackOrThrow( - deterministic.records, deterministic.warnings, config, options, mode, startedAt, - classifyLlmFailure(failure), responses, - ); - } -} - -class CommunicationAttemptError extends Error { - constructor(readonly failure: unknown, readonly responses: LlmResponseMetadata[]) { - super(failure instanceof Error ? failure.message : String(failure)); - this.name = 'CommunicationAttemptError'; - } -} - -async function enrichWithCorrection( - client: OpenRouterClient, - baseMessages: Array<{ role: 'system' | 'user'; content: string }>, - model: string, -): Promise<{ completion: OpenRouterResult; responses: LlmResponseMetadata[] }> { - const responses: LlmResponseMetadata[] = []; - let correction: string | null = null; - - for (let attempt = 0; attempt < 2; attempt += 1) { - try { - const completion = await client.chatStructuredWithMetadata([ - ...baseMessages, - ...(correction - ? [{ - role: 'user' as const, - content: `The previous response was rejected: ${correction}\n` - + 'Correct exactly that violation and re-emit the full object. Do not add, rename, or omit properties.\n' - + `The exact required JSON Schema is: ${JSON.stringify(COMMUNICATION_RESPONSE_CONTRACT.jsonSchema)}`, - }] - : []), - ], 't2c_communication_enrichment', COMMUNICATION_RESPONSE_CONTRACT, model); - responses.push(completion.metadata); - return { completion, responses }; - } catch (error) { - if (error instanceof StructuredResponseError) { - if (error.responseMetadata) responses.push(error.responseMetadata); - if (attempt === 0) { - correction = error.message; - continue; - } - } - throw new CommunicationAttemptError(error, [...responses]); - } - } - - throw new CommunicationAttemptError(new Error('Communication correction retry budget exhausted'), responses); -} - -async function fallbackOrThrow( - records: IntentRecord[], - warnings: string[], - config: T2CConfig, - options: CommunicationExtractionOptions, - mode: LlmExtractionMode, - startedAt: number, - reason: LlmFailureReason, - responses: LlmResponseMetadata[] = [], -): Promise { - const failed = audit('failed', 'llm', 'none', true, 0, warnings.length + 1, - config.openRouter.communicationModel, reason, Date.now() - startedAt, responses, config, options); - if (mode === 'require-llm') { - throw new CommunicationLlmRequiredError(`Communication enrichment requires LLM: ${reason.message}`, failed); - } - const warning = `Communication enrichment used deterministic fallback (${reason.code}): ${reason.message}`; - const marked = markDeterministic(records, true, reason.code); - return { - schemaVersion: 't2c.communication-enrichment/v1', - records: marked, - participants: deterministicSyntheses(marked, fallbackGeneration(reason.code)), - warnings: [...warnings, warning], - audit: audit('fallback', 'llm', 'deterministic', true, marked.length, warnings.length + 1, - config.openRouter.communicationModel, reason, Date.now() - startedAt, responses, config, options), - }; -} - -interface ParticipantGroup { - key: string; - participant: string; - role: CommunicationRole; - tickets: string[]; - records: IntentRecord[]; -} - -function participantGroups(records: IntentRecord[]): ParticipantGroup[] { - const grouped = new Map(); - for (const record of records) { - const participant = String(record.metadata.participant ?? record.statement.actor ?? `unknown:${record.id}`); - const role = roleOf(record); - const key = stableStringify({ participant, role }); - const values = grouped.get(key); - if (values) values.push(record); - else grouped.set(key, [record]); - } - return [...grouped.values()].map((values, index) => ({ - key: `participant-${index + 1}`, - participant: String(values[0]?.metadata.participant ?? values[0]?.statement.actor ?? 'unknown'), - role: roleOf(values[0]), - tickets: [...new Set(values.flatMap((record) => record.statement.target.tickets))].sort(), - records: [...values].sort((left, right) => left.id.localeCompare(right.id)), - })).sort((left, right) => left.role.localeCompare(right.role) || left.participant.localeCompare(right.participant)) - .map((group, index) => ({ ...group, key: `participant-${index + 1}` })); -} - -function promptPayload(records: IntentRecord[], groups: ParticipantGroup[]): Record { - return { - records: records.map((record) => ({ - recordId: record.id, - participantKey: groups.find((group) => group.records.some((item) => item.id === record.id))?.key, - text: record.statement.text, - deterministic: { - action: record.statement.action, - object: record.statement.object, - polarity: record.statement.polarity, - paths: record.statement.target.paths, - symbols: record.statement.target.symbols, - versions: record.statement.target.versions, - }, - })), - participants: groups.map((group) => ({ - participantKey: group.key, - recordIds: group.records.map((record) => record.id), - })), - }; -} - -function validateEnrichments(values: RawCommunicationEnrichment[] | undefined, records: IntentRecord[]): Map { - if (!Array.isArray(values)) throw new Error('Structured response does not contain communication enrichments'); - const expected = new Set(records.map((record) => record.id)); - const output = new Map(); - for (const value of values) { - if (!expected.has(value.recordId)) throw new Error(`Structured response contains unknown recordId: ${value.recordId}`); - if (output.has(value.recordId)) throw new Error(`Structured response duplicates recordId: ${value.recordId}`); - output.set(value.recordId, value); - } - if (output.size !== expected.size) throw new Error(`Structured response returned ${output.size} of ${expected.size} enrichments`); - return output; -} - -function materializeSyntheses( - values: RawParticipantSynthesis[] | undefined, - groups: ParticipantGroup[], - enrichedByOriginal: Map, - generation: GroundedGenerationMetadata, -): ParticipantCommunicationSynthesis[] { - if (!Array.isArray(values)) throw new Error('Structured response does not contain participantSyntheses'); - const byKey = new Map(groups.map((group) => [group.key, group])); - const seen = new Set(); - const output = values.map((raw) => { - const group = byKey.get(raw.participantKey); - if (!group) throw new Error(`Structured response contains unknown participantKey: ${raw.participantKey}`); - if (seen.has(raw.participantKey)) throw new Error(`Structured response duplicates participantKey: ${raw.participantKey}`); - seen.add(raw.participantKey); - const permitted = new Set(group.records.map((record) => record.id)); - if (!raw.recordIds.length || raw.recordIds.some((id) => !permitted.has(id))) { - throw new Error(`Participant synthesis ${raw.participantKey} contains ungrounded recordIds`); - } - const recordIds = raw.recordIds.map((id) => enrichedByOriginal.get(id)?.id) - .filter((id): id is string => Boolean(id)).sort(); - return synthesis({ - participant: group.participant, - role: group.role, - tickets: group.tickets, - summary: raw.summary, - commitments: raw.commitments, - risks: raw.risks, - recordIds, - confidence: raw.confidence, - generation, - }); - }); - if (seen.size !== groups.length) throw new Error(`Structured response returned ${seen.size} of ${groups.length} participant syntheses`); - return output.sort((left, right) => left.role.localeCompare(right.role) || left.participant.localeCompare(right.participant)); -} - -function enrichRecord( - record: IntentRecord, - enrichment: RawCommunicationEnrichment, - config: T2CConfig, - response: LlmResponseMetadata, -): IntentRecord { - return buildRecord({ - kind: record.statement.kind, - actor: record.statement.actor, - action: enrichment.action, - subject: record.statement.subject, - object: enrichment.object.trim() || record.statement.object, - target: { - paths: [...record.statement.target.paths, ...enrichment.target.paths], - symbols: [...record.statement.target.symbols, ...enrichment.target.symbols], - // Ticket ownership is structural and never accepted from the model. - tickets: record.statement.target.tickets, - versions: [...record.statement.target.versions, ...enrichment.target.versions], - }, - modality: record.statement.modality, - polarity: enrichment.polarity, - text: record.statement.text, - lifecycle: record.lifecycle.status, - sourceKind: record.source.kind, - sourcePath: record.source.path, - sourceLines: record.source.lines, - revision: record.source.revision, - symbol: record.source.symbol, - commitIndex: record.source.commitIndex, - extractor: 't2c/project-communication-openrouter@1', - rawExcerpt: record.source.rawExcerpt, - // A plan/declaration/claim cannot become a fact through model prose. - epistemicClass: record.epistemic.class, - confidence: Math.min(0.85, Math.max(0.05, enrichment.confidence)), - basis: [...record.epistemic.basis, 'openrouter_communication_enrichment', ...enrichment.basis], - observedAt: record.observedAt, - generation: { - requested: 'llm', used: 'llm', provider: response.provider ?? 'openrouter', - model: response.model ?? config.openRouter.communicationModel, responseId: response.responseId, - }, - metadata: { - ...record.metadata, - llmUsed: true, - topics: sortedUnique(enrichment.topics), - response, - }, - }); -} - -function deterministicSyntheses(records: IntentRecord[], generation: GroundedGenerationMetadata): ParticipantCommunicationSynthesis[] { - return participantGroups(records).map((group) => synthesis({ - participant: group.participant, - role: group.role, - tickets: group.tickets, - summary: `${group.participant} (${group.role}) ma ${group.records.length} uziemionych rekordΓ³w komunikacji.`, - commitments: group.records.filter((record) => record.epistemic.class === 'plan') - .map((record) => record.statement.text), - risks: group.records.filter((record) => record.statement.polarity === 'negative') - .map((record) => record.statement.text), - recordIds: group.records.map((record) => record.id).sort(), - confidence: 1, - generation, - })); -} - -function synthesis(input: Omit): ParticipantCommunicationSynthesis { - const semantic = { - participant: input.participant, - role: input.role, - tickets: sortedUnique(input.tickets), - summary: input.summary.trim(), - commitments: sortedUnique(input.commitments), - risks: sortedUnique(input.risks), - recordIds: sortedUnique(input.recordIds), - }; - if (!semantic.summary || !semantic.recordIds.length) throw new Error('Participant synthesis requires a summary and record citations'); - return { - schemaVersion: 't2c.participant-synthesis/v1', - id: createIntentId(semantic, 'COMM-SYN'), - ...semantic, - confidence: Math.min(1, Math.max(0, input.confidence)), - generation: input.generation, - }; -} - -function markDeterministic(records: IntentRecord[], degraded: boolean, fallbackReason: string | null): IntentRecord[] { - return records.map((record) => { - const marked = withRecordGeneration(record, { - requested: degraded ? 'llm' : 'deterministic', used: 'deterministic', degraded, fallbackReason, - }); - return { ...marked, metadata: { ...marked.metadata, llmUsed: false } }; - }); -} - -function deterministicGeneration(): GroundedGenerationMetadata { - return { - generator: 't2c/participant-synthesis', generatorVersion: '1', - runtimeVersion: T2C_VERSION, generatedAt: new Date().toISOString(), - requestedMode: 'deterministic', effectiveMode: 'deterministic', degraded: false, - model: null, provider: null, responseId: null, - configurationFingerprint: sha256('t2c-communication-deterministic/v1'), reason: null, - }; -} - -function fallbackGeneration(reason: string): GroundedGenerationMetadata { - return { - generator: 't2c/participant-synthesis', generatorVersion: '1', - runtimeVersion: T2C_VERSION, generatedAt: new Date().toISOString(), - requestedMode: 'prefer-llm', effectiveMode: 'deterministic', degraded: true, - model: null, provider: null, responseId: null, - configurationFingerprint: sha256(stableStringify({ stage: 'communication', reason })), reason, - }; -} - -function llmGeneration(config: T2CConfig, mode: LlmExtractionMode, response: LlmResponseMetadata): GroundedGenerationMetadata { - return { - generator: 't2c/participant-synthesis', generatorVersion: '1', - runtimeVersion: T2C_VERSION, generatedAt: new Date().toISOString(), - requestedMode: mode, effectiveMode: 'llm', degraded: false, - model: response.model ?? config.openRouter.communicationModel, - provider: response.provider ?? 'openrouter', responseId: response.responseId, - configurationFingerprint: sha256(stableStringify(openRouterAuditConfiguration(config, config.openRouter.communicationModel))), - reason: null, - }; -} - -function audit( - status: PipelineStageAudit['status'], requestedMode: PipelineStageAudit['requestedMode'], - effectiveMode: PipelineStageAudit['effectiveMode'], degraded: boolean, recordCount: number, - warningCount: number, model: string | null, reason: PipelineStageAudit['reason'], durationMs: number, - responses: LlmResponseMetadata[], config: T2CConfig, options: CommunicationExtractionOptions, -): PipelineStageAudit { - return { - runtimeVersion: T2C_VERSION, - configuration: { - ...openRouterAuditConfiguration(config, model), - projectDirectory: options.projectDir ?? 'project', - ticket: options.ticket ?? null, - }, - status, requestedMode, effectiveMode, degraded, recordCount, warningCount, - model, durationMs, reason, responses, - }; -} - -function roleOf(record: IntentRecord | undefined): CommunicationRole { - return record?.metadata.participantRole === 'human' || record?.metadata.participantRole === 'agent' - ? record.metadata.participantRole - : 'unknown'; -} - -function sortedUnique(values: string[]): string[] { - return [...new Set(values.map((value) => value.trim()).filter(Boolean))].sort(); -} - -async function readPrompt(): Promise { - const promptPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../prompts', 'communication-to-intent.system.md'); - if (!(await pathExists(promptPath))) throw new Error(`Prompt not found: ${promptPath}`); - return fs.readFile(promptPath, 'utf8'); -} - -const communicationStrings = () => s.array(s.string()); -const COMMUNICATION_ENRICHMENT_CONTRACT = s.object({ - recordId: s.string(), - action: s.enum(ACTIONS), - object: s.string(), - polarity: s.enum(['positive', 'negative']), - confidence: s.number({ minimum: 0, maximum: 0.85 }), - basis: communicationStrings(), - target: s.object({ paths: communicationStrings(), symbols: communicationStrings(), versions: communicationStrings() }), - topics: communicationStrings(), -}) satisfies StructuredSchema; -const PARTICIPANT_SYNTHESIS_CONTRACT = s.object({ - participantKey: s.string(), - summary: s.string({ minLength: 1, pattern: '.*\\S.*' }), - commitments: communicationStrings(), - risks: communicationStrings(), - recordIds: communicationStrings(), - confidence: s.number({ minimum: 0, maximum: 0.85 }), -}) satisfies StructuredSchema; -const COMMUNICATION_RESPONSE_CONTRACT = s.object({ - enrichments: s.array(COMMUNICATION_ENRICHMENT_CONTRACT), - participantSyntheses: s.array(PARTICIPANT_SYNTHESIS_CONTRACT), -}) satisfies StructuredSchema; +export * from './llm/index.js'; diff --git a/src/communication/llm/implementation-helpers.ts b/src/communication/llm/implementation-helpers.ts new file mode 100644 index 0000000..b139af3 --- /dev/null +++ b/src/communication/llm/implementation-helpers.ts @@ -0,0 +1,357 @@ +import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { T2CConfig } from '../../config/env.js'; +import { createIntentId, sha256, stableStringify } from '../../core/id.js'; +import { pathExists } from '../../core/io.js'; +import { buildRecord, withRecordGeneration } from '../../core/record.js'; +import type { + GroundedGenerationMetadata, + IntentAction, + IntentRecord, + LlmResponseMetadata, + PipelineStageAudit, + LlmExtractionMode, +} from '../../core/types.js'; +import { openRouterAuditConfiguration } from '../../llm/audit.js'; +import { structuredSchema as s, type StructuredSchema } from '../../llm/structured-schema.js'; +import { T2C_VERSION } from '../../version.js'; +import type { CommunicationRole, CommunicationExtractionOptions } from '../../extractors/communication.js'; + +export const ACTIONS = [ + 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', + 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', +] as const satisfies readonly IntentAction[]; + +export interface RawCommunicationEnrichment { + recordId: string; + action: IntentAction; + object: string; + polarity: 'positive' | 'negative'; + confidence: number; + basis: string[]; + target: { paths: string[]; symbols: string[]; versions: string[] }; + topics: string[]; +} + +export interface RawParticipantSynthesis { + participantKey: string; + summary: string; + commitments: string[]; + risks: string[]; + recordIds: string[]; + confidence: number; +} + +export interface RawCommunicationResponse { + enrichments: RawCommunicationEnrichment[]; + participantSyntheses: RawParticipantSynthesis[]; +} + +export interface ParticipantGroup { + key: string; + participant: string; + role: CommunicationRole; + tickets: string[]; + records: IntentRecord[]; +} + +export interface ParticipantCommunicationSynthesisInput { + schemaVersion: 't2c.participant-synthesis/v1'; + participant: string; + role: CommunicationRole; + tickets: string[]; + summary: string; + commitments: string[]; + risks: string[]; + recordIds: string[]; + confidence: number; + generation: GroundedGenerationMetadata; +} + +export function participantGroups(records: IntentRecord[]): ParticipantGroup[] { + const grouped = new Map(); + for (const record of records) { + const participant = String(record.metadata.participant ?? record.statement.actor ?? `unknown:${record.id}`); + const role = roleOf(record); + const key = stableStringify({ participant, role }); + const values = grouped.get(key); + if (values) values.push(record); + else grouped.set(key, [record]); + } + return [...grouped.values()].map((values, index) => ({ + key: `participant-${index + 1}`, + participant: String(values[0]?.metadata.participant ?? values[0]?.statement.actor ?? 'unknown'), + role: roleOf(values[0]), + tickets: [...new Set(values.flatMap((record) => record.statement.target.tickets))].sort(), + records: [...values].sort((left, right) => left.id.localeCompare(right.id)), + })).sort((left, right) => left.role.localeCompare(right.role) || left.participant.localeCompare(right.participant)) + .map((group, index) => ({ ...group, key: `participant-${index + 1}` })); +} + +export function promptPayload(records: IntentRecord[], groups: ParticipantGroup[]): Record { + return { + records: records.map((record) => ({ + recordId: record.id, + participantKey: groups.find((group) => group.records.some((item) => item.id === record.id))?.key, + text: record.statement.text, + deterministic: { + action: record.statement.action, + object: record.statement.object, + polarity: record.statement.polarity, + paths: record.statement.target.paths, + symbols: record.statement.target.symbols, + versions: record.statement.target.versions, + }, + })), + participants: groups.map((group) => ({ + participantKey: group.key, + recordIds: group.records.map((record) => record.id), + })), + }; +} + +export function validateEnrichments(values: RawCommunicationEnrichment[] | undefined, records: IntentRecord[]): Map { + if (!Array.isArray(values)) throw new Error('Structured response does not contain communication enrichments'); + const expected = new Set(records.map((record) => record.id)); + const output = new Map(); + for (const value of values) { + if (!expected.has(value.recordId)) throw new Error(`Structured response contains unknown recordId: ${value.recordId}`); + if (output.has(value.recordId)) throw new Error(`Structured response duplicates recordId: ${value.recordId}`); + output.set(value.recordId, value); + } + if (output.size !== expected.size) throw new Error(`Structured response returned ${output.size} of ${expected.size} enrichments`); + return output; +} + +export function materializeSyntheses( + values: RawParticipantSynthesis[] | undefined, + groups: ParticipantGroup[], + enrichedByOriginal: Map, + generation: GroundedGenerationMetadata, +): Array<{ + schemaVersion: 't2c.participant-synthesis/v1'; + id: string; + participant: string; + role: CommunicationRole; + tickets: string[]; + summary: string; + commitments: string[]; + risks: string[]; + recordIds: string[]; + confidence: number; + generation: GroundedGenerationMetadata; +}> { + if (!Array.isArray(values)) throw new Error('Structured response does not contain participantSyntheses'); + const byKey = new Map(groups.map((group) => [group.key, group])); + const seen = new Set(); + const output = values.map((raw) => { + const group = byKey.get(raw.participantKey); + if (!group) throw new Error(`Structured response contains unknown participantKey: ${raw.participantKey}`); + if (seen.has(raw.participantKey)) throw new Error(`Structured response duplicates participantKey: ${raw.participantKey}`); + seen.add(raw.participantKey); + const permitted = new Set(group.records.map((record) => record.id)); + if (!raw.recordIds.length || raw.recordIds.some((id) => !permitted.has(id))) { + throw new Error(`Participant synthesis ${raw.participantKey} contains ungrounded recordIds`); + } + const recordIds = raw.recordIds.map((id) => enrichedByOriginal.get(id)?.id) + .filter((id): id is string => Boolean(id)).sort(); + return synthesis({ + participant: group.participant, + role: group.role, + tickets: group.tickets, + summary: raw.summary, + commitments: raw.commitments, + risks: raw.risks, + recordIds, + confidence: raw.confidence, + generation, + }); + }); + if (seen.size !== groups.length) throw new Error(`Structured response returned ${seen.size} of ${groups.length} participant syntheses`); + return output.sort((left, right) => left.role.localeCompare(right.role) || left.participant.localeCompare(right.participant)); +} + +export function enrichRecord( + record: IntentRecord, + enrichment: RawCommunicationEnrichment, + config: T2CConfig, + response: LlmResponseMetadata, +): IntentRecord { + return buildRecord({ + kind: record.statement.kind, + actor: record.statement.actor, + action: enrichment.action, + subject: record.statement.subject, + object: enrichment.object.trim() || record.statement.object, + target: { + paths: [...record.statement.target.paths, ...enrichment.target.paths], + symbols: [...record.statement.target.symbols, ...enrichment.target.symbols], + // Ticket ownership is structural and never accepted from the model. + tickets: record.statement.target.tickets, + versions: [...record.statement.target.versions, ...enrichment.target.versions], + }, + modality: record.statement.modality, + polarity: enrichment.polarity, + text: record.statement.text, + lifecycle: record.lifecycle.status, + sourceKind: record.source.kind, + sourcePath: record.source.path, + sourceLines: record.source.lines, + revision: record.source.revision, + symbol: record.source.symbol, + commitIndex: record.source.commitIndex, + extractor: 't2c/project-communication-openrouter@1', + rawExcerpt: record.source.rawExcerpt, + // A plan/declaration/claim cannot become a fact through model prose. + epistemicClass: record.epistemic.class, + confidence: Math.min(0.85, Math.max(0.05, enrichment.confidence)), + basis: [...record.epistemic.basis, 'openrouter_communication_enrichment', ...enrichment.basis], + observedAt: record.observedAt, + generation: { + requested: 'llm', used: 'llm', provider: response.provider ?? 'openrouter', + model: response.model ?? config.openRouter.communicationModel, responseId: response.responseId, + }, + metadata: { + ...record.metadata, + llmUsed: true, + topics: sortedUnique(enrichment.topics), + response, + }, + }); +} + +export function deterministicSyntheses(records: IntentRecord[], generation: GroundedGenerationMetadata) { + return participantGroups(records).map((group) => synthesis({ + participant: group.participant, + role: group.role, + tickets: group.tickets, + summary: `${group.participant} (${group.role}) ma ${group.records.length} uziemionych rekordΓ³w komunikacji.`, + commitments: group.records.filter((record) => record.epistemic.class === 'plan') + .map((record) => record.statement.text), + risks: group.records.filter((record) => record.statement.polarity === 'negative') + .map((record) => record.statement.text), + recordIds: group.records.map((record) => record.id).sort(), + confidence: 1, + generation, + })); +} + +export function markDeterministic(records: IntentRecord[], degraded: boolean, fallbackReason: string | null): IntentRecord[] { + return records.map((record) => { + const marked = withRecordGeneration(record, { + requested: degraded ? 'llm' : 'deterministic', used: 'deterministic', degraded, fallbackReason, + }); + return { ...marked, metadata: { ...marked.metadata, llmUsed: false } }; + }); +} + +export function deterministicGeneration(): GroundedGenerationMetadata { + return { + generator: 't2c/participant-synthesis', generatorVersion: '1', + runtimeVersion: T2C_VERSION, generatedAt: new Date().toISOString(), + requestedMode: 'deterministic', effectiveMode: 'deterministic', degraded: false, + model: null, provider: null, responseId: null, + configurationFingerprint: sha256('t2c-communication-deterministic/v1'), reason: null, + }; +} + +export function fallbackGeneration(reason: string): GroundedGenerationMetadata { + return { + generator: 't2c/participant-synthesis', generatorVersion: '1', + runtimeVersion: T2C_VERSION, generatedAt: new Date().toISOString(), + requestedMode: 'prefer-llm', effectiveMode: 'deterministic', degraded: true, + model: null, provider: null, responseId: null, + configurationFingerprint: sha256(stableStringify({ stage: 'communication', reason })), reason, + }; +} + +export function llmGeneration(config: T2CConfig, mode: LlmExtractionMode, response: LlmResponseMetadata): GroundedGenerationMetadata { + return { + generator: 't2c/participant-synthesis', generatorVersion: '1', + runtimeVersion: T2C_VERSION, generatedAt: new Date().toISOString(), + requestedMode: mode, effectiveMode: 'llm', degraded: false, + model: response.model ?? config.openRouter.communicationModel, + provider: response.provider ?? 'openrouter', responseId: response.responseId, + configurationFingerprint: sha256(stableStringify(openRouterAuditConfiguration(config, config.openRouter.communicationModel))), + reason: null, + }; +} + +export function audit( + status: PipelineStageAudit['status'], requestedMode: PipelineStageAudit['requestedMode'], + effectiveMode: PipelineStageAudit['effectiveMode'], degraded: boolean, recordCount: number, + warningCount: number, model: string | null, reason: PipelineStageAudit['reason'], durationMs: number, + responses: LlmResponseMetadata[], config: T2CConfig, options: CommunicationExtractionOptions, +): PipelineStageAudit { + return { + runtimeVersion: T2C_VERSION, + configuration: { + ...openRouterAuditConfiguration(config, model), + projectDirectory: options.projectDir ?? 'project', + ticket: options.ticket ?? null, + }, + status, requestedMode, effectiveMode, degraded, recordCount, warningCount, + model, durationMs, reason, responses, + }; +} + +export async function readPrompt(): Promise { + const promptPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../prompts', 'communication-to-intent.system.md'); + if (!(await pathExists(promptPath))) throw new Error(`Prompt not found: ${promptPath}`); + return fs.readFile(promptPath, 'utf8'); +} + +function synthesis(input: Omit): ParticipantCommunicationSynthesisInput & { id: string } { + const semantic = { + participant: input.participant, + role: input.role, + tickets: sortedUnique(input.tickets), + summary: input.summary.trim(), + commitments: sortedUnique(input.commitments), + risks: sortedUnique(input.risks), + recordIds: sortedUnique(input.recordIds), + }; + if (!semantic.summary || !semantic.recordIds.length) throw new Error('Participant synthesis requires a summary and record citations'); + return { + schemaVersion: 't2c.participant-synthesis/v1', + id: createIntentId(semantic, 'COMM-SYN'), + ...semantic, + confidence: Math.min(1, Math.max(0, input.confidence)), + generation: input.generation, + }; +} + +function sortedUnique(values: string[]): string[] { + return [...new Set(values.map((value) => value.trim()).filter(Boolean))].sort(); +} + +function roleOf(record: IntentRecord | undefined): CommunicationRole { + return record?.metadata.participantRole === 'human' || record?.metadata.participantRole === 'agent' + ? record.metadata.participantRole + : 'unknown'; +} + +const communicationStrings = () => s.array(s.string()); +const COMMUNICATION_ENRICHMENT_CONTRACT = s.object({ + recordId: s.string(), + action: s.enum(ACTIONS), + object: s.string(), + polarity: s.enum(['positive', 'negative']), + confidence: s.number({ minimum: 0, maximum: 0.85 }), + basis: communicationStrings(), + target: s.object({ paths: communicationStrings(), symbols: communicationStrings(), versions: communicationStrings() }), + topics: communicationStrings(), +}) satisfies StructuredSchema; +const PARTICIPANT_SYNTHESIS_CONTRACT = s.object({ + participantKey: s.string(), + summary: s.string({ minLength: 1, pattern: '.*\\S.*' }), + commitments: communicationStrings(), + risks: communicationStrings(), + recordIds: communicationStrings(), + confidence: s.number({ minimum: 0, maximum: 0.85 }), +}) satisfies StructuredSchema; +export const COMMUNICATION_RESPONSE_CONTRACT = s.object({ + enrichments: s.array(COMMUNICATION_ENRICHMENT_CONTRACT), + participantSyntheses: s.array(PARTICIPANT_SYNTHESIS_CONTRACT), +}) satisfies StructuredSchema; diff --git a/src/communication/llm/implementation.ts b/src/communication/llm/implementation.ts new file mode 100644 index 0000000..fe76cb3 --- /dev/null +++ b/src/communication/llm/implementation.ts @@ -0,0 +1,208 @@ +import type { T2CConfig } from '../../config/env.js'; +import type { + GroundedGenerationMetadata, + IntentRecord, + LlmExtractionMode, + LlmResponseMetadata, + PipelineStageAudit, +} from '../../core/types.js'; +import { classifyLlmFailure, rejectedLlmResponseMetadata, type LlmFailureReason } from '../../llm/failure.js'; +import { OpenRouterClient, type OpenRouterResult } from '../../llm/openrouter.js'; +import { StructuredResponseError } from '../../llm/structured-schema.js'; +import { + audit, + deterministicGeneration, + deterministicSyntheses, + enrichRecord, + fallbackGeneration, + llmGeneration, + markDeterministic, + materializeSyntheses, + participantGroups, + promptPayload, + readPrompt, + type RawCommunicationResponse, + validateEnrichments, + COMMUNICATION_RESPONSE_CONTRACT, +} from './implementation-helpers.js'; +import { + extractCommunicationIntent, + type CommunicationExtractionOptions, + type CommunicationRole, +} from '../../extractors/communication.js'; + +export interface ParticipantCommunicationSynthesis { + schemaVersion: 't2c.participant-synthesis/v1'; + id: string; + participant: string; + role: CommunicationRole; + tickets: string[]; + summary: string; + commitments: string[]; + risks: string[]; + recordIds: string[]; + confidence: number; + generation: GroundedGenerationMetadata; +} + +export interface AuditedCommunicationExtractionResult { + schemaVersion: 't2c.communication-enrichment/v1'; + records: IntentRecord[]; + participants: ParticipantCommunicationSynthesis[]; + warnings: string[]; + audit: PipelineStageAudit; +} + +export class CommunicationLlmRequiredError extends Error { + constructor(message: string, readonly audit: PipelineStageAudit) { + super(message); + this.name = 'CommunicationLlmRequiredError'; + } +} + +export async function extractCommunicationIntentAudited( + options: CommunicationExtractionOptions, + config: T2CConfig, + mode: LlmExtractionMode = config.communicationMode, +): Promise { + const startedAt = Date.now(); + const deterministic = await extractCommunicationIntent(options, config); + if (deterministic.records.length === 0) { + return { + schemaVersion: 't2c.communication-enrichment/v1', + ...deterministic, + participants: [], + audit: audit('skipped', mode === 'deterministic' ? 'deterministic' : 'llm', 'none', false, + deterministic.records.length, deterministic.warnings.length, null, + { code: 'NO_COMMUNICATION_RECORDS', message: 'No communication records were available for enrichment' }, + Date.now() - startedAt, [], config, options), + }; + } + if (mode === 'deterministic') { + const records = markDeterministic(deterministic.records, false, null); + return { + schemaVersion: 't2c.communication-enrichment/v1', records, + participants: deterministicSyntheses(records, deterministicGeneration()), + warnings: deterministic.warnings, + audit: audit(deterministic.warnings.length ? 'partial' : 'succeeded', 'deterministic', 'deterministic', false, records.length, + deterministic.warnings.length, null, null, Date.now() - startedAt, [], config, options), + }; + } + + const client = new OpenRouterClient(config.openRouter); + if (!client.isConfigured()) { + return fallbackOrThrow(deterministic.records, deterministic.warnings, config, options, mode, startedAt, { + code: 'LLM_NOT_CONFIGURED', message: 'OPENROUTER_API_KEY is not configured', + }); + } + try { + const groups = participantGroups(deterministic.records); + const { completion, responses } = await enrichWithCorrection(client, [ + { role: 'system', content: await readPrompt() }, + { role: 'user', content: JSON.stringify(promptPayload(deterministic.records, groups)) }, + ], config.openRouter.communicationModel); + const response = completion.value; + const enrichments = validateEnrichments(response.enrichments, deterministic.records); + const enrichedByOriginal = new Map(); + for (const record of deterministic.records) { + enrichedByOriginal.set(record.id, enrichRecord(record, enrichments.get(record.id)!, config, completion.metadata)); + } + const generation = llmGeneration(config, mode, completion.metadata); + const participants = materializeSyntheses( + response.participantSyntheses, + groups, + enrichedByOriginal, + generation, + ); + return { + schemaVersion: 't2c.communication-enrichment/v1', + records: [...enrichedByOriginal.values()], + participants, + warnings: deterministic.warnings, + audit: audit(deterministic.warnings.length ? 'partial' : 'succeeded', 'llm', 'llm', false, deterministic.records.length, + deterministic.warnings.length, config.openRouter.communicationModel, null, + Date.now() - startedAt, responses, config, options), + }; + } catch (error) { + const failure = error instanceof CommunicationAttemptError ? error.failure : error; + const responses = error instanceof CommunicationAttemptError + ? error.responses + : rejectedLlmResponseMetadata(error); + return fallbackOrThrow( + deterministic.records, deterministic.warnings, config, options, mode, startedAt, + classifyLlmFailure(failure), responses, + ); + } +} + +class CommunicationAttemptError extends Error { + constructor(readonly failure: unknown, readonly responses: LlmResponseMetadata[]) { + super(failure instanceof Error ? failure.message : String(failure)); + this.name = 'CommunicationAttemptError'; + } +} + +async function enrichWithCorrection( + client: OpenRouterClient, + baseMessages: Array<{ role: 'system' | 'user'; content: string }>, + model: string, +): Promise<{ completion: OpenRouterResult; responses: LlmResponseMetadata[] }> { + const responses: LlmResponseMetadata[] = []; + let correction: string | null = null; + + for (let attempt = 0; attempt < 2; attempt += 1) { + try { + const completion = await client.chatStructuredWithMetadata([ + ...baseMessages, + ...(correction + ? [{ + role: 'user' as const, + content: `The previous response was rejected: ${correction}\n` + + 'Correct exactly that violation and re-emit the full object. Do not add, rename, or omit properties.\n' + + `The exact required JSON Schema is: ${JSON.stringify(COMMUNICATION_RESPONSE_CONTRACT.jsonSchema)}`, + }] + : []), + ], 't2c_communication_enrichment', COMMUNICATION_RESPONSE_CONTRACT, model); + responses.push(completion.metadata); + return { completion, responses }; + } catch (error) { + if (error instanceof StructuredResponseError) { + if (error.responseMetadata) responses.push(error.responseMetadata); + if (attempt === 0) { + correction = error.message; + continue; + } + } + throw new CommunicationAttemptError(error, [...responses]); + } + } + + throw new CommunicationAttemptError(new Error('Communication correction retry budget exhausted'), responses); +} + +async function fallbackOrThrow( + records: IntentRecord[], + warnings: string[], + config: T2CConfig, + options: CommunicationExtractionOptions, + mode: LlmExtractionMode, + startedAt: number, + reason: LlmFailureReason, + responses: LlmResponseMetadata[] = [], +): Promise { + const failed = audit('failed', 'llm', 'none', true, 0, warnings.length + 1, + config.openRouter.communicationModel, reason, Date.now() - startedAt, responses, config, options); + if (mode === 'require-llm') { + throw new CommunicationLlmRequiredError(`Communication enrichment requires LLM: ${reason.message}`, failed); + } + const warning = `Communication enrichment used deterministic fallback (${reason.code}): ${reason.message}`; + const marked = markDeterministic(records, true, reason.code); + return { + schemaVersion: 't2c.communication-enrichment/v1', + records: marked, + participants: deterministicSyntheses(marked, fallbackGeneration(reason.code)), + warnings: [...warnings, warning], + audit: audit('fallback', 'llm', 'deterministic', true, marked.length, warnings.length + 1, + config.openRouter.communicationModel, reason, Date.now() - startedAt, responses, config, options), + }; +} diff --git a/src/communication/llm/index.ts b/src/communication/llm/index.ts new file mode 100644 index 0000000..2366584 --- /dev/null +++ b/src/communication/llm/index.ts @@ -0,0 +1 @@ +export * from './implementation.js'; diff --git a/src/core/io.ts b/src/core/io.ts index 927b304..c2c3305 100644 --- a/src/core/io.ts +++ b/src/core/io.ts @@ -85,33 +85,67 @@ export interface WalkOptions { } export async function walkFiles(root: string, options: WalkOptions = {}): Promise { - const ignored = new Set([...DEFAULT_IGNORED_DIRS, ...(options.ignoredDirs ?? [])]); - const extensions = options.extensions ? new Set(options.extensions.map((value) => value.toLowerCase())) : null; - const maxFiles = options.maxFiles ?? 20_000; - const matcher = options.matcher; - const base = path.resolve(root); - const output: string[] = []; - - async function visit(directory: string): Promise { - const entries = await fs.readdir(directory, { withFileTypes: true }); - entries.sort((a, b) => a.name.localeCompare(b.name)); - for (const entry of entries) { - if (output.length >= maxFiles) throw new Error(`File limit exceeded (${maxFiles}) under ${root}`); - const absolute = path.join(directory, entry.name); - if (entry.isSymbolicLink()) continue; - const relative = relativePosix(base, absolute); - if (matcher?.ignores(relative, entry.isDirectory())) continue; - if (entry.isDirectory()) { - if (!ignored.has(entry.name)) await visit(absolute); - } else if (entry.isFile()) { - const extension = path.extname(entry.name).toLowerCase(); - if (!extensions || extensions.has(extension)) output.push(absolute); - } - } + const state = createWalkState(root, options); + if (await pathExists(root)) await walkDirectory(state.base, state); + return state.output; +} + +interface WalkState { + base: string; + root: string; + output: string[]; + maxFiles: number; + extensions: Set | null; + ignored: Set; + matcher: { ignores(relativePath: string, isDirectory?: boolean): boolean }; +} + +function createWalkState(root: string, options: WalkOptions): WalkState { + return { + base: path.resolve(root), + root, + output: [], + maxFiles: options.maxFiles ?? 20_000, + extensions: options.extensions ? new Set(options.extensions.map((value) => value.toLowerCase())) : null, + ignored: new Set([...DEFAULT_IGNORED_DIRS, ...(options.ignoredDirs ?? [])]), + matcher: options.matcher ?? { ignores: () => false }, + }; +} + +async function walkDirectory(directory: string, state: WalkState): Promise { + const entries = await fs.readdir(directory, { withFileTypes: true }); + entries.sort((a, b) => a.name.localeCompare(b.name)); + for (const entry of entries) { + if (entry.isSymbolicLink()) continue; + await walkEntry(directory, entry, state); } +} + +async function walkEntry( + directory: string, + entry: { isDirectory(): boolean; isFile(): boolean; name: string }, + state: WalkState, +): Promise { + if (state.output.length >= state.maxFiles) { + throw new Error(`File limit exceeded (${state.maxFiles}) under ${state.root}`); + } + const absolute = path.join(directory, entry.name); + const relative = relativePosix(state.base, absolute); + if (state.matcher.ignores(relative, entry.isDirectory())) return; + + if (entry.isDirectory()) { + if (!state.ignored.has(entry.name)) await walkDirectory(absolute, state); + return; + } + + if (entry.isFile() && isTargetFile(entry.name, state.extensions)) { + state.output.push(absolute); + } +} - if (await pathExists(root)) await visit(base); - return output; +function isTargetFile(name: string, extensions: Set | null): boolean { + if (!extensions) return true; + return extensions.has(path.extname(name).toLowerCase()); } function escapeRegex(value: string): string { diff --git a/src/core/record-metadata.ts b/src/core/record-metadata.ts new file mode 100644 index 0000000..edf4421 --- /dev/null +++ b/src/core/record-metadata.ts @@ -0,0 +1,27 @@ +import type { BuildRecordGenerationInput, IntentGenerationMetadata } from './types.js'; +import { T2C_VERSION } from './version.js'; + +export function generationMetadata( + extractor: string, + input: BuildRecordGenerationInput | undefined, +): IntentGenerationMetadata { + return { + ...generationIdentity(extractor), + runtimeVersion: T2C_VERSION, + requested: input?.requested ?? (input?.used ?? 'deterministic'), + used: input?.used ?? 'deterministic', + degraded: input?.degraded ?? false, + fallbackReason: input?.fallbackReason ?? null, + provider: input?.provider ?? null, + model: input?.model ?? null, + responseId: input?.responseId ?? null, + }; +} + +function generationIdentity(extractor: string): { generator: string; generatorVersion: string } { + const separator = extractor.lastIndexOf('@'); + if (separator > 0 && separator < extractor.length - 1) { + return { generator: extractor.slice(0, separator), generatorVersion: extractor.slice(separator + 1) }; + } + return { generator: extractor, generatorVersion: T2C_VERSION }; +} diff --git a/src/core/record.ts b/src/core/record.ts index 4e989de..e39812a 100644 --- a/src/core/record.ts +++ b/src/core/record.ts @@ -14,7 +14,7 @@ import type { SourceLineRange, } from './types.js'; import { normalizeTarget } from './target.js'; -import { T2C_VERSION } from './version.js'; +import { generationMetadata } from './record-metadata.js'; export interface BuildRecordGenerationInput { requested?: IntentGenerationMode; @@ -57,7 +57,24 @@ export interface BuildRecordInput { export function buildRecord(input: BuildRecordInput): IntentRecord { const target: IntentTarget = normalizeTarget(input.target); const rawExcerpt = input.rawExcerpt ?? input.text; - const seed = { + const seed = buildRecordSeed(input, target, rawExcerpt); + return { + schemaVersion: 't2c.intent/v1', + id: createIntentId(seed, input.prefix ?? sourcePrefix(input.sourceKind)), + statement: buildRecordStatement(input, target), + lifecycle: { status: input.lifecycle }, + source: buildRecordSource(input, rawExcerpt), + epistemic: buildRecordEpistemic(input), + observedAt: input.observedAt ?? null, + metadata: { + ...(input.metadata ?? {}), + generation: generationMetadata(input.extractor, input.generation), + }, + }; +} + +function buildRecordSeed(input: BuildRecordInput, target: IntentTarget, rawExcerpt: string): Omit { + return { kind: input.kind, action: input.action, object: input.object, @@ -69,42 +86,41 @@ export function buildRecord(input: BuildRecordInput): IntentRecord { symbol: input.symbol ?? null, rawExcerpt, }; +} + +function buildRecordStatement(input: BuildRecordInput, target: IntentTarget): IntentRecord['statement'] { return { - schemaVersion: 't2c.intent/v1', - id: createIntentId(seed, input.prefix ?? sourcePrefix(input.sourceKind)), - statement: { - kind: input.kind, - actor: input.actor ?? null, - action: input.action, - subject: input.subject ?? null, - object: input.object, - target, - modality: input.modality ?? 'unknown', - polarity: input.polarity ?? 'positive', - text: input.text, - }, - lifecycle: { status: input.lifecycle }, - source: { - kind: input.sourceKind, - path: input.sourcePath ?? null, - lines: input.sourceLines ?? null, - revision: input.revision ?? null, - symbol: input.symbol ?? null, - commitIndex: input.commitIndex ?? null, - extractor: input.extractor, - contentHash: sha256(rawExcerpt), - rawExcerpt, - }, - epistemic: { - class: input.epistemicClass, - confidence: clamp(input.confidence), - basis: [...new Set(input.basis)].sort(), - }, - observedAt: input.observedAt ?? null, - metadata: { - ...(input.metadata ?? {}), - generation: generationMetadata(input.extractor, input.generation), - }, + kind: input.kind, + actor: input.actor ?? null, + action: input.action, + subject: input.subject ?? null, + object: input.object, + target, + modality: input.modality ?? 'unknown', + polarity: input.polarity ?? 'positive', + text: input.text, + }; +} + +function buildRecordSource(input: BuildRecordInput, rawExcerpt: string): IntentRecord['source'] { + return { + kind: input.sourceKind, + path: input.sourcePath ?? null, + lines: input.sourceLines ?? null, + revision: input.revision ?? null, + symbol: input.symbol ?? null, + commitIndex: input.commitIndex ?? null, + extractor: input.extractor, + contentHash: sha256(rawExcerpt), + rawExcerpt, + }; +} + +function buildRecordEpistemic(input: BuildRecordInput): IntentRecord['epistemic'] { + return { + class: input.epistemicClass, + confidence: clamp(input.confidence), + basis: [...new Set(input.basis)].sort(), }; } @@ -122,36 +138,6 @@ export function withRecordGeneration( }; } -function generationMetadata( - extractor: string, - input: BuildRecordGenerationInput | undefined, -): IntentGenerationMetadata { - const { generator, generatorVersion } = extractorIdentity(extractor); - const used = input?.used ?? 'deterministic'; - return { - generator, - generatorVersion, - runtimeVersion: T2C_VERSION, - requested: input?.requested ?? used, - used, - degraded: input?.degraded ?? false, - fallbackReason: input?.fallbackReason ?? null, - provider: input?.provider ?? null, - model: input?.model ?? null, - responseId: input?.responseId ?? null, - }; -} - -function extractorIdentity(extractor: string): { generator: string; generatorVersion: string } { - const separator = extractor.lastIndexOf('@'); - if (separator > 0 && separator < extractor.length - 1) { - return { generator: extractor.slice(0, separator), generatorVersion: extractor.slice(separator + 1) }; - } - // External/test builders that still supply an unversioned name are tied to - // the runtime implementation that materialized the record. - return { generator: extractor, generatorVersion: T2C_VERSION }; -} - function clamp(value: number): number { return Math.round(Math.max(0, Math.min(1, value)) * 1000) / 1000; } diff --git a/src/core/schema.ts b/src/core/schema.ts index af85c7e..e3c1414 100644 --- a/src/core/schema.ts +++ b/src/core/schema.ts @@ -1,922 +1 @@ -import { - createCodeChangePlanHash, - createCodeChangePlanId, - createConclusionId, - createTodoProposalId, - graphFingerprint, -} from './id.js'; -import type { - CodeChangeAcceptance, - CodeChangePlan, - Conclusion, - DiagnosticReport, - GroundedGenerationMetadata, - IntentGraph, - IntentGraphDiff, - IntentRecord, - IntentRelation, - JsonValue, - TodoProposal, -} from './types.js'; - -const ACTIONS = new Set([ - 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', - 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', -]); -const MODALITIES = new Set(['required', 'recommended', 'optional', 'observed', 'claimed', 'unknown']); -const POLARITIES = new Set(['positive', 'negative']); -const LIFECYCLES = new Set([ - 'proposed', 'planned', 'in_progress', 'implemented', 'verified', 'released', 'completed', 'blocked', 'unknown', -]); -const SOURCE_KINDS = new Set(['nl', 'git', 'ast', 'todo', 'changelog', 'document', 'agent_log', 'test', 'system']); -const EPISTEMIC_CLASSES = new Set(['declaration', 'plan', 'claim', 'fact', 'inference', 'llm_inference']); -const RELATION_TYPES = new Set([ - 'declares', 'plans', 'implements', 'modifies', 'tests', 'documents', 'releases', 'depends_on', - 'blocks', 'supersedes', 'contradicts', 'duplicates', 'evidenced_by', 'claimed_by', 'same_as', 'related_to', -]); -const CONCLUSION_KINDS = new Set(['finding', 'risk', 'decision', 'recommendation']); -const DIAGNOSTIC_SEVERITIES = new Set(['info', 'warning', 'review_required', 'blocking']); -const TODO_PRIORITIES = new Set(['P0', 'P1', 'P2', 'P3']); -const GENERATION_REQUESTED_MODES = new Set(['deterministic', 'prefer-llm', 'require-llm']); -const GENERATION_EFFECTIVE_MODES = new Set(['deterministic', 'llm']); -const RECORD_ID = /^INT-[A-Z]+-[a-f0-9]{20}$/; -const RELATION_ID = /^REL-[a-f0-9]{20}$/; -const DIAGNOSTIC_ID = /^DIAG-[a-f0-9]{20}$/; -const CONCLUSION_ID = /^CONC-[a-f0-9]{20}$/; -const TODO_PROPOSAL_ID = /^TPROP-[a-f0-9]{20}$/; -const CODE_CHANGE_PLAN_ID = /^CPLAN-[a-f0-9]{20}$/; -const CODE_CHANGE_ACTIONS = new Set(['create', 'modify', 'delete']); -const CODE_CHANGE_RISK_LEVELS = new Set(['low', 'medium', 'high']); -const FINGERPRINT = /^[a-f0-9]{64}$/; -const RUNTIME_VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; -const ISO_DATE_TIME = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/; - -export interface GroundedValidationContext { - graph: IntentGraph; - diagnostics: DiagnosticReport; -} - -export interface TodoProposalValidationContext extends GroundedValidationContext { - conclusions: Conclusion[]; -} - -export interface CodeChangePlanValidationContext extends GroundedValidationContext { - conclusions?: Conclusion[]; - proposals?: TodoProposal[]; -} - -export interface CodeChangeAcceptanceValidationContext { - plan: CodeChangePlan; - before: GroundedValidationContext; - after: GroundedValidationContext; -} - -export function assertIntentRecord(value: unknown): asserts value is IntentRecord { - const record = objectValue(value, 'Intent record'); - exactKeys(record, ['schemaVersion', 'id', 'statement', 'lifecycle', 'source', 'epistemic', 'observedAt', 'metadata'], 'Intent record'); - if (record.schemaVersion !== 't2c.intent/v1') throw new Error('Unsupported intent schemaVersion'); - if (typeof record.id !== 'string' || !RECORD_ID.test(record.id)) throw new Error('Intent record id must match INT--<20 hex>'); - - const statement = objectValue(record.statement, `Intent ${record.id}: statement`); - exactKeys(statement, ['kind', 'actor', 'action', 'subject', 'object', 'target', 'modality', 'polarity', 'text'], `Intent ${record.id}: statement`); - nonEmptyString(statement.kind, `Intent ${record.id}: statement.kind`); - nullableString(statement.actor, `Intent ${record.id}: statement.actor`); - enumValue(statement.action, ACTIONS, `Intent ${record.id}: statement.action`); - nullableString(statement.subject, `Intent ${record.id}: statement.subject`); - nonEmptyString(statement.object, `Intent ${record.id}: statement.object`); - if (typeof statement.text !== 'string') throw new Error(`Intent ${record.id}: statement.text must be a string`); - enumValue(statement.modality, MODALITIES, `Intent ${record.id}: statement.modality`); - enumValue(statement.polarity, POLARITIES, `Intent ${record.id}: statement.polarity`); - - const target = objectValue(statement.target, `Intent ${record.id}: statement.target`); - exactKeys(target, ['paths', 'symbols', 'tickets', 'versions'], `Intent ${record.id}: statement.target`); - for (const key of ['paths', 'symbols', 'tickets', 'versions'] as const) { - stringArray(target[key], `Intent ${record.id}: statement.target.${key}`, true); - } - - const lifecycle = objectValue(record.lifecycle, `Intent ${record.id}: lifecycle`); - exactKeys(lifecycle, ['status'], `Intent ${record.id}: lifecycle`); - enumValue(lifecycle.status, LIFECYCLES, `Intent ${record.id}: lifecycle.status`); - - const source = objectValue(record.source, `Intent ${record.id}: source`); - exactKeys(source, ['kind', 'path', 'lines', 'revision', 'symbol', 'commitIndex', 'extractor', 'contentHash', 'rawExcerpt'], `Intent ${record.id}: source`); - enumValue(source.kind, SOURCE_KINDS, `Intent ${record.id}: source.kind`); - nullableString(source.path, `Intent ${record.id}: source.path`); - nullableString(source.revision, `Intent ${record.id}: source.revision`); - nullableString(source.symbol, `Intent ${record.id}: source.symbol`); - nullableString(source.rawExcerpt, `Intent ${record.id}: source.rawExcerpt`); - nonEmptyString(source.extractor, `Intent ${record.id}: source.extractor`); - if (typeof source.contentHash !== 'string' || !FINGERPRINT.test(source.contentHash)) { - throw new Error(`Intent ${record.id}: source.contentHash must be SHA-256`); - } - if (source.commitIndex !== null && (!Number.isInteger(source.commitIndex) || (source.commitIndex as number) < 1)) { - throw new Error(`Intent ${record.id}: source.commitIndex must be null or an integer >= 1`); - } - if (source.lines !== null) { - const lines = objectValue(source.lines, `Intent ${record.id}: source.lines`); - exactKeys(lines, ['start', 'end'], `Intent ${record.id}: source.lines`); - if (!Number.isInteger(lines.start) || (lines.start as number) < 1 || !Number.isInteger(lines.end) || (lines.end as number) < (lines.start as number)) { - throw new Error(`Intent ${record.id}: source.lines must be positive and end >= start`); - } - } - - const epistemic = objectValue(record.epistemic, `Intent ${record.id}: epistemic`); - exactKeys(epistemic, ['class', 'confidence', 'basis'], `Intent ${record.id}: epistemic`); - enumValue(epistemic.class, EPISTEMIC_CLASSES, `Intent ${record.id}: epistemic.class`); - if (typeof epistemic.confidence !== 'number' || !Number.isFinite(epistemic.confidence) - || epistemic.confidence < 0 || epistemic.confidence > 1) { - throw new Error(`Intent ${record.id}: epistemic.confidence must be between 0 and 1`); - } - stringArray(epistemic.basis, `Intent ${record.id}: epistemic.basis`, true); - nullableDate(record.observedAt, `Intent ${record.id}: observedAt`); - - const metadata = objectValue(record.metadata, `Intent ${record.id}: metadata`); - if (!isJsonValue(metadata)) throw new Error(`Intent ${record.id}: metadata must contain JSON values only`); - assertIntentGenerationMetadata(metadata.generation, `Intent ${record.id}: metadata.generation`); - assertGenerationMatchesExtractor(metadata.generation, source.extractor as string, `Intent ${record.id}: metadata.generation`); - if (epistemic.class === 'llm_inference' - && (metadata.generation as { used: unknown }).used !== 'llm') { - throw new Error(`Intent ${record.id}: llm_inference requires metadata.generation.used=llm`); - } -} - -function assertGenerationMatchesExtractor(value: unknown, extractor: string, name: string): void { - const generation = value as { generator: string; generatorVersion: string }; - const separator = extractor.lastIndexOf('@'); - const expectedGenerator = separator > 0 ? extractor.slice(0, separator) : extractor; - if (generation.generator !== expectedGenerator) { - throw new Error(`${name}.generator must match source.extractor (${expectedGenerator})`); - } - if (separator > 0 && generation.generatorVersion !== extractor.slice(separator + 1)) { - throw new Error(`${name}.generatorVersion must match source.extractor (${extractor.slice(separator + 1)})`); - } -} - -function assertIntentGenerationMetadata(value: unknown, name: string): void { - const generation = objectValue(value, name); - exactKeys(generation, [ - 'generator', 'generatorVersion', 'runtimeVersion', 'requested', 'used', 'degraded', - 'fallbackReason', 'provider', 'model', 'responseId', - ], name); - nonBlankString(generation.generator, `${name}.generator`); - nonBlankString(generation.generatorVersion, `${name}.generatorVersion`); - if (typeof generation.runtimeVersion !== 'string' || !RUNTIME_VERSION.test(generation.runtimeVersion)) { - throw new Error(`${name}.runtimeVersion must be a semantic version`); - } - enumValue(generation.requested, GENERATION_EFFECTIVE_MODES, `${name}.requested`); - enumValue(generation.used, GENERATION_EFFECTIVE_MODES, `${name}.used`); - if (typeof generation.degraded !== 'boolean') throw new Error(`${name}.degraded must be a boolean`); - nullableString(generation.fallbackReason, `${name}.fallbackReason`); - nullableString(generation.provider, `${name}.provider`); - nullableString(generation.model, `${name}.model`); - nullableString(generation.responseId, `${name}.responseId`); - if (generation.used === 'llm') { - nonBlankString(generation.provider, `${name}.provider`); - nonBlankString(generation.model, `${name}.model`); - } else if (generation.provider !== null || generation.model !== null || generation.responseId !== null) { - throw new Error(`${name}: deterministic generation cannot claim an LLM provider, model or responseId`); - } - if (generation.degraded) { - if (generation.requested !== 'llm' || generation.used !== 'deterministic') { - throw new Error(`${name}: degraded generation must be an LLM request using deterministic fallback`); - } - nonBlankString(generation.fallbackReason, `${name}.fallbackReason`); - } else if (generation.fallbackReason !== null) { - throw new Error(`${name}.fallbackReason must be null when generation is not degraded`); - } -} - -export function assertIntentRecords(values: unknown): asserts values is IntentRecord[] { - if (!Array.isArray(values)) throw new Error('Intent records must be an array'); - values.forEach(assertIntentRecord); -} - -export function assertIntentGraph(value: unknown): asserts value is IntentGraph { - const graph = objectValue(value, 'Intent graph'); - exactKeys(graph, ['schemaVersion', 'generatedAt', 'fingerprint', 'records', 'relations', 'stats'], 'Intent graph'); - if (graph.schemaVersion !== 't2c.graph/v1') throw new Error('Unsupported graph schemaVersion'); - dateString(graph.generatedAt, 'Graph generatedAt'); - fingerprint(graph.fingerprint, 'Graph fingerprint'); - assertIntentRecords(graph.records); - if (!Array.isArray(graph.relations)) throw new Error('Graph relations must be an array'); - const recordIds = new Set((graph.records as IntentRecord[]).map((record) => record.id)); - if (recordIds.size !== (graph.records as IntentRecord[]).length) throw new Error('Graph record IDs must be unique'); - const relationIds = new Set(); - for (const relation of graph.relations) { - assertRelation(relation, recordIds); - if (relationIds.has((relation as IntentRelation).id)) throw new Error(`Duplicate relation id: ${(relation as IntentRelation).id}`); - relationIds.add((relation as IntentRelation).id); - } - const stats = objectValue(graph.stats, 'Graph stats'); - exactKeys(stats, ['bySource', 'byAction', 'byStatus'], 'Graph stats'); - countMap(stats.bySource, 'Graph stats.bySource'); - countMap(stats.byAction, 'Graph stats.byAction'); - countMap(stats.byStatus, 'Graph stats.byStatus'); - const records = graph.records as IntentRecord[]; - exactCounts(stats.bySource, countRecords(records, (record) => record.source.kind), 'Graph stats.bySource'); - exactCounts(stats.byAction, countRecords(records, (record) => record.statement.action), 'Graph stats.byAction'); - exactCounts(stats.byStatus, countRecords(records, (record) => record.lifecycle.status), 'Graph stats.byStatus'); - const expectedFingerprint = graphFingerprint(records, graph.relations as IntentRelation[]); - if (graph.fingerprint !== expectedFingerprint) throw new Error('Graph fingerprint does not match records and relations'); -} - -export function assertIntentGraphDiff(value: unknown): asserts value is IntentGraphDiff { - const diff = objectValue(value, 'Intent graph diff'); - exactKeys(diff, ['schemaVersion', 'generatedAt', 'fingerprint', 'beforeFingerprint', 'afterFingerprint', 'records', 'relations', 'summary'], 'Intent graph diff'); - if (diff.schemaVersion !== 't2c.diff/v1') throw new Error('Unsupported graph diff schemaVersion'); - dateString(diff.generatedAt, 'Graph diff generatedAt'); - fingerprint(diff.fingerprint, 'Graph diff fingerprint'); - fingerprint(diff.beforeFingerprint, 'Graph diff beforeFingerprint'); - fingerprint(diff.afterFingerprint, 'Graph diff afterFingerprint'); - - const records = objectValue(diff.records, 'Graph diff records'); - exactKeys(records, ['added', 'removed', 'changed', 'unchanged'], 'Graph diff records'); - assertIntentRecords(records.added); - assertIntentRecords(records.removed); - if (!Array.isArray(records.changed)) throw new Error('Graph diff changed records must be an array'); - for (const rawChange of records.changed) { - const change = objectValue(rawChange, 'Graph diff record change'); - exactKeys(change, ['identity', 'before', 'after', 'changedFields'], 'Graph diff record change'); - nonEmptyString(change.identity, 'Graph diff record change identity'); - assertIntentRecord(change.before); - assertIntentRecord(change.after); - stringArray(change.changedFields, 'Graph diff changedFields', true); - } - nonNegativeInteger(records.unchanged, 'Graph diff records.unchanged'); - - const relations = objectValue(diff.relations, 'Graph diff relations'); - exactKeys(relations, ['added', 'removed', 'unchanged'], 'Graph diff relations'); - if (!Array.isArray(relations.added) || !Array.isArray(relations.removed)) throw new Error('Graph diff relation sets must be arrays'); - [...relations.added, ...relations.removed].forEach((relation) => assertRelation(relation)); - nonNegativeInteger(relations.unchanged, 'Graph diff relations.unchanged'); - - const summary = objectValue(diff.summary, 'Graph diff summary'); - exactKeys(summary, ['recordsAdded', 'recordsRemoved', 'recordsChanged', 'recordsUnchanged', 'relationsAdded', 'relationsRemoved', 'relationsUnchanged'], 'Graph diff summary'); - for (const [key, count] of Object.entries(summary)) nonNegativeInteger(count, `Graph diff summary.${key}`); - const expectedCounts: Record = { - recordsAdded: (records.added as unknown[]).length, - recordsRemoved: (records.removed as unknown[]).length, - recordsChanged: (records.changed as unknown[]).length, - recordsUnchanged: records.unchanged as number, - relationsAdded: (relations.added as unknown[]).length, - relationsRemoved: (relations.removed as unknown[]).length, - relationsUnchanged: relations.unchanged as number, - }; - exactCounts(summary, expectedCounts, 'Graph diff summary'); -} - -export function assertConclusion( - value: unknown, - context: GroundedValidationContext, -): asserts value is Conclusion { - const known = validateGroundedContext(context); - assertConclusionValue(value, known.recordIds, known.diagnosticIds); -} - -export function assertConclusions( - values: unknown, - context: GroundedValidationContext, -): asserts values is Conclusion[] { - if (!Array.isArray(values)) throw new Error('Conclusions must be an array'); - const known = validateGroundedContext(context); - const ids = new Set(); - for (const value of values) { - assertConclusionValue(value, known.recordIds, known.diagnosticIds); - const id = (value as Conclusion).id; - if (ids.has(id)) throw new Error(`Duplicate conclusion id: ${id}`); - ids.add(id); - } -} - -export function assertTodoProposal( - value: unknown, - context: TodoProposalValidationContext, -): asserts value is TodoProposal { - const known = validateTodoProposalContext(context); - assertTodoProposalValue(value, known.recordIds, known.diagnosticIds, known.conclusionIds); -} - -export function assertTodoProposals( - values: unknown, - context: TodoProposalValidationContext, -): asserts values is TodoProposal[] { - if (!Array.isArray(values)) throw new Error('TODO proposals must be an array'); - const known = validateTodoProposalContext(context); - const proposalIds = new Set(); - for (const value of values) { - assertTodoProposalValue(value, known.recordIds, known.diagnosticIds, known.conclusionIds); - const id = (value as TodoProposal).id; - if (proposalIds.has(id)) throw new Error(`Duplicate TODO proposal id: ${id}`); - proposalIds.add(id); - } - for (const proposal of values as TodoProposal[]) { - for (const dependency of proposal.dependencies) { - if (!proposalIds.has(dependency)) { - throw new Error(`TODO proposal ${proposal.id} references unknown dependency ${dependency}`); - } - } - } - assertAcyclicProposalDependencies(values as TodoProposal[]); -} - -export function assertCodeChangePlan( - value: unknown, - context: CodeChangePlanValidationContext, -): asserts value is CodeChangePlan { - const known = validateCodeChangePlanContext(context); - assertCodeChangePlanValue(value, known); - assertPlanGraphFingerprint(value, context.graph.fingerprint); -} - -export function assertCodeChangePlans( - values: unknown, - context: CodeChangePlanValidationContext, -): asserts values is CodeChangePlan[] { - if (!Array.isArray(values)) throw new Error('Code change plans must be an array'); - const known = validateCodeChangePlanContext(context); - const ids = new Set(); - for (const value of values) { - assertCodeChangePlanValue(value, known); - assertPlanGraphFingerprint(value, context.graph.fingerprint); - const id = (value as CodeChangePlan).id; - if (ids.has(id)) throw new Error(`Duplicate code change plan id: ${id}`); - ids.add(id); - } -} - -/** - * Validate persisted plans for rendering when their source graph and - * diagnostics are not loaded. Evidence references remain syntax-checked and - * content-bound by each plan hash; the supplied graph fingerprint must match. - */ -export function assertCodeChangePlansForReview( - values: unknown, - graphFingerprintValue: string, -): asserts values is CodeChangePlan[] { - if (!Array.isArray(values)) throw new Error('Code change plans must be an array'); - fingerprint(graphFingerprintValue, 'Code change review graphFingerprint'); - const ids = new Set(); - for (const value of values) { - const plan = objectValue(value, 'Code change plan'); - const evidence = objectValue(plan.evidence, 'Code change plan evidence'); - uniqueIdArray(evidence.recordIds, RECORD_ID, 'Code change plan evidence.recordIds'); - uniqueIdArray(evidence.diagnosticIds, DIAGNOSTIC_ID, 'Code change plan evidence.diagnosticIds'); - uniqueIdArray(evidence.conclusionIds, CONCLUSION_ID, 'Code change plan evidence.conclusionIds'); - uniqueIdArray(evidence.proposalIds, TODO_PROPOSAL_ID, 'Code change plan evidence.proposalIds'); - assertCodeChangePlanValue(value, { - recordIds: new Set(evidence.recordIds as string[]), - diagnosticIds: new Set(evidence.diagnosticIds as string[]), - conclusionIds: new Set(evidence.conclusionIds as string[]), - proposalIds: new Set(evidence.proposalIds as string[]), - }); - assertPlanGraphFingerprint(value, graphFingerprintValue); - const id = (value as CodeChangePlan).id; - if (ids.has(id)) throw new Error(`Duplicate code change plan id: ${id}`); - ids.add(id); - } -} - -/** - * Validate a persisted plan before acceptance when its full conclusion and - * TODO-proposal objects are no longer present. Their IDs remain syntax-checked - * and content-bound by the plan hash; records and diagnostics stay grounded in - * the supplied before graph. - */ -export function assertCodeChangePlanForAcceptance( - value: unknown, - context: GroundedValidationContext, -): asserts value is CodeChangePlan { - const known = validateGroundedContext(context); - const plan = objectValue(value, 'Code change plan'); - const evidence = objectValue(plan.evidence, 'Code change plan evidence'); - uniqueIdArray(evidence.conclusionIds, CONCLUSION_ID, 'Code change plan evidence.conclusionIds'); - uniqueIdArray(evidence.proposalIds, TODO_PROPOSAL_ID, 'Code change plan evidence.proposalIds'); - assertCodeChangePlanValue(value, { - ...known, - conclusionIds: new Set(evidence.conclusionIds as string[]), - proposalIds: new Set(evidence.proposalIds as string[]), - }); - assertPlanGraphFingerprint(value, context.graph.fingerprint); -} - -function assertPlanGraphFingerprint(plan: CodeChangePlan, graphFingerprintValue: string): void { - if (plan.evidence.graphFingerprint !== graphFingerprintValue) { - throw new Error('Code change plan evidence.graphFingerprint does not match its graph'); - } -} - -export function assertCodeChangeAcceptance( - value: unknown, - context: CodeChangeAcceptanceValidationContext, -): asserts value is CodeChangeAcceptance { - assertCodeChangePlanForAcceptance(context.plan, context.before); - const beforeKnown = validateGroundedContext(context.before); - const afterKnown = validateGroundedContext(context.after); - const acceptance = objectValue(value, 'Code change acceptance'); - exactKeys(acceptance, [ - 'schemaVersion', 'planId', 'planHash', 'beforeGraphFingerprint', 'afterGraphFingerprint', - 'beforeDiagnosticIds', 'afterDiagnosticIds', 'clearedDiagnosticIds', 'remainingDiagnosticIds', - 'newBlockingDiagnosticIds', 'accepted', 'reasons', 'evaluatedAt', 'generation', - ], 'Code change acceptance'); - if (acceptance.schemaVersion !== 't2c.code-change-acceptance/v1') { - throw new Error('Unsupported code change acceptance schemaVersion'); - } - if (acceptance.planId !== context.plan.id) throw new Error('Code change acceptance planId does not match its plan'); - if (acceptance.planHash !== context.plan.planHash) throw new Error('Code change acceptance planHash does not match its plan'); - if (acceptance.beforeGraphFingerprint !== context.before.graph.fingerprint) { - throw new Error('Code change acceptance beforeGraphFingerprint does not match its graph'); - } - if (acceptance.afterGraphFingerprint !== context.after.graph.fingerprint) { - throw new Error('Code change acceptance afterGraphFingerprint does not match its graph'); - } - for (const key of [ - 'beforeDiagnosticIds', 'afterDiagnosticIds', 'clearedDiagnosticIds', 'remainingDiagnosticIds', - 'newBlockingDiagnosticIds', - ] as const) { - uniqueIdArray(acceptance[key], DIAGNOSTIC_ID, `Code change acceptance ${key}`); - } - const beforeIds = [...beforeKnown.diagnosticIds].sort(); - const afterIds = [...afterKnown.diagnosticIds].sort(); - const targeted = [...context.plan.evidence.diagnosticIds].sort(); - const expectedCleared = targeted.filter((id) => !afterKnown.diagnosticIds.has(id)); - const expectedRemaining = targeted.filter((id) => afterKnown.diagnosticIds.has(id)); - const expectedBlocking = context.after.diagnostics.diagnostics - .filter((item) => item.severity === 'blocking' && !beforeKnown.diagnosticIds.has(item.id)) - .map((item) => item.id) - .sort(); - exactStringSet(acceptance.beforeDiagnosticIds as string[], beforeIds, 'Code change acceptance beforeDiagnosticIds'); - exactStringSet(acceptance.afterDiagnosticIds as string[], afterIds, 'Code change acceptance afterDiagnosticIds'); - exactStringSet(acceptance.clearedDiagnosticIds as string[], expectedCleared, 'Code change acceptance clearedDiagnosticIds'); - exactStringSet(acceptance.remainingDiagnosticIds as string[], expectedRemaining, 'Code change acceptance remainingDiagnosticIds'); - exactStringSet(acceptance.newBlockingDiagnosticIds as string[], expectedBlocking, 'Code change acceptance newBlockingDiagnosticIds'); - const expectedAccepted = expectedRemaining.length === 0 && expectedBlocking.length === 0; - if (acceptance.accepted !== expectedAccepted) throw new Error('Code change acceptance accepted flag is inconsistent'); - nonEmptyUniqueStringArray(acceptance.reasons, 'Code change acceptance reasons'); - dateString(acceptance.evaluatedAt, 'Code change acceptance evaluatedAt'); - assertGroundedGenerationMetadata(acceptance.generation, 'Code change acceptance generation'); - if ((acceptance.generation as GroundedGenerationMetadata).generatedAt !== acceptance.evaluatedAt) { - throw new Error('Code change acceptance generation.generatedAt must match evaluatedAt'); - } -} - -function assertConclusionValue( - value: unknown, - recordIds: Set, - diagnosticIds: Set, -): asserts value is Conclusion { - const conclusion = objectValue(value, 'Conclusion'); - exactKeys(conclusion, [ - 'schemaVersion', 'id', 'kind', 'title', 'detail', 'severity', 'diagnosticIds', 'recordIds', 'confidence', 'generation', - ], 'Conclusion'); - if (conclusion.schemaVersion !== 't2c.conclusion/v1') throw new Error('Unsupported conclusion schemaVersion'); - if (typeof conclusion.id !== 'string' || !CONCLUSION_ID.test(conclusion.id)) { - throw new Error('Conclusion id must match CONC-<20 hex>'); - } - enumValue(conclusion.kind, CONCLUSION_KINDS, `Conclusion ${conclusion.id}: kind`); - nonBlankString(conclusion.title, `Conclusion ${conclusion.id}: title`); - nonBlankString(conclusion.detail, `Conclusion ${conclusion.id}: detail`); - enumValue(conclusion.severity, DIAGNOSTIC_SEVERITIES, `Conclusion ${conclusion.id}: severity`); - nonEmptyUniqueIdArray(conclusion.diagnosticIds, DIAGNOSTIC_ID, `Conclusion ${conclusion.id}: diagnosticIds`); - nonEmptyUniqueIdArray(conclusion.recordIds, RECORD_ID, `Conclusion ${conclusion.id}: recordIds`); - knownReferences(conclusion.diagnosticIds as string[], diagnosticIds, `Conclusion ${conclusion.id}: diagnosticIds`); - knownReferences(conclusion.recordIds as string[], recordIds, `Conclusion ${conclusion.id}: recordIds`); - confidence(conclusion.confidence, `Conclusion ${conclusion.id}: confidence`); - assertGroundedGenerationMetadata(conclusion.generation, `Conclusion ${conclusion.id}: generation`); - const expectedId = createConclusionId(conclusion as unknown as Conclusion); - if (conclusion.id !== expectedId) throw new Error(`Conclusion id does not match semantic content: expected ${expectedId}`); -} - -function assertTodoProposalValue( - value: unknown, - recordIds: Set, - diagnosticIds: Set, - conclusionIds: Set, -): asserts value is TodoProposal { - const proposal = objectValue(value, 'TODO proposal'); - exactKeys(proposal, [ - 'schemaVersion', 'id', 'title', 'description', 'priority', 'status', 'target', 'acceptanceCriteria', - 'dependencies', 'conclusionIds', 'diagnosticIds', 'recordIds', 'confidence', 'generation', - ], 'TODO proposal'); - if (proposal.schemaVersion !== 't2c.todo-proposal/v1') throw new Error('Unsupported TODO proposal schemaVersion'); - if (typeof proposal.id !== 'string' || !TODO_PROPOSAL_ID.test(proposal.id)) { - throw new Error('TODO proposal id must match TPROP-<20 hex>'); - } - nonBlankString(proposal.title, `TODO proposal ${proposal.id}: title`); - nonBlankString(proposal.description, `TODO proposal ${proposal.id}: description`); - enumValue(proposal.priority, TODO_PRIORITIES, `TODO proposal ${proposal.id}: priority`); - if (proposal.status !== 'proposed') throw new Error(`TODO proposal ${proposal.id}: status must be proposed`); - const target = objectValue(proposal.target, `TODO proposal ${proposal.id}: target`); - exactKeys(target, ['paths', 'symbols', 'tickets', 'versions'], `TODO proposal ${proposal.id}: target`); - for (const key of ['paths', 'symbols', 'tickets', 'versions'] as const) { - stringArray(target[key], `TODO proposal ${proposal.id}: target.${key}`, true); - if ((target[key] as string[]).some((item) => !item.trim())) { - throw new Error(`TODO proposal ${proposal.id}: target.${key} cannot contain blank values`); - } - } - nonEmptyUniqueStringArray(proposal.acceptanceCriteria, `TODO proposal ${proposal.id}: acceptanceCriteria`); - uniqueIdArray(proposal.dependencies, TODO_PROPOSAL_ID, `TODO proposal ${proposal.id}: dependencies`); - if ((proposal.dependencies as string[]).includes(proposal.id as string)) { - throw new Error(`TODO proposal ${proposal.id} cannot depend on itself`); - } - nonEmptyUniqueIdArray(proposal.conclusionIds, CONCLUSION_ID, `TODO proposal ${proposal.id}: conclusionIds`); - nonEmptyUniqueIdArray(proposal.diagnosticIds, DIAGNOSTIC_ID, `TODO proposal ${proposal.id}: diagnosticIds`); - nonEmptyUniqueIdArray(proposal.recordIds, RECORD_ID, `TODO proposal ${proposal.id}: recordIds`); - knownReferences(proposal.conclusionIds as string[], conclusionIds, `TODO proposal ${proposal.id}: conclusionIds`); - knownReferences(proposal.diagnosticIds as string[], diagnosticIds, `TODO proposal ${proposal.id}: diagnosticIds`); - knownReferences(proposal.recordIds as string[], recordIds, `TODO proposal ${proposal.id}: recordIds`); - confidence(proposal.confidence, `TODO proposal ${proposal.id}: confidence`); - assertGroundedGenerationMetadata(proposal.generation, `TODO proposal ${proposal.id}: generation`); - const expectedId = createTodoProposalId(proposal as unknown as TodoProposal); - if (proposal.id !== expectedId) throw new Error(`TODO proposal id does not match semantic content: expected ${expectedId}`); -} - -export function assertGroundedGenerationMetadata(value: unknown, name: string): asserts value is GroundedGenerationMetadata { - const generation = objectValue(value, name); - exactKeys(generation, [ - 'generator', 'generatorVersion', 'runtimeVersion', 'generatedAt', 'requestedMode', 'effectiveMode', - 'degraded', 'model', 'provider', 'responseId', 'configurationFingerprint', 'reason', - ], name); - nonBlankString(generation.generator, `${name}.generator`); - nonBlankString(generation.generatorVersion, `${name}.generatorVersion`); - if (typeof generation.runtimeVersion !== 'string' || !RUNTIME_VERSION.test(generation.runtimeVersion)) { - throw new Error(`${name}.runtimeVersion must be a semantic version`); - } - dateString(generation.generatedAt, `${name}.generatedAt`); - enumValue(generation.requestedMode, GENERATION_REQUESTED_MODES, `${name}.requestedMode`); - enumValue(generation.effectiveMode, GENERATION_EFFECTIVE_MODES, `${name}.effectiveMode`); - if (typeof generation.degraded !== 'boolean') throw new Error(`${name}.degraded must be a boolean`); - nullableString(generation.model, `${name}.model`); - nullableString(generation.provider, `${name}.provider`); - nullableString(generation.responseId, `${name}.responseId`); - fingerprint(generation.configurationFingerprint, `${name}.configurationFingerprint`); - nullableString(generation.reason, `${name}.reason`); - - if (generation.effectiveMode === 'llm') { - nonBlankString(generation.model, `${name}.model`); - nonBlankString(generation.provider, `${name}.provider`); - if (generation.degraded) throw new Error(`${name}.degraded must be false when effectiveMode is llm`); - } - if (generation.requestedMode === 'deterministic') { - if (generation.effectiveMode !== 'deterministic' || generation.degraded - || generation.model !== null || generation.provider !== null || generation.responseId !== null - || generation.reason !== null) { - throw new Error(`${name} deterministic mode cannot contain LLM or degradation metadata`); - } - } - if (generation.requestedMode === 'require-llm' && generation.effectiveMode !== 'llm') { - throw new Error(`${name} require-llm mode cannot use deterministic output`); - } - if (generation.requestedMode === 'prefer-llm' && generation.effectiveMode === 'deterministic' && !generation.degraded) { - throw new Error(`${name} prefer-llm deterministic output must be marked degraded`); - } - if (generation.degraded) { - if (generation.requestedMode !== 'prefer-llm' || generation.effectiveMode !== 'deterministic') { - throw new Error(`${name} degraded output is only valid for prefer-llm deterministic fallback`); - } - nonBlankString(generation.reason, `${name}.reason`); - } else if (generation.reason !== null) { - throw new Error(`${name}.reason must be null when output is not degraded`); - } -} - -function validateGroundedContext(context: GroundedValidationContext): { - recordIds: Set; - diagnosticIds: Set; -} { - assertIntentGraph(context.graph); - const report = objectValue(context.diagnostics, 'Diagnostic report'); - if (report.schemaVersion !== 't2c.diagnostics/v1') throw new Error('Unsupported diagnostic schemaVersion'); - if (report.graphFingerprint !== context.graph.fingerprint) { - throw new Error('Diagnostic report does not describe the supplied graph'); - } - if (!Array.isArray(report.diagnostics)) throw new Error('Diagnostic report diagnostics must be an array'); - const diagnosticIds = new Set(); - for (const value of report.diagnostics) { - const diagnostic = objectValue(value, 'Diagnostic'); - if (typeof diagnostic.id !== 'string' || !DIAGNOSTIC_ID.test(diagnostic.id)) { - throw new Error('Diagnostic id must match DIAG-<20 hex>'); - } - if (diagnosticIds.has(diagnostic.id)) throw new Error(`Duplicate diagnostic id: ${diagnostic.id}`); - diagnosticIds.add(diagnostic.id); - } - return { - recordIds: new Set(context.graph.records.map((record) => record.id)), - diagnosticIds, - }; -} - -function validateTodoProposalContext(context: TodoProposalValidationContext): { - recordIds: Set; - diagnosticIds: Set; - conclusionIds: Set; -} { - const known = validateGroundedContext(context); - assertConclusions(context.conclusions, context); - return { - ...known, - conclusionIds: new Set(context.conclusions.map((conclusion) => conclusion.id)), - }; -} - -function validateCodeChangePlanContext(context: CodeChangePlanValidationContext): { - recordIds: Set; - diagnosticIds: Set; - conclusionIds: Set; - proposalIds: Set; -} { - const known = validateGroundedContext(context); - const conclusions = context.conclusions ?? []; - const proposals = context.proposals ?? []; - if (conclusions.length) assertConclusions(conclusions, context); - // Full proposal contracts need conclusions. When only proposal IDs are - // supplied as evidence references, accept the IDs after a light shape check. - if (proposals.length && conclusions.length) { - assertTodoProposals(proposals, { graph: context.graph, diagnostics: context.diagnostics, conclusions }); - } else if (proposals.length) { - const referencedConclusionIds = new Set(); - for (const [index, value] of proposals.entries()) { - const proposal = objectValue(value, `TODO proposal reference[${index}]`); - uniqueIdArray(proposal.conclusionIds, CONCLUSION_ID, `TODO proposal reference[${index}].conclusionIds`); - for (const id of proposal.conclusionIds as string[]) referencedConclusionIds.add(id); - } - const proposalIds = new Set(); - for (const proposal of proposals) { - assertTodoProposalValue( - proposal, - known.recordIds, - known.diagnosticIds, - referencedConclusionIds, - ); - if (proposalIds.has(proposal.id)) throw new Error(`Duplicate TODO proposal id: ${proposal.id}`); - proposalIds.add(proposal.id); - } - } - return { - ...known, - conclusionIds: new Set(conclusions.map((item) => item.id)), - proposalIds: new Set(proposals.map((item) => item.id)), - }; -} - -function assertCodeChangePlanValue( - value: unknown, - known: { - recordIds: Set; - diagnosticIds: Set; - conclusionIds: Set; - proposalIds: Set; - }, -): asserts value is CodeChangePlan { - const plan = objectValue(value, 'Code change plan'); - exactKeys(plan, [ - 'schemaVersion', 'id', 'planHash', 'status', 'createdAt', 'title', 'description', 'priority', - 'target', 'acceptanceCriteria', 'changes', 'risk', 'rollback', 'evidence', 'confidence', 'generation', - ], 'Code change plan'); - if (plan.schemaVersion !== 't2c.code-change-plan/v1') { - throw new Error('Unsupported code change plan schemaVersion'); - } - if (typeof plan.id !== 'string' || !CODE_CHANGE_PLAN_ID.test(plan.id)) { - throw new Error('Code change plan id must match CPLAN-<20 hex>'); - } - fingerprint(plan.planHash, `Code change plan ${plan.id}: planHash`); - if (plan.status !== 'proposed') throw new Error(`Code change plan ${plan.id}: status must be proposed`); - dateString(plan.createdAt, `Code change plan ${plan.id}: createdAt`); - nonBlankString(plan.title, `Code change plan ${plan.id}: title`); - nonBlankString(plan.description, `Code change plan ${plan.id}: description`); - enumValue(plan.priority, TODO_PRIORITIES, `Code change plan ${plan.id}: priority`); - const target = objectValue(plan.target, `Code change plan ${plan.id}: target`); - exactKeys(target, ['paths', 'symbols', 'tickets', 'versions'], `Code change plan ${plan.id}: target`); - for (const key of ['paths', 'symbols', 'tickets', 'versions'] as const) { - stringArray(target[key], `Code change plan ${plan.id}: target.${key}`, true); - if ((target[key] as string[]).some((item) => !item.trim())) { - throw new Error(`Code change plan ${plan.id}: target.${key} cannot contain blank values`); - } - } - const targetPaths = new Set((target.paths as string[]).map((item, index) => ( - repositoryPath(item, `Code change plan ${plan.id}: target.paths[${index}]`) - ))); - nonEmptyUniqueStringArray(plan.acceptanceCriteria, `Code change plan ${plan.id}: acceptanceCriteria`); - if (!Array.isArray(plan.changes) || plan.changes.length === 0) { - throw new Error(`Code change plan ${plan.id}: changes must be a non-empty array`); - } - const changePaths = new Set(); - for (const [index, rawChange] of plan.changes.entries()) { - const change = objectValue(rawChange, `Code change plan ${plan.id}: changes[${index}]`); - exactKeys(change, ['path', 'action', 'symbols', 'rationale'], `Code change plan ${plan.id}: changes[${index}]`); - nonBlankString(change.path, `Code change plan ${plan.id}: changes[${index}].path`); - const normalizedPath = repositoryPath(change.path, `Code change plan ${plan.id}: changes[${index}].path`); - if (!targetPaths.has(normalizedPath)) { - throw new Error(`Code change plan ${plan.id}: changes[${index}].path is not present in target.paths`); - } - enumValue(change.action, CODE_CHANGE_ACTIONS, `Code change plan ${plan.id}: changes[${index}].action`); - stringArray(change.symbols, `Code change plan ${plan.id}: changes[${index}].symbols`, true); - if ((change.symbols as string[]).some((item) => !item.trim())) { - throw new Error(`Code change plan ${plan.id}: changes[${index}].symbols cannot contain blank values`); - } - nonBlankString(change.rationale, `Code change plan ${plan.id}: changes[${index}].rationale`); - if (changePaths.has(normalizedPath)) { - throw new Error(`Code change plan ${plan.id}: duplicate change for ${normalizedPath}`); - } - changePaths.add(normalizedPath); - } - const risk = objectValue(plan.risk, `Code change plan ${plan.id}: risk`); - exactKeys(risk, ['level', 'reasons'], `Code change plan ${plan.id}: risk`); - enumValue(risk.level, CODE_CHANGE_RISK_LEVELS, `Code change plan ${plan.id}: risk.level`); - nonEmptyUniqueStringArray(risk.reasons, `Code change plan ${plan.id}: risk.reasons`); - nonBlankString(plan.rollback, `Code change plan ${plan.id}: rollback`); - const evidence = objectValue(plan.evidence, `Code change plan ${plan.id}: evidence`); - exactKeys(evidence, [ - 'graphFingerprint', 'recordIds', 'diagnosticIds', 'conclusionIds', 'proposalIds', - ], `Code change plan ${plan.id}: evidence`); - fingerprint(evidence.graphFingerprint, `Code change plan ${plan.id}: evidence.graphFingerprint`); - nonEmptyUniqueIdArray(evidence.recordIds, RECORD_ID, `Code change plan ${plan.id}: evidence.recordIds`); - nonEmptyUniqueIdArray(evidence.diagnosticIds, DIAGNOSTIC_ID, `Code change plan ${plan.id}: evidence.diagnosticIds`); - uniqueIdArray(evidence.conclusionIds, CONCLUSION_ID, `Code change plan ${plan.id}: evidence.conclusionIds`); - uniqueIdArray(evidence.proposalIds, TODO_PROPOSAL_ID, `Code change plan ${plan.id}: evidence.proposalIds`); - knownReferences(evidence.recordIds as string[], known.recordIds, `Code change plan ${plan.id}: evidence.recordIds`); - knownReferences(evidence.diagnosticIds as string[], known.diagnosticIds, `Code change plan ${plan.id}: evidence.diagnosticIds`); - knownReferences(evidence.conclusionIds as string[], known.conclusionIds, `Code change plan ${plan.id}: evidence.conclusionIds`); - knownReferences(evidence.proposalIds as string[], known.proposalIds, `Code change plan ${plan.id}: evidence.proposalIds`); - confidence(plan.confidence, `Code change plan ${plan.id}: confidence`); - assertGroundedGenerationMetadata(plan.generation, `Code change plan ${plan.id}: generation`); - - const semantic = plan as unknown as CodeChangePlan; - const expectedHash = createCodeChangePlanHash(semantic); - if (plan.planHash !== expectedHash) { - throw new Error(`Code change plan planHash does not match semantic content: expected ${expectedHash}`); - } - const expectedId = createCodeChangePlanId(semantic); - if (plan.id !== expectedId) { - throw new Error(`Code change plan id does not match semantic content: expected ${expectedId}`); - } -} - -function assertRelation(value: unknown, knownRecords?: Set): asserts value is IntentRelation { - const relation = objectValue(value, 'Intent relation'); - exactKeys(relation, ['id', 'from', 'to', 'type', 'confidence', 'basis'], 'Intent relation'); - if (typeof relation.id !== 'string' || !RELATION_ID.test(relation.id)) throw new Error('Intent relation id must match REL-<20 hex>'); - nonEmptyString(relation.from, `Relation ${relation.id}: from`); - nonEmptyString(relation.to, `Relation ${relation.id}: to`); - enumValue(relation.type, RELATION_TYPES, `Relation ${relation.id}: type`); - if (typeof relation.confidence !== 'number' || !Number.isFinite(relation.confidence) - || relation.confidence < 0 || relation.confidence > 1) { - throw new Error(`Relation ${relation.id}: confidence must be between 0 and 1`); - } - stringArray(relation.basis, `Relation ${relation.id}: basis`, true); - if (knownRecords && (!knownRecords.has(relation.from as string) || !knownRecords.has(relation.to as string))) { - throw new Error(`Relation ${relation.id} references unknown records`); - } -} - -function objectValue(value: unknown, name: string): Record { - if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${name} must be an object`); - return value as Record; -} - -function exactKeys(value: Record, expected: string[], name: string): void { - const expectedSet = new Set(expected); - const missing = expected.filter((key) => !(key in value)); - const extra = Object.keys(value).filter((key) => !expectedSet.has(key)); - if (missing.length) throw new Error(`${name} is missing: ${missing.join(', ')}`); - if (extra.length) throw new Error(`${name} has unsupported fields: ${extra.join(', ')}`); -} - -function nonEmptyString(value: unknown, name: string): asserts value is string { - if (typeof value !== 'string' || !value.length) throw new Error(`${name} must be a non-empty string`); -} - -function nonBlankString(value: unknown, name: string): asserts value is string { - if (typeof value !== 'string' || !value.trim().length) throw new Error(`${name} must be a non-blank string`); -} - -function nullableString(value: unknown, name: string): void { - if (value !== null && typeof value !== 'string') throw new Error(`${name} must be a string or null`); -} - -function enumValue(value: unknown, allowed: Set, name: string): asserts value is string { - if (typeof value !== 'string' || !allowed.has(value)) throw new Error(`${name} has unsupported value: ${String(value)}`); -} - -function stringArray(value: unknown, name: string, unique = false): asserts value is string[] { - if (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) throw new Error(`${name} must be an array of strings`); - if (unique && new Set(value).size !== value.length) throw new Error(`${name} must contain unique values`); -} - -function nonEmptyUniqueStringArray(value: unknown, name: string): asserts value is string[] { - stringArray(value, name, true); - if (!value.length || value.some((item) => !item.trim().length)) { - throw new Error(`${name} must contain at least one non-blank string`); - } - if (new Set(value.map((item) => item.trim())).size !== value.length) { - throw new Error(`${name} must remain unique after trimming whitespace`); - } -} - -function repositoryPath(value: unknown, name: string): string { - nonBlankString(value, name); - const normalized = value.trim().replace(/\\/g, '/'); - if (normalized.startsWith('/') || normalized.split('/').some((part) => part === '..')) { - throw new Error(`${name} must be a relative repository path without parent traversal`); - } - return normalized; -} - -function exactStringSet(actual: string[], expected: string[], name: string): void { - const normalizedActual = [...actual].sort(); - if (normalizedActual.length !== expected.length - || normalizedActual.some((value, index) => value !== expected[index])) { - throw new Error(`${name} does not match the grounded diagnostic set`); - } -} - -function uniqueIdArray(value: unknown, pattern: RegExp, name: string): asserts value is string[] { - stringArray(value, name, true); - if (value.some((item) => !pattern.test(item))) throw new Error(`${name} contains an invalid id`); -} - -function nonEmptyUniqueIdArray(value: unknown, pattern: RegExp, name: string): asserts value is string[] { - uniqueIdArray(value, pattern, name); - if (!value.length) throw new Error(`${name} must contain at least one id`); -} - -function knownReferences(values: string[], known: Set, name: string): void { - const unknown = values.filter((value) => !known.has(value)); - if (unknown.length) throw new Error(`${name} references unknown ids: ${unknown.join(', ')}`); -} - -function confidence(value: unknown, name: string): asserts value is number { - if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 1) { - throw new Error(`${name} must be between 0 and 1`); - } -} - -function assertAcyclicProposalDependencies(proposals: TodoProposal[]): void { - const byId = new Map(proposals.map((proposal) => [proposal.id, proposal])); - const visiting = new Set(); - const visited = new Set(); - const visit = (id: string, chain: string[]): void => { - if (visiting.has(id)) { - const start = chain.indexOf(id); - throw new Error(`TODO proposal dependency cycle: ${[...chain.slice(Math.max(0, start)), id].join(' -> ')}`); - } - if (visited.has(id)) return; - visiting.add(id); - for (const dependency of byId.get(id)?.dependencies ?? []) visit(dependency, [...chain, id]); - visiting.delete(id); - visited.add(id); - }; - for (const proposal of proposals) visit(proposal.id, []); -} - -function dateString(value: unknown, name: string): asserts value is string { - if (typeof value !== 'string' || !ISO_DATE_TIME.test(value) || !Number.isFinite(Date.parse(value))) { - throw new Error(`${name} must be an ISO date-time string`); - } -} - -function nullableDate(value: unknown, name: string): void { - if (value !== null) dateString(value, name); -} - -function fingerprint(value: unknown, name: string): void { - if (typeof value !== 'string' || !FINGERPRINT.test(value)) throw new Error(`${name} must be SHA-256`); -} - -function nonNegativeInteger(value: unknown, name: string): void { - if (!Number.isInteger(value) || (value as number) < 0) throw new Error(`${name} must be an integer >= 0`); -} - -function countMap(value: unknown, name: string): void { - const map = objectValue(value, name); - for (const [key, count] of Object.entries(map)) { - if (!key) throw new Error(`${name} keys must be non-empty`); - nonNegativeInteger(count, `${name}.${key}`); - } -} - -function countRecords(records: IntentRecord[], selector: (record: IntentRecord) => string): Record { - const counts: Record = {}; - for (const record of records) { - const key = selector(record); - counts[key] = (counts[key] ?? 0) + 1; - } - return counts; -} - -function exactCounts(value: unknown, expected: Record, name: string): void { - const actual = objectValue(value, name); - const keys = [...new Set([...Object.keys(actual), ...Object.keys(expected)])].sort(); - for (const key of keys) { - if (actual[key] !== expected[key]) { - throw new Error(`${name} is inconsistent for ${key}: expected ${expected[key] ?? 0}, received ${String(actual[key] ?? 0)}`); - } - } -} - -function isJsonValue(value: unknown): value is JsonValue { - if (value === null || typeof value === 'string' || typeof value === 'boolean') return true; - if (typeof value === 'number') return Number.isFinite(value); - if (Array.isArray(value)) return value.every(isJsonValue); - if (value && typeof value === 'object') return Object.values(value as Record).every(isJsonValue); - return false; -} +export * from './schema/index.js'; diff --git a/src/core/schema/code-change.ts b/src/core/schema/code-change.ts new file mode 100644 index 0000000..b6247c0 --- /dev/null +++ b/src/core/schema/code-change.ts @@ -0,0 +1,322 @@ +import { createCodeChangePlanId, createCodeChangePlanHash } from '../id.js'; +import type { + CodeChangeAcceptance, + CodeChangePlan, +} from '../types.js'; +import { + CodeChangePlanValidationContext, + CodeChangeAcceptanceValidationContext, + GroundedValidationContext, +} from './intent.js'; +import { + CONCLUSION_ID, + CODE_CHANGE_ACTIONS, + CODE_CHANGE_PLAN_ID, + CODE_CHANGE_RISK_LEVELS, + DIAGNOSTIC_ID, + RECORD_ID, + TODO_PRIORITIES, + TODO_PROPOSAL_ID, +} from './constants.js'; +import { + assertGroundedGenerationMetadata, + confidence, + dateString, + exactKeys, + enumValue, + fingerprint, + knownReferences, + nonBlankString, + nonEmptyUniqueIdArray, + nonEmptyUniqueStringArray, + objectValue, + repositoryPath, + stringArray, + uniqueIdArray, +} from './utils.js'; +import { + assertConclusions, + assertTodoProposals, + validateGroundedContext, + assertTodoProposalReferenceValue, +} from './conclusions.js'; +import type { GroundedGenerationMetadata } from '../types.js'; + +export function assertCodeChangePlan( + value: unknown, + context: CodeChangePlanValidationContext, +): asserts value is CodeChangePlan { + const known = validateCodeChangePlanContext(context); + assertCodeChangePlanValue(value, known); + assertPlanGraphFingerprint(value, context.graph.fingerprint); +} + +export function assertCodeChangePlans( + values: unknown, + context: CodeChangePlanValidationContext, +): asserts values is CodeChangePlan[] { + if (!Array.isArray(values)) throw new Error('Code change plans must be an array'); + const known = validateCodeChangePlanContext(context); + const ids = new Set(); + for (const value of values) { + assertCodeChangePlanValue(value, known); + assertPlanGraphFingerprint(value, context.graph.fingerprint); + const id = (value as CodeChangePlan).id; + if (ids.has(id)) throw new Error(`Duplicate code change plan id: ${id}`); + ids.add(id); + } +} + +/** + * Validate persisted plans for review when their source graph and diagnostics are + * not loaded. Evidence references remain syntax-checked and content-bound by each + * plan hash; the supplied graph fingerprint must match. + */ +export function assertCodeChangePlansForReview( + values: unknown, + graphFingerprintValue: string, +): asserts values is CodeChangePlan[] { + if (!Array.isArray(values)) throw new Error('Code change plans must be an array'); + fingerprint(graphFingerprintValue, 'Code change review graphFingerprint'); + const ids = new Set(); + for (const value of values) { + const plan = objectValue(value, 'Code change plan'); + const evidence = objectValue(plan.evidence, 'Code change plan evidence'); + uniqueIdArray(evidence.recordIds, RECORD_ID, 'Code change plan evidence.recordIds'); + uniqueIdArray(evidence.diagnosticIds, DIAGNOSTIC_ID, 'Code change plan evidence.diagnosticIds'); + uniqueIdArray(evidence.conclusionIds, CONCLUSION_ID, 'Code change plan evidence.conclusionIds'); + uniqueIdArray(evidence.proposalIds, TODO_PROPOSAL_ID, 'Code change plan evidence.proposalIds'); + assertCodeChangePlanValue(value, { + recordIds: new Set(evidence.recordIds as string[]), + diagnosticIds: new Set(evidence.diagnosticIds as string[]), + conclusionIds: new Set(evidence.conclusionIds as string[]), + proposalIds: new Set(evidence.proposalIds as string[]), + }); + assertPlanGraphFingerprint(value, graphFingerprintValue); + const id = (value as CodeChangePlan).id; + if (ids.has(id)) throw new Error(`Duplicate code change plan id: ${id}`); + ids.add(id); + } +} + +/** + * Validate a persisted plan before acceptance when its full conclusion and TODO + * proposal objects are no longer present. Their IDs remain syntax-checked and + * content-bound by the plan hash; records and diagnostics stay grounded in the + * supplied before graph. + */ +export function assertCodeChangePlanForAcceptance( + value: unknown, + context: GroundedValidationContext, +): asserts value is CodeChangePlan { + const known = validateGroundedContext(context); + const plan = objectValue(value, 'Code change plan'); + const evidence = objectValue(plan.evidence, 'Code change plan evidence'); + uniqueIdArray(evidence.conclusionIds, CONCLUSION_ID, 'Code change plan evidence.conclusionIds'); + uniqueIdArray(evidence.proposalIds, TODO_PROPOSAL_ID, 'Code change plan evidence.proposalIds'); + assertCodeChangePlanValue(value, { + ...known, + conclusionIds: new Set(evidence.conclusionIds as string[]), + proposalIds: new Set(evidence.proposalIds as string[]), + }); + assertPlanGraphFingerprint(value, context.graph.fingerprint); +} + +export function assertCodeChangeAcceptance( + value: unknown, + context: CodeChangeAcceptanceValidationContext, +): asserts value is CodeChangeAcceptance { + assertCodeChangePlanForAcceptance(context.plan, context.before); + const beforeKnown = validateGroundedContext(context.before); + const afterKnown = validateGroundedContext(context.after); + const acceptance = objectValue(value, 'Code change acceptance'); + exactKeys(acceptance, [ + 'schemaVersion', 'planId', 'planHash', 'beforeGraphFingerprint', 'afterGraphFingerprint', + 'beforeDiagnosticIds', 'afterDiagnosticIds', 'clearedDiagnosticIds', 'remainingDiagnosticIds', + 'newBlockingDiagnosticIds', 'accepted', 'reasons', 'evaluatedAt', 'generation', + ], 'Code change acceptance'); + if (acceptance.schemaVersion !== 't2c.code-change-acceptance/v1') { + throw new Error('Unsupported code change acceptance schemaVersion'); + } + if (acceptance.planId !== context.plan.id) throw new Error('Code change acceptance planId does not match its plan'); + if (acceptance.planHash !== context.plan.planHash) throw new Error('Code change acceptance planHash does not match its plan'); + if (acceptance.beforeGraphFingerprint !== context.before.graph.fingerprint) { + throw new Error('Code change acceptance beforeGraphFingerprint does not match its graph'); + } + if (acceptance.afterGraphFingerprint !== context.after.graph.fingerprint) { + throw new Error('Code change acceptance afterGraphFingerprint does not match its graph'); + } + for (const key of [ + 'beforeDiagnosticIds', 'afterDiagnosticIds', 'clearedDiagnosticIds', 'remainingDiagnosticIds', + 'newBlockingDiagnosticIds', + ] as const) { + uniqueIdArray(acceptance[key], DIAGNOSTIC_ID, `Code change acceptance ${key}`); + } + const beforeIds = [...beforeKnown.diagnosticIds].sort(); + const afterIds = [...afterKnown.diagnosticIds].sort(); + const targeted = [...context.plan.evidence.diagnosticIds].sort(); + const expectedCleared = targeted.filter((id) => !afterKnown.diagnosticIds.has(id)); + const expectedRemaining = targeted.filter((id) => afterKnown.diagnosticIds.has(id)); + const expectedBlocking = context.after.diagnostics.diagnostics + .filter((item) => item.severity === 'blocking' && !beforeKnown.diagnosticIds.has(item.id)) + .map((item) => item.id) + .sort(); + assertStringSetMatch(acceptance.beforeDiagnosticIds as string[], beforeIds, 'Code change acceptance beforeDiagnosticIds'); + assertStringSetMatch(acceptance.afterDiagnosticIds as string[], afterIds, 'Code change acceptance afterDiagnosticIds'); + assertStringSetMatch(acceptance.clearedDiagnosticIds as string[], expectedCleared, 'Code change acceptance clearedDiagnosticIds'); + assertStringSetMatch(acceptance.remainingDiagnosticIds as string[], expectedRemaining, 'Code change acceptance remainingDiagnosticIds'); + assertStringSetMatch(acceptance.newBlockingDiagnosticIds as string[], expectedBlocking, 'Code change acceptance newBlockingDiagnosticIds'); + const expectedAccepted = expectedRemaining.length === 0 && expectedBlocking.length === 0; + if (acceptance.accepted !== expectedAccepted) throw new Error('Code change acceptance accepted flag is inconsistent'); + nonEmptyUniqueStringArray(acceptance.reasons, 'Code change acceptance reasons'); + dateString(acceptance.evaluatedAt, 'Code change acceptance evaluatedAt'); + assertGroundedGenerationMetadata(acceptance.generation, 'Code change acceptance generation'); + if ((acceptance.generation as GroundedGenerationMetadata).generatedAt !== acceptance.evaluatedAt) { + throw new Error('Code change acceptance generation.generatedAt must match evaluatedAt'); + } +} + +function assertPlanGraphFingerprint(plan: CodeChangePlan, graphFingerprintValue: string): void { + if (plan.evidence.graphFingerprint !== graphFingerprintValue) { + throw new Error('Code change plan evidence.graphFingerprint does not match its graph'); + } +} + +function assertCodeChangePlanValue( + value: unknown, + known: { + recordIds: Set; + diagnosticIds: Set; + conclusionIds: Set; + proposalIds: Set; + }, +): asserts value is CodeChangePlan { + const plan = objectValue(value, 'Code change plan'); + exactKeys(plan, [ + 'schemaVersion', 'id', 'planHash', 'status', 'createdAt', 'title', 'description', 'priority', + 'target', 'acceptanceCriteria', 'changes', 'risk', 'rollback', 'evidence', 'confidence', 'generation', + ], 'Code change plan'); + if (plan.schemaVersion !== 't2c.code-change-plan/v1') { + throw new Error('Unsupported code change plan schemaVersion'); + } + if (typeof plan.id !== 'string' || !CODE_CHANGE_PLAN_ID.test(plan.id)) { + throw new Error('Code change plan id must match CPLAN-<20 hex>'); + } + fingerprint(plan.planHash, `Code change plan ${plan.id}: planHash`); + if (plan.status !== 'proposed') throw new Error(`Code change plan ${plan.id}: status must be proposed`); + dateString(plan.createdAt, `Code change plan ${plan.id}: createdAt`); + nonBlankString(plan.title, `Code change plan ${plan.id}: title`); + nonBlankString(plan.description, `Code change plan ${plan.id}: description`); + enumValue(plan.priority, TODO_PRIORITIES, `Code change plan ${plan.id}: priority`); + const target = objectValue(plan.target, `Code change plan ${plan.id}: target`); + exactKeys(target, ['paths', 'symbols', 'tickets', 'versions'], `Code change plan ${plan.id}: target`); + for (const key of ['paths', 'symbols', 'tickets', 'versions'] as const) { + stringArray(target[key], `Code change plan ${plan.id}: target.${key}`, true); + if ((target[key] as string[]).some((item) => !item.trim())) { + throw new Error(`Code change plan ${plan.id}: target.${key} cannot contain blank values`); + } + } + const targetPaths = new Set((target.paths as string[]).map((item, index) => ( + repositoryPath(item, `Code change plan ${plan.id}: target.paths[${index}]`) + ))); + nonEmptyUniqueStringArray(plan.acceptanceCriteria, `Code change plan ${plan.id}: acceptanceCriteria`); + if (!Array.isArray(plan.changes) || plan.changes.length === 0) { + throw new Error(`Code change plan ${plan.id}: changes must be a non-empty array`); + } + const changePaths = new Set(); + for (const [index, rawChange] of plan.changes.entries()) { + const change = objectValue(rawChange, `Code change plan ${plan.id}: changes[${index}]`); + exactKeys(change, ['path', 'action', 'symbols', 'rationale'], `Code change plan ${plan.id}: changes[${index}]`); + nonBlankString(change.path, `Code change plan ${plan.id}: changes[${index}].path`); + const normalizedPath = repositoryPath(change.path, `Code change plan ${plan.id}: changes[${index}].path`); + if (!targetPaths.has(normalizedPath)) { + throw new Error(`Code change plan ${plan.id}: changes[${index}].path is not present in target.paths`); + } + enumValue(change.action, CODE_CHANGE_ACTIONS, `Code change plan ${plan.id}: changes[${index}].action`); + stringArray(change.symbols, `Code change plan ${plan.id}: changes[${index}].symbols`, true); + if ((change.symbols as string[]).some((item) => !item.trim())) { + throw new Error(`Code change plan ${plan.id}: changes[${index}].symbols cannot contain blank values`); + } + nonBlankString(change.rationale, `Code change plan ${plan.id}: changes[${index}].rationale`); + if (changePaths.has(normalizedPath)) { + throw new Error(`Code change plan ${plan.id}: duplicate change for ${normalizedPath}`); + } + changePaths.add(normalizedPath); + } + const risk = objectValue(plan.risk, `Code change plan ${plan.id}: risk`); + exactKeys(risk, ['level', 'reasons'], `Code change plan ${plan.id}: risk`); + enumValue(risk.level, CODE_CHANGE_RISK_LEVELS, `Code change plan ${plan.id}: risk.level`); + nonEmptyUniqueStringArray(risk.reasons, `Code change plan ${plan.id}: risk.reasons`); + nonBlankString(plan.rollback, `Code change plan ${plan.id}: rollback`); + const evidence = objectValue(plan.evidence, `Code change plan ${plan.id}: evidence`); + exactKeys(evidence, [ + 'graphFingerprint', 'recordIds', 'diagnosticIds', 'conclusionIds', 'proposalIds', + ], `Code change plan ${plan.id}: evidence`); + fingerprint(evidence.graphFingerprint, `Code change plan ${plan.id}: evidence.graphFingerprint`); + nonEmptyUniqueIdArray(evidence.recordIds, RECORD_ID, `Code change plan ${plan.id}: evidence.recordIds`); + nonEmptyUniqueIdArray(evidence.diagnosticIds, DIAGNOSTIC_ID, `Code change plan ${plan.id}: evidence.diagnosticIds`); + uniqueIdArray(evidence.conclusionIds, CONCLUSION_ID, `Code change plan ${plan.id}: evidence.conclusionIds`); + uniqueIdArray(evidence.proposalIds, TODO_PROPOSAL_ID, `Code change plan ${plan.id}: evidence.proposalIds`); + knownReferences(evidence.recordIds as string[], known.recordIds, `Code change plan ${plan.id}: evidence.recordIds`); + knownReferences(evidence.diagnosticIds as string[], known.diagnosticIds, `Code change plan ${plan.id}: evidence.diagnosticIds`); + knownReferences(evidence.conclusionIds as string[], known.conclusionIds, `Code change plan ${plan.id}: evidence.conclusionIds`); + knownReferences(evidence.proposalIds as string[], known.proposalIds, `Code change plan ${plan.id}: evidence.proposalIds`); + confidence(plan.confidence, `Code change plan ${plan.id}: confidence`); + assertGroundedGenerationMetadata(plan.generation, `Code change plan ${plan.id}: generation`); + + const semantic = plan as unknown as CodeChangePlan; + const expectedHash = createCodeChangePlanHash(semantic); + if (plan.planHash !== expectedHash) { + throw new Error(`Code change plan planHash does not match semantic content: expected ${expectedHash}`); + } + const expectedId = createCodeChangePlanId(semantic); + if (plan.id !== expectedId) { + throw new Error(`Code change plan id does not match semantic content: expected ${expectedId}`); + } +} + +function validateCodeChangePlanContext(context: CodeChangePlanValidationContext): { + recordIds: Set; + diagnosticIds: Set; + conclusionIds: Set; + proposalIds: Set; +} { + const known = validateGroundedContext(context); + const conclusions = context.conclusions ?? []; + const proposals = context.proposals ?? []; + if (conclusions.length) assertConclusions(conclusions, context); + if (proposals.length && conclusions.length) { + assertTodoProposals(proposals, { graph: context.graph, diagnostics: context.diagnostics, conclusions }); + } else if (proposals.length) { + const referencedConclusionIds = new Set(); + for (const [index, value] of proposals.entries()) { + const proposal = objectValue(value, `TODO proposal reference[${index}]`); + uniqueIdArray(proposal.conclusionIds, CONCLUSION_ID, `TODO proposal reference[${index}].conclusionIds`); + for (const id of proposal.conclusionIds as string[]) referencedConclusionIds.add(id); + } + const proposalIds = new Set(); + for (const proposal of proposals) { + assertTodoProposalReferenceValue( + proposal, + known.recordIds, + known.diagnosticIds, + referencedConclusionIds, + ); + if (proposalIds.has(proposal.id)) throw new Error(`Duplicate TODO proposal id: ${proposal.id}`); + proposalIds.add(proposal.id); + } + } + return { + ...known, + conclusionIds: new Set(conclusions.map((item) => item.id)), + proposalIds: new Set(proposals.map((item) => item.id)), + }; +} + +function assertStringSetMatch(actual: string[], expected: string[], name: string): void { + const normalizedActual = [...actual].sort(); + if (normalizedActual.length !== expected.length + || normalizedActual.some((value, index) => value !== expected[index])) { + throw new Error(`${name} does not match the grounded diagnostic set`); + } +} diff --git a/src/core/schema/conclusions.ts b/src/core/schema/conclusions.ts new file mode 100644 index 0000000..6763aac --- /dev/null +++ b/src/core/schema/conclusions.ts @@ -0,0 +1,210 @@ +import { createConclusionId, createTodoProposalId } from '../id.js'; +import type { + Conclusion, + TodoProposal, +} from '../types.js'; +import { + DIAGNOSTIC_ID, + CONCLUSION_ID, + TODO_PROPOSAL_ID, + TODO_PRIORITIES, + CONCLUSION_KINDS, + DIAGNOSTIC_SEVERITIES, +} from './constants.js'; +import { + assertAcyclicProposalDependencies, + assertGroundedGenerationMetadata, + confidence, + enumValue, + exactKeys, + nonBlankString, + nonEmptyUniqueIdArray, + nonEmptyUniqueStringArray, + objectValue, + uniqueIdArray, + knownReferences, + stringArray, +} from './utils.js'; +import { + assertIntentGraph, + assertIntentRecord, + TodoProposalValidationContext, + GroundedValidationContext, +} from './intent.js'; + +export function assertConclusion( + value: unknown, + context: GroundedValidationContext, +): asserts value is Conclusion { + const known = validateGroundedContext(context); + assertConclusionValue(value, known.recordIds, known.diagnosticIds); +} + +export function assertConclusions( + values: unknown, + context: GroundedValidationContext, +): asserts values is Conclusion[] { + if (!Array.isArray(values)) throw new Error('Conclusions must be an array'); + const known = validateGroundedContext(context); + const ids = new Set(); + for (const value of values) { + assertConclusionValue(value, known.recordIds, known.diagnosticIds); + const id = (value as Conclusion).id; + if (ids.has(id)) throw new Error(`Duplicate conclusion id: ${id}`); + ids.add(id); + } +} + +export function assertTodoProposal( + value: unknown, + context: TodoProposalValidationContext, +): asserts value is TodoProposal { + const known = validateTodoProposalContext(context); + assertTodoProposalValue(value, known.recordIds, known.diagnosticIds, known.conclusionIds); +} + +export function assertTodoProposals( + values: unknown, + context: TodoProposalValidationContext, +): asserts values is TodoProposal[] { + if (!Array.isArray(values)) throw new Error('TODO proposals must be an array'); + const known = validateTodoProposalContext(context); + const proposalIds = new Set(); + for (const value of values) { + assertTodoProposalValue(value, known.recordIds, known.diagnosticIds, known.conclusionIds); + const id = (value as TodoProposal).id; + if (proposalIds.has(id)) throw new Error(`Duplicate TODO proposal id: ${id}`); + proposalIds.add(id); + } + for (const proposal of values as TodoProposal[]) { + for (const dependency of proposal.dependencies) { + if (!proposalIds.has(dependency)) { + throw new Error(`TODO proposal ${proposal.id} references unknown dependency ${dependency}`); + } + } + } + assertAcyclicProposalDependencies(values as TodoProposal[]); +} + +function assertConclusionValue( + value: unknown, + recordIds: Set, + diagnosticIds: Set, +): asserts value is Conclusion { + const conclusion = objectValue(value, 'Conclusion'); + exactKeys(conclusion, [ + 'schemaVersion', 'id', 'kind', 'title', 'detail', 'severity', 'diagnosticIds', 'recordIds', 'confidence', 'generation', + ], 'Conclusion'); + if (conclusion.schemaVersion !== 't2c.conclusion/v1') throw new Error('Unsupported conclusion schemaVersion'); + if (typeof conclusion.id !== 'string' || !CONCLUSION_ID.test(conclusion.id)) { + throw new Error('Conclusion id must match CONC-<20 hex>'); + } + enumValue(conclusion.kind, CONCLUSION_KINDS, `Conclusion ${conclusion.id}: kind`); + nonBlankString(conclusion.title, `Conclusion ${conclusion.id}: title`); + nonBlankString(conclusion.detail, `Conclusion ${conclusion.id}: detail`); + enumValue(conclusion.severity, DIAGNOSTIC_SEVERITIES, `Conclusion ${conclusion.id}: severity`); + nonEmptyUniqueIdArray(conclusion.diagnosticIds, DIAGNOSTIC_ID, `Conclusion ${conclusion.id}: diagnosticIds`); + nonEmptyUniqueIdArray(conclusion.recordIds, createRecordIdRegex(), `Conclusion ${conclusion.id}: recordIds`); + knownReferences(conclusion.diagnosticIds, diagnosticIds, `Conclusion ${conclusion.id}: diagnosticIds`); + knownReferences(conclusion.recordIds, recordIds, `Conclusion ${conclusion.id}: recordIds`); + confidence(conclusion.confidence, `Conclusion ${conclusion.id}: confidence`); + assertGroundedGenerationMetadata(conclusion.generation, `Conclusion ${conclusion.id}: generation`); + const expectedId = createConclusionId(conclusion as unknown as Conclusion); + if (conclusion.id !== expectedId) throw new Error(`Conclusion id does not match semantic content: expected ${expectedId}`); +} + +export function assertTodoProposalValue( + value: unknown, + recordIds: Set, + diagnosticIds: Set, + conclusionIds: Set, +): asserts value is TodoProposal { + const proposal = objectValue(value, 'TODO proposal'); + exactKeys(proposal, [ + 'schemaVersion', 'id', 'title', 'description', 'priority', 'status', 'target', 'acceptanceCriteria', + 'dependencies', 'conclusionIds', 'diagnosticIds', 'recordIds', 'confidence', 'generation', + ], 'TODO proposal'); + if (proposal.schemaVersion !== 't2c.todo-proposal/v1') throw new Error('Unsupported TODO proposal schemaVersion'); + if (typeof proposal.id !== 'string' || !TODO_PROPOSAL_ID.test(proposal.id)) { + throw new Error('TODO proposal id must match TPROP-<20 hex>'); + } + nonBlankString(proposal.title, `TODO proposal ${proposal.id}: title`); + nonBlankString(proposal.description, `TODO proposal ${proposal.id}: description`); + enumValue(proposal.priority, TODO_PRIORITIES, `TODO proposal ${proposal.id}: priority`); + if (proposal.status !== 'proposed') throw new Error(`TODO proposal ${proposal.id}: status must be proposed`); + const target = objectValue(proposal.target, `TODO proposal ${proposal.id}: target`); + exactKeys(target, ['paths', 'symbols', 'tickets', 'versions'], `TODO proposal ${proposal.id}: target`); + for (const key of ['paths', 'symbols', 'tickets', 'versions'] as const) { + stringArray(target[key], `TODO proposal ${proposal.id}: target.${key}`, true); + if ((target[key] as string[]).some((item) => !item.trim())) { + throw new Error(`TODO proposal ${proposal.id}: target.${key} cannot contain blank values`); + } + } + nonEmptyUniqueStringArray(proposal.acceptanceCriteria, `TODO proposal ${proposal.id}: acceptanceCriteria`); + uniqueIdArray(proposal.dependencies, TODO_PROPOSAL_ID, `TODO proposal ${proposal.id}: dependencies`); + if ((proposal.dependencies as string[]).includes(proposal.id as string)) { + throw new Error(`TODO proposal ${proposal.id} cannot depend on itself`); + } + nonEmptyUniqueIdArray(proposal.conclusionIds, CONCLUSION_ID, `TODO proposal ${proposal.id}: conclusionIds`); + nonEmptyUniqueIdArray(proposal.diagnosticIds, DIAGNOSTIC_ID, `TODO proposal ${proposal.id}: diagnosticIds`); + nonEmptyUniqueIdArray(proposal.recordIds, createRecordIdRegex(), `TODO proposal ${proposal.id}: recordIds`); + knownReferences(proposal.conclusionIds, conclusionIds, `TODO proposal ${proposal.id}: conclusionIds`); + knownReferences(proposal.diagnosticIds, diagnosticIds, `TODO proposal ${proposal.id}: diagnosticIds`); + knownReferences(proposal.recordIds, recordIds, `TODO proposal ${proposal.id}: recordIds`); + confidence(proposal.confidence, `TODO proposal ${proposal.id}: confidence`); + assertGroundedGenerationMetadata(proposal.generation, `TODO proposal ${proposal.id}: generation`); + const expectedId = createTodoProposalId(proposal as unknown as TodoProposal); + if (proposal.id !== expectedId) throw new Error(`TODO proposal id does not match semantic content: expected ${expectedId}`); +} + +export function assertTodoProposalReferenceValue( + value: unknown, + recordIds: Set, + diagnosticIds: Set, + conclusionIds: Set, +): void { + assertTodoProposalValue(value, recordIds, diagnosticIds, conclusionIds); +} + +function createRecordIdRegex(): RegExp { + return /^INT-[A-Z]+-[a-f0-9]{20}$/; +} + +export function validateGroundedContext(context: GroundedValidationContext): { + recordIds: Set; + diagnosticIds: Set; +} { + assertIntentGraph(context.graph); + const report = objectValue(context.diagnostics, 'Diagnostic report'); + if (report.schemaVersion !== 't2c.diagnostics/v1') throw new Error('Unsupported diagnostic schemaVersion'); + if (report.graphFingerprint !== context.graph.fingerprint) { + throw new Error('Diagnostic report does not describe the supplied graph'); + } + if (!Array.isArray(report.diagnostics)) throw new Error('Diagnostic report diagnostics must be an array'); + const diagnosticIds = new Set(); + for (const value of report.diagnostics) { + const diagnostic = objectValue(value, 'Diagnostic'); + if (typeof diagnostic.id !== 'string' || !DIAGNOSTIC_ID.test(diagnostic.id)) { + throw new Error('Diagnostic id must match DIAG-<20 hex>'); + } + if (diagnosticIds.has(diagnostic.id)) throw new Error(`Duplicate diagnostic id: ${diagnostic.id}`); + diagnosticIds.add(diagnostic.id); + } + return { + recordIds: new Set(context.graph.records.map((record) => record.id)), + diagnosticIds, + }; +} + +export function validateTodoProposalContext(context: TodoProposalValidationContext): { + recordIds: Set; + diagnosticIds: Set; + conclusionIds: Set; +} { + const known = validateGroundedContext(context); + assertConclusions(context.conclusions, context); + return { + ...known, + conclusionIds: new Set(context.conclusions.map((conclusion) => conclusion.id)), + }; +} diff --git a/src/core/schema/constants.ts b/src/core/schema/constants.ts new file mode 100644 index 0000000..2f52361 --- /dev/null +++ b/src/core/schema/constants.ts @@ -0,0 +1,31 @@ +export const ACTIONS = new Set([ + 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', + 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', +]); +export const MODALITIES = new Set(['required', 'recommended', 'optional', 'observed', 'claimed', 'unknown']); +export const POLARITIES = new Set(['positive', 'negative']); +export const LIFECYCLES = new Set([ + 'proposed', 'planned', 'in_progress', 'implemented', 'verified', 'released', 'completed', 'blocked', 'unknown', +]); +export const SOURCE_KINDS = new Set(['nl', 'git', 'ast', 'todo', 'changelog', 'document', 'agent_log', 'test', 'system']); +export const EPISTEMIC_CLASSES = new Set(['declaration', 'plan', 'claim', 'fact', 'inference', 'llm_inference']); +export const RELATION_TYPES = new Set([ + 'declares', 'plans', 'implements', 'modifies', 'tests', 'documents', 'releases', 'depends_on', + 'blocks', 'supersedes', 'contradicts', 'duplicates', 'evidenced_by', 'claimed_by', 'same_as', 'related_to', +]); +export const CONCLUSION_KINDS = new Set(['finding', 'risk', 'decision', 'recommendation']); +export const DIAGNOSTIC_SEVERITIES = new Set(['info', 'warning', 'review_required', 'blocking']); +export const TODO_PRIORITIES = new Set(['P0', 'P1', 'P2', 'P3']); +export const GENERATION_REQUESTED_MODES = new Set(['deterministic', 'prefer-llm', 'require-llm']); +export const GENERATION_EFFECTIVE_MODES = new Set(['deterministic', 'llm']); +export const RECORD_ID = /^INT-[A-Z]+-[a-f0-9]{20}$/; +export const RELATION_ID = /^REL-[a-f0-9]{20}$/; +export const DIAGNOSTIC_ID = /^DIAG-[a-f0-9]{20}$/; +export const CONCLUSION_ID = /^CONC-[a-f0-9]{20}$/; +export const TODO_PROPOSAL_ID = /^TPROP-[a-f0-9]{20}$/; +export const CODE_CHANGE_PLAN_ID = /^CPLAN-[a-f0-9]{20}$/; +export const CODE_CHANGE_ACTIONS = new Set(['create', 'modify', 'delete']); +export const CODE_CHANGE_RISK_LEVELS = new Set(['low', 'medium', 'high']); +export const FINGERPRINT = /^[a-f0-9]{64}$/; +export const RUNTIME_VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; +export const ISO_DATE_TIME = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/; diff --git a/src/core/schema/index.ts b/src/core/schema/index.ts new file mode 100644 index 0000000..a9d7a6e --- /dev/null +++ b/src/core/schema/index.ts @@ -0,0 +1,4 @@ +export * from './intent.js'; +export * from './conclusions.js'; +export * from './code-change.js'; +export { assertGroundedGenerationMetadata } from './utils.js'; diff --git a/src/core/schema/intent.ts b/src/core/schema/intent.ts new file mode 100644 index 0000000..e4fe2b3 --- /dev/null +++ b/src/core/schema/intent.ts @@ -0,0 +1,309 @@ +import { graphFingerprint } from '../id.js'; +import type { + CodeChangeAcceptance, + CodeChangePlan, + Conclusion, + DiagnosticReport, + IntentGraph, + IntentGraphDiff, + IntentRecord, + IntentRelation, + TodoProposal, +} from '../types.js'; +import { + ACTIONS, + EPISTEMIC_CLASSES, + FINGERPRINT, + GENERATION_EFFECTIVE_MODES, + ISO_DATE_TIME, + LIFECYCLES, + MODALITIES, + SOURCE_KINDS, + RECORD_ID, + RELATION_ID, + RELATION_TYPES, + RUNTIME_VERSION, + POLARITIES, +} from './constants.js'; +import { + assertGroundedGenerationMetadata, + countMap, + countRecords, + dateString, + exactCounts, + exactKeys, + enumValue, + fingerprint, + nonBlankString, + nonEmptyString, + nonNegativeInteger, + nullableDate, + nullableString, + objectValue, + stringArray, + isJsonValue, +} from './utils.js'; + +export interface GroundedValidationContext { + graph: IntentGraph; + diagnostics: DiagnosticReport; +} + +export interface TodoProposalValidationContext extends GroundedValidationContext { + conclusions: Conclusion[]; +} + +export interface CodeChangePlanValidationContext extends GroundedValidationContext { + conclusions?: Conclusion[]; + proposals?: TodoProposal[]; +} + +export interface CodeChangeAcceptanceValidationContext { + plan: CodeChangePlan; + before: GroundedValidationContext; + after: GroundedValidationContext; +} + +export function assertIntentRecord(value: unknown): asserts value is IntentRecord { + const record = objectValue(value, 'Intent record'); + exactKeys(record, ['schemaVersion', 'id', 'statement', 'lifecycle', 'source', 'epistemic', 'observedAt', 'metadata'], 'Intent record'); + if (record.schemaVersion !== 't2c.intent/v1') throw new Error('Unsupported intent schemaVersion'); + if (typeof record.id !== 'string' || !RECORD_ID.test(record.id)) throw new Error('Intent record id must match INT--<20 hex>'); + nonEmptyString(record.id, 'Intent record: id'); + const recordId = record.id; + const statement = assertIntentStatement(recordId, record); + const lifecycle = assertIntentLifecycle(recordId, record); + const source = assertIntentSource(recordId, record); + const epistemic = assertIntentEpistemic(recordId, record); + const metadata = objectValue(record.metadata, `Intent ${record.id}: metadata`); + assertIntentMetadata(recordId, metadata, source.extractor, epistemic.class, record.observedAt); +} + +function assertIntentStatement(recordId: string, record: Record): IntentRecord['statement'] { + const statement = objectValue(record.statement, `Intent ${recordId}: statement`); + exactKeys(statement, ['kind', 'actor', 'action', 'subject', 'object', 'target', 'modality', 'polarity', 'text'], `Intent ${recordId}: statement`); + nonEmptyString(statement.kind, `Intent ${recordId}: statement.kind`); + nullableString(statement.actor, `Intent ${recordId}: statement.actor`); + enumValue(statement.action, ACTIONS, `Intent ${recordId}: statement.action`); + nullableString(statement.subject, `Intent ${recordId}: statement.subject`); + nonEmptyString(statement.object, `Intent ${recordId}: statement.object`); + if (typeof statement.text !== 'string') throw new Error(`Intent ${recordId}: statement.text must be a string`); + enumValue(statement.modality, MODALITIES, `Intent ${recordId}: statement.modality`); + enumValue(statement.polarity, POLARITIES, `Intent ${recordId}: statement.polarity`); + statement.target = assertIntentTarget(recordId, statement.target); + return statement as unknown as IntentRecord['statement']; +} + +function assertIntentTarget(recordId: string, targetValue: unknown): IntentRecord['statement']['target'] { + const target = objectValue(targetValue, `Intent ${recordId}: statement.target`); + exactKeys(target, ['paths', 'symbols', 'tickets', 'versions'], `Intent ${recordId}: statement.target`); + for (const key of ['paths', 'symbols', 'tickets', 'versions'] as const) { + stringArray(target[key], `Intent ${recordId}: statement.target.${key}`, true); + } + return target as unknown as IntentRecord['statement']['target']; +} + +function assertIntentLifecycle(recordId: string, record: Record): IntentRecord['lifecycle'] { + const lifecycle = objectValue(record.lifecycle, `Intent ${recordId}: lifecycle`); + exactKeys(lifecycle, ['status'], `Intent ${recordId}: lifecycle`); + enumValue(lifecycle.status, LIFECYCLES, `Intent ${recordId}: lifecycle.status`); + return lifecycle as unknown as IntentRecord['lifecycle']; +} + +function assertIntentSource(recordId: string, record: Record): IntentRecord['source'] { + const source = objectValue(record.source, `Intent ${recordId}: source`); + exactKeys(source, ['kind', 'path', 'lines', 'revision', 'symbol', 'commitIndex', 'extractor', 'contentHash', 'rawExcerpt'], `Intent ${recordId}: source`); + enumValue(source.kind, SOURCE_KINDS, `Intent ${recordId}: source.kind`); + nullableString(source.path, `Intent ${recordId}: source.path`); + nullableString(source.revision, `Intent ${recordId}: source.revision`); + nullableString(source.symbol, `Intent ${recordId}: source.symbol`); + nullableString(source.rawExcerpt, `Intent ${recordId}: source.rawExcerpt`); + nonEmptyString(source.extractor, `Intent ${recordId}: source.extractor`); + if (typeof source.contentHash !== 'string' || !FINGERPRINT.test(source.contentHash)) { + throw new Error(`Intent ${recordId}: source.contentHash must be SHA-256`); + } + if (source.commitIndex !== null && (!Number.isInteger(source.commitIndex) || (source.commitIndex as number) < 1)) { + throw new Error(`Intent ${recordId}: source.commitIndex must be null or an integer >= 1`); + } + if (source.lines !== null) { + const lines = objectValue(source.lines, `Intent ${recordId}: source.lines`); + exactKeys(lines, ['start', 'end'], `Intent ${recordId}: source.lines`); + if (!Number.isInteger(lines.start) || (lines.start as number) < 1 + || !Number.isInteger(lines.end) || (lines.end as number) < (lines.start as number)) { + throw new Error(`Intent ${recordId}: source.lines must be positive and end >= start`); + } + } + return source as unknown as IntentRecord['source']; +} + +function assertIntentEpistemic(recordId: string, record: Record): IntentRecord['epistemic'] { + const epistemic = objectValue(record.epistemic, `Intent ${recordId}: epistemic`); + exactKeys(epistemic, ['class', 'confidence', 'basis'], `Intent ${recordId}: epistemic`); + enumValue(epistemic.class, EPISTEMIC_CLASSES, `Intent ${recordId}: epistemic.class`); + if (typeof epistemic.confidence !== 'number' || !Number.isFinite(epistemic.confidence) + || epistemic.confidence < 0 || epistemic.confidence > 1) { + throw new Error(`Intent ${recordId}: epistemic.confidence must be between 0 and 1`); + } + stringArray(epistemic.basis, `Intent ${recordId}: epistemic.basis`, true); + return epistemic as unknown as IntentRecord['epistemic']; +} + +function assertIntentMetadata( + recordId: string, + metadata: unknown, + sourceExtractor: string, + epistemicClass: string, + observedAt: unknown, +): void { + if (!isJsonValue(metadata)) throw new Error(`Intent ${recordId}: metadata must contain JSON values only`); + const typedMetadata = metadata as Record; + const generation = objectValue(typedMetadata.generation, `Intent ${recordId}: metadata.generation`); + assertIntentGenerationMetadata(generation, `Intent ${recordId}: metadata.generation`); + assertGenerationMatchesExtractor(generation, sourceExtractor, `Intent ${recordId}: metadata.generation`); + nullableDate(observedAt, `Intent ${recordId}: observedAt`); + if (epistemicClass === 'llm_inference' && (generation as { used?: unknown }).used !== 'llm') { + throw new Error(`Intent ${recordId}: llm_inference requires metadata.generation.used=llm`); + } +} + +function assertGenerationMatchesExtractor(value: unknown, extractor: string, name: string): void { + const generation = value as { generator: string; generatorVersion: string }; + const separator = extractor.lastIndexOf('@'); + const expectedGenerator = separator > 0 ? extractor.slice(0, separator) : extractor; + if (generation.generator !== expectedGenerator) { + throw new Error(`${name}.generator must match source.extractor (${expectedGenerator})`); + } + if (separator > 0 && generation.generatorVersion !== extractor.slice(separator + 1)) { + throw new Error(`${name}.generatorVersion must match source.extractor (${extractor.slice(separator + 1)})`); + } +} + +function assertIntentGenerationMetadata(value: unknown, name: string): void { + const generation = objectValue(value, name); + exactKeys(generation, [ + 'generator', 'generatorVersion', 'runtimeVersion', 'requested', 'used', 'degraded', + 'fallbackReason', 'provider', 'model', 'responseId', + ], name); + nonBlankString(generation.generator, `${name}.generator`); + nonBlankString(generation.generatorVersion, `${name}.generatorVersion`); + if (typeof generation.runtimeVersion !== 'string' || !RUNTIME_VERSION.test(generation.runtimeVersion)) { + throw new Error(`${name}.runtimeVersion must be a semantic version`); + } + enumValue(generation.requested, GENERATION_EFFECTIVE_MODES, `${name}.requested`); + enumValue(generation.used, GENERATION_EFFECTIVE_MODES, `${name}.used`); + if (typeof generation.degraded !== 'boolean') throw new Error(`${name}.degraded must be a boolean`); + nullableString(generation.fallbackReason, `${name}.fallbackReason`); + nullableString(generation.provider, `${name}.provider`); + nullableString(generation.model, `${name}.model`); + nullableString(generation.responseId, `${name}.responseId`); + if (generation.used === 'llm') { + nonBlankString(generation.provider, `${name}.provider`); + nonBlankString(generation.model, `${name}.model`); + } else if (generation.provider !== null || generation.model !== null || generation.responseId !== null) { + throw new Error(`${name}: deterministic generation cannot claim an LLM provider, model or responseId`); + } + if (generation.degraded) { + if (generation.requested !== 'llm' || generation.used !== 'deterministic') { + throw new Error(`${name}: degraded generation must be an LLM request using deterministic fallback`); + } + nonBlankString(generation.fallbackReason, `${name}.fallbackReason`); + } else if (generation.fallbackReason !== null) { + throw new Error(`${name}.fallbackReason must be null when generation is not degraded`); + } +} + +export function assertIntentRecords(values: unknown): asserts values is IntentRecord[] { + if (!Array.isArray(values)) throw new Error('Intent records must be an array'); + values.forEach(assertIntentRecord); +} + +export function assertIntentGraph(value: unknown): asserts value is IntentGraph { + const graph = objectValue(value, 'Intent graph'); + exactKeys(graph, ['schemaVersion', 'generatedAt', 'fingerprint', 'records', 'relations', 'stats'], 'Intent graph'); + if (graph.schemaVersion !== 't2c.graph/v1') throw new Error('Unsupported graph schemaVersion'); + dateString(graph.generatedAt, 'Graph generatedAt'); + fingerprint(graph.fingerprint, 'Graph fingerprint'); + assertIntentRecords(graph.records); + if (!Array.isArray(graph.relations)) throw new Error('Graph relations must be an array'); + const recordIds = new Set((graph.records as IntentRecord[]).map((record) => record.id)); + if (recordIds.size !== (graph.records as IntentRecord[]).length) throw new Error('Graph record IDs must be unique'); + const relationIds = new Set(); + for (const relation of graph.relations) { + assertRelation(relation, recordIds); + if (relationIds.has((relation as IntentRelation).id)) throw new Error(`Duplicate relation id: ${(relation as IntentRelation).id}`); + relationIds.add((relation as IntentRelation).id); + } + const stats = objectValue(graph.stats, 'Graph stats'); + exactKeys(stats, ['bySource', 'byAction', 'byStatus'], 'Graph stats'); + countMap(stats.bySource, 'Graph stats.bySource'); + countMap(stats.byAction, 'Graph stats.byAction'); + countMap(stats.byStatus, 'Graph stats.byStatus'); + const records = graph.records as IntentRecord[]; + exactCounts(stats.bySource, countRecords(records, (record) => record.source.kind), 'Graph stats.bySource'); + exactCounts(stats.byAction, countRecords(records, (record) => record.statement.action), 'Graph stats.byAction'); + exactCounts(stats.byStatus, countRecords(records, (record) => record.lifecycle.status), 'Graph stats.byStatus'); + const expectedFingerprint = graphFingerprint(records, graph.relations as IntentRelation[]); + if (graph.fingerprint !== expectedFingerprint) throw new Error('Graph fingerprint does not match records and relations'); +} + +export function assertIntentGraphDiff(value: unknown): asserts value is IntentGraphDiff { + const diff = objectValue(value, 'Intent graph diff'); + exactKeys(diff, ['schemaVersion', 'generatedAt', 'fingerprint', 'beforeFingerprint', 'afterFingerprint', 'records', 'relations', 'summary'], 'Intent graph diff'); + if (diff.schemaVersion !== 't2c.diff/v1') throw new Error('Unsupported graph diff schemaVersion'); + dateString(diff.generatedAt, 'Graph diff generatedAt'); + fingerprint(diff.fingerprint, 'Graph diff fingerprint'); + fingerprint(diff.beforeFingerprint, 'Graph diff beforeFingerprint'); + fingerprint(diff.afterFingerprint, 'Graph diff afterFingerprint'); + + const records = objectValue(diff.records, 'Graph diff records'); + exactKeys(records, ['added', 'removed', 'changed', 'unchanged'], 'Graph diff records'); + assertIntentRecords(records.added); + assertIntentRecords(records.removed); + if (!Array.isArray(records.changed)) throw new Error('Graph diff changed records must be an array'); + for (const rawChange of records.changed) { + const change = objectValue(rawChange, 'Graph diff record change'); + exactKeys(change, ['identity', 'before', 'after', 'changedFields'], 'Graph diff record change'); + nonEmptyString(change.identity, 'Graph diff record change identity'); + assertIntentRecord(change.before); + assertIntentRecord(change.after); + stringArray(change.changedFields, 'Graph diff changedFields', true); + } + nonNegativeInteger(records.unchanged, 'Graph diff records.unchanged'); + + const relations = objectValue(diff.relations, 'Graph diff relations'); + exactKeys(relations, ['added', 'removed', 'unchanged'], 'Graph diff relations'); + if (!Array.isArray(relations.added) || !Array.isArray(relations.removed)) throw new Error('Graph diff relation sets must be arrays'); + [...relations.added, ...relations.removed].forEach((relation) => assertRelation(relation)); + nonNegativeInteger(relations.unchanged, 'Graph diff relations.unchanged'); + + const summary = objectValue(diff.summary, 'Graph diff summary'); + exactKeys(summary, ['recordsAdded', 'recordsRemoved', 'recordsChanged', 'recordsUnchanged', 'relationsAdded', 'relationsRemoved', 'relationsUnchanged'], 'Graph diff summary'); + for (const [key, count] of Object.entries(summary)) nonNegativeInteger(count, `Graph diff summary.${key}`); + const expectedCounts: Record = { + recordsAdded: (records.added as unknown[]).length, + recordsRemoved: (records.removed as unknown[]).length, + recordsChanged: (records.changed as unknown[]).length, + recordsUnchanged: records.unchanged as number, + relationsAdded: (relations.added as unknown[]).length, + relationsRemoved: (relations.removed as unknown[]).length, + relationsUnchanged: relations.unchanged as number, + }; + exactCounts(summary, expectedCounts, 'Graph diff summary'); +} + +export function assertRelation(value: unknown, knownRecords?: Set): asserts value is IntentRelation { + const relation = objectValue(value, 'Intent relation'); + exactKeys(relation, ['id', 'from', 'to', 'type', 'confidence', 'basis'], 'Intent relation'); + if (typeof relation.id !== 'string' || !RELATION_ID.test(relation.id)) throw new Error('Intent relation id must match REL-<20 hex>'); + nonEmptyString(relation.from, `Relation ${relation.id}: from`); + nonEmptyString(relation.to, `Relation ${relation.id}: to`); + enumValue(relation.type, RELATION_TYPES, `Relation ${relation.id}: type`); + if (typeof relation.confidence !== 'number' || !Number.isFinite(relation.confidence) + || relation.confidence < 0 || relation.confidence > 1) { + throw new Error(`Relation ${relation.id}: confidence must be between 0 and 1`); + } + stringArray(relation.basis, `Relation ${relation.id}: basis`, true); + if (knownRecords && (!knownRecords.has(relation.from as string) || !knownRecords.has(relation.to as string))) { + throw new Error(`Relation ${relation.id} references unknown records`); + } +} diff --git a/src/core/schema/utils.ts b/src/core/schema/utils.ts new file mode 100644 index 0000000..555e9ff --- /dev/null +++ b/src/core/schema/utils.ts @@ -0,0 +1,239 @@ +import type { JsonValue, IntentRecord, GroundedGenerationMetadata } from '../types.js'; +import { + GENERATION_EFFECTIVE_MODES, + GENERATION_REQUESTED_MODES, + FINGERPRINT, + ISO_DATE_TIME, + RUNTIME_VERSION, +} from './constants.js'; + +export function objectValue(value: unknown, name: string): Record { + if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${name} must be an object`); + return value as Record; +} + +export function exactKeys(value: Record, expected: string[], name: string): void { + const expectedSet = new Set(expected); + const missing = expected.filter((key) => !(key in value)); + const extra = Object.keys(value).filter((key) => !expectedSet.has(key)); + if (missing.length) throw new Error(`${name} is missing: ${missing.join(', ')}`); + if (extra.length) throw new Error(`${name} has unsupported fields: ${extra.join(', ')}`); +} + +export function nonEmptyString(value: unknown, name: string): asserts value is string { + if (typeof value !== 'string' || !value.length) throw new Error(`${name} must be a non-empty string`); +} + +export function nonBlankString(value: unknown, name: string): asserts value is string { + if (typeof value !== 'string' || !value.trim().length) throw new Error(`${name} must be a non-blank string`); +} + +export function nullableString(value: unknown, name: string): void { + if (value !== null && typeof value !== 'string') throw new Error(`${name} must be a string or null`); +} + +export function enumValue(value: unknown, allowed: Set, name: string): asserts value is string { + if (typeof value !== 'string' || !allowed.has(value)) throw new Error(`${name} has unsupported value: ${String(value)}`); +} + +export function stringArray(value: unknown, name: string, unique = false): asserts value is string[] { + if (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) { + throw new Error(`${name} must be an array of strings`); + } + if (unique && new Set(value).size !== value.length) { + throw new Error(`${name} must contain unique values`); + } +} + +export function nonEmptyUniqueStringArray(value: unknown, name: string): asserts value is string[] { + stringArray(value, name, true); + if (!value.length || value.some((item) => !item.trim().length)) { + throw new Error(`${name} must contain at least one non-blank string`); + } + if (new Set(value.map((item) => item.trim())).size !== value.length) { + throw new Error(`${name} must remain unique after trimming whitespace`); + } +} + +export function repositoryPath(value: unknown, name: string): string { + nonBlankString(value, name); + const normalized = value.trim().replace(/\\/g, '/'); + if (normalized.startsWith('/') || normalized.split('/').some((part) => part === '..')) { + throw new Error(`${name} must be a relative repository path without parent traversal`); + } + return normalized; +} + +export function exactStringSet(actual: string[], expected: string[], name: string): void { + const normalizedActual = [...actual].sort(); + if (normalizedActual.length !== expected.length + || normalizedActual.some((value, index) => value !== expected[index])) { + throw new Error(`${name} does not match the grounded diagnostic set`); + } +} + +export function uniqueIdArray(value: unknown, pattern: RegExp, name: string): asserts value is string[] { + stringArray(value, name, true); + if (value.some((item) => !pattern.test(item))) throw new Error(`${name} contains an invalid id`); +} + +export function nonEmptyUniqueIdArray(value: unknown, pattern: RegExp, name: string): asserts value is string[] { + uniqueIdArray(value, pattern, name); + if (!value.length) throw new Error(`${name} must contain at least one id`); +} + +export function knownReferences(values: string[], known: Set, name: string): void { + const unknown = values.filter((value) => !known.has(value)); + if (unknown.length) throw new Error(`${name} references unknown ids: ${unknown.join(', ')}`); +} + +export function confidence(value: unknown, name: string): asserts value is number { + if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 1) { + throw new Error(`${name} must be between 0 and 1`); + } +} + +export function assertAcyclicProposalDependencies(proposals: { id: string; dependencies: string[] }[]): void { + const byId = new Map(proposals.map((proposal) => [proposal.id, proposal])); + const visiting = new Set(); + const visited = new Set(); + const visit = (id: string, chain: string[]): void => { + if (visiting.has(id)) { + const start = chain.indexOf(id); + throw new Error(`TODO proposal dependency cycle: ${[...chain.slice(Math.max(0, start)), id].join(' -> ')}`); + } + if (visited.has(id)) return; + visiting.add(id); + for (const dependency of byId.get(id)?.dependencies ?? []) visit(dependency, [...chain, id]); + visiting.delete(id); + visited.add(id); + }; + for (const proposal of proposals) visit(proposal.id, []); +} + +export function dateString(value: unknown, name: string): asserts value is string { + if (typeof value !== 'string' || !ISO_DATE_TIME.test(value) || !Number.isFinite(Date.parse(value))) { + throw new Error(`${name} must be an ISO date-time string`); + } +} + +export function nullableDate(value: unknown, name: string): void { + if (value !== null) dateString(value, name); +} + +export function fingerprint(value: unknown, name: string): void { + if (typeof value !== 'string' || !FINGERPRINT.test(value)) throw new Error(`${name} must be SHA-256`); +} + +export function nonNegativeInteger(value: unknown, name: string): void { + if (!Number.isInteger(value) || (value as number) < 0) throw new Error(`${name} must be an integer >= 0`); +} + +export function countMap(value: unknown, name: string): void { + const map = objectValue(value, name); + for (const [key, count] of Object.entries(map)) { + if (!key) throw new Error(`${name} keys must be non-empty`); + nonNegativeInteger(count, `${name}.${key}`); + } +} + +export function countRecords(records: IntentRecord[], selector: (record: IntentRecord) => string): Record { + const counts: Record = {}; + for (const record of records) { + const key = selector(record); + counts[key] = (counts[key] ?? 0) + 1; + } + return counts; +} + +export function exactCounts(value: unknown, expected: Record, name: string): void { + const actual = objectValue(value, name); + const keys = [...new Set([...Object.keys(actual), ...Object.keys(expected)])].sort(); + for (const key of keys) { + if (actual[key] !== expected[key]) { + throw new Error(`${name} is inconsistent for ${key}: expected ${expected[key] ?? 0}, received ${String(actual[key] ?? 0)}`); + } + } +} + +export function isJsonValue(value: unknown): value is JsonValue { + if (value === null || typeof value === 'string' || typeof value === 'boolean') return true; + if (typeof value === 'number') return Number.isFinite(value); + if (Array.isArray(value)) return value.every(isJsonValue); + if (value && typeof value === 'object') return Object.values(value as Record).every(isJsonValue); + return false; +} + +export function assertGroundedGenerationMetadata( + value: unknown, + name: string, +): asserts value is GroundedGenerationMetadata { + const generation = objectValue(value, name); + exactKeys(generation, [ + 'generator', 'generatorVersion', 'runtimeVersion', 'generatedAt', 'requestedMode', 'effectiveMode', + 'degraded', 'model', 'provider', 'responseId', 'configurationFingerprint', 'reason', + ], name); + nonBlankString(generation.generator, `${name}.generator`); + nonBlankString(generation.generatorVersion, `${name}.generatorVersion`); + if (typeof generation.runtimeVersion !== 'string' || !RUNTIME_VERSION.test(generation.runtimeVersion)) { + throw new Error(`${name}.runtimeVersion must be a semantic version`); + } + dateString(generation.generatedAt, `${name}.generatedAt`); + enumValue(generation.requestedMode, GENERATION_REQUESTED_MODES, `${name}.requestedMode`); + enumValue(generation.effectiveMode, GENERATION_EFFECTIVE_MODES, `${name}.effectiveMode`); + if (typeof generation.degraded !== 'boolean') throw new Error(`${name}.degraded must be a boolean`); + nullableString(generation.model, `${name}.model`); + nullableString(generation.provider, `${name}.provider`); + nullableString(generation.responseId, `${name}.responseId`); + fingerprint(generation.configurationFingerprint, `${name}.configurationFingerprint`); + nullableString(generation.reason, `${name}.reason`); + + assertGroundedLlMMode(generation, name); + assertModeRequirements(generation, name); + assertDegradedRequirements(generation, name); +} + +function assertGroundedLlMMode(generation: Record, name: string): void { + if (generation.effectiveMode !== 'llm') return; + nonBlankString(generation.model, `${name}.model`); + nonBlankString(generation.provider, `${name}.provider`); + if (generation.degraded) throw new Error(`${name}.degraded must be false when effectiveMode is llm`); +} + +function assertModeRequirements(generation: Record, name: string): void { + if (generation.requestedMode === 'deterministic') { + assertDeterministicGeneration(generation, name); + return; + } + if (generation.requestedMode === 'require-llm' && generation.effectiveMode !== 'llm') { + throw new Error(`${name} require-llm mode cannot use deterministic output`); + } + if (generation.requestedMode === 'prefer-llm' + && generation.effectiveMode === 'deterministic' + && !generation.degraded) { + throw new Error(`${name} prefer-llm deterministic output must be marked degraded`); + } +} + +function assertDeterministicGeneration(generation: Record, name: string): void { + if ( + generation.effectiveMode !== 'deterministic' || generation.degraded + || generation.model !== null || generation.provider !== null || generation.responseId !== null + || generation.reason !== null + ) { + throw new Error(`${name} deterministic mode cannot contain LLM or degradation metadata`); + } +} + +function assertDegradedRequirements(generation: Record, name: string): void { + if (!generation.degraded) { + if (generation.reason !== null) { + throw new Error(`${name}.reason must be null when output is not degraded`); + } + return; + } + if (generation.requestedMode !== 'prefer-llm' || generation.effectiveMode !== 'deterministic') { + throw new Error(`${name} degraded output is only valid for prefer-llm deterministic fallback`); + } + nonBlankString(generation.reason, `${name}.reason`); +} diff --git a/src/core/text.ts b/src/core/text.ts index 6c6dd55..fb73b27 100644 --- a/src/core/text.ts +++ b/src/core/text.ts @@ -16,6 +16,27 @@ const ACTION_PATTERNS: Array<[IntentAction, RegExp]> = [ ['preserve', /\b(preserve|keep|maintain|zachowa(?:Δ‡|c)|utrzyma(?:Δ‡|c))\b/i], ]; +const OBJECT_PATTERNS: Record = { + add: /\b(add|create|implement|introduce|build|utworzy(?:Δ‡|c)|doda(?:Δ‡|c)|zaimplementowa(?:Δ‡|c)|stworzy(?:Δ‡|c)|zbudowa(?:Δ‡|c))\b/i, + fix: /\b(fix|repair|correct|napraw(?:iΔ‡|ic)|popraw(?:iΔ‡|ic))\b/i, + remove: /\b(remove|delete|drop|usun(?:Δ…Δ‡|ac)|wycofa(?:Δ‡|c))\b/i, + refactor: /\b(refactor|restructure|przebudowa(?:Δ‡|c)|refaktoryz)\w*/i, + test: /\b(test|spec|coverage|przetestowa(?:Δ‡|c)|testowa(?:Δ‡|c))\b/i, + document: /\b(document|udokumentowa(?:Δ‡|c)|readme|changelog|documentation|dokumentacj)\b/i, + configure: /\b(configure|configur|setup|ustawi(?:Δ‡|c)|konfigur)\w*/i, + analyze: /\b(analy[sz]|inspect|scan|compare|analiz|por[oΓ³]wn|zbada(?:Δ‡|c))\w*/i, + validate: /\b(validat(?:e[sd]?|ing)|verify|check|walid(?:uj\w*|ow\w*)|sprawdzi(?:Δ‡|c)|zweryfikowa(?:Δ‡|c))\b/i, + call: /\b(call|wywoΕ‚)\w*/i, + depend_on: /\b(depends?|zaleΕΌ)\w*/i, + declare: /\b(declare|deklar)\w*/i, + release: /\b(release|wydaj)\w*/i, + change: /\b(change|update|modify|zmieni(?:Δ‡|c)|aktualizowa(?:Δ‡|c)|modyfikowa(?:Δ‡|c))\b/i, + preserve: /\b(preserve|keep|maintain|zachowa(?:Δ‡|c)|utrzyma(?:Δ‡|c))\b/i, + block: /\b(block|deny|prevent|zablokowa(?:Δ‡|c)|zabroni(?:Δ‡|c))\b/i, + approve: /\b(approve|accept|zatwierdzi(?:Δ‡|c)|zaakceptowa(?:Δ‡|c))\b/i, + unknown: /$a/, +}; + /** * Function words, folded exactly as `keywords` folds its input. * @@ -27,7 +48,7 @@ const ACTION_PATTERNS: Array<[IntentAction, RegExp]> = [ * buckets keep only the first twelve tokens per record, so pure grammar was * displacing real vocabulary before matching even began. */ -const STOP_WORDS = new Set([ +const STOP_WORDS = new Set(buildStopWords([ 'the', 'a', 'an', 'and', 'or', 'to', 'of', 'for', 'in', 'on', 'with', 'from', 'by', 'i', 'oraz', 'lub', 'do', 'z', 'ze', 'na', 'w', 'we', 'dla', 'przez', 'sie', 'ma', 'musi', 'musza', 'powinien', 'powinna', 'powinno', 'powinny', 'nalezy', 'trzeba', @@ -35,9 +56,31 @@ const STOP_WORDS = new Set([ 'nie', 'jest', 'sa', 'jako', 'bez', 'ani', 'albo', 'ale', 'tylko', 'wylacznie', 'tego', 'tym', 'tej', 'ten', 'ta', 'to', 'te', 'przy', 'po', 'przed', 'aby', 'gdy', 'kazdy', 'kazda', 'kazde', 'juz', 'tez', 'takze', 'byc', 'byl', 'byla', 'bylo', -].map((value) => normalizeToken(value))); +], normalizeToken)); + +function buildStopWords( + words: readonly string[], + normalizer: (value: string) => string, +): Set { + return new Set(words.map(normalizer)); +} export function classifyActionHeuristically(text: string): IntentAction { + const conventionalAction = extractConventionalAction(text); + if (conventionalAction !== 'unknown') return conventionalAction; + // Inline code is a target, not a verb. Without masking it, an identifier + // such as `validateContract` can override the explicit verb "implement". + const prose = removeInlineCode(text); + // Fold diacritics before dictionary matching. JavaScript's `\b` treats letters such + // as `Δ‡` or `Δ…` as non-word characters, so matching only the raw Polish text + // would miss perfectly valid imperatives such as `dodaΔ‡`. + const searchable = normalizeToken(prose); + const matchedByPattern = findActionInText(prose, searchable); + if (matchedByPattern) return matchedByPattern; + return 'unknown'; +} + +function extractConventionalAction(text: string): IntentAction { const conventional = text.match(/^\s*(feat|fix|refactor|test|docs|chore|build|ci|perf)(?:\([^)]*\))?!?:/i)?.[1]?.toLowerCase(); if (conventional === 'feat') return 'add'; if (conventional === 'fix') return 'fix'; @@ -45,17 +88,21 @@ export function classifyActionHeuristically(text: string): IntentAction { if (conventional === 'test') return 'test'; if (conventional === 'docs') return 'document'; if (conventional === 'build' || conventional === 'ci' || conventional === 'chore') return 'configure'; - // Inline code is a target, not a verb. Without masking it, an identifier - // such as `validateContract` can override the explicit verb "implement". - const prose = text.replace(/`[^`]*`/g, ' '); - // Fold diacritics before dictionary matching. JavaScript's `\b` treats letters such - // as `Δ‡` or `Δ…` as non-word characters, so matching only the raw Polish text - // would miss perfectly valid imperatives such as `dodaΔ‡`. - const searchable = normalizeToken(prose); + return 'unknown'; +} + +function findActionInText( + prose: string, + searchable: string, +): IntentAction | null { for (const [action, pattern] of ACTION_PATTERNS) { if (pattern.test(prose) || pattern.test(searchable)) return action; } - return 'unknown'; + return null; +} + +function removeInlineCode(value: string): string { + return value.replace(/`[^`]*`/g, ' '); } /** @@ -438,35 +485,27 @@ export function extractVersions(text: string): string[] { } export function inferObject(text: string, action: IntentAction): string { - const normalized = text + const normalized = normalizeForObject(text); + const withoutAction = removeObjectAction(normalized, action); + const result = stripObjectConnector(withoutAction); + return result || normalized || 'unspecified'; +} + +function normalizeForObject(text: string): string { + return text .replace(/^\s*[-*+]\s+/, '') .replace(/^\s*\d+[.)]\s+/, '') .replace(/^\s*\[[ xX]\]\s+/, '') .replace(/^\s*(feat|fix|refactor|test|docs|chore|build|ci|perf)(?:\([^)]*\))?!?:\s*/i, '') .trim(); +} - const actionWords: Record = { - add: /\b(add|create|implement|introduce|build|utworzy(?:Δ‡|c)|doda(?:Δ‡|c)|zaimplementowa(?:Δ‡|c)|stworzy(?:Δ‡|c)|zbudowa(?:Δ‡|c))\b/i, - fix: /\b(fix|repair|correct|napraw(?:iΔ‡|ic)|popraw(?:iΔ‡|ic))\b/i, - remove: /\b(remove|delete|drop|usun(?:Δ…Δ‡|ac)|wycofa(?:Δ‡|c))\b/i, - refactor: /\b(refactor|restructure|przebudowa(?:Δ‡|c)|refaktoryz)\w*/i, - test: /\b(test|przetestowa(?:Δ‡|c)|testowa(?:Δ‡|c))\b/i, - document: /\b(document|udokumentowa(?:Δ‡|c))\b/i, - configure: /\b(configur\w*|setup|ustawi(?:Δ‡|c)|konfigurowa(?:Δ‡|c))\b/i, - analyze: /\b(analy[sz]\w*|inspect|scan|analizowa(?:Δ‡|c)|zbada(?:Δ‡|c))\b/i, - validate: /\b(validat\w*|verify|check|walidowa(?:Δ‡|c)|sprawdzi(?:Δ‡|c))\b/i, - call: /\b(call|wywoΕ‚)\w*/i, - depend_on: /\b(depends?|zaleΕΌ)\w*/i, - declare: /\b(declare|deklar)\w*/i, - release: /\b(release|wydaj)\w*/i, - change: /\b(change|update|modify|zmieni(?:Δ‡|c)|aktualizowa(?:Δ‡|c)|modyfikowa(?:Δ‡|c))\b/i, - preserve: /\b(preserve|keep|maintain|zachowa(?:Δ‡|c)|utrzyma(?:Δ‡|c))\b/i, - block: /\b(block|deny|prevent|zablokowa(?:Δ‡|c)|zabroni(?:Δ‡|c))\b/i, - approve: /\b(approve|accept|zatwierdzi(?:Δ‡|c)|zaakceptowa(?:Δ‡|c))\b/i, - unknown: /$a/, - }; - const result = normalized.replace(actionWords[action], '').replace(/^\s*(to|aby|ΕΌeby)\s+/i, '').trim(); - return result || normalized || 'unspecified'; +function removeObjectAction(value: string, action: IntentAction): string { + return value.replace(OBJECT_PATTERNS[action], '').trim(); +} + +function stripObjectConnector(value: string): string { + return value.replace(/^\s*(to|aby|ΕΌeby)\s+/i, '').trim(); } export function splitIntentLines(text: string): Array<{ text: string; line: number }> { diff --git a/src/core/types.ts b/src/core/types.ts index 16aa0c3..314a00e 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -1,676 +1 @@ -export type JsonPrimitive = string | number | boolean | null; -export type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; - -export type SourceKind = - | 'nl' - | 'git' - | 'ast' - | 'todo' - | 'changelog' - | 'document' - | 'agent_log' - | 'test' - | 'system'; - -export type EpistemicClass = - | 'declaration' - | 'plan' - | 'claim' - | 'fact' - | 'inference' - | 'llm_inference'; - -export type LifecycleStatus = - | 'proposed' - | 'planned' - | 'in_progress' - | 'implemented' - | 'verified' - | 'released' - | 'completed' - | 'blocked' - | 'unknown'; - -export type IntentAction = - | 'add' - | 'fix' - | 'remove' - | 'refactor' - | 'test' - | 'document' - | 'configure' - | 'analyze' - | 'validate' - | 'call' - | 'depend_on' - | 'declare' - | 'release' - | 'change' - | 'preserve' - | 'block' - | 'approve' - | 'unknown'; - -export type Modality = 'required' | 'recommended' | 'optional' | 'observed' | 'claimed' | 'unknown'; -export type Polarity = 'positive' | 'negative'; - -export interface SourceLineRange { - start: number; - end: number; -} - -export interface IntentTarget { - paths: string[]; - symbols: string[]; - tickets: string[]; - versions: string[]; -} - -export interface IntentStatement { - kind: string; - actor: string | null; - action: IntentAction; - subject: string | null; - object: string; - target: IntentTarget; - modality: Modality; - polarity: Polarity; - text: string; -} - -export interface IntentSource { - kind: SourceKind; - path: string | null; - lines: SourceLineRange | null; - revision: string | null; - symbol: string | null; - commitIndex: number | null; - extractor: string; - contentHash: string; - rawExcerpt: string | null; -} - -export interface IntentEpistemic { - class: EpistemicClass; - confidence: number; - basis: string[]; -} - -export interface IntentLifecycle { - status: LifecycleStatus; -} - -export type IntentGenerationMode = 'deterministic' | 'llm'; - -/** - * Runtime-owned provenance of the conversion that materialized one DSL record. - * This is required even for deterministic records: `source` identifies the - * evidence, while `generation` identifies the software or model that converted - * that evidence to Intent DSL. - */ -export interface IntentGenerationMetadata extends Record { - generator: string; - generatorVersion: string; - runtimeVersion: string; - requested: IntentGenerationMode; - used: IntentGenerationMode; - degraded: boolean; - fallbackReason: string | null; - provider: string | null; - model: string | null; - responseId: string | null; -} - -export interface IntentRecordMetadata extends Record { - generation: IntentGenerationMetadata; -} - -export interface IntentRecord { - schemaVersion: 't2c.intent/v1'; - id: string; - statement: IntentStatement; - lifecycle: IntentLifecycle; - source: IntentSource; - epistemic: IntentEpistemic; - observedAt: string | null; - metadata: IntentRecordMetadata; -} - -export type RelationType = - | 'declares' - | 'plans' - | 'implements' - | 'modifies' - | 'tests' - | 'documents' - | 'releases' - | 'depends_on' - | 'blocks' - | 'supersedes' - | 'contradicts' - | 'duplicates' - | 'evidenced_by' - | 'claimed_by' - | 'same_as' - | 'related_to'; - -export interface IntentRelation { - id: string; - from: string; - to: string; - type: RelationType; - confidence: number; - basis: string[]; -} - -export interface IntentGraph { - schemaVersion: 't2c.graph/v1'; - generatedAt: string; - fingerprint: string; - records: IntentRecord[]; - relations: IntentRelation[]; - stats: { - bySource: Record; - byAction: Record; - byStatus: Record; - }; -} - -export interface IntentRecordChange { - identity: string; - before: IntentRecord; - after: IntentRecord; - changedFields: string[]; -} - -export interface IntentGraphDiff { - schemaVersion: 't2c.diff/v1'; - generatedAt: string; - fingerprint: string; - beforeFingerprint: string; - afterFingerprint: string; - records: { - added: IntentRecord[]; - removed: IntentRecord[]; - changed: IntentRecordChange[]; - unchanged: number; - }; - relations: { - added: IntentRelation[]; - removed: IntentRelation[]; - unchanged: number; - }; - summary: { - recordsAdded: number; - recordsRemoved: number; - recordsChanged: number; - recordsUnchanged: number; - relationsAdded: number; - relationsRemoved: number; - relationsUnchanged: number; - }; -} - -export type DiagnosticCode = - | 'ALIGNED' - | 'PLANNED_NOT_IMPLEMENTED' - | 'IMPLEMENTED_NOT_PLANNED' - | 'IMPLEMENTED_NOT_DOCUMENTED' - | 'CHANGELOG_WITHOUT_IMPLEMENTATION' - | 'CONFLICTING_INTENT' - | 'AMBIGUOUS_REQUIREMENT' - | 'UNLINKED_RECORD' - | 'LOW_CONFIDENCE' - | 'INSUFFICIENT_EVIDENCE' - | 'LLM_NOT_CONFIGURED' - | 'SOURCE_UNAVAILABLE' - | 'PARTICIPANT_IDENTITY_UNRESOLVED' - | 'HUMAN_COMMUNICATION_CONFLICT' - | 'AGENT_COMMUNICATION_CONFLICT' - | 'HUMAN_AGENT_CONFLICT' - | 'REQUEST_WITHOUT_AGENT_RESPONSE' - | 'AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED' - | 'AGENT_CLAIM_WITHOUT_EVIDENCE' - | 'AGENT_WORK_OUTSIDE_REQUEST'; - -export type DiagnosticSeverity = 'info' | 'warning' | 'review_required' | 'blocking'; - -export interface Diagnostic { - id: string; - code: DiagnosticCode; - severity: DiagnosticSeverity; - title: string; - detail: string; - recordIds: string[]; - suggestedAction: string; -} - -export interface DiagnosticReport { - schemaVersion: 't2c.diagnostics/v1'; - generatedAt: string; - graphFingerprint: string; - diagnostics: Diagnostic[]; - counts: Record; -} - -export type ConclusionKind = 'finding' | 'risk' | 'decision' | 'recommendation'; -export type TodoPriority = 'P0' | 'P1' | 'P2' | 'P3'; - -export interface GroundedGenerationMetadata { - generator: string; - generatorVersion: string; - runtimeVersion: string; - generatedAt: string; - requestedMode: 'deterministic' | 'prefer-llm' | 'require-llm'; - effectiveMode: 'deterministic' | 'llm'; - degraded: boolean; - model: string | null; - provider: string | null; - responseId: string | null; - configurationFingerprint: string; - reason: string | null; -} - -export interface Conclusion { - schemaVersion: 't2c.conclusion/v1'; - id: string; - kind: ConclusionKind; - title: string; - detail: string; - severity: DiagnosticSeverity; - diagnosticIds: string[]; - recordIds: string[]; - confidence: number; - generation: GroundedGenerationMetadata; -} - -export interface TodoProposal { - schemaVersion: 't2c.todo-proposal/v1'; - id: string; - title: string; - description: string; - priority: TodoPriority; - status: 'proposed'; - target: IntentTarget; - acceptanceCriteria: string[]; - dependencies: string[]; - conclusionIds: string[]; - diagnosticIds: string[]; - recordIds: string[]; - confidence: number; - generation: GroundedGenerationMetadata; -} - -/** - * Grounded proposal to change source files so that a plan/diagnostic can be - * closed by later re-analysis. Status is always `proposed`: the runtime never - * applies a code change and never marks work DONE from this contract alone. - */ -export type CodeChangeFileAction = 'create' | 'modify' | 'delete'; - -export interface CodeChangeFile { - path: string; - action: CodeChangeFileAction; - symbols: string[]; - rationale: string; -} - -export type CodeChangeRiskLevel = 'low' | 'medium' | 'high'; - -export interface CodeChangeRisk { - level: CodeChangeRiskLevel; - reasons: string[]; -} - -export interface CodeChangePlan { - schemaVersion: 't2c.code-change-plan/v1'; - id: string; - planHash: string; - status: 'proposed'; - createdAt: string; - title: string; - description: string; - priority: TodoPriority; - target: IntentTarget; - acceptanceCriteria: string[]; - changes: CodeChangeFile[]; - risk: CodeChangeRisk; - rollback: string; - evidence: { - graphFingerprint: string; - recordIds: string[]; - diagnosticIds: string[]; - conclusionIds: string[]; - proposalIds: string[]; - }; - confidence: number; - generation: GroundedGenerationMetadata; -} - -/** - * Result of re-diagnosing a graph after an attempted implementation. - * Acceptance requires every cited diagnostic to clear and no new blocking - * diagnostics to appear. Remaining non-targeted warnings do not fail the gate. - */ -export interface CodeChangeAcceptance { - schemaVersion: 't2c.code-change-acceptance/v1'; - planId: string; - planHash: string; - beforeGraphFingerprint: string; - afterGraphFingerprint: string; - beforeDiagnosticIds: string[]; - afterDiagnosticIds: string[]; - clearedDiagnosticIds: string[]; - remainingDiagnosticIds: string[]; - newBlockingDiagnosticIds: string[]; - accepted: boolean; - reasons: string[]; - evaluatedAt: string; - generation: GroundedGenerationMetadata; -} - -/** Aggregate, non-authoritative result for closing one or more code-change plans. */ -export interface CodeChangeCloseResult { - schemaVersion: 't2c.code-change-close-result/v1'; - evaluatedAt: string; - graphFingerprintBefore: string; - graphFingerprintAfter: string; - planCount: number; - acceptedCount: number; - rejectedCount: number; - allAccepted: boolean; - acceptances: CodeChangeAcceptance[]; - generation: GroundedGenerationMetadata; -} - -/** - * Reviewable, non-executable projection of code-change plans. - * Carries a content hash of the Markdown so reviewers can detect tampering. - * The runtime never applies this artifact to source files. - */ -export interface CodeChangeReviewPatch { - schemaVersion: 't2c.code-change-review/v1'; - createdAt: string; - graphFingerprint: string; - planIds: string[]; - planHashes: string[]; - renderedPatchHash: string; - generation: GroundedGenerationMetadata; -} - -/** - * Structured source-edit proposal bound to one code-change plan. - * Instructions (and optional unified diffs) may only name paths declared by the - * plan. Application requires an explicit approval hash and never runs by default. - */ -export interface CodeChangeSourceEdit { - path: string; - action: CodeChangeFileAction; - symbols: string[]; - instruction: string; - /** - * Optional unified diff body for the single file. Null for instruction-only - * deterministic proposals. When set, the runtime checks path headers and - * rejects parent traversal / absolute host paths. Apply requires a non-null - * diff for every edit. - */ - unifiedDiff: string | null; -} - -export interface CodeChangeSourcePatch { - schemaVersion: 't2c.code-change-source-patch/v1'; - id: string; - patchHash: string; - status: 'proposed'; - createdAt: string; - planId: string; - planHash: string; - graphFingerprint: string; - diagnosticIds: string[]; - recordIds: string[]; - edits: CodeChangeSourceEdit[]; - acceptanceCriteria: string[]; - generation: GroundedGenerationMetadata; -} - -export interface CodeChangeSourcePatchSet { - schemaVersion: 't2c.code-change-source-patch-set/v1'; - generatedAt: string; - graphFingerprint: string; - patches: CodeChangeSourcePatch[]; - generation: GroundedGenerationMetadata; -} - -export interface CodeChangeSourcePatchApproval { - actor: string; - patchHash: string; -} - -export interface CodeChangeSourceApplyReceipt { - schemaVersion: 't2c.code-change-source-apply-receipt/v1'; - patchId: string; - patchHash: string; - planId: string; - approvedBy: string; - approvedAt: string; - appliedAt: string; - appliedPaths: string[]; - fileHashesAfter: Record; - generation: GroundedGenerationMetadata; -} - -export interface TodoPatchDuplicateClassification { - proposalId: string; - existingRecordIds: string[]; - basis: string[]; -} - -export interface TodoPatchArtifact { - schemaVersion: 't2c.todo-patch/v1'; - createdAt: string; - sourceTodo: { - path: string; - contentHash: string; - }; - graphFingerprint: string; - diagnosticsFingerprint: string; - selectedProposalIds: string[]; - duplicateProposalIds: string[]; - duplicates: TodoPatchDuplicateClassification[]; - synthesisAudit: PipelineStageAudit; - renderedPatchHash: string; -} - -export interface TodoPatchApproval { - actor: string; - patchHash: string; -} - -export interface TodoApplyReceipt { - schemaVersion: 't2c.todo-apply-receipt/v1'; - patchHash: string; - sourceTodoHash: string; - resultTodoHash: string; - selectedProposalIds: string[]; - approvedBy: string; - approvedAt: string; - appliedAt: string; -} - -export interface TodoApplyResult { - applied: boolean; - idempotent: boolean; - receipt: TodoApplyReceipt; -} - -export interface ExtractionResult { - records: IntentRecord[]; - warnings: string[]; -} - -export interface ContentCacheStats { - hits: number; - misses: number; - writes: number; - recoveries: number; - errors: number; - bypassed: number; -} - -export interface CachedExtractionResult extends ExtractionResult { - cache: ContentCacheStats; -} - -export type LlmExtractionMode = 'deterministic' | 'prefer-llm' | 'require-llm'; -export type NlExtractionMode = LlmExtractionMode; - -export type PipelineStageStatus = 'succeeded' | 'partial' | 'fallback' | 'failed' | 'skipped'; -export type PipelineFailureStage = - | 'setup' - | 'naturalLanguageExtraction' - | 'gitExtraction' - | 'astExtraction' - | 'markdownExtraction' - | 'documentationExtraction' - | 'configurationExtraction' - | 'runtimeExtraction' - | 'communicationAnalysis' - | 'linking' - | 'diagnostics' - | 'taskSynthesis' - | 'todoRendering' - | 'codeChangePlanning' - | 'summary' - | 'persistence'; - -export interface LlmResponseMetadata extends Record { - responseId: string | null; - model: string | null; - provider: string | null; - usage: { - promptTokens: number | null; - completionTokens: number | null; - totalTokens: number | null; - cost: number | null; - } | null; -} - -export interface PipelineStageAudit { - runtimeVersion: string; - configuration: Record; - status: PipelineStageStatus; - requestedMode: 'deterministic' | 'llm' | 'disabled'; - effectiveMode: 'deterministic' | 'llm' | 'none'; - degraded: boolean; - recordCount: number; - warningCount: number; - model: string | null; - durationMs: number; - reason: { code: string; message: string } | null; - responses: LlmResponseMetadata[]; -} - -export interface PipelineOptions { - root: string; - taskFile: string | null; - todoFile: string | null; - changelogFile: string | null; - documentPatterns: string[]; - includeDocumentationLlm: boolean; - outputDir: string; - gitCommitCount: number; - allowSummaryFallback: boolean; - includeSummaryLlm?: boolean; - nlMode?: NlExtractionMode; - markdownMode?: LlmExtractionMode; - communicationMode?: LlmExtractionMode; - documentExcludes?: string[]; - taskSynthesisMode?: 'disabled' | 'prefer-llm' | 'require-llm'; - includeCommunication?: boolean; - projectDirectory?: string; - communicationTicket?: string | null; - /** autonom cycle document; runtime evidence is skipped when absent. */ - cycleFile?: string | null; -} - -export interface PipelineManifest { - schemaVersion: 't2c.run/v1'; - runId: string; - root: string; - createdAt: string; - graphFingerprint: string | null; - files: Record; - warnings: string[]; - status: 'succeeded' | 'degraded' | 'failed'; - failure: { stage: PipelineFailureStage; code: string; message: string } | null; - runtime: { - name: 'todo2code'; - version: string; - }; - configuration: { - fingerprint: string; - nlMode: NlExtractionMode; - markdownMode: LlmExtractionMode; - communicationMode: LlmExtractionMode; - gitCommitCount: number; - maxFileBytes: number; - markdownConcurrency: number; - documentConcurrency: number; - documentChunkChars: number; - documentMaxChunks: number; - documentRecordsPerChunk: number; - documentTimeoutMs: number; - summaryLlm: boolean; - taskSynthesisMode: 'disabled' | 'prefer-llm' | 'require-llm'; - includeCommunication: boolean; - projectDirectory: string; - communicationTicket: string | null; - documentPatterns: string[]; - documentExcludes: string[]; - adapters: { - python: { enabled: boolean; executable: string }; - go: { enabled: boolean; executable: string }; - java: { enabled: boolean; executable: string }; - rust: { enabled: boolean; executable: string }; - php: { enabled: boolean; executable: string }; - tensorflow: { - enabled: boolean; - modelPath: string | null; - modulePath: string; - labels: string[]; - }; - }; - llm: { - configured: boolean; - baseUrl: string; - nlModel: string; - markdownModel: string; - communicationModel: string; - documentModel: string; - summaryModel: string; - taskModel: string; - timeoutMs: number; - maxTokens: number; - temperature: number; - requireStructuredOutput: boolean; - responseHealing: boolean; - }; - }; - stages: { - naturalLanguageExtraction: PipelineStageAudit; - markdownExtraction: PipelineStageAudit; - documentationExtraction: PipelineStageAudit; - communicationAnalysis: PipelineStageAudit; - taskSynthesis: PipelineStageAudit; - codeChangePlanning: PipelineStageAudit; - summary: PipelineStageAudit; - }; - llm: { - naturalLanguageExtraction: boolean; - markdownExtraction: boolean; - communicationEnrichment: boolean; - documentationExtraction: boolean; - taskSynthesis: boolean; - summary: boolean; - }; -} +export * from './types/index.js'; diff --git a/src/core/types/code-change.ts b/src/core/types/code-change.ts new file mode 100644 index 0000000..262e481 --- /dev/null +++ b/src/core/types/code-change.ts @@ -0,0 +1,250 @@ +import type { IntentTarget } from './intent.js'; +import type { ConclusionKind, DiagnosticSeverity, TodoPriority } from './diagnostics.js'; +import type { PipelineStageAudit } from './pipeline.js'; + +export interface GroundedGenerationMetadata { + generator: string; + generatorVersion: string; + runtimeVersion: string; + generatedAt: string; + requestedMode: 'deterministic' | 'prefer-llm' | 'require-llm'; + effectiveMode: 'deterministic' | 'llm'; + degraded: boolean; + model: string | null; + provider: string | null; + responseId: string | null; + configurationFingerprint: string; + reason: string | null; +} + +export interface Conclusion { + schemaVersion: 't2c.conclusion/v1'; + id: string; + kind: ConclusionKind; + title: string; + detail: string; + severity: DiagnosticSeverity; + diagnosticIds: string[]; + recordIds: string[]; + confidence: number; + generation: GroundedGenerationMetadata; +} + +export interface TodoProposal { + schemaVersion: 't2c.todo-proposal/v1'; + id: string; + title: string; + description: string; + priority: TodoPriority; + status: 'proposed'; + target: IntentTarget; + acceptanceCriteria: string[]; + dependencies: string[]; + conclusionIds: string[]; + diagnosticIds: string[]; + recordIds: string[]; + confidence: number; + generation: GroundedGenerationMetadata; +} + +/** + * Grounded proposal to change source files so that a plan/diagnostic can be + * closed by later re-analysis. Status is always `proposed`: the runtime never + * applies a code change and never marks work DONE from this contract alone. + */ +export type CodeChangeFileAction = 'create' | 'modify' | 'delete'; + +export interface CodeChangeFile { + path: string; + action: CodeChangeFileAction; + symbols: string[]; + rationale: string; +} + +export type CodeChangeRiskLevel = 'low' | 'medium' | 'high'; + +export interface CodeChangeRisk { + level: CodeChangeRiskLevel; + reasons: string[]; +} + +export interface CodeChangePlan { + schemaVersion: 't2c.code-change-plan/v1'; + id: string; + planHash: string; + status: 'proposed'; + createdAt: string; + title: string; + description: string; + priority: TodoPriority; + target: IntentTarget; + acceptanceCriteria: string[]; + changes: CodeChangeFile[]; + risk: CodeChangeRisk; + rollback: string; + evidence: { + graphFingerprint: string; + recordIds: string[]; + diagnosticIds: string[]; + conclusionIds: string[]; + proposalIds: string[]; + }; + confidence: number; + generation: GroundedGenerationMetadata; +} + +/** + * Result of re-diagnosing a graph after an attempted implementation. + * Acceptance requires every cited diagnostic to clear and no new blocking + * diagnostics to appear. Remaining non-targeted warnings do not fail the gate. + */ +export interface CodeChangeAcceptance { + schemaVersion: 't2c.code-change-acceptance/v1'; + planId: string; + planHash: string; + beforeGraphFingerprint: string; + afterGraphFingerprint: string; + beforeDiagnosticIds: string[]; + afterDiagnosticIds: string[]; + clearedDiagnosticIds: string[]; + remainingDiagnosticIds: string[]; + newBlockingDiagnosticIds: string[]; + accepted: boolean; + reasons: string[]; + evaluatedAt: string; + generation: GroundedGenerationMetadata; +} + +/** Aggregate, non-authoritative result for closing one or more code-change plans. */ +export interface CodeChangeCloseResult { + schemaVersion: 't2c.code-change-close-result/v1'; + evaluatedAt: string; + graphFingerprintBefore: string; + graphFingerprintAfter: string; + planCount: number; + acceptedCount: number; + rejectedCount: number; + allAccepted: boolean; + acceptances: CodeChangeAcceptance[]; + generation: GroundedGenerationMetadata; +} + +/** + * Reviewable, non-executable projection of code-change plans. + * Carries a content hash of the Markdown so reviewers can detect tampering. + * The runtime never applies this artifact to source files. + */ +export interface CodeChangeReviewPatch { + schemaVersion: 't2c.code-change-review/v1'; + createdAt: string; + graphFingerprint: string; + planIds: string[]; + planHashes: string[]; + renderedPatchHash: string; + generation: GroundedGenerationMetadata; +} + +/** + * Structured source-edit proposal bound to one code-change plan. + * Instructions (and optional unified diffs) may only name paths declared by the + * plan. Application requires an explicit approval hash and never runs by default. + */ +export interface CodeChangeSourceEdit { + path: string; + action: CodeChangeFileAction; + symbols: string[]; + instruction: string; + /** + * Optional unified diff body for the single file. Null for instruction-only + * deterministic proposals. When set, the runtime checks path headers and + * rejects parent traversal / absolute host paths. Apply requires a non-null + * diff for every edit. + */ + unifiedDiff: string | null; +} + +export interface CodeChangeSourcePatch { + schemaVersion: 't2c.code-change-source-patch/v1'; + id: string; + patchHash: string; + status: 'proposed'; + createdAt: string; + planId: string; + planHash: string; + graphFingerprint: string; + diagnosticIds: string[]; + recordIds: string[]; + edits: CodeChangeSourceEdit[]; + acceptanceCriteria: string[]; + generation: GroundedGenerationMetadata; +} + +export interface CodeChangeSourcePatchSet { + schemaVersion: 't2c.code-change-source-patch-set/v1'; + generatedAt: string; + graphFingerprint: string; + patches: CodeChangeSourcePatch[]; + generation: GroundedGenerationMetadata; +} + +export interface CodeChangeSourcePatchApproval { + actor: string; + patchHash: string; +} + +export interface CodeChangeSourceApplyReceipt { + schemaVersion: 't2c.code-change-source-apply-receipt/v1'; + patchId: string; + patchHash: string; + planId: string; + approvedBy: string; + approvedAt: string; + appliedAt: string; + appliedPaths: string[]; + fileHashesAfter: Record; + generation: GroundedGenerationMetadata; +} + +export interface TodoPatchDuplicateClassification { + proposalId: string; + existingRecordIds: string[]; + basis: string[]; +} + +export interface TodoPatchArtifact { + schemaVersion: 't2c.todo-patch/v1'; + createdAt: string; + sourceTodo: { + path: string; + contentHash: string; + }; + graphFingerprint: string; + diagnosticsFingerprint: string; + selectedProposalIds: string[]; + duplicateProposalIds: string[]; + duplicates: TodoPatchDuplicateClassification[]; + synthesisAudit: PipelineStageAudit; + renderedPatchHash: string; +} + +export interface TodoPatchApproval { + actor: string; + patchHash: string; +} + +export interface TodoApplyReceipt { + schemaVersion: 't2c.todo-apply-receipt/v1'; + patchHash: string; + sourceTodoHash: string; + resultTodoHash: string; + selectedProposalIds: string[]; + approvedBy: string; + approvedAt: string; + appliedAt: string; +} + +export interface TodoApplyResult { + applied: boolean; + idempotent: boolean; + receipt: TodoApplyReceipt; +} diff --git a/src/core/types/diagnostics.ts b/src/core/types/diagnostics.ts new file mode 100644 index 0000000..e6b03c4 --- /dev/null +++ b/src/core/types/diagnostics.ts @@ -0,0 +1,45 @@ +export type DiagnosticCode = + | 'ALIGNED' + | 'PLANNED_NOT_IMPLEMENTED' + | 'IMPLEMENTED_NOT_PLANNED' + | 'IMPLEMENTED_NOT_DOCUMENTED' + | 'CHANGELOG_WITHOUT_IMPLEMENTATION' + | 'CONFLICTING_INTENT' + | 'AMBIGUOUS_REQUIREMENT' + | 'UNLINKED_RECORD' + | 'LOW_CONFIDENCE' + | 'INSUFFICIENT_EVIDENCE' + | 'LLM_NOT_CONFIGURED' + | 'SOURCE_UNAVAILABLE' + | 'PARTICIPANT_IDENTITY_UNRESOLVED' + | 'HUMAN_COMMUNICATION_CONFLICT' + | 'AGENT_COMMUNICATION_CONFLICT' + | 'HUMAN_AGENT_CONFLICT' + | 'REQUEST_WITHOUT_AGENT_RESPONSE' + | 'AGENT_HUMAN_DECISION_CLAIM_UNCONFIRMED' + | 'AGENT_CLAIM_WITHOUT_EVIDENCE' + | 'AGENT_WORK_OUTSIDE_REQUEST'; + +export type DiagnosticSeverity = 'info' | 'warning' | 'review_required' | 'blocking'; + +export interface Diagnostic { + id: string; + code: DiagnosticCode; + severity: DiagnosticSeverity; + title: string; + detail: string; + recordIds: string[]; + suggestedAction: string; +} + +export interface DiagnosticReport { + schemaVersion: 't2c.diagnostics/v1'; + generatedAt: string; + graphFingerprint: string; + diagnostics: Diagnostic[]; + counts: Record; +} + +export type ConclusionKind = 'finding' | 'risk' | 'decision' | 'recommendation'; +export type TodoPriority = 'P0' | 'P1' | 'P2' | 'P3'; + diff --git a/src/core/types/index.ts b/src/core/types/index.ts new file mode 100644 index 0000000..0dc4287 --- /dev/null +++ b/src/core/types/index.ts @@ -0,0 +1,4 @@ +export * from './intent.js'; +export * from './diagnostics.js'; +export * from './code-change.js'; +export * from './pipeline.js'; diff --git a/src/core/types/intent.ts b/src/core/types/intent.ts new file mode 100644 index 0000000..91479f7 --- /dev/null +++ b/src/core/types/intent.ts @@ -0,0 +1,212 @@ +export type JsonPrimitive = string | number | boolean | null; +export type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; + +export type SourceKind = + | 'nl' + | 'git' + | 'ast' + | 'todo' + | 'changelog' + | 'document' + | 'agent_log' + | 'test' + | 'system'; + +export type EpistemicClass = + | 'declaration' + | 'plan' + | 'claim' + | 'fact' + | 'inference' + | 'llm_inference'; + +export type LifecycleStatus = + | 'proposed' + | 'planned' + | 'in_progress' + | 'implemented' + | 'verified' + | 'released' + | 'completed' + | 'blocked' + | 'unknown'; + +export type IntentAction = + | 'add' + | 'fix' + | 'remove' + | 'refactor' + | 'test' + | 'document' + | 'configure' + | 'analyze' + | 'validate' + | 'call' + | 'depend_on' + | 'declare' + | 'release' + | 'change' + | 'preserve' + | 'block' + | 'approve' + | 'unknown'; + +export type Modality = 'required' | 'recommended' | 'optional' | 'observed' | 'claimed' | 'unknown'; +export type Polarity = 'positive' | 'negative'; + +export interface SourceLineRange { + start: number; + end: number; +} + +export interface IntentTarget { + paths: string[]; + symbols: string[]; + tickets: string[]; + versions: string[]; +} + +export interface IntentStatement { + kind: string; + actor: string | null; + action: IntentAction; + subject: string | null; + object: string; + target: IntentTarget; + modality: Modality; + polarity: Polarity; + text: string; +} + +export interface IntentSource { + kind: SourceKind; + path: string | null; + lines: SourceLineRange | null; + revision: string | null; + symbol: string | null; + commitIndex: number | null; + extractor: string; + contentHash: string; + rawExcerpt: string | null; +} + +export interface IntentEpistemic { + class: EpistemicClass; + confidence: number; + basis: string[]; +} + +export interface IntentLifecycle { + status: LifecycleStatus; +} + +export type IntentGenerationMode = 'deterministic' | 'llm'; + +/** + * Runtime-owned provenance of the conversion that materialized one DSL record. + * This is required even for deterministic records: `source` identifies the + * evidence, while `generation` identifies the software or model that converted + * that evidence to Intent DSL. + */ +export interface IntentGenerationMetadata extends Record { + generator: string; + generatorVersion: string; + runtimeVersion: string; + requested: IntentGenerationMode; + used: IntentGenerationMode; + degraded: boolean; + fallbackReason: string | null; + provider: string | null; + model: string | null; + responseId: string | null; +} + +export interface IntentRecordMetadata extends Record { + generation: IntentGenerationMetadata; +} + +export interface IntentRecord { + schemaVersion: 't2c.intent/v1'; + id: string; + statement: IntentStatement; + lifecycle: IntentLifecycle; + source: IntentSource; + epistemic: IntentEpistemic; + observedAt: string | null; + metadata: IntentRecordMetadata; +} + +export type RelationType = + | 'declares' + | 'plans' + | 'implements' + | 'modifies' + | 'tests' + | 'documents' + | 'releases' + | 'depends_on' + | 'blocks' + | 'supersedes' + | 'contradicts' + | 'duplicates' + | 'evidenced_by' + | 'claimed_by' + | 'same_as' + | 'related_to'; + +export interface IntentRelation { + id: string; + from: string; + to: string; + type: RelationType; + confidence: number; + basis: string[]; +} + +export interface IntentGraph { + schemaVersion: 't2c.graph/v1'; + generatedAt: string; + fingerprint: string; + records: IntentRecord[]; + relations: IntentRelation[]; + stats: { + bySource: Record; + byAction: Record; + byStatus: Record; + }; +} + +export interface IntentRecordChange { + identity: string; + before: IntentRecord; + after: IntentRecord; + changedFields: string[]; +} + +export interface IntentGraphDiff { + schemaVersion: 't2c.diff/v1'; + generatedAt: string; + fingerprint: string; + beforeFingerprint: string; + afterFingerprint: string; + records: { + added: IntentRecord[]; + removed: IntentRecord[]; + changed: IntentRecordChange[]; + unchanged: number; + }; + relations: { + added: IntentRelation[]; + removed: IntentRelation[]; + unchanged: number; + }; + summary: { + recordsAdded: number; + recordsRemoved: number; + recordsChanged: number; + recordsUnchanged: number; + relationsAdded: number; + relationsRemoved: number; + relationsUnchanged: number; + }; +} diff --git a/src/core/types/pipeline.ts b/src/core/types/pipeline.ts new file mode 100644 index 0000000..c8e965c --- /dev/null +++ b/src/core/types/pipeline.ts @@ -0,0 +1,173 @@ +import type { IntentRecord, JsonValue } from './intent.js'; + +export interface ExtractionResult { + records: IntentRecord[]; + warnings: string[]; +} + +export interface ContentCacheStats { + hits: number; + misses: number; + writes: number; + recoveries: number; + errors: number; + bypassed: number; +} + +export interface CachedExtractionResult extends ExtractionResult { + cache: ContentCacheStats; +} + +export type LlmExtractionMode = 'deterministic' | 'prefer-llm' | 'require-llm'; +export type NlExtractionMode = LlmExtractionMode; + +export type PipelineStageStatus = 'succeeded' | 'partial' | 'fallback' | 'failed' | 'skipped'; +export type PipelineFailureStage = + | 'setup' + | 'naturalLanguageExtraction' + | 'gitExtraction' + | 'astExtraction' + | 'markdownExtraction' + | 'documentationExtraction' + | 'configurationExtraction' + | 'runtimeExtraction' + | 'communicationAnalysis' + | 'linking' + | 'diagnostics' + | 'taskSynthesis' + | 'todoRendering' + | 'codeChangePlanning' + | 'summary' + | 'persistence'; + +export interface LlmResponseMetadata extends Record { + responseId: string | null; + model: string | null; + provider: string | null; + usage: { + promptTokens: number | null; + completionTokens: number | null; + totalTokens: number | null; + cost: number | null; + } | null; +} + +export interface PipelineStageAudit { + runtimeVersion: string; + configuration: Record; + status: PipelineStageStatus; + requestedMode: 'deterministic' | 'llm' | 'disabled'; + effectiveMode: 'deterministic' | 'llm' | 'none'; + degraded: boolean; + recordCount: number; + warningCount: number; + model: string | null; + durationMs: number; + reason: { code: string; message: string } | null; + responses: LlmResponseMetadata[]; +} + +export interface PipelineOptions { + root: string; + taskFile: string | null; + todoFile: string | null; + changelogFile: string | null; + documentPatterns: string[]; + includeDocumentationLlm: boolean; + outputDir: string; + gitCommitCount: number; + allowSummaryFallback: boolean; + includeSummaryLlm?: boolean; + nlMode?: NlExtractionMode; + markdownMode?: LlmExtractionMode; + communicationMode?: LlmExtractionMode; + documentExcludes?: string[]; + taskSynthesisMode?: 'disabled' | 'prefer-llm' | 'require-llm'; + includeCommunication?: boolean; + projectDirectory?: string; + communicationTicket?: string | null; + /** autonom cycle document; runtime evidence is skipped when absent. */ + cycleFile?: string | null; +} + +export interface PipelineManifest { + schemaVersion: 't2c.run/v1'; + runId: string; + root: string; + createdAt: string; + graphFingerprint: string | null; + files: Record; + warnings: string[]; + status: 'succeeded' | 'degraded' | 'failed'; + failure: { stage: PipelineFailureStage; code: string; message: string } | null; + runtime: { + name: 'todo2code'; + version: string; + }; + configuration: { + fingerprint: string; + nlMode: NlExtractionMode; + markdownMode: LlmExtractionMode; + communicationMode: LlmExtractionMode; + gitCommitCount: number; + maxFileBytes: number; + markdownConcurrency: number; + documentConcurrency: number; + documentChunkChars: number; + documentMaxChunks: number; + documentRecordsPerChunk: number; + documentTimeoutMs: number; + summaryLlm: boolean; + taskSynthesisMode: 'disabled' | 'prefer-llm' | 'require-llm'; + includeCommunication: boolean; + projectDirectory: string; + communicationTicket: string | null; + documentPatterns: string[]; + documentExcludes: string[]; + adapters: { + python: { enabled: boolean; executable: string }; + go: { enabled: boolean; executable: string }; + java: { enabled: boolean; executable: string }; + rust: { enabled: boolean; executable: string }; + php: { enabled: boolean; executable: string }; + tensorflow: { + enabled: boolean; + modelPath: string | null; + modulePath: string; + labels: string[]; + }; + }; + llm: { + configured: boolean; + baseUrl: string; + nlModel: string; + markdownModel: string; + communicationModel: string; + documentModel: string; + summaryModel: string; + taskModel: string; + timeoutMs: number; + maxTokens: number; + temperature: number; + requireStructuredOutput: boolean; + responseHealing: boolean; + }; + }; + stages: { + naturalLanguageExtraction: PipelineStageAudit; + markdownExtraction: PipelineStageAudit; + documentationExtraction: PipelineStageAudit; + communicationAnalysis: PipelineStageAudit; + taskSynthesis: PipelineStageAudit; + codeChangePlanning: PipelineStageAudit; + summary: PipelineStageAudit; + }; + llm: { + naturalLanguageExtraction: boolean; + markdownExtraction: boolean; + communicationEnrichment: boolean; + documentationExtraction: boolean; + taskSynthesis: boolean; + summary: boolean; + }; +} diff --git a/src/diff/git-binary.ts b/src/diff/git-binary.ts new file mode 100644 index 0000000..f30ea2a --- /dev/null +++ b/src/diff/git-binary.ts @@ -0,0 +1,10 @@ +import path from 'node:path'; + +export const BINARY_EXTENSIONS = new Set([ + '.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.pdf', '.zip', '.gz', '.tar', + '.woff', '.woff2', '.ttf', '.eot', '.mp4', '.mp3', '.wasm', '.so', '.dylib', '.dll', +]); + +export function isProbablyBinary(filePath: string): boolean { + return BINARY_EXTENSIONS.has(path.extname(filePath).toLowerCase()); +} diff --git a/src/diff/git.ts b/src/diff/git.ts index 4c9fe44..6602acd 100644 --- a/src/diff/git.ts +++ b/src/diff/git.ts @@ -10,6 +10,7 @@ import { promises as fs } from 'node:fs'; import path from 'node:path'; import { promisify } from 'node:util'; import { diffText, type DiffTextOptions, type FileDiff } from './text.js'; +import { isProbablyBinary } from './git-binary.js'; const execFileAsync = promisify(execFile); @@ -38,74 +39,124 @@ interface ChangedEntry { previousPath: string | null; } -const BINARY_EXTENSIONS = new Set([ - '.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.pdf', '.zip', '.gz', '.tar', - '.woff', '.woff2', '.ttf', '.eot', '.mp4', '.mp3', '.wasm', '.so', '.dylib', '.dll', -]); +interface ResolvedGitDiffOptions { + root: string; + revision: string; + staged: boolean; + maxFiles: number; +} export async function collectGitDiff(options: GitDiffOptions): Promise { - const root = path.resolve(options.root); - const revision = options.revision?.trim() || 'HEAD'; - const staged = options.staged ?? false; - const maxFiles = Math.max(1, Math.min(500, Math.trunc(options.maxFiles ?? 50))); + const normalized = resolveGitDiffOptions(options); const warnings: string[] = []; - try { - const inside = (await runGit(root, ['rev-parse', '--is-inside-work-tree'])).trim(); - if (inside !== 'true') return { revision, staged, diffs: [], warnings: [`${root} is not a Git work tree`] }; - } catch { - return { revision, staged, diffs: [], warnings: [`Git repository not available at ${root}`] }; + const worktree = await getWorktreeStatus(normalized.root); + if (!worktree.available) { + return { ...normalized, diffs: [], warnings: [`Git repository not available at ${normalized.root}`] }; + } + if (!worktree.inside) { + return { ...normalized, diffs: [], warnings: [`${normalized.root} is not a Git work tree`] }; } - const args = ['diff', '--name-status', '-M', '--no-ext-diff']; - if (staged) args.push('--cached'); - args.push(revision); - if (options.paths?.length) args.push('--', ...options.paths); - + const args = buildNameStatusArgs(normalized, options.paths); let entries: ChangedEntry[]; try { - entries = parseNameStatus(await runGit(root, args)); + entries = parseNameStatus(await runGit(normalized.root, args)); } catch (error) { return { - revision, - staged, + ...normalized, diffs: [], warnings: [`git diff failed: ${error instanceof Error ? error.message : String(error)}`], }; } - if (entries.length > maxFiles) { - warnings.push(`Showing ${maxFiles} of ${entries.length} changed files; raise --max-files to widen the view`); - entries = entries.slice(0, maxFiles); - } + const selected = capEntries(entries, normalized.maxFiles, warnings); + const diffs = await collectFileDiffs(selected, normalized, options, warnings); + return { ...normalized, diffs, warnings }; +} + +function resolveGitDiffOptions(options: GitDiffOptions): ResolvedGitDiffOptions { + return { + root: path.resolve(options.root), + revision: options.revision?.trim() || 'HEAD', + staged: options.staged ?? false, + maxFiles: Math.max(1, Math.min(500, Math.trunc(options.maxFiles ?? 50))), + }; +} + +function getWorktreeStatus(root: string): Promise<{ available: boolean; inside: boolean }> { + return runGit(root, ['rev-parse', '--is-inside-work-tree']) + .then((inside) => ({ available: true, inside: inside.trim() === 'true' })) + .catch(() => ({ available: false, inside: false })); +} +function buildNameStatusArgs(options: ResolvedGitDiffOptions, paths?: string[]): string[] { + const args = ['diff', '--name-status', '-M', '--no-ext-diff']; + if (options.staged) args.push('--cached'); + args.push(options.revision); + if (paths?.length) args.push('--', ...paths); + return args; +} + +function capEntries(entries: ChangedEntry[], maxFiles: number, warnings: string[]): ChangedEntry[] { + if (entries.length <= maxFiles) return entries; + warnings.push(`Showing ${maxFiles} of ${entries.length} changed files; raise --max-files to widen the view`); + return entries.slice(0, maxFiles); +} + +async function collectFileDiffs( + entries: ChangedEntry[], + options: ResolvedGitDiffOptions, + requestOptions: GitDiffOptions, + warnings: string[], +): Promise { const diffs: FileDiff[] = []; for (const entry of entries) { - if (isProbablyBinary(entry.path)) { - warnings.push(`Skipped binary file ${entry.path}`); - continue; - } - const beforePath = entry.previousPath ?? entry.path; - const before = entry.status.startsWith('A') - ? '' - : await readBlob(root, revision, beforePath); - const after = entry.status.startsWith('D') - ? '' - : staged - ? await readStagedBlob(root, entry.path, warnings) - : await readWorkingFile(root, entry.path, warnings); - - const diff = diffText(before, after, { - path: entry.path, - beforePath, - afterPath: entry.path, - ...(options.context !== undefined ? { context: options.context } : {}), - ...(options.maxCompareLines !== undefined ? { maxCompareLines: options.maxCompareLines } : {}), - }); - if (diff.hunks.length > 0) diffs.push(diff); + const diff = await buildFileDiff(entry, options, requestOptions, warnings); + if (diff) diffs.push(diff); + } + return diffs; +} + +async function buildFileDiff( + entry: ChangedEntry, + options: ResolvedGitDiffOptions, + requestOptions: GitDiffOptions, + warnings: string[], +): Promise { + if (isProbablyBinary(entry.path)) { + warnings.push(`Skipped binary file ${entry.path}`); + return null; } - return { revision, staged, diffs, warnings }; + const beforePath = entry.previousPath ?? entry.path; + const before = await loadBeforeSnapshot(options.root, options.revision, entry); + const after = await loadAfterSnapshot(options.root, entry, options.staged, warnings); + + const diff = diffText(before, after, { + path: entry.path, + beforePath, + afterPath: entry.path, + ...(requestOptions.context !== undefined ? { context: requestOptions.context } : {}), + ...(requestOptions.maxCompareLines !== undefined ? { maxCompareLines: requestOptions.maxCompareLines } : {}), + }); + return diff.hunks.length > 0 ? diff : null; +} + +async function loadBeforeSnapshot(root: string, revision: string, entry: ChangedEntry): Promise { + if (entry.status.startsWith('A')) return ''; + return readBlob(root, revision, entry.previousPath ?? entry.path); +} + +async function loadAfterSnapshot( + root: string, + entry: ChangedEntry, + staged: boolean, + warnings: string[], +): Promise { + if (entry.status.startsWith('D')) return ''; + if (staged) return readStagedBlob(root, entry.path, warnings); + return readWorkingFile(root, entry.path, warnings); } function parseNameStatus(output: string): ChangedEntry[] { @@ -124,10 +175,6 @@ function parseNameStatus(output: string): ChangedEntry[] { .sort((left, right) => left.path.localeCompare(right.path)); } -function isProbablyBinary(filePath: string): boolean { - return BINARY_EXTENSIONS.has(path.extname(filePath).toLowerCase()); -} - async function readBlob(root: string, revision: string, filePath: string): Promise { try { return await runGit(root, ['show', `${revision}:${filePath}`], 16 * 1024 * 1024); diff --git a/src/diff/reality-build.ts b/src/diff/reality-build.ts new file mode 100644 index 0000000..47733cc --- /dev/null +++ b/src/diff/reality-build.ts @@ -0,0 +1,387 @@ +import { sha256, stableStringify } from '../core/id.js'; +import { assertIntentGraph } from '../core/schema.js'; +import { symbolAliases } from '../core/target.js'; +import type { + DiagnosticCode, + DiagnosticReport, + DiagnosticSeverity, + IntentGraph, + IntentRecord, + SourceKind, +} from '../core/types.js'; + +/** Source kinds that state what *should* exist. */ +export const DECLARED_KINDS: SourceKind[] = ['nl', 'todo', 'document', 'agent_log']; +/** + * Source kinds that evidence what *does* exist. + * + * Configuration counts: a `system` record is an observed fact with lifecycle + * `implemented`, and for infrastructure repositories the implementation largely + * *is* the configuration. Leaving it out made Intent-vs-Reality structurally + * blind there β€” a platform repository with 1 263 configuration records reported + * 2.4% implementation coverage while documenting exactly what those files do. + */ +export const OBSERVED_KINDS: SourceKind[] = ['git', 'ast', 'system']; + +export const LANE_ORDER: SourceKind[] = ['nl', 'todo', 'document', 'agent_log', 'git', 'ast', 'system', 'changelog']; + +export type RealityStatus = + | 'aligned' + | 'planned_not_implemented' + | 'implemented_not_planned' + | 'implemented_not_documented' + | 'changelog_without_implementation' + | 'conflicting' + | 'unlinked'; + +/** + * What kind of observed record proves a topic. + */ +export type RealityEvidence = 'code' | 'configuration' | 'none'; + +export interface RealityRow { + key: string; + label: string; + lanes: Record; + status: RealityStatus; + severity: DiagnosticSeverity; + recordIds: string[]; + diagnosticCodes: DiagnosticCode[]; + /** Evidence grade for a topic that survived semantic implementation gating. */ + evidence: RealityEvidence; +} + +export interface IntentRealityView { + schemaVersion: 't2c.reality/v1'; + generatedAt: string; + graphFingerprint: string; + fingerprint: string; + rows: RealityRow[]; + totals: { + topics: number; + aligned: number; + gaps: number; + byStatus: Record; + declaredRecords: number; + observedRecords: number; + declaredTopics: number; + observedTopics: number; + implementationAlignedTopics: number; + implementationCoverage: number; + plannedCodeCoverage: number; + documentedCodeCoverage: number; + /** + * False when the graph holds no `document` record at all, which makes + * `documentedCodeCoverage` structurally 0 rather than measured. Reporting + * a bare 0.0% in that case reads as "nothing is documented" when the truth + * is "documentation extraction did not run". + */ + documentationMeasured: boolean; + /** + * Aligned topics split by how strong their evidence is. + */ + alignedByEvidence: Record; + }; +} + +export const STATUS_LABEL: Record = { + aligned: 'aligned', + planned_not_implemented: 'planned, no code', + implemented_not_planned: 'code, no plan', + implemented_not_documented: 'code, no docs', + changelog_without_implementation: 'changelog, no code', + conflicting: 'conflicting', + unlinked: 'unlinked', +}; + +const SEVERITY_RANK: Record = { + info: 0, + warning: 1, + review_required: 2, + blocking: 3, +}; + +export function buildRealityView( + graph: IntentGraph, + diagnostics: DiagnosticReport, + generatedAt = new Date().toISOString(), +): IntentRealityView { + assertIntentGraph(graph); + const components = groupIntoTopics(graph); + const diagnosticsByRecord = indexDiagnostics(diagnostics); + const rows = buildRealityRows(components, diagnosticsByRecord); + return { + schemaVersion: 't2c.reality/v1', + generatedAt, + graphFingerprint: graph.fingerprint, + fingerprint: sha256(stableStringify(rows.map((row) => [row.key, row.status, row.recordIds]))), + rows, + totals: buildRealityTotals(graph, rows), + }; +} + +function buildRealityRows( + components: Array<{ key: string; records: IntentRecord[] }>, + diagnosticsByRecord: Map, +): RealityRow[] { + const rows = components.map(({ key, records }) => buildRealityRow(key, records, diagnosticsByRecord)); + rows.sort(compareRealityRows); + return rows; +} + +function buildRealityRow( + key: string, + records: IntentRecord[], + diagnosticsByRecord: Map, +): RealityRow { + const lanes: Record = {}; + for (const kind of LANE_ORDER) lanes[kind] = 0; + for (const record of records) { + lanes[record.source.kind] = (lanes[record.source.kind] ?? 0) + 1; + } + + const codes = new Set(); + let severity: DiagnosticSeverity = 'info'; + for (const record of records) { + for (const diagnostic of diagnosticsByRecord.get(record.id) ?? []) { + codes.add(diagnostic.code); + if (SEVERITY_RANK[diagnostic.severity] > SEVERITY_RANK[severity]) severity = diagnostic.severity; + } + } + + const status = resolveStatus(codes, lanes); + return { + key, + label: topicLabel(key, records), + lanes, + status, + severity: status === 'aligned' ? 'info' : severity, + recordIds: records.map((record) => record.id).sort(), + diagnosticCodes: [...codes].sort(), + evidence: resolveEvidence(lanes), + }; +} + +function compareRealityRows(left: RealityRow, right: RealityRow): number { + const bySeverity = SEVERITY_RANK[right.severity] - SEVERITY_RANK[left.severity]; + if (bySeverity !== 0) return bySeverity; + const alignment = Number(left.status === 'aligned') - Number(right.status === 'aligned'); + if (alignment !== 0) return alignment; + const bySize = right.recordIds.length - left.recordIds.length; + if (bySize !== 0) return bySize; + return left.key.localeCompare(right.key); +} + +function buildRealityTotals(graph: IntentGraph, rows: RealityRow[]): IntentRealityView['totals'] { + const byStatus: Record = {}; + for (const row of rows) byStatus[row.status] = (byStatus[row.status] ?? 0) + 1; + + const declaredRecords = graph.records.filter((record) => DECLARED_KINDS.includes(record.source.kind)).length; + const observedRecords = graph.records.filter((record) => OBSERVED_KINDS.includes(record.source.kind)).length; + const aligned = rows.filter((row) => row.status === 'aligned').length; + const declaredTopics = rows.filter((row) => DECLARED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; + const observedTopics = rows.filter((row) => OBSERVED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; + const implementationAlignedTopics = rows.filter((row) => row.status === 'aligned' + && DECLARED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0) + && OBSERVED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; + const documentedObservedTopics = rows.filter((row) => + (row.lanes.document ?? 0) > 0 + && OBSERVED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; + + return { + topics: rows.length, + aligned, + gaps: rows.length - aligned, + alignedByEvidence: { + code: rows.filter((row) => row.status === 'aligned' && row.evidence === 'code').length, + configuration: rows.filter((row) => row.status === 'aligned' && row.evidence === 'configuration').length, + none: rows.filter((row) => row.status === 'aligned' && row.evidence === 'none').length, + }, + byStatus: Object.fromEntries(Object.entries(byStatus).sort(([a], [b]) => a.localeCompare(b))), + declaredRecords, + observedRecords, + declaredTopics, + observedTopics, + implementationAlignedTopics, + implementationCoverage: ratio(implementationAlignedTopics, declaredTopics), + plannedCodeCoverage: ratio(implementationAlignedTopics, observedTopics), + documentedCodeCoverage: ratio(documentedObservedTopics, observedTopics), + documentationMeasured: graph.records.some((record) => record.source.kind === 'document'), + }; +} + +function ratio(numerator: number, denominator: number): number { + return denominator === 0 ? 1 : Math.round((numerator / denominator) * 10_000) / 10_000; +} + +/** Renders documentation coverage, or says it was not measured at all. */ +export function documentedCoverageLabel(totals: IntentRealityView['totals']): string { + if (!totals.documentationMeasured) return 'not measured (no documentation records in this run)'; + return `${(totals.documentedCodeCoverage * 100).toFixed(1)}%`; +} + +/** + * Groups records by their primary target. + * + * Connected components of the relation graph are deliberately *not* used here. + */ +function groupIntoTopics(graph: IntentGraph): Array<{ key: string; records: IntentRecord[] }> { + const symbolPaths = indexUnambiguousSymbolPaths(graph.records); + const anchors = indexModuleAnchors(graph, symbolPaths); + const groups = new Map(); + for (const record of graph.records) { + const key = primaryTargetKey(record, symbolPaths, anchors); + const bucket = groups.get(key) ?? []; + bucket.push(record); + groups.set(key, bucket); + } + return [...groups.entries()] + .map(([key, records]) => ({ key, records: records.sort((a, b) => a.id.localeCompare(b.id)) })) + .sort((left, right) => left.key.localeCompare(right.key)); +} + +function indexModuleAnchors(graph: IntentGraph, symbolPaths: Map): Map { + const modulePaths = new Map(); + for (const record of graph.records) { + if (record.statement.kind !== 'module_fact' && record.statement.kind !== 'configuration_file_fact') continue; + const paths = [...new Set(record.statement.target.paths)]; + if (paths.length === 1 && paths[0]) modulePaths.set(record.id, paths[0]); + } + + const targetless = new Set(graph.records + .filter((record) => DECLARED_KINDS.includes(record.source.kind) && !resolvesToFile(record, symbolPaths)) + .map((record) => record.id)); + const candidates = new Map>(); + for (const relation of graph.relations) { + for (const [left, right] of [[relation.from, relation.to], [relation.to, relation.from]] as const) { + const path = modulePaths.get(right); + if (!path || !targetless.has(left)) continue; + const values = candidates.get(left) ?? new Set(); + values.add(path); + candidates.set(left, values); + } + } + return new Map([...candidates.entries()] + .filter(([, paths]) => paths.size === 1) + .map(([recordId, paths]) => [recordId, [...paths][0] as string])); +} + +/** + * True when the record already names something a reader can open. + */ +function resolvesToFile(record: IntentRecord, symbolPaths: Map): boolean { + const { tickets, paths, symbols } = record.statement.target; + if (tickets.length > 0 || paths.length > 0) return true; + const resolved = new Set(symbols + .flatMap(symbolAliases) + .map((symbol) => symbolPaths.get(symbol)) + .filter((value): value is string => Boolean(value))); + return resolved.size === 1; +} + +function indexUnambiguousSymbolPaths(records: IntentRecord[]): Map { + const candidates = new Map>(); + for (const record of records) { + const paths = record.statement.target.paths; + if (paths.length !== 1 || !paths[0]) continue; + for (const alias of record.statement.target.symbols.flatMap(symbolAliases)) { + const values = candidates.get(alias) ?? new Set(); + values.add(paths[0]); + candidates.set(alias, values); + } + } + return new Map([...candidates.entries()] + .filter(([, paths]) => paths.size === 1) + .map(([alias, paths]) => [alias, [...paths][0] as string])); +} + +function primaryTargetKey( + record: IntentRecord, + symbolPaths: Map, + anchors: Map = new Map(), +): string { + const tickets = [...record.statement.target.tickets].sort(); + if (tickets.length === 1 && tickets[0]) return `ticket:${tickets[0]}`; + + if (tickets.length > 1 && tickets[0]) return `ticket:${tickets[0]}`; + + const targetPaths = [...new Set(record.statement.target.paths)].sort(); + if (targetPaths.length && targetPaths[0]) return `path:${targetPaths[0]}`; + + const symbols = [...new Set(record.statement.target.symbols.flatMap(symbolAliases))] + .sort((left, right) => left.split('.').length - right.split('.').length || left.localeCompare(right)); + const resolvedPaths = [...new Set(symbols.map((symbol) => symbolPaths.get(symbol)).filter((value): value is string => Boolean(value)))]; + if (resolvedPaths.length === 1 && resolvedPaths[0]) return `path:${resolvedPaths[0]}`; + + const anchor = anchors.get(record.id); + if (anchor) return `path:${anchor}`; + + if (symbols.length && symbols[0]) return `symbol:${symbols[0]}`; + + if (record.source.path) return `source:${record.source.path}`; + + return `record:${record.id}`; +} + +function indexDiagnostics(report: DiagnosticReport): Map { + const index = new Map(); + for (const diagnostic of report.diagnostics) { + for (const recordId of diagnostic.recordIds) { + const bucket = index.get(recordId) ?? []; + bucket.push(diagnostic); + index.set(recordId, bucket); + } + } + return index; +} + +function resolveEvidence(lanes: Record): RealityEvidence { + if ((lanes.ast ?? 0) > 0 || (lanes.git ?? 0) > 0) return 'code'; + if ((lanes.system ?? 0) > 0) return 'configuration'; + return 'none'; +} + +function resolveStatus(codes: Set, lanes: Record): RealityStatus { + const { declared, observed, changelog } = summarizeLaneTotals(lanes); + + if (codes.has('CONFLICTING_INTENT')) return 'conflicting'; + + if (codes.has('PLANNED_NOT_IMPLEMENTED')) return 'planned_not_implemented'; + + if (declared === 0 && observed === 0) { + return changelog > 0 ? 'changelog_without_implementation' : 'unlinked'; + } + if (declared > 0 && observed === 0) { + return changelog > 0 && codes.has('CHANGELOG_WITHOUT_IMPLEMENTATION') + ? 'changelog_without_implementation' + : 'planned_not_implemented'; + } + if (observed > 0 && declared === 0) return 'implemented_not_planned'; + + return 'aligned'; +} + +function summarizeLaneTotals(lanes: Record): { + declared: number; + observed: number; + changelog: number; +} { + const declared = DECLARED_KINDS.reduce((total, kind) => total + (lanes[kind] ?? 0), 0); + const observed = OBSERVED_KINDS.reduce((total, kind) => total + (lanes[kind] ?? 0), 0); + const changelog = lanes.changelog ?? 0; + return { declared, observed, changelog }; +} + +function topicLabel(key: string, records: IntentRecord[]): string { + const separator = key.indexOf(':'); + const raw = separator >= 0 ? key.slice(separator + 1) : key; + const value = key.startsWith('source:') ? `${raw} (unattributed)` : raw; + + const declared = records + .filter((record) => DECLARED_KINDS.includes(record.source.kind)) + .sort((left, right) => right.epistemic.confidence - left.epistemic.confidence)[0]; + if (!declared) return value; + + const object = declared.statement.object.trim() || declared.statement.text.trim(); + return object ? `${value} β€” ${object}` : value; +} diff --git a/src/diff/reality.ts b/src/diff/reality.ts index 645be3f..c1c7947 100644 --- a/src/diff/reality.ts +++ b/src/diff/reality.ts @@ -1,133 +1,35 @@ -// Intent-vs-reality view: the "plan ↔ code" diff. +// Intent-vs-reality renderers. // -// Where `graph/diff.ts` compares two runs over time, this module compares the -// declared side of a single run (NL task, TODO, documentation, changelog) -// against the observed side (Git claims, AST facts). Records are grouped into -// topics using the connected components of the existing relation graph, so the -// view reuses the linker's evidence instead of inventing a second heuristic. +// This module delegates model construction to `reality-build.ts` and focuses +// exclusively on rendering (`renderRealitySvg` / `renderRealityMarkdown`). -import { sha256, stableStringify } from '../core/id.js'; -import { assertIntentGraph } from '../core/schema.js'; -import { symbolAliases } from '../core/target.js'; -import type { - DiagnosticCode, - DiagnosticReport, - DiagnosticSeverity, - IntentGraph, - IntentRecord, - SourceKind, -} from '../core/types.js'; -import { - DARK_THEME, - escapeXml, - metricCard, - svgDocument, - truncate, -} from './svg.js'; - -/** Source kinds that state what *should* exist. */ -export const DECLARED_KINDS: SourceKind[] = ['nl', 'todo', 'document', 'agent_log']; -/** - * Source kinds that evidence what *does* exist. - * - * Configuration counts: a `system` record is an observed fact with lifecycle - * `implemented`, and for infrastructure repositories the implementation largely - * *is* the configuration. Leaving it out made Intent-vs-Reality structurally - * blind there β€” a platform repository with 1 263 configuration records reported - * 2.4% implementation coverage while documenting exactly what those files do. - */ -export const OBSERVED_KINDS: SourceKind[] = ['git', 'ast', 'system']; - -export const LANE_ORDER: SourceKind[] = ['nl', 'todo', 'document', 'agent_log', 'git', 'ast', 'system', 'changelog']; - -export type RealityStatus = - | 'aligned' - | 'planned_not_implemented' - | 'implemented_not_planned' - | 'implemented_not_documented' - | 'changelog_without_implementation' - | 'conflicting' - | 'unlinked'; - -/** - * What kind of observed record proves a topic. - * - * `configuration` means the only evidence is a declared key in a committed - * file. That is real β€” a behaviour whose implementation *is* configuration is - * implemented β€” but it is weaker than a function the parser found, and until - * now both produced an identical `aligned` with nothing to tell them apart. - * Measured: 16 of 46 aligned topics on `subactor/platform` rest on - * configuration alone, against 4 of 89 here. - */ -export type RealityEvidence = 'code' | 'configuration' | 'none'; - -export interface RealityRow { - key: string; - label: string; - lanes: Record; - status: RealityStatus; - severity: DiagnosticSeverity; - recordIds: string[]; - diagnosticCodes: DiagnosticCode[]; - /** Evidence grade for a topic that survived semantic implementation gating. */ - evidence: RealityEvidence; -} +import { DARK_THEME, escapeXml, metricCard, svgDocument, truncate } from './svg.js'; +import type { SourceKind } from '../core/types.js'; -export interface IntentRealityView { - schemaVersion: 't2c.reality/v1'; - generatedAt: string; - graphFingerprint: string; - fingerprint: string; - rows: RealityRow[]; - totals: { - topics: number; - aligned: number; - gaps: number; - byStatus: Record; - declaredRecords: number; - observedRecords: number; - declaredTopics: number; - observedTopics: number; - implementationAlignedTopics: number; - implementationCoverage: number; - plannedCodeCoverage: number; - documentedCodeCoverage: number; - /** - * False when the graph holds no `document` record at all, which makes - * `documentedCodeCoverage` structurally 0 rather than measured. Reporting - * a bare 0.0% in that case reads as "nothing is documented" when the truth - * is "documentation extraction did not run" β€” it is LLM-only, so every - * offline run produced that number. - */ - documentationMeasured: boolean; - /** - * Aligned topics split by how strong their evidence is. Reported so a - * headline that rests mostly on configuration cannot read the same as one - * backed by parsed code; neither number changes what counts as aligned. - */ - alignedByEvidence: Record; - }; -} - -/** - * Diagnostic codes that mark a topic as divergent, mapped to the row status - * they imply. Codes absent from this table (LOW_CONFIDENCE, ALIGNED, …) do not - * by themselves make a topic a gap. - */ -const DIVERGENCE_STATUS: Partial> = { - PLANNED_NOT_IMPLEMENTED: 'planned_not_implemented', - IMPLEMENTED_NOT_PLANNED: 'implemented_not_planned', - IMPLEMENTED_NOT_DOCUMENTED: 'implemented_not_documented', - CHANGELOG_WITHOUT_IMPLEMENTATION: 'changelog_without_implementation', - CONFLICTING_INTENT: 'conflicting', - UNLINKED_RECORD: 'unlinked', -}; - -const SEVERITY_RANK: Record = { - info: 0, - warning: 1, - review_required: 2, - blocking: 3, +import { + DECLARED_KINDS, + OBSERVED_KINDS, + LANE_ORDER, + STATUS_LABEL, + buildRealityView, + documentedCoverageLabel, + type IntentRealityView, + type RealityEvidence, + type RealityRow, + type RealityStatus, +} from './reality-build.js'; + +export { + buildRealityView, + documentedCoverageLabel, + DECLARED_KINDS, + OBSERVED_KINDS, + LANE_ORDER, + STATUS_LABEL, + type IntentRealityView, + type RealityEvidence, + type RealityRow, + type RealityStatus, }; const STATUS_COLOR: Record = { @@ -140,119 +42,6 @@ const STATUS_COLOR: Record = { unlinked: '#64748b', }; -const STATUS_LABEL: Record = { - aligned: 'aligned', - planned_not_implemented: 'planned, no code', - implemented_not_planned: 'code, no plan', - implemented_not_documented: 'code, no docs', - changelog_without_implementation: 'changelog, no code', - conflicting: 'conflicting', - unlinked: 'unlinked', -}; - -export function buildRealityView( - graph: IntentGraph, - diagnostics: DiagnosticReport, - generatedAt = new Date().toISOString(), -): IntentRealityView { - assertIntentGraph(graph); - const components = groupIntoTopics(graph); - const diagnosticsByRecord = indexDiagnostics(diagnostics); - - const rows: RealityRow[] = components.map(({ key, records }) => { - const lanes: Record = {}; - for (const kind of LANE_ORDER) lanes[kind] = 0; - for (const record of records) { - lanes[record.source.kind] = (lanes[record.source.kind] ?? 0) + 1; - } - - const codes = new Set(); - let severity: DiagnosticSeverity = 'info'; - for (const record of records) { - for (const diagnostic of diagnosticsByRecord.get(record.id) ?? []) { - codes.add(diagnostic.code); - if (SEVERITY_RANK[diagnostic.severity] > SEVERITY_RANK[severity]) severity = diagnostic.severity; - } - } - - const status = resolveStatus(codes, lanes); - return { - key, - label: topicLabel(key, records), - lanes, - status, - severity: status === 'aligned' ? 'info' : severity, - recordIds: records.map((record) => record.id).sort(), - diagnosticCodes: [...codes].sort(), - evidence: resolveEvidence(lanes), - }; - }); - - // Most severe first, then largest topic, then stable by key. - rows.sort((left, right) => { - const bySeverity = SEVERITY_RANK[right.severity] - SEVERITY_RANK[left.severity]; - if (bySeverity !== 0) return bySeverity; - const alignment = Number(left.status === 'aligned') - Number(right.status === 'aligned'); - if (alignment !== 0) return alignment; - const bySize = right.recordIds.length - left.recordIds.length; - if (bySize !== 0) return bySize; - return left.key.localeCompare(right.key); - }); - - const byStatus: Record = {}; - for (const row of rows) byStatus[row.status] = (byStatus[row.status] ?? 0) + 1; - - const declaredRecords = graph.records.filter((record) => DECLARED_KINDS.includes(record.source.kind)).length; - const observedRecords = graph.records.filter((record) => OBSERVED_KINDS.includes(record.source.kind)).length; - const aligned = rows.filter((row) => row.status === 'aligned').length; - const declaredTopics = rows.filter((row) => DECLARED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; - const observedTopics = rows.filter((row) => OBSERVED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; - const implementationAlignedTopics = rows.filter((row) => row.status === 'aligned' - && DECLARED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0) - && OBSERVED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; - const documentedObservedTopics = rows.filter((row) => - (row.lanes.document ?? 0) > 0 - && OBSERVED_KINDS.some((kind) => (row.lanes[kind] ?? 0) > 0)).length; - - return { - schemaVersion: 't2c.reality/v1', - generatedAt, - graphFingerprint: graph.fingerprint, - fingerprint: sha256(stableStringify(rows.map((row) => [row.key, row.status, row.recordIds]))), - rows, - totals: { - topics: rows.length, - aligned, - gaps: rows.length - aligned, - alignedByEvidence: { - code: rows.filter((row) => row.status === 'aligned' && row.evidence === 'code').length, - configuration: rows.filter((row) => row.status === 'aligned' && row.evidence === 'configuration').length, - none: rows.filter((row) => row.status === 'aligned' && row.evidence === 'none').length, - }, - byStatus: Object.fromEntries(Object.entries(byStatus).sort(([a], [b]) => a.localeCompare(b))), - declaredRecords, - observedRecords, - declaredTopics, - observedTopics, - implementationAlignedTopics, - implementationCoverage: ratio(implementationAlignedTopics, declaredTopics), - plannedCodeCoverage: ratio(implementationAlignedTopics, observedTopics), - documentedCodeCoverage: ratio(documentedObservedTopics, observedTopics), - documentationMeasured: graph.records.some((record) => record.source.kind === 'document'), - }, - }; -} - -function ratio(numerator: number, denominator: number): number { - return denominator === 0 ? 1 : Math.round((numerator / denominator) * 10_000) / 10_000; -} - -/** Renders documentation coverage, or says it was not measured at all. */ -function documentedCoverageLabel(totals: IntentRealityView['totals']): string { - if (!totals.documentationMeasured) return 'not measured (no documentation records in this run)'; - return `${(totals.documentedCodeCoverage * 100).toFixed(1)}%`; -} - /** Approximate advance width per character for the `.label` and `.badge` styles. */ const LABEL_CHAR = 7.2; const BADGE_CHAR = 7.4; @@ -262,237 +51,6 @@ function widestLabel(labels: string[]): number { return labels.reduce((widest, label) => Math.max(widest, label.length), 0); } -/** - * Groups records by their primary target. - * - * Connected components of the relation graph are deliberately *not* used here. - * The linker emits `shared_path` relations, which tie together every AST symbol - * declared in the same file; transitively that collapses a real repository into - * one giant component (measured: 2561 records and 95 549 relations produced a - * single topic holding 2507 AST facts). Keying on the record's own primary - * target keeps topics at file/ticket granularity and makes membership - * explainable without walking the graph. - */ -function groupIntoTopics(graph: IntentGraph): Array<{ key: string; records: IntentRecord[] }> { - const symbolPaths = indexUnambiguousSymbolPaths(graph.records); - const anchors = indexModuleAnchors(graph, symbolPaths); - const groups = new Map(); - for (const record of graph.records) { - const key = primaryTargetKey(record, symbolPaths, anchors); - const bucket = groups.get(key) ?? []; - bucket.push(record); - groups.set(key, bucket); - } - return [...groups.entries()] - .map(([key, records]) => ({ key, records: records.sort((a, b) => a.id.localeCompare(b.id)) })) - .sort((left, right) => left.key.localeCompare(right.key)); -} - -/** - * The one module a targetless declaration is directly linked to. - * - * Without this, a sentence the linker *did* connect to code still counted as - * "planned, no code": topics are keyed by each record's own ticket, path or - * symbol, so prose that names none of them was filed under the documentation - * file it was written in, never under the module it describes. On - * `subactor/platform`, where documentation is Polish prose and identifiers are - * English, that is most of the corpus. - * - * The narrowness is the point, and it is why connected components are still - * refused above: one hop, only from a declaration whose own target resolves to - * no file, and only when every module aggregate it touches names the same one. - * An ambiguous declaration keeps its old key rather than picking a winner β€” - * measured on `subactor/platform`, 69 declarations touch several modules and - * are deliberately left alone. - */ -function indexModuleAnchors(graph: IntentGraph, symbolPaths: Map): Map { - const modulePaths = new Map(); - for (const record of graph.records) { - if (record.statement.kind !== 'module_fact' && record.statement.kind !== 'configuration_file_fact') continue; - const paths = [...new Set(record.statement.target.paths)]; - if (paths.length === 1 && paths[0]) modulePaths.set(record.id, paths[0]); - } - - const targetless = new Set(graph.records - .filter((record) => DECLARED_KINDS.includes(record.source.kind) && !resolvesToFile(record, symbolPaths)) - .map((record) => record.id)); - const candidates = new Map>(); - for (const relation of graph.relations) { - for (const [left, right] of [[relation.from, relation.to], [relation.to, relation.from]] as const) { - const path = modulePaths.get(right); - if (!path || !targetless.has(left)) continue; - const values = candidates.get(left) ?? new Set(); - values.add(path); - candidates.set(left, values); - } - } - return new Map([...candidates.entries()] - .filter(([, paths]) => paths.size === 1) - .map(([recordId, paths]) => [recordId, [...paths][0] as string])); -} - -/** - * True when the record already names something a reader can open. - * - * A bare prose symbol does not count. `extractSymbols` returns acronyms such as - * `API` or `DSL`, and a topic keyed `symbol:api` groups sentences that share - * nothing but a word β€” a worse anchor than the module the linker proved. - */ -function resolvesToFile(record: IntentRecord, symbolPaths: Map): boolean { - const { tickets, paths, symbols } = record.statement.target; - if (tickets.length > 0 || paths.length > 0) return true; - const resolved = new Set(symbols - .flatMap(symbolAliases) - .map((symbol) => symbolPaths.get(symbol)) - .filter((value): value is string => Boolean(value))); - return resolved.size === 1; -} - -function indexUnambiguousSymbolPaths(records: IntentRecord[]): Map { - const candidates = new Map>(); - for (const record of records) { - const paths = record.statement.target.paths; - if (paths.length !== 1 || !paths[0]) continue; - for (const alias of record.statement.target.symbols.flatMap(symbolAliases)) { - const values = candidates.get(alias) ?? new Set(); - values.add(paths[0]); - candidates.set(alias, values); - } - } - return new Map([...candidates.entries()] - .filter(([, paths]) => paths.size === 1) - .map(([alias, paths]) => [alias, [...paths][0] as string])); -} - -/** - * Deterministic topic key. A ticket is the strongest cross-source identifier, - * then the file the record is about, then its normalized symbol. - * - * `statement.target.paths` outranks symbols and `source.path`: a TODO item is - * written in TODO.md but targets `src/…`, and keying it by its source file - * would file every task under TODO.md instead of the code it concerns. When a - * record has no target path, normalized symbol aliases still align - * `validateContract`, `Runtime.validateContract` and Rust `::` notation. - * A declaration with no target of its own falls back to the single module it - * is linked to, and only then to its own document under a separate `source:` - * namespace. "Written in X" is not "about X": sharing the `path:` namespace - * merged every unattributable release note into the topic for the changelog - * file itself β€” 283 of them beside the 20 that name it on `if-uri/urirun`, - * and 447 beside 40 on `semcod/goal` β€” so a document appeared to be a heavily - * declared topic with no implementation. Observed evidence is unaffected: AST, - * Git and configuration records always carry a target of their own and never - * reach this fallback. - */ -function primaryTargetKey( - record: IntentRecord, - symbolPaths: Map, - anchors: Map = new Map(), -): string { - const tickets = [...record.statement.target.tickets].sort(); - if (tickets.length === 1 && tickets[0]) return `ticket:${tickets[0]}`; - - if (tickets.length > 1 && tickets[0]) return `ticket:${tickets[0]}`; - - const targetPaths = [...new Set(record.statement.target.paths)].sort(); - if (targetPaths.length && targetPaths[0]) return `path:${targetPaths[0]}`; - - const symbols = [...new Set(record.statement.target.symbols.flatMap(symbolAliases))] - .sort((left, right) => left.split('.').length - right.split('.').length || left.localeCompare(right)); - const resolvedPaths = [...new Set(symbols.map((symbol) => symbolPaths.get(symbol)).filter((value): value is string => Boolean(value)))]; - if (resolvedPaths.length === 1 && resolvedPaths[0]) return `path:${resolvedPaths[0]}`; - - const anchor = anchors.get(record.id); - if (anchor) return `path:${anchor}`; - - if (symbols.length && symbols[0]) return `symbol:${symbols[0]}`; - - if (record.source.path) return `source:${record.source.path}`; - - return `record:${record.id}`; -} - -function indexDiagnostics(report: DiagnosticReport): Map { - const index = new Map(); - for (const diagnostic of report.diagnostics) { - for (const recordId of diagnostic.recordIds) { - const bucket = index.get(recordId) ?? []; - bucket.push(diagnostic); - index.set(recordId, bucket); - } - } - return index; -} - -/** - * Status is derived from lane presence first, because that is a structural fact - * about the topic. Diagnostics only refine the result: a topic that demonstrably - * holds both declared and observed records is never reported as "planned, no - * code" just because one of its members carries that diagnostic. - */ -/** - * Grades observed evidence without regrading the topic. - * - * AST or Git evidence outranks configuration: a parser found the symbol, or a - * commit touched the file. Configuration alone still proves the behaviour - * exists, so it stays `aligned` β€” the caller decides what to do with a - * headline where most of the alignment is configuration. - */ -function resolveEvidence(lanes: Record): RealityEvidence { - if ((lanes.ast ?? 0) > 0 || (lanes.git ?? 0) > 0) return 'code'; - if ((lanes.system ?? 0) > 0) return 'configuration'; - return 'none'; -} - -function resolveStatus(codes: Set, lanes: Record): RealityStatus { - const declared = DECLARED_KINDS.reduce((total, kind) => total + (lanes[kind] ?? 0), 0); - const observed = OBSERVED_KINDS.reduce((total, kind) => total + (lanes[kind] ?? 0), 0); - const changelog = lanes.changelog ?? 0; - - // A contradiction outranks every structural reading of the same topic. - if (codes.has('CONFLICTING_INTENT')) return 'conflicting'; - - // Co-location is not semantic implementation. Diagnostics has inspected the - // relation basis and keeps this gap open when both lanes share only a path. - if (codes.has('PLANNED_NOT_IMPLEMENTED')) return 'planned_not_implemented'; - - if (declared === 0 && observed === 0) { - return changelog > 0 ? 'changelog_without_implementation' : 'unlinked'; - } - if (declared > 0 && observed === 0) { - return changelog > 0 && codes.has('CHANGELOG_WITHOUT_IMPLEMENTATION') - ? 'changelog_without_implementation' - : 'planned_not_implemented'; - } - if (observed > 0 && declared === 0) return 'implemented_not_planned'; - - // Both sides are present, so plan-to-code alignment is proven. Documentation - // coverage is an independent metric and its diagnostic remains attached to - // the row; requiring a document lane here made `aligned` impossible in a - // fully offline run because semantic document records are LLM-only. - return 'aligned'; -} - -/** - * The topic key names the row; a declared statement is appended as context when - * one exists. Labelling by an arbitrary member record would be misleading, since - * a file-keyed topic can hold hundreds of unrelated AST facts. - */ -function topicLabel(key: string, records: IntentRecord[]): string { - const separator = key.indexOf(':'); - const raw = separator >= 0 ? key.slice(separator + 1) : key; - // The reader must be able to tell a topic about a file from the bucket of - // statements that merely live in it and name nothing. - const value = key.startsWith('source:') ? `${raw} (unattributed)` : raw; - - const declared = records - .filter((record) => DECLARED_KINDS.includes(record.source.kind)) - .sort((left, right) => right.epistemic.confidence - left.epistemic.confidence)[0]; - if (!declared) return value; - - const object = declared.statement.object.trim() || declared.statement.text.trim(); - return object ? `${value} β€” ${object}` : value; -} - export interface RealitySvgOptions { title?: string; maxRows?: number; @@ -506,74 +64,17 @@ export function renderRealitySvg(view: IntentRealityView, options: RealitySvgOpt const title = options.title?.trim() || 'todo2code Intent vs Reality'; const rows = (options.gapsOnly ? view.rows.filter((row) => row.status !== 'aligned') : view.rows); const visible = rows.slice(0, maxRows); - - // The lane columns and the status column are sized from their own content. - // Both were hardcoded for six lanes, so adding `agent_log` made the headers - // overlap and pushed "CHANGELOG, NO CODE" past the right edge of the - // viewBox. Deriving the geometry keeps the table readable when a lane is - // added again. - const laneX = 720; - const laneStep = Math.max(62, Math.ceil(widestLabel(LANE_ORDER.map((kind) => kind.toUpperCase())) * LABEL_CHAR + 14)); - const statusX = laneX + LANE_ORDER.length * laneStep + 30; - const statusWidth = Math.ceil(widestLabel(Object.values(STATUS_LABEL).map((label) => label.toUpperCase())) * BADGE_CHAR); - const width = statusX + statusWidth + 40; - const rowHeight = 30; - const headerY = 214; - let y = headerY + 28; - - const body: string[] = []; - - // Lane column headers. - body.push(`TOPIC`); - LANE_ORDER.forEach((kind, index) => { - const isDeclared = DECLARED_KINDS.includes(kind); - body.push( - `${escapeXml(kind.toUpperCase())}`, - ); - }); - body.push(`STATUS`); - body.push(``); - - for (const row of visible) { - const color = STATUS_COLOR[row.status]; - body.push(``); - body.push(``); - body.push(`${escapeXml(truncate(row.label, 76))}`); - - LANE_ORDER.forEach((kind, index) => { - const count = row.lanes[kind] ?? 0; - const cx = laneX + index * laneStep; - if (count > 0) { - // A 16px circle fits two digits; a file with 161 AST facts overflowed - // it, so wider counts get a pill sized to their own text. - const fill = DECLARED_KINDS.includes(kind) ? theme.changed : theme.accent; - const label = String(count); - const pillWidth = Math.max(16, Math.ceil(label.length * BADGE_CHAR) + 8); - body.push( - ``, - ); - body.push(`${label}`); - } else { - body.push(``); - } - }); - - body.push( - `` - + `${escapeXml(STATUS_LABEL[row.status].toUpperCase())}`, - ); - y += rowHeight; - } - - if (rows.length > visible.length) { - body.push(`… ${rows.length - visible.length} more topics`); - y += 30; - } + const layout = buildRealityLayout(); + const header = renderRealityLaneHeaders(theme, layout); + const body = visible.map((row, index) => renderRealityRow(row, index, layout, theme)).join(''); + const overflow = rows.length > visible.length + ? renderMoreTopicsLabel(rows.length - visible.length, visible.length, layout) + : ''; + const height = Math.max(400, renderRealityHeight(visible.length, rows.length, layout)); return svgDocument({ - width, - height: Math.max(400, y + 30), + width: layout.width, + height, title, description: `Intent versus reality across ${view.totals.topics} topics: ` + `${view.totals.aligned} aligned, ${view.totals.gaps} divergent.`, @@ -587,11 +88,114 @@ export function renderRealitySvg(view: IntentRealityView, options: RealitySvgOpt ` ${metricCard(610, 92, 'Planned, no code', view.totals.byStatus.planned_not_implemented ?? 0, STATUS_COLOR.planned_not_implemented, 200)}`, ` ${metricCard(830, 92, 'Code, no plan', view.totals.byStatus.implemented_not_planned ?? 0, STATUS_COLOR.implemented_not_planned, 200)}`, ` ${metricCard(1050, 92, 'Conflicting', view.totals.byStatus.conflicting ?? 0, STATUS_COLOR.conflicting, 190)}`, - ` ${body.join('')}`, + ` ${header}${body}${overflow}`, ].join('\n'), }); } +interface RealitySvgLayout { + laneX: number; + laneStep: number; + statusX: number; + width: number; + rowHeight: number; + headerY: number; + yStart: number; +} + +function buildRealityLayout(): RealitySvgLayout { + const laneX = 720; + const laneStep = Math.max(62, Math.ceil(widestLabel(LANE_ORDER.map((kind) => kind.toUpperCase())) * LABEL_CHAR + 14)); + const statusX = laneX + LANE_ORDER.length * laneStep + 30; + const statusWidth = Math.ceil(widestLabel(Object.values(STATUS_LABEL).map((label) => label.toUpperCase())) * BADGE_CHAR); + return { + laneX, + laneStep, + statusX, + width: statusX + statusWidth + 40, + rowHeight: 30, + headerY: 214, + yStart: 242, + }; +} + +function renderRealityLaneHeaders(theme: typeof DARK_THEME, layout: RealitySvgLayout): string { + return [ + `TOPIC`, + ...LANE_ORDER.map((kind, index) => { + const isDeclared = DECLARED_KINDS.includes(kind); + return `${escapeXml(kind.toUpperCase())}`; + }), + `STATUS`, + ``, + ].join(''); +} + +function renderRealityRow( + row: RealityRow, + index: number, + layout: RealitySvgLayout, + theme: typeof DARK_THEME, +): string { + const y = layout.yStart + index * layout.rowHeight; + const color = STATUS_COLOR[row.status]; + return [ + ``, + ``, + `${escapeXml(truncate(row.label, 76))}`, + renderRealityLanes(row, y, layout, theme), + `` + + `${escapeXml(STATUS_LABEL[row.status].toUpperCase())}`, + ].join(''); +} + +function renderRealityLanes( + row: RealityRow, + y: number, + layout: RealitySvgLayout, + theme: typeof DARK_THEME, +): string { + return LANE_ORDER.map((kind, index) => { + const count = row.lanes[kind] ?? 0; + const cx = layout.laneX + index * layout.laneStep; + return renderRealityLaneCell(kind, count, cx, y, theme); + }).join(''); +} + +function renderRealityLaneCell( + kind: SourceKind, + count: number, + cx: number, + y: number, + theme: typeof DARK_THEME, +): string { + if (count > 0) { + // A 16px circle fits two digits; a file with 161 AST facts overflowed + // it, so wider counts get a pill sized to their own text. + const fill = DECLARED_KINDS.includes(kind) ? theme.changed : theme.accent; + const label = String(count); + const pillWidth = Math.max(16, Math.ceil(label.length * BADGE_CHAR) + 8); + return [ + ``, + `${label}`, + ].join(''); + } + return ``; +} + +function renderMoreTopicsLabel(remaining: number, visibleRows: number, layout: RealitySvgLayout): string { + if (remaining <= 0) return ''; + const y = layout.yStart + visibleRows * layout.rowHeight + 6; + return `… ${remaining} more topics`; +} + +function renderRealityHeight(visibleCount: number, totalCount: number, layout: RealitySvgLayout): number { + const footer = totalCount > visibleCount ? 30 : 0; + const y = layout.yStart + visibleCount * layout.rowHeight; + return y + footer + 30; +} + /** Compact Markdown rendering for pull-request comments and terminals. */ export function renderRealityMarkdown(view: IntentRealityView, maxRows = 40): string { const lines: string[] = [ diff --git a/src/diff/text-myers.ts b/src/diff/text-myers.ts new file mode 100644 index 0000000..56de5a4 --- /dev/null +++ b/src/diff/text-myers.ts @@ -0,0 +1,152 @@ +import type { DiffLine, LineChangeType } from './text-types.js'; + +export interface RawDiffOp { + type: LineChangeType; + beforeIndex: number | null; + afterIndex: number | null; + text: string; +} + +interface MyersState { + n: number; + m: number; + offset: number; +} + +interface MyersEditPoint { + x: number; + y: number; +} + +export function blockReplace(before: string[], after: string[]): RawDiffOp[] { + return [ + ...before.map((text, index) => ({ type: 'delete' as const, beforeIndex: index, afterIndex: null, text })), + ...after.map((text, index) => ({ type: 'insert' as const, beforeIndex: null, afterIndex: index, text })), + ]; +} + +/** Myers' greedy O(ND) diff with a stored trace for backtracking. */ +export function myers(before: string[], after: string[]): RawDiffOp[] { + const state = createMyersState(before, after); + if (state.n === 0 && state.m === 0) return []; + if (state.n === 0 || state.m === 0) return blockReplace(before, after); + + const trace: Int32Array[] = []; + let v = new Int32Array(2 * (state.n + state.m) + 1); + + for (let d = 0; d <= state.n + state.m; d += 1) { + trace.push(v.slice()); + for (let k = -d; k <= d; k += 2) { + const startX = chooseStartX(v, state, k, d); + const point = advanceDiagonal(before, after, startX, startX - k, state); + v[state.offset + k] = point.x; + if (point.x >= state.n && point.y >= state.m) { + return backtrack(trace, before, after, d, state.offset); + } + } + } + /* c8 ignore next -- unreachable: d === n + m always terminates above */ + return blockReplace(before, after); +} + +function createMyersState(before: string[], after: string[]): MyersState { + const n = before.length; + const m = after.length; + return { n, m, offset: n + m }; +} + +function chooseStartX(v: Int32Array, state: MyersState, k: number, d: number): number { + if (k === -d || (k !== d && (v[state.offset + k - 1] ?? 0) < (v[state.offset + k + 1] ?? 0))) { + return v[state.offset + k + 1] ?? 0; + } + return (v[state.offset + k - 1] ?? 0) + 1; +} + +function advanceDiagonal( + before: string[], + after: string[], + x: number, + y: number, + state: MyersState, +): MyersEditPoint { + let nextX = x; + let nextY = y; + while (nextX < state.n && nextY < state.m && before[nextX] === after[nextY]) { + nextX += 1; + nextY += 1; + } + return { x: nextX, y: nextY }; +} + +function backtrack( + trace: Int32Array[], + before: string[], + after: string[], + d: number, + offset: number, +): RawDiffOp[] { + const ops: RawDiffOp[] = []; + let x = before.length; + let y = after.length; + for (let step = d; step > 0; step -= 1) { + const v = trace[step]; + if (!v) break; + const k = x - y; + const previous = choosePreviousPoint(v, offset, k, step); + const previousX = previous.x; + const previousY = previous.y; + const diag = emitEqualOps(ops, before, x, y, previousX, previousY); + const afterEqualX = diag.x; + const afterEqualY = diag.y; + emitEditOp(ops, before, after, afterEqualX, afterEqualY, previousX); + x = previousX; + y = previousY; + } + while (x > 0 && y > 0) { + x -= 1; + y -= 1; + ops.push({ type: 'equal', beforeIndex: x, afterIndex: y, text: before[x] ?? '' }); + } + return ops.reverse(); +} + +function choosePreviousPoint(v: Int32Array, offset: number, k: number, step: number): MyersEditPoint { + const previousK = k === -step || (k !== step && (v[offset + k - 1] ?? 0) < (v[offset + k + 1] ?? 0)) + ? k + 1 + : k - 1; + const previousX = v[offset + previousK] ?? 0; + return { x: previousX, y: previousX - previousK }; +} + +function emitEqualOps( + ops: RawDiffOp[], + before: string[], + x: number, + y: number, + previousX: number, + previousY: number, +): MyersEditPoint { + while (x > previousX && y > previousY) { + x -= 1; + y -= 1; + ops.push({ type: 'equal', beforeIndex: x, afterIndex: y, text: before[x] ?? '' }); + } + return { x, y }; +} + +function emitEditOp( + ops: RawDiffOp[], + before: string[], + after: string[], + x: number, + y: number, + previousX: number, +): void { + if (x === previousX) { + y -= 1; + ops.push({ type: 'insert', beforeIndex: null, afterIndex: y, text: after[y] ?? '' }); + return; + } + x -= 1; + ops.push({ type: 'delete', beforeIndex: x, afterIndex: null, text: before[x] ?? '' }); +} diff --git a/src/diff/text.ts b/src/diff/text.ts index 8629e24..4b37e48 100644 --- a/src/diff/text.ts +++ b/src/diff/text.ts @@ -11,6 +11,7 @@ export type { } from './text-types.js'; import type { DiffHunk, DiffLine, DiffTextOptions, FileDiff, LineChangeType } from './text-types.js'; +import { blockReplace, myers } from './text-myers.js'; const DEFAULT_CONTEXT = 3; const DEFAULT_MAX_COMPARE_LINES = 4000; @@ -122,93 +123,6 @@ function suffixLines(before: string[], after: string[], suffix: number): DiffLin return lines; } -interface RawOp { - type: LineChangeType; - beforeIndex: number | null; - afterIndex: number | null; - text: string; -} - -function blockReplace(before: string[], after: string[]): RawOp[] { - return [ - ...before.map((text, index) => ({ type: 'delete' as const, beforeIndex: index, afterIndex: null, text })), - ...after.map((text, index) => ({ type: 'insert' as const, beforeIndex: null, afterIndex: index, text })), - ]; -} - -/** Myers' greedy O(ND) diff with a stored trace for backtracking. */ -function myers(before: string[], after: string[]): RawOp[] { - const n = before.length; - const m = after.length; - if (n === 0 && m === 0) return []; - if (n === 0 || m === 0) return blockReplace(before, after); - const max = n + m; - const offset = max; - const trace: Int32Array[] = []; - let v = new Int32Array(2 * max + 1); - - for (let d = 0; d <= max; d += 1) { - trace.push(v.slice()); - for (let k = -d; k <= d; k += 2) { - let x: number; - if (k === -d || (k !== d && (v[offset + k - 1] ?? 0) < (v[offset + k + 1] ?? 0))) { - x = v[offset + k + 1] ?? 0; - } else { - x = (v[offset + k - 1] ?? 0) + 1; - } - let y = x - k; - while (x < n && y < m && before[x] === after[y]) { - x += 1; - y += 1; - } - v[offset + k] = x; - if (x >= n && y >= m) return backtrack(trace, before, after, d, offset); - } - } - /* c8 ignore next -- unreachable: d === n + m always terminates above */ - return blockReplace(before, after); -} - -function backtrack( - trace: Int32Array[], - before: string[], - after: string[], - d: number, - offset: number, -): RawOp[] { - const ops: RawOp[] = []; - let x = before.length; - let y = after.length; - for (let step = d; step > 0; step -= 1) { - const v = trace[step]; - if (!v) break; - const k = x - y; - const previousK = k === -step || (k !== step && (v[offset + k - 1] ?? 0) < (v[offset + k + 1] ?? 0)) - ? k + 1 - : k - 1; - const previousX = v[offset + previousK] ?? 0; - const previousY = previousX - previousK; - while (x > previousX && y > previousY) { - x -= 1; - y -= 1; - ops.push({ type: 'equal', beforeIndex: x, afterIndex: y, text: before[x] ?? '' }); - } - if (x === previousX) { - y -= 1; - ops.push({ type: 'insert', beforeIndex: null, afterIndex: y, text: after[y] ?? '' }); - } else { - x -= 1; - ops.push({ type: 'delete', beforeIndex: x, afterIndex: null, text: before[x] ?? '' }); - } - } - while (x > 0 && y > 0) { - x -= 1; - y -= 1; - ops.push({ type: 'equal', beforeIndex: x, afterIndex: y, text: before[x] ?? '' }); - } - return ops.reverse(); -} - function buildHunks(lines: DiffLine[], context: number): DiffHunk[] { const changeIndexes = lines .map((line, index) => (line.type === 'equal' ? -1 : index)) diff --git a/src/evaluation/gold-cases.ts b/src/evaluation/gold-cases.ts index fd8bc84..1265214 100644 --- a/src/evaluation/gold-cases.ts +++ b/src/evaluation/gold-cases.ts @@ -69,40 +69,73 @@ export interface RerankingCaseResult { } export function evaluateRerankingCase(fixture: GoldLinkingCase): RerankingCaseResult { - if (!fixture.reranker) throw new Error(`Gold case ${fixture.id} has no reranker fixture`); + const reranker = resolveRerankerFixture(fixture); const { records, labels } = buildFixtureRecords(fixture.id, fixture.records); const idToLabel = new Map([...labels].map(([label, id]) => [id, label])); - const declarationRecordId = labels.get('declaration'); - if (!declarationRecordId) throw new Error(`Gold reranker case ${fixture.id} has no declaration label`); + const declarationRecordId = resolveDeclarationRecordId(fixture.id, labels); const graph = linkIntentRecords(records, GOLD_FIXED_TIME); - const candidates = createSemanticCandidateSet( + const candidates = buildRerankerCandidates(fixture.id, graph, labels, declarationRecordId, reranker); + const decisions = buildRerankerDecisions(fixture.id, reranker, labels, candidates, declarationRecordId); + const rerank = buildRerankResult(graph, fixture, reranker, candidates, decisions); + const observed = buildObservedRerankRelations(graph, candidates, rerank, idToLabel); + const forbiddenViolations = countForbiddenRelations(observed, fixture.forbidden); + return { + counts: compareSets(observed, buildRerankExpected(fixture.expected)), + forbiddenViolations, + accepted: countVerdictDecisions(rerank.decisions, 'accept'), + abstained: countVerdictDecisions(rerank.decisions, 'abstain'), + actual: observed, + snapshot: buildRerankSnapshot(fixture.id, candidates, rerank, observed), + }; +} + +function buildRerankerCandidates( + caseId: string, + graph: ReturnType, + labels: Map, + declarationRecordId: string, + reranker: NonNullable, +): ReturnType { + const requestedCandidates = reranker.decisions.map((decision) => ({ + declarationRecordId, + moduleRecordId: resolveFixtureLabelToRecordId(caseId, labels, decision.module), + score: decision.score, + })); + return createSemanticCandidateSet( graph, - fixture.reranker.decisions.map((decision) => { - const moduleRecordId = labels.get(decision.module); - if (!moduleRecordId) { - throw new Error(`Gold reranker case ${fixture.id} references unknown module label ${decision.module}`); - } - return { - declarationRecordId, - moduleRecordId, - score: decision.score, - }; - }), + requestedCandidates, { provider: 'captured-gold-retrieval', model: 'intfloat/multilingual-e5-base', revision: '18fcae5', metric: 'cosine', }, - Math.max(1, fixture.reranker.decisions.length), + Math.max(1, requestedCandidates.length), GOLD_FIXED_TIME, ); +} + +function buildRerankerDecisions( + caseId: string, + reranker: NonNullable, + labels: Map, + candidates: ReturnType, + declarationRecordId: string, +): Array<{ + candidateId: string; + verdict: 'accept' | 'reject' | 'abstain'; + confidence: number; + reasonCode: string; + rationale: string; + citedRecordIds: [string, string]; + evidence: Array<{ recordId: string; quote: string }>; +}> { const candidateByModule = new Map(candidates.candidates.map((candidate) => [candidate.moduleRecordId, candidate])); - const decisions = fixture.reranker.decisions.map((decision) => { - const moduleRecordId = labels.get(decision.module); - const candidate = moduleRecordId ? candidateByModule.get(moduleRecordId) : undefined; - if (!moduleRecordId || !candidate) { - throw new Error(`Gold reranker case ${fixture.id} cannot resolve candidate ${decision.module}`); + return reranker.decisions.map((decision) => { + const moduleRecordId = resolveFixtureLabelToRecordId(caseId, labels, decision.module); + const candidate = candidateByModule.get(moduleRecordId); + if (!candidate) { + throw new Error(`Gold reranker case ${caseId} cannot resolve candidate ${decision.module}`); } return { candidateId: candidate.id, @@ -117,41 +150,103 @@ export function evaluateRerankingCase(fixture: GoldLinkingCase): RerankingCaseRe ], }; }); - const rerank = createSemanticRerankResult(graph, candidates, decisions, { +} + +function buildRerankResult( + graph: ReturnType, + fixture: GoldLinkingCase, + reranker: NonNullable, + candidates: ReturnType, + decisions: ReturnType, +): ReturnType { + return createSemanticRerankResult(graph, candidates, decisions, { provider: 'captured-gold-response', - requestedModel: fixture.reranker.model, - model: fixture.reranker.model, - modelRevision: fixture.reranker.modelRevision, + requestedModel: reranker.model, + model: reranker.model, + modelRevision: reranker.modelRevision, responseId: `gold-${fixture.id}`, }, GOLD_FIXED_TIME); +} + +function buildObservedRerankRelations( + graph: ReturnType, + candidates: ReturnType, + rerank: ReturnType, + idToLabel: Map, +): Array<{ from: string; to: string; type: string }> { const augmented = applyAcceptedSemanticRelations(graph, candidates, rerank, GOLD_FIXED_TIME); - const observed = augmented.relations + return augmented.relations .filter((relation) => relation.basis.includes('cross_language_reranker')) .map((relation) => ({ from: idToLabel.get(relation.from) ?? relation.from, to: idToLabel.get(relation.to) ?? relation.to, type: relation.type, })); - const expected = fixture.expected.map(({ from, to, type }) => ({ from, to, type })); - const forbidden = fixture.forbidden ?? []; - const forbiddenViolations = forbidden.filter((pair) => observed.some((relation) => - (relation.from === pair.from && relation.to === pair.to) - || (relation.from === pair.to && relation.to === pair.from))).length; +} + +function countForbiddenRelations( + observed: T[], + forbidden?: Array<{ from: string; to: string }>, +): number { + const restricted = forbidden ?? []; + return restricted.filter((pair) => observed.some((item) => ( + (item.from === pair.from && item.to === pair.to) + || (item.from === pair.to && item.to === pair.from) + ))).length; +} + +function buildRerankExpected(expected: GoldLinkingCase['expected']): Array<{ from: string; to: string; type: string }> { + return expected.map(({ from, to, type }) => ({ from, to, type })); +} + +function buildRerankSnapshot( + caseId: string, + candidates: ReturnType, + rerank: ReturnType, + observed: ReturnType, +): { caseId: string; candidateSetHash: string; resultHash: string; actual: typeof observed } { return { - counts: compareSets(observed, expected), - forbiddenViolations, - accepted: rerank.decisions.filter((decision) => decision.verdict === 'accept').length, - abstained: rerank.decisions.filter((decision) => decision.verdict === 'abstain').length, + caseId, + candidateSetHash: candidates.candidateSetHash, + resultHash: rerank.resultHash, actual: observed, - snapshot: { - caseId: fixture.id, - candidateSetHash: candidates.candidateSetHash, - resultHash: rerank.resultHash, - actual: observed, - }, }; } +function countVerdictDecisions( + decisions: Array<{ verdict: 'accept' | 'reject' | 'abstain' }>, + verdict: 'accept' | 'abstain', +): number { + return decisions.filter((decision) => decision.verdict === verdict).length; +} + +function resolveRerankerFixture(fixture: GoldLinkingCase): NonNullable { + if (!fixture.reranker) { + throw new Error(`Gold case ${fixture.id} has no reranker fixture`); + } + return fixture.reranker; +} + +function resolveDeclarationRecordId(caseId: string, labels: Map): string { + const declarationRecordId = labels.get('declaration'); + if (!declarationRecordId) { + throw new Error(`Gold reranker case ${caseId} has no declaration label`); + } + return declarationRecordId; +} + +function resolveFixtureLabelToRecordId( + caseId: string, + labels: Map, + label: string, +): string { + const recordId = labels.get(label); + if (!recordId) { + throw new Error(`Gold reranker case ${caseId} references unknown module label ${label}`); + } + return recordId; +} + /** * Reads the justification class off a relation's `basis`. * @@ -318,36 +413,64 @@ function buildFixtureRecords( ): { records: IntentRecord[]; labels: Map } { const labels = new Map(); const records = fixtures.map((fixture, index) => { - const record = buildRecord({ - kind: fixture.statementKind ?? 'gold_fixture', - action: fixture.action, - object: fixture.text, - text: fixture.text, - ...(fixture.target ? { target: fixture.target } : {}), - polarity: fixture.polarity ?? 'positive', - modality: fixture.modality ?? (fixture.sourceKind === 'todo' ? 'required' : 'observed'), - lifecycle: fixture.lifecycle, - sourceKind: fixture.sourceKind, - sourcePath: fixture.sourceKind === 'ast' && fixture.target?.paths?.length === 1 - ? fixture.target.paths[0] as string - : `evaluation/${caseId}/${fixture.label}-${index + 1}.md`, - sourceLines: { start: 1, end: 1 }, - extractor: 't2c/gold-fixture@1', - ...(fixture.sourceKind === 'ast' && fixture.target?.symbols?.length === 1 - ? { symbol: fixture.target.symbols[0] as string } - : {}), - epistemicClass: fixture.sourceKind === 'todo' ? 'plan' : fixture.sourceKind === 'git' ? 'fact' : 'declaration', - confidence: 1, - basis: ['versioned_gold_fixture'], - ...(fixture.metadata ? { metadata: fixture.metadata as Record } : {}), - }); if (labels.has(fixture.label)) throw new Error(`Duplicate gold fixture label: ${fixture.label}`); + const record = buildFixtureRecord(caseId, fixture, index); labels.set(fixture.label, record.id); return record; }); return { records, labels }; } +function buildFixtureRecord( + caseId: string, + fixture: GoldFixtureRecord, + index: number, +): IntentRecord { + return buildRecord({ + kind: fixture.statementKind ?? 'gold_fixture', + action: fixture.action, + object: fixture.text, + text: fixture.text, + ...(fixture.target ? { target: fixture.target } : {}), + polarity: fixture.polarity ?? 'positive', + modality: fixture.modality ?? resolveDefaultFixtureModality(fixture), + lifecycle: fixture.lifecycle, + sourceKind: fixture.sourceKind, + sourcePath: resolveFixtureSourcePath(caseId, fixture, index), + sourceLines: { start: 1, end: 1 }, + extractor: 't2c/gold-fixture@1', + ...(resolveFixtureSymbol(fixture) ? { symbol: resolveFixtureSymbol(fixture) } : {}), + epistemicClass: resolveFixtureEpistemicClass(fixture), + confidence: 1, + basis: ['versioned_gold_fixture'], + ...(fixture.metadata ? { metadata: fixture.metadata as Record } : {}), + }); +} + +function resolveDefaultFixtureModality(fixture: GoldFixtureRecord): IntentRecord['modality'] { + return fixture.sourceKind === 'todo' ? 'required' : 'observed'; +} + +function resolveFixtureSourcePath( + caseId: string, + fixture: GoldFixtureRecord, + index: number, +): string { + return fixture.sourceKind === 'ast' && fixture.target?.paths?.length === 1 + ? fixture.target.paths[0] as string + : `evaluation/${caseId}/${fixture.label}-${index + 1}.md`; +} + +function resolveFixtureSymbol(fixture: GoldFixtureRecord): string | undefined { + return fixture.sourceKind === 'ast' && fixture.target?.symbols?.length === 1 + ? fixture.target.symbols[0] as string + : undefined; +} + +function resolveFixtureEpistemicClass(fixture: GoldFixtureRecord): IntentRecord['epistemicClass'] { + return fixture.sourceKind === 'todo' ? 'plan' : fixture.sourceKind === 'git' ? 'fact' : 'declaration'; +} + function deterministicGeneration(): GroundedGenerationMetadata { return { generator: 't2c/gold-evaluation', diff --git a/src/evaluation/gold-types.ts b/src/evaluation/gold-types.ts index eac6f1a..f167614 100644 --- a/src/evaluation/gold-types.ts +++ b/src/evaluation/gold-types.ts @@ -340,39 +340,66 @@ function assertExtractionCoverage(dataset: GoldDataset): void { function assertLinkingCohorts(dataset: GoldDataset): void { for (const fixture of dataset.linking) { - if (fixture.cohort !== undefined && fixture.cohort !== 'cross-language') { - throw new Error(`Unsupported gold linking cohort: ${String(fixture.cohort)}`); - } - if (dataset.schemaVersion === 't2c.gold-dataset/v2' - && fixture.cohort === 'cross-language' - && !fixture.reranker) { - throw new Error(`Cross-language gold case ${fixture.id} is missing a captured reranker fixture`); - } - if (fixture.reranker) { - if (!fixture.reranker.model.trim() || !fixture.reranker.modelRevision.trim()) { - throw new Error(`Gold reranker case ${fixture.id} has a blank model identity`); - } - if (!fixture.reranker.decisions.length || fixture.reranker.decisions.length > 10) { - throw new Error(`Gold reranker case ${fixture.id} must contain 1-10 bounded decisions`); - } - const labels = new Set(fixture.records.map((record) => record.label)); - const modules = new Set(); - for (const decision of fixture.reranker.decisions) { - if (!labels.has(decision.module) || decision.module === 'declaration') { - throw new Error(`Gold reranker case ${fixture.id} references unknown module ${decision.module}`); - } - if (modules.has(decision.module)) { - throw new Error(`Gold reranker case ${fixture.id} repeats module ${decision.module}`); - } - modules.add(decision.module); - if (!Number.isFinite(decision.score) || decision.score < -1 || decision.score > 1 - || !Number.isFinite(decision.confidence) || decision.confidence < 0 || decision.confidence > 1) { - throw new Error(`Gold reranker case ${fixture.id} has an invalid score or confidence`); - } - if (!decision.rationale.trim() || !decision.declarationQuote.trim() || !decision.moduleQuote.trim()) { - throw new Error(`Gold reranker case ${fixture.id} has blank grounded decision content`); - } - } - } + assertGoldLinkingCohort(dataset.schemaVersion, fixture); + assertRerankerFixture(fixture); + } +} + +function assertGoldLinkingCohort(schemaVersion: GoldDatasetVersion, fixture: GoldLinkingCase): void { + if (fixture.cohort !== undefined && fixture.cohort !== 'cross-language') { + throw new Error(`Unsupported gold linking cohort: ${String(fixture.cohort)}`); + } + if (schemaVersion === 't2c.gold-dataset/v2' + && fixture.cohort === 'cross-language' + && !fixture.reranker) { + throw new Error(`Cross-language gold case ${fixture.id} is missing a captured reranker fixture`); + } +} + +function assertRerankerFixture(fixture: GoldLinkingCase): void { + if (!fixture.reranker) return; + assertRerankerModelIdentity(fixture); + assertRerankerDecisions(fixture); +} + +function assertRerankerModelIdentity(fixture: GoldLinkingCase): void { + if (!fixture.reranker?.model.trim() || !fixture.reranker.modelRevision.trim()) { + throw new Error(`Gold reranker case ${fixture.id} has a blank model identity`); + } +} + +function assertRerankerDecisions(fixture: GoldLinkingCase): void { + const decisions = fixture.reranker?.decisions ?? []; + if (!decisions.length || decisions.length > 10) { + throw new Error(`Gold reranker case ${fixture.id} must contain 1-10 bounded decisions`); + } + const recordLabels = new Set(fixture.records.map((record) => record.label)); + const seenModules = new Set(); + for (const decision of decisions) { + assertRerankerDecision(fixture.id, decision, seenModules, recordLabels); + } +} + +function assertRerankerDecision( + caseId: string, + decision: GoldRerankerDecisionFixture, + seenModules: Set, + recordLabels: Set, +): void { + if (!recordLabels.has(decision.module) || decision.module === 'declaration') { + throw new Error(`Gold reranker case ${caseId} references unknown module ${decision.module}`); + } + if (seenModules.has(decision.module)) { + throw new Error(`Gold reranker case ${caseId} repeats module ${decision.module}`); + } + seenModules.add(decision.module); + if ( + !Number.isFinite(decision.score) || decision.score < -1 || decision.score > 1 + || !Number.isFinite(decision.confidence) || decision.confidence < 0 || decision.confidence > 1 + ) { + throw new Error(`Gold reranker case ${caseId} has an invalid score or confidence`); + } + if (!decision.rationale.trim() || !decision.declarationQuote.trim() || !decision.moduleQuote.trim()) { + throw new Error(`Gold reranker case ${caseId} has blank grounded decision content`); } } diff --git a/src/extractors/ast/typescript.ts b/src/extractors/ast/typescript.ts index 8991dc8..40a16e0 100644 --- a/src/extractors/ast/typescript.ts +++ b/src/extractors/ast/typescript.ts @@ -9,137 +9,237 @@ export const JS_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts', '.mj export const TYPESCRIPT_AST_CACHE_IDENTITY = `t2c/typescript-ast@1/typescript-${ts.version}`; export function extractTypeScriptFile(root: string, filePath: string, body: string): IntentRecord[] { - const relative = relativePosix(root, filePath); - const sourceFile = ts.createSourceFile(filePath, body, ts.ScriptTarget.Latest, true, scriptKind(filePath)); - const records: IntentRecord[] = []; - const scope: string[] = []; - const moduleCapabilities = new Set(); - - function lineRange(node: ts.Node): { start: number; end: number } { - return { - start: sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1, - end: sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line + 1, - }; - } + const context = createTypeScriptExtractionContext({ + filePath, + relative: relativePosix(root, filePath), + sourceFile: ts.createSourceFile(filePath, body, ts.ScriptTarget.Latest, true, scriptKind(filePath)), + records: [], + scope: [], + moduleCapabilities: new Set(), + }); + visitTypeScriptNode(context.sourceFile, context); + const capabilities = boundedCapabilities(context.moduleCapabilities); + recordModuleFact(context, context.sourceFile, capabilities); + return context.records; +} - function excerpt(node: ts.Node): string { - return node.getText(sourceFile).slice(0, 2000); +interface TypeScriptExtractionContext { + filePath: string; + relative: string; + sourceFile: ts.SourceFile; + records: IntentRecord[]; + scope: string[]; + moduleCapabilities: Set; +} + +function createTypeScriptExtractionContext(args: { + filePath: string; + relative: string; + sourceFile: ts.SourceFile; + records: IntentRecord[]; + scope: string[]; + moduleCapabilities: Set; +}): TypeScriptExtractionContext { + return args; +} + +function visitTypeScriptNode(node: ts.Node, context: TypeScriptExtractionContext): void { + if (handleNode(node, context)) { + ts.forEachChild(node, (child) => visitTypeScriptNode(child, context)); } +} + +function handleNode(node: ts.Node, context: TypeScriptExtractionContext): boolean { + if (handleImportDeclaration(node, context)) return true; + if (handleExportDeclaration(node, context)) return true; + if (handleSymbolDeclaration(node, context)) return true; + if (handleVariableDeclaration(node, context)) return true; + if (handleCallExpression(node, context)) return true; + return true; +} + +function handleImportDeclaration(node: ts.Node, context: TypeScriptExtractionContext): boolean { + if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) return false; + addTypeScriptRecord({ + context, + node, + kind: 'module_dependency_fact', + action: 'depend_on', + object: node.moduleSpecifier.text, + metadata: { importClause: node.importClause?.getText(context.sourceFile) ?? null }, + }); + return true; +} + +function handleExportDeclaration(node: ts.Node, context: TypeScriptExtractionContext): boolean { + if (!ts.isExportDeclaration(node) || !node.moduleSpecifier || !ts.isStringLiteral(node.moduleSpecifier)) return false; + addTypeScriptRecord({ + context, + node, + kind: 'module_dependency_fact', + action: 'depend_on', + object: node.moduleSpecifier.text, + metadata: { reExport: true }, + }); + return true; +} - function add(node: ts.Node, input: { +function handleSymbolDeclaration(node: ts.Node, context: TypeScriptExtractionContext): boolean { + if (!isTypeScriptSymbolDeclaration(node)) return false; + const symbol = extractSymbolName(node, context.sourceFile); + if (!symbol) return true; + const symbolModifiers = extractModifiers(node); + addTypeScriptRecord({ + context, + node, + kind: 'symbol_fact', + action: 'declare', + object: symbol, + symbol, + metadata: { + symbolKind: ts.SyntaxKind[node.kind] ?? 'unknown', + modifiers: symbolModifiers, + exported: symbolModifiers.includes('ExportKeyword'), + }, + }); + context.scope.push(symbol); + ts.forEachChild(node, (child) => visitTypeScriptNode(child, context)); + context.scope.pop(); + return false; +} + +function handleVariableDeclaration(node: ts.Node, context: TypeScriptExtractionContext): boolean { + if (!ts.isVariableDeclaration(node) || !ts.isIdentifier(node.name)) return false; + const declarationIsCallable = Boolean(node.initializer && (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer))); + if (!declarationIsCallable && !isTopLevel(node)) return true; + addTypeScriptRecord({ + context, + node, + kind: 'symbol_fact', + action: 'declare', + object: node.name.text, + symbol: node.name.text, + metadata: { symbolKind: declarationIsCallable ? 'callable_variable' : 'variable' }, + }); + return true; +} + +function handleCallExpression(node: ts.Node, context: TypeScriptExtractionContext): boolean { + if (!ts.isCallExpression(node)) return false; + const callee = node.expression.getText(context.sourceFile).slice(0, 300); + addTypeScriptRecord({ + context, + node, + kind: 'call_fact', + action: 'call', + object: callee, + symbol: context.scope.length ? context.scope.join('.') : null, + metadata: { callee, argumentCount: node.arguments.length }, + }); + return true; +} + +function isTypeScriptSymbolDeclaration( + node: ts.Node, +): node is + | ts.FunctionDeclaration + | ts.ClassDeclaration + | ts.InterfaceDeclaration + | ts.TypeAliasDeclaration + | ts.EnumDeclaration + | ts.MethodDeclaration { + return ( + ts.isFunctionDeclaration(node) + || ts.isClassDeclaration(node) + || ts.isInterfaceDeclaration(node) + || ts.isTypeAliasDeclaration(node) + || ts.isEnumDeclaration(node) + || ts.isMethodDeclaration(node) + ); +} + +function extractSymbolName( + node: ts.Node & { name?: ts.Node }, + sourceFile: ts.SourceFile, +): string | null { + if (!node.name) return null; + return node.name.getText(sourceFile).replace(/^['"]|['"]$/g, ''); +} + +function extractModifiers(node: ts.Node): string[] { + if (!ts.canHaveModifiers(node)) return []; + return (ts.getModifiers(node) ?? []).map((modifier) => ts.SyntaxKind[modifier.kind] ?? String(modifier.kind)); +} + +function addTypeScriptRecord( + input: { + context: TypeScriptExtractionContext; + node: ts.Node; kind: string; action: IntentAction; object: string; symbol?: string | null; + text?: string; subject?: string | null; metadata?: Record; - text?: string; - }): void { - const symbol = input.symbol ?? null; - if (input.kind === 'symbol_fact' || input.kind === 'module_dependency_fact') moduleCapabilities.add(input.object); - records.push(buildRecord({ - kind: input.kind, - action: input.action, - subject: input.subject ?? (scope.length ? scope.join('.') : null), - object: input.object, - target: { paths: [relative], symbols: symbol ? [symbol] : [] }, - modality: 'observed', - text: input.text ?? `${input.action} ${input.object}`, - lifecycle: 'implemented', - sourceKind: 'ast', - sourcePath: relative, - sourceLines: lineRange(node), - symbol, - extractor: 't2c/typescript-ast@1', - rawExcerpt: excerpt(node), - epistemicClass: 'fact', - confidence: 1, - basis: ['typescript_compiler_ast'], - metadata: { - language: languageName(filePath), - syntaxKind: ts.SyntaxKind[node.kind] ?? String(node.kind), - llmUsed: false, - ...(input.metadata ?? {}), - }, - })); - } - - function nameOf(node: ts.Node & { name?: ts.Node }): string | null { - if (!node.name) return null; - return node.name.getText(sourceFile).replace(/^['"]|['"]$/g, ''); + }, +): void { + const symbol = input.symbol ?? null; + if (input.kind === 'symbol_fact' || input.kind === 'module_dependency_fact') { + input.context.moduleCapabilities.add(input.object); } + input.context.records.push(buildRecord({ + kind: input.kind, + action: input.action, + subject: input.subject ?? (input.context.scope.length ? input.context.scope.join('.') : null), + object: input.object, + target: { paths: [input.context.relative], symbols: symbol ? [symbol] : [] }, + modality: 'observed', + text: input.text ?? `${input.action} ${input.object}`, + lifecycle: 'implemented', + sourceKind: 'ast', + sourcePath: input.context.relative, + sourceLines: sourceLineRange(input.node, input.context.sourceFile), + symbol, + extractor: 't2c/typescript-ast@1', + rawExcerpt: nodeExcerpt(input.node, input.context.sourceFile), + epistemicClass: 'fact', + confidence: 1, + basis: ['typescript_compiler_ast'], + metadata: { + language: languageName(input.context.filePath), + syntaxKind: ts.SyntaxKind[input.node.kind] ?? String(input.node.kind), + llmUsed: false, + ...(input.metadata ?? {}), + }, + })); +} - function modifiers(node: ts.Node): string[] { - if (!ts.canHaveModifiers(node)) return []; - return (ts.getModifiers(node) ?? []).map((modifier) => ts.SyntaxKind[modifier.kind] ?? String(modifier.kind)); - } +function sourceLineRange(node: ts.Node, sourceFile: ts.SourceFile): { start: number; end: number } { + return { + start: sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1, + end: sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line + 1, + }; +} - function visit(node: ts.Node): void { - if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) { - add(node, { kind: 'module_dependency_fact', action: 'depend_on', object: node.moduleSpecifier.text, metadata: { importClause: node.importClause?.getText(sourceFile) ?? null } }); - } else if (ts.isExportDeclaration(node) && node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) { - add(node, { kind: 'module_dependency_fact', action: 'depend_on', object: node.moduleSpecifier.text, metadata: { reExport: true } }); - } else if ( - ts.isFunctionDeclaration(node) - || ts.isClassDeclaration(node) - || ts.isInterfaceDeclaration(node) - || ts.isTypeAliasDeclaration(node) - || ts.isEnumDeclaration(node) - || ts.isMethodDeclaration(node) - ) { - const symbol = nameOf(node); - if (symbol) { - const symbolModifiers = modifiers(node); - add(node, { - kind: 'symbol_fact', - action: 'declare', - object: symbol, - symbol, - metadata: { - symbolKind: ts.SyntaxKind[node.kind] ?? 'unknown', - modifiers: symbolModifiers, - exported: symbolModifiers.includes('ExportKeyword'), - }, - }); - scope.push(symbol); - ts.forEachChild(node, visit); - scope.pop(); - return; - } - } else if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) { - const declarationIsCallable = Boolean(node.initializer && (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer))); - if (declarationIsCallable || isTopLevel(node)) { - add(node, { - kind: 'symbol_fact', - action: 'declare', - object: node.name.text, - symbol: node.name.text, - metadata: { symbolKind: declarationIsCallable ? 'callable_variable' : 'variable' }, - }); - } - } else if (ts.isCallExpression(node)) { - const callee = node.expression.getText(sourceFile).slice(0, 300); - add(node, { - kind: 'call_fact', - action: 'call', - object: callee, - symbol: scope.length ? scope.join('.') : null, - metadata: { callee, argumentCount: node.arguments.length }, - }); - } - ts.forEachChild(node, visit); - } +function nodeExcerpt(node: ts.Node, sourceFile: ts.SourceFile): string { + return node.getText(sourceFile).slice(0, 2000); +} - visit(sourceFile); - const capabilities = boundedCapabilities(moduleCapabilities); - add(sourceFile, { +function recordModuleFact( + context: TypeScriptExtractionContext, + node: ts.SourceFile, + capabilities: string[], +): void { + addTypeScriptRecord({ + context, + node, kind: 'module_fact', action: 'declare', - object: relative, - text: moduleTopicText(relative, capabilities), + object: context.relative, + text: moduleTopicText(context.relative, capabilities), metadata: { aggregate: 'module', factGranularity: 'file', capabilities }, }); - return records; } function isTopLevel(node: ts.Node): boolean { diff --git a/src/extractors/communication-file-helpers.ts b/src/extractors/communication-file-helpers.ts new file mode 100644 index 0000000..cdc28c5 --- /dev/null +++ b/src/extractors/communication-file-helpers.ts @@ -0,0 +1,342 @@ +import path from 'node:path'; +import type { T2CConfig } from '../config/env.js'; +import { relativePosix } from '../core/io.js'; +import type { ExtractionResult } from '../core/types.js'; +import type { LoadedParticipantIdentityRegistry, ParticipantIdentityEntry } from '../communication/identity.js'; +import { + buildCommunicationRecords, + CommunicationType, + communicationSegments, + first, + inferIdentity, + isTicketEvidenceFile, + listValue, + looksLikeTicket, + normalizeRole, + normalizeType, + parseEnvelope, + resolveIdentity, + sameStrings, + validTimestamp, +} from './communication-helpers.js'; +import type { CommunicationRole } from './communication-helpers.js'; + +export interface CommunicationFileOutcome { + records: ExtractionResult['records']; + warnings: string[]; + communicationFiles: number; +} + +export async function extractCommunicationFile( + file: string, + projectRoot: string, + root: string, + options: { ticket?: string | null }, + config: T2CConfig, + readText: (filePath: string, maxBytes: number) => Promise, + identityRegistry: LoadedParticipantIdentityRegistry | null, +): Promise { + const scope = resolveFileScope(file, projectRoot, options.ticket); + if (!scope) return null; + + const readResult = await readCommunicationBody(file, config.maxFileBytes, readText); + if (!readResult.success) { + return { + records: [], + warnings: [`${scope.relativeToProject}: ${readResult.error}`], + communicationFiles: 0, + }; + } + + const envelope = parseEnvelope(readResult.body); + const inferred = inferIdentity(scope.relativeToProject); + if (shouldSkipCommunicationFile(scope.relativeToProject, options.ticket, scope.pathTicket, envelope, inferred, identityRegistry)) { + return null; + } + + const extracted = collectCommunicationMetadata( + scope.relativeToProject, + scope.pathTicket, + inferred, + envelope, + identityRegistry, + ); + + const localWarnings = buildLocalWarnings( + scope.relativeToProject, + extracted, + identityRegistry, + envelope, + ); + + const segmentResult = buildCommunicationSegments(scope.relativeToProject, extracted, envelope); + localWarnings.push(...segmentResult.warnings); + + const records = await buildCommunicationRecords( + root, + file, + extracted.role, + extracted.ticket, + extracted.participant, + extracted.identity, + extracted.recipient, + extracted.timestamp, + extracted.explicitPaths, + extracted.explicitSymbols, + extracted.gitAuthors, + extracted.displayName, + segmentResult.segments, + config, + envelope.bodyStartLine, + Boolean(identityRegistry), + identityRegistry ? relativePosix(root, identityRegistry.path) : null, + ); + + return { + records, + warnings: localWarnings, + communicationFiles: 1, + }; +} + +function shouldSkipCommunicationFile( + relativeToProject: string, + ticket: string | null | undefined, + pathTicket: string, + envelope: ReturnType, + inferred: ReturnType, + identityRegistry: LoadedParticipantIdentityRegistry | null, +): boolean { + const explicitEnvelope = hasExplicitEnvelopeMetadata(envelope); + if (!explicitEnvelope && isTicketEvidenceFile(relativeToProject)) return true; + if (!ticket && !identityRegistry && !looksLikeTicket(pathTicket) && !inferred.role && !explicitEnvelope) return true; + return false; +} + +function hasExplicitEnvelopeMetadata(envelope: ReturnType): boolean { + return Boolean( + first( + envelope.metadata.participant, + envelope.metadata.participant_id, + envelope.metadata['participant-id'], + envelope.metadata.role, + envelope.metadata.type, + envelope.metadata.ticket, + ), + ); +} + +function buildCommunicationSegments( + relativeToProject: string, + metadata: CommunicationMetadata, + envelope: ReturnType, +): { segments: ReturnType; warnings: string[] } { + const inferredRole = metadata.inferred.governanceParticipantFile && !metadata.explicitMessageType ? metadata.role : null; + const segments = communicationSegments(envelope.body, metadata.messageType, inferredRole); + if (segments.length === 0 && metadata.inferred.governanceParticipantFile && envelope.body.trim()) { + return { + segments, + warnings: [ + `${relativeToProject}: no recognized intent sections for ${metadata.role}:${metadata.participant}; ` + + `${metadata.role} participant must classify the content under a supported heading or add explicit type front matter`, + ], + }; + } + + return { segments, warnings: [] }; +} + +interface CommunicationMetadata { + declaredRole: CommunicationRole; + role: CommunicationRole; + participant: string; + identity: { entry: ParticipantIdentityEntry | null }; + displayName: string; + recipient: string | null; + timestamp: string | null; + explicitPaths: string[]; + explicitSymbols: string[]; + gitAuthors: string[]; + messageType: CommunicationType; + explicitMessageType: string | null; + ticket: string; + inferred: ReturnType; +} + +function resolveFileScope( + file: string, + projectRoot: string, + ticket?: string | null, +): { relativeToProject: string; pathTicket: string } | null { + const relativeToProject = relativePosix(projectRoot, file); + const segments = relativeToProject.split('/'); + const pathTicket = segments.length > 1 ? segments[0] ?? '' : ''; + if (!pathTicket) return null; + if (ticket && pathTicket.toLowerCase() !== ticket.toLowerCase()) return null; + return { relativeToProject, pathTicket }; +} + +async function readCommunicationBody( + file: string, + maxBytes: number, + readText: (filePath: string, maxBytes: number) => Promise, +): Promise<{ success: true; body: string } | { success: false; error: string }> { + try { + return { success: true, body: await readText(file, maxBytes) }; + } catch (error) { + return { success: false, error: error instanceof Error ? error.message : String(error) }; + } +} + +function collectCommunicationMetadata( + relativeToProject: string, + pathTicket: string, + inferred: ReturnType, + envelope: ReturnType, + identityRegistry: LoadedParticipantIdentityRegistry | null, +): CommunicationMetadata { + const declaredParticipant = first( + envelope.metadata.participant, + envelope.metadata.actor, + inferred.participant, + ); + const declaredRole = normalizeRole(first(envelope.metadata.role, inferred.role)); + const declaredParticipantId = first(envelope.metadata.participant_id, envelope.metadata['participant-id']); + const identity = resolveIdentity(identityRegistry?.byId ?? null, declaredParticipantId); + const participant = identity.entry?.id ?? declaredParticipantId ?? declaredParticipant ?? `unknown:${path.basename(relativeToProject)}`; + const role = identity.entry?.role ?? declaredRole; + const displayName = identity.entry?.displayName ?? declaredParticipant ?? participant; + const explicitMessageType = first(envelope.metadata.type, envelope.metadata.kind); + const messageType = normalizeType(first(explicitMessageType, inferred.type)); + const ticket = first(envelope.metadata.ticket, pathTicket) ?? pathTicket; + const recipient = first(envelope.metadata.recipient, envelope.metadata.to); + const rawTimestamp = first( + envelope.metadata.timestamp, + envelope.metadata.created_at, + envelope.metadata.createdat, + ); + const timestamp = validTimestamp(rawTimestamp); + const declaredGitAuthors = listValue(first( + envelope.metadata.git_authors, + envelope.metadata['git-authors'], + envelope.metadata.git_author, + )); + const gitAuthors = identity.entry ? [...identity.entry.gitAuthors] : declaredGitAuthors; + const explicitPaths = listValue(first( + envelope.metadata.paths, + envelope.metadata.target_paths, + envelope.metadata['target-paths'], + )); + const explicitSymbols = listValue(first( + envelope.metadata.symbols, + envelope.metadata.target_symbols, + envelope.metadata['target-symbols'], + )); + + return { + declaredRole, + role, + participant, + identity, + displayName, + recipient, + timestamp, + explicitPaths, + explicitSymbols, + gitAuthors, + messageType, + explicitMessageType, + ticket, + inferred, + }; +} + +function buildLocalWarnings( + relativeToProject: string, + metadata: CommunicationMetadata, + identityRegistry: LoadedParticipantIdentityRegistry | null, + envelope: ReturnType, +): string[] { + const warnings: string[] = []; + appendRoleAndParticipantWarnings(relativeToProject, metadata, warnings); + + if (identityRegistry && !metadata.identity.entry) { + appendIdentityWarnings(relativeToProject, metadata, identityRegistry, envelope, warnings); + } + appendRegistryAlignmentWarnings(relativeToProject, metadata, warnings); + appendA2aAgentWarnings(relativeToProject, metadata, envelope, warnings); + appendTimestampWarnings(relativeToProject, metadata, envelope, warnings); + + return warnings; +} + +function appendRoleAndParticipantWarnings( + relativeToProject: string, + metadata: CommunicationMetadata, + warnings: string[], +): void { + if (metadata.role === 'unknown') warnings.push(`${relativeToProject}: role must be human or agent`); + if (metadata.participant.startsWith('unknown:')) warnings.push(`${relativeToProject}: participant is missing`); +} + +function appendIdentityWarnings( + relativeToProject: string, + metadata: CommunicationMetadata, + identityRegistry: LoadedParticipantIdentityRegistry | null, + envelope: ReturnType, + warnings: string[], +): void { + if (!identityRegistry) return; + if (!first(envelope.metadata.participant_id, envelope.metadata['participant-id'])) { + warnings.push(`${relativeToProject}: participant-id is required when project/participants.json exists`); + } else { + if (!metadata.identity.entry) { + warnings.push(`${relativeToProject}: participant-id is not present in project/participants.json`); + } + } +} + +function appendRegistryAlignmentWarnings( + relativeToProject: string, + metadata: CommunicationMetadata, + warnings: string[], +): void { + if (!metadata.identity.entry) return; + if (metadata.declaredRole !== 'unknown' && metadata.declaredRole !== metadata.identity.entry.role) { + warnings.push(`${relativeToProject}: declared role conflicts with participant registry`); + } + if (metadata.identity.entry && metadata.gitAuthors.length + && !sameStrings(metadata.gitAuthors, metadata.identity.entry.gitAuthors)) { + warnings.push(`${relativeToProject}: git-authors differ from participant registry and were ignored`); + } +} + +function appendA2aAgentWarnings( + relativeToProject: string, + metadata: CommunicationMetadata, + envelope: ReturnType, + warnings: string[], +): void { + const declaredA2aAgentId = first(envelope.metadata.a2a_agent_id, envelope.metadata['a2a-agent-id']); + if (!declaredA2aAgentId) return; + const hasRegistryEntry = Boolean(metadata.identity.entry?.a2aAgentIds.includes(declaredA2aAgentId)); + if (!metadata.identity.entry || !hasRegistryEntry) { + warnings.push(`${relativeToProject}: a2a-agent-id is not assigned to participant-id in the registry`); + } +} + +function appendTimestampWarnings( + relativeToProject: string, + metadata: CommunicationMetadata, + envelope: ReturnType, + warnings: string[], +): void { + const rawTimestamp = first( + envelope.metadata.timestamp, + envelope.metadata.created_at, + envelope.metadata.createdat, + ); + if (!metadata.timestamp && rawTimestamp) { + warnings.push(`${relativeToProject}: invalid timestamp`); + } +} diff --git a/src/extractors/communication-helpers.ts b/src/extractors/communication-helpers.ts new file mode 100644 index 0000000..8ec0da4 --- /dev/null +++ b/src/extractors/communication-helpers.ts @@ -0,0 +1,320 @@ +import path from 'node:path'; +import type { T2CConfig } from '../config/env.js'; +import { + detectModality, + detectPolarity, + extractPaths, + extractSymbols, + extractTickets, + extractVersions, + inferObject, + splitIntentLines, +} from '../core/text.js'; +import type { EpistemicClass, IntentRecord, LifecycleStatus } from '../core/types.js'; +import { buildRecord } from '../core/record.js'; +import type { ParticipantIdentityEntry } from '../communication/identity.js'; +import { classifyAction } from '../tf/classifier.js'; +import { relativePosix } from '../core/io.js'; + +export type CommunicationRole = 'human' | 'agent' | 'unknown'; +export type CommunicationType = 'request' | 'plan' | 'decision' | 'message' | 'report' | 'result' | 'claim'; + +export interface CommunicationEnvelope { + body: string; + bodyStartLine: number; + metadata: Record; +} + +export interface InferredCommunicationIdentity { + role: string | null; + participant: string | null; + type: string | null; + governanceParticipantFile: boolean; +} + +export interface CommunicationSegment { + text: string; + line: number; + type: CommunicationType; +} + +export async function buildCommunicationRecords( + root: string, + file: string, + role: CommunicationRole, + ticket: string, + participant: string, + identity: { entry: ParticipantIdentityEntry | null }, + recipient: string | null, + timestamp: string | null, + explicitPaths: string[], + explicitSymbols: string[], + gitAuthors: string[], + displayName: string, + segments: CommunicationSegment[], + config: T2CConfig, + bodyStartLine: number, + hasIdentityRegistry: boolean, + participantRegistryPath: string | null, +): Promise { + const records: IntentRecord[] = []; + for (const segment of segments) { + const segmentType = segment.type; + const semantics = semanticsFor(segmentType, role); + const classified = await classifyAction(segment.text, config); + const action = segmentType === 'decision' && classified.action === 'unknown' ? 'approve' : classified.action; + const line = bodyStartLine + segment.line - 1; + const segmentTickets = [...new Set([ticket.toUpperCase(), ...extractTickets(segment.text)])]; + const symbols = [...new Set([...explicitSymbols, ...extractSymbols(segment.text)])] + .filter((symbol) => !segmentTickets.some((item) => item === symbol.toUpperCase() || item.startsWith(`${symbol.toUpperCase()}-`))); + + records.push(buildRecord({ + kind: `communication_${segmentType}`, + actor: participant, + action, + subject: recipient ? `to:${recipient}` : `ticket:${ticket}`, + object: inferObject(segment.text, action), + target: { + paths: [...new Set([...explicitPaths, ...extractPaths(segment.text)])], + symbols, + tickets: segmentTickets, + versions: extractVersions(segment.text), + }, + modality: segmentType === 'report' || segmentType === 'result' || segmentType === 'claim' + ? 'claimed' + : detectModality(segment.text), + polarity: detectPolarity(segment.text), + text: segment.text, + lifecycle: semantics.lifecycle, + sourceKind: 'agent_log', + sourcePath: relativePosix(root, file), + sourceLines: { start: line, end: line }, + extractor: 't2c/project-communication@1', + epistemicClass: semantics.epistemicClass, + confidence: role === 'unknown' || participant.startsWith('unknown:') ? 0.55 : 0.88, + basis: ['project_ticket_path', 'communication_front_matter', classified.basis], + observedAt: timestamp, + metadata: { + participant, + participantId: identity.entry?.id ?? null, + displayName, + participantRole: role, + messageType: segmentType, + ticket, + recipient, + gitAuthors, + a2aAgentIds: identity.entry?.a2aAgentIds ?? [], + humanAliases: identity.entry?.humanAliases ?? [], + identityResolved: hasIdentityRegistry ? Boolean(identity.entry) : role !== 'unknown' && !participant.startsWith('unknown:'), + identitySource: identity.entry ? 'registry' : hasIdentityRegistry ? 'unresolved' : 'legacy', + participantRegistry: participantRegistryPath, + llmUsed: false, + }, + })); + } + return records; +} + +export function parseEnvelope(value: string): CommunicationEnvelope { + const lines = value.split(/\r?\n/); + if (lines[0]?.trim() !== '---') return { body: value, bodyStartLine: 1, metadata: {} }; + const end = lines.slice(1).findIndex((line) => line.trim() === '---'); + if (end < 0) return { body: value, bodyStartLine: 1, metadata: {} }; + const metadata: Record = {}; + for (const line of lines.slice(1, end + 1)) { + const match = line.match(/^\s*([A-Za-z][A-Za-z0-9_-]*)\s*:\s*(.*?)\s*$/); + if (!match?.[1]) continue; + metadata[match[1].toLowerCase()] = unquote(match[2] ?? ''); + } + return { body: lines.slice(end + 2).join('\n'), bodyStartLine: end + 3, metadata }; +} + +export function inferIdentity(relativePath: string): InferredCommunicationIdentity { + const parts = relativePath.split('/'); + const basename = path.basename(relativePath, path.extname(relativePath)); + const governanceIdentity = inferGovernanceIdentityFromFilename(basename); + if (governanceIdentity) return governanceIdentity; + + return inferIdentityFromPathAndFilename(parts, basename); +} + +function inferGovernanceIdentityFromFilename(basename: string): InferredCommunicationIdentity | null { + const governance = basename.match(/^(user|human|ai|agent)-(.+)$/i); + if (!governance?.[1] || !governance[2] || /-logs$/i.test(governance[2])) return null; + const role = /^(user|human)$/i.test(governance[1]) ? 'human' : 'agent'; + return { + role, + participant: governance[2].toLowerCase(), + type: role === 'human' ? 'request' : 'plan', + governanceParticipantFile: true, + }; +} + +function inferIdentityFromPathAndFilename(parts: string[], basename: string): InferredCommunicationIdentity { + const fileParts = basename.split('.'); + const nestedRoleIndex = parts.findIndex((part) => /^(agents?|humans?|users?)$/i.test(part)); + const nestedRole = nestedRoleIndex >= 0 ? parts[nestedRoleIndex] ?? null : null; + const nestedParticipant = nestedRoleIndex >= 0 ? parts[nestedRoleIndex + 1] ?? null : null; + const filenameRole = /^(agent|human|user)$/i.test(fileParts[0] ?? '') ? fileParts[0] ?? null : null; + return { + role: filenameRole ?? nestedRole, + participant: filenameRole ? fileParts[1] ?? null : nestedParticipant, + type: filenameRole ? fileParts[2] ?? null : fileParts.find((part) => isCommunicationType(part)) ?? null, + governanceParticipantFile: false, + }; +} + +export function isTicketEvidenceFile(relativePath: string): boolean { + const basename = path.basename(relativePath).toLowerCase(); + return [ + 'readme.md', + 'preprompt.md', + 'changelog.md', + 'audit.md', + 'baseline.md', + 'logs.txt', + ].includes(basename) + || /^iteration-\d+(?:-[a-z0-9-]+)?\.md$/.test(basename) + || /^(?:ai|agent)-.+-logs\.txt$/.test(basename); +} + +export function communicationSegments( + body: string, + defaultType: CommunicationType, + governanceRole: CommunicationRole | null, +): CommunicationSegment[] { + if (!governanceRole || governanceRole === 'unknown') { + return splitIntentLines(body) + .filter((segment) => !isCommunicationNoise(segment.text)) + .map((segment) => ({ ...segment, type: defaultType })); + } + const output: CommunicationSegment[] = []; + const lines = body.split(/\r?\n/); + let sectionType: CommunicationType | null = null; + let pending: { text: string; line: number; type: CommunicationType } | null = null; + const flush = (): void => { + if (!pending) return; + const item = pending; + pending = null; + if (/^(?:none|brak)[.!]?$/i.test(item.text.trim())) return; + for (const segment of splitIntentLines(item.text)) { + if (isCommunicationNoise(segment.text)) continue; + output.push({ text: segment.text, line: item.line + segment.line - 1, type: item.type }); + } + }; + for (let index = 0; index < lines.length; index += 1) { + const raw = lines[index] ?? ''; + const heading = raw.match(/^\s{0,3}#{2,6}\s+(.+?)\s*$/)?.[1]; + if (heading) { + flush(); + sectionType = governanceSectionType(heading, governanceRole); + continue; + } + if (!sectionType) { + flush(); + continue; + } + if (!raw.trim()) { + flush(); + continue; + } + const startsListItem = /^\s*(?:[-*+]|\d+[.)]|\[[ xX]\])\s+/.test(raw); + if (startsListItem) flush(); + const cleaned = raw + .replace(/^\s*[-*+]\s+/, '') + .replace(/^\s*\d+[.)]\s+/, '') + .replace(/^\s*\[[ xX]\]\s+/, '') + .trim(); + if (!cleaned) continue; + if (pending) pending.text = `${pending.text} ${cleaned}`; + else pending = { text: cleaned, line: index + 1, type: sectionType }; + } + flush(); + return output; +} + +export function looksLikeTicket(value: string): boolean { + return /^[A-Za-z][A-Za-z0-9]*-\d+(?:[-_][A-Za-z0-9]+)*$/.test(value); +} + +export function normalizeRole(value: string | null): CommunicationRole { + if (/^agents?$/i.test(value ?? '')) return 'agent'; + if (/^(human|humans|user|users|person)$/i.test(value ?? '')) return 'human'; + return 'unknown'; +} + +export function normalizeType(value: string | null): CommunicationType { + const normalized = value?.toLowerCase(); + return isCommunicationType(normalized ?? '') ? normalized as CommunicationType : 'message'; +} + +export function isCommunicationType(value: string): boolean { + return ['request', 'plan', 'decision', 'message', 'report', 'result', 'claim'].includes(value.toLowerCase()); +} + +export function first(...values: Array): string | null { + return values.find((value) => typeof value === 'string' && Boolean(value.trim()))?.trim() ?? null; +} + +export function listValue(value: string | null): string[] { + if (!value) return []; + const stripped = value.replace(/^\[|\]$/g, ''); + return [...new Set(stripped.split(',').map((item) => unquote(item.trim())).filter(Boolean))].sort(); +} + +export function validTimestamp(value: string | null): string | null { + if (!value) return null; + const parsed = new Date(value); + return Number.isNaN(parsed.valueOf()) ? null : parsed.toISOString(); +} + +export function resolveIdentity( + byId: Map | null, + participantId: string | null, +): { entry: ParticipantIdentityEntry | null } { + if (!byId || !participantId) return { entry: null }; + // Stable IDs are canonical and exact. Display names and aliases are never + // searched here, so a similar-looking name cannot acquire another identity. + return { entry: byId.get(participantId) ?? null }; +} + +export function sameStrings(left: string[], right: string[]): boolean { + const normalize = (values: string[]): string[] => values.map((value) => value.trim().toLowerCase()).sort(); + return JSON.stringify(normalize(left)) === JSON.stringify(normalize(right)); +} + +function isCommunicationNoise(value: string): boolean { + const normalized = value.trim(); + return /^#{1,6}\s*\d+(?:[.):_-]\d+)*[.):_-]?\s*$/.test(normalized) + || /^(?:-{3,}|_{3,}|\*{3,})$/.test(normalized); +} + +function governanceSectionType(heading: string, role: Exclude): CommunicationType | null { + const normalized = heading.toLowerCase().replace(/[^a-z0-9Δ…Δ‡Δ™Ε‚Ε„Γ³Ε›ΕΊΕΌ]+/gi, ' ').trim(); + if (role === 'human') { + if (/\b(decision|decisions|decyzj|approval|zatwierdzen)/i.test(normalized)) return 'decision'; + if (/\b(instruction|instructions|request|requirements?|goal|scope|polecen|wymagan|zakres|cel)\b/i.test(normalized)) { + return 'request'; + } + return null; + } + if (/\b(actual changes?|result|results|report|unfinished|blockers?|wykonan|zmian|wynik|raport|blokad)\b/i.test(normalized)) { + return 'report'; + } + if (/\b(understanding|execution plan|plan|scope|guardrails?|risks?|hypotheses|code locations?|rozumien|zakres|ryzyk)\b/i.test(normalized)) { + return 'plan'; + } + if (/\b(approval|zatwierdzen)\b/i.test(normalized)) return 'claim'; + return null; +} + +function semanticsFor(type: CommunicationType, role: CommunicationRole): { lifecycle: LifecycleStatus; epistemicClass: EpistemicClass } { + if (type === 'plan') return { lifecycle: 'planned', epistemicClass: 'plan' }; + if (type === 'report' || type === 'result' || type === 'claim') return { lifecycle: 'implemented', epistemicClass: 'claim' }; + if (type === 'decision') return { lifecycle: 'completed', epistemicClass: 'declaration' }; + return { lifecycle: 'proposed', epistemicClass: role === 'agent' ? 'claim' : 'declaration' }; +} + +function unquote(value: string): string { + return value.replace(/^['"]|['"]$/g, '').trim(); +} diff --git a/src/extractors/communication.ts b/src/extractors/communication.ts index 1671c37..cf42880 100644 --- a/src/extractors/communication.ts +++ b/src/extractors/communication.ts @@ -1,24 +1,12 @@ import path from 'node:path'; import type { T2CConfig } from '../config/env.js'; import { pathExists, readText, relativePosix, walkFiles } from '../core/io.js'; -import { buildRecord } from '../core/record.js'; +import type { ExtractionResult } from '../core/types.js'; import { assertPathWithinRoot } from '../core/security.js'; -import { - detectModality, - detectPolarity, - extractPaths, - extractSymbols, - extractTickets, - extractVersions, - inferObject, - splitIntentLines, -} from '../core/text.js'; -import type { EpistemicClass, ExtractionResult, LifecycleStatus } from '../core/types.js'; -import { classifyAction } from '../tf/classifier.js'; -import { loadParticipantIdentityRegistry, type ParticipantIdentityEntry } from '../communication/identity.js'; +import { loadParticipantIdentityRegistry } from '../communication/identity.js'; +import { extractCommunicationFile } from './communication-file-helpers.js'; -export type CommunicationRole = 'human' | 'agent' | 'unknown'; -export type CommunicationType = 'request' | 'plan' | 'decision' | 'message' | 'report' | 'result' | 'claim'; +export type { CommunicationRole, CommunicationType } from './communication-helpers.js'; export interface CommunicationExtractionOptions { root: string; @@ -26,25 +14,6 @@ export interface CommunicationExtractionOptions { ticket?: string | null; } -interface CommunicationEnvelope { - body: string; - bodyStartLine: number; - metadata: Record; -} - -interface InferredCommunicationIdentity { - role: string | null; - participant: string | null; - type: string | null; - governanceParticipantFile: boolean; -} - -interface CommunicationSegment { - text: string; - line: number; - type: CommunicationType; -} - /** * Converts append-only human/agent communication under project// to * canonical agent_log records. Front matter is intentionally parsed without a @@ -74,349 +43,21 @@ export async function extractCommunicationIntent( let communicationFiles = 0; for (const file of files) { - const relativeToProject = relativePosix(projectRoot, file); - const parts = relativeToProject.split('/'); - const pathTicket = parts.length > 1 ? parts[0] ?? '' : ''; - if (!pathTicket) continue; - if (options.ticket && pathTicket.toLowerCase() !== options.ticket.toLowerCase()) continue; - - let body: string; - try { - body = await readText(file, config.maxFileBytes); - } catch (error) { - warnings.push(`${relativeToProject}: ${error instanceof Error ? error.message : String(error)}`); - continue; - } - const envelope = parseEnvelope(body); - const inferred = inferIdentity(relativeToProject); - const explicitEnvelope = Boolean(first( - envelope.metadata.participant, - envelope.metadata.participant_id, - envelope.metadata['participant-id'], - envelope.metadata.role, - envelope.metadata.type, - envelope.metadata.ticket, - )); - if (!explicitEnvelope && isTicketEvidenceFile(relativeToProject)) continue; - if (!options.ticket && !identityRegistry && !looksLikeTicket(pathTicket) - && !inferred.role && !explicitEnvelope) continue; - communicationFiles += 1; - const declaredParticipant = first(envelope.metadata.participant, envelope.metadata.actor, inferred.participant); - const declaredRole = normalizeRole(first(envelope.metadata.role, inferred.role)); - const declaredParticipantId = first(envelope.metadata.participant_id, envelope.metadata['participant-id']); - const identity = resolveIdentity(identityRegistry?.byId ?? null, declaredParticipantId); - const participant = identity.entry?.id ?? declaredParticipantId ?? declaredParticipant ?? `unknown:${path.basename(file)}`; - const role = identity.entry?.role ?? declaredRole; - const displayName = identity.entry?.displayName ?? declaredParticipant ?? participant; - const explicitMessageType = first(envelope.metadata.type, envelope.metadata.kind); - const messageType = normalizeType(first(explicitMessageType, inferred.type)); - const ticket = first(envelope.metadata.ticket, pathTicket) ?? pathTicket; - const recipient = first(envelope.metadata.recipient, envelope.metadata.to); - const timestamp = validTimestamp(first(envelope.metadata.timestamp, envelope.metadata.created_at, envelope.metadata.createdat)); - const declaredGitAuthors = listValue(first(envelope.metadata.git_authors, envelope.metadata['git-authors'], envelope.metadata.git_author)); - const gitAuthors = identity.entry ? [...identity.entry.gitAuthors] : declaredGitAuthors; - const declaredA2aAgentId = first(envelope.metadata.a2a_agent_id, envelope.metadata['a2a-agent-id']); - const explicitPaths = listValue(first(envelope.metadata.paths, envelope.metadata.target_paths, envelope.metadata['target-paths'])); - const explicitSymbols = listValue(first(envelope.metadata.symbols, envelope.metadata.target_symbols, envelope.metadata['target-symbols'])); - - if (role === 'unknown') warnings.push(`${relativeToProject}: role must be human or agent`); - if (participant.startsWith('unknown:')) warnings.push(`${relativeToProject}: participant is missing`); - if (identityRegistry && !declaredParticipantId) { - warnings.push(`${relativeToProject}: participant-id is required when project/participants.json exists`); - } else if (identityRegistry && !identity.entry) { - warnings.push(`${relativeToProject}: participant-id is not present in project/participants.json`); - } - if (identity.entry && declaredRole !== 'unknown' && declaredRole !== identity.entry.role) { - warnings.push(`${relativeToProject}: declared role conflicts with participant registry`); - } - if (identity.entry && declaredGitAuthors.length - && !sameStrings(declaredGitAuthors, identity.entry.gitAuthors)) { - warnings.push(`${relativeToProject}: git-authors differ from participant registry and were ignored`); - } - if (declaredA2aAgentId && (!identity.entry || !identity.entry.a2aAgentIds.includes(declaredA2aAgentId))) { - warnings.push(`${relativeToProject}: a2a-agent-id is not assigned to participant-id in the registry`); - } - if (!timestamp && first(envelope.metadata.timestamp, envelope.metadata.created_at, envelope.metadata.createdat)) { - warnings.push(`${relativeToProject}: invalid timestamp`); - } - - const segments = communicationSegments( - envelope.body, - messageType, - inferred.governanceParticipantFile && !explicitMessageType ? role : null, + const fileResult = await extractCommunicationFile( + file, + projectRoot, + root, + options, + config, + readText, + identityRegistry, ); - if (segments.length === 0 - && inferred.governanceParticipantFile - && envelope.body.trim()) { - warnings.push( - `${relativeToProject}: no recognized intent sections for ${role}:${participant}; ` - + `${role} participant must classify the content under a supported heading or add explicit type front matter`, - ); - } - for (const segment of segments) { - const segmentType = segment.type; - const semantics = semanticsFor(segmentType, role); - const classified = await classifyAction(segment.text, config); - const action = segmentType === 'decision' && classified.action === 'unknown' ? 'approve' : classified.action; - const line = envelope.bodyStartLine + segment.line - 1; - const tickets = [...new Set([ticket.toUpperCase(), ...extractTickets(segment.text)])]; - const symbols = [...new Set([...explicitSymbols, ...extractSymbols(segment.text)])] - .filter((symbol) => !tickets.some((item) => item === symbol.toUpperCase() || item.startsWith(`${symbol.toUpperCase()}-`))); - records.push(buildRecord({ - kind: `communication_${segmentType}`, - actor: participant, - action, - subject: recipient ? `to:${recipient}` : `ticket:${ticket}`, - object: inferObject(segment.text, action), - target: { - paths: [...new Set([...explicitPaths, ...extractPaths(segment.text)])], - symbols, - tickets, - versions: extractVersions(segment.text), - }, - modality: segmentType === 'report' || segmentType === 'result' || segmentType === 'claim' - ? 'claimed' - : detectModality(segment.text), - polarity: detectPolarity(segment.text), - text: segment.text, - lifecycle: semantics.lifecycle, - sourceKind: 'agent_log', - sourcePath: relativePosix(root, file), - sourceLines: { start: line, end: line }, - extractor: 't2c/project-communication@1', - epistemicClass: semantics.epistemicClass, - confidence: role === 'unknown' || participant.startsWith('unknown:') ? 0.55 : 0.88, - basis: ['project_ticket_path', 'communication_front_matter', classified.basis], - observedAt: timestamp, - metadata: { - participant, - participantId: identity.entry?.id ?? null, - displayName, - participantRole: role, - messageType: segmentType, - ticket, - recipient, - gitAuthors, - a2aAgentIds: identity.entry?.a2aAgentIds ?? [], - humanAliases: identity.entry?.humanAliases ?? [], - identityResolved: identityRegistry ? Boolean(identity.entry) : role !== 'unknown' && !participant.startsWith('unknown:'), - identitySource: identity.entry ? 'registry' : identityRegistry ? 'unresolved' : 'legacy', - participantRegistry: identityRegistry ? relativePosix(root, identityRegistry.path) : null, - llmUsed: false, - }, - })); - } + if (!fileResult) continue; + communicationFiles += fileResult.communicationFiles; + records.push(...fileResult.records); + warnings.push(...fileResult.warnings); } if (records.length === 0 && communicationFiles > 0) warnings.push('No intent-like communication statements were found'); return { records, warnings: [...new Set(warnings)].sort() }; } - -function resolveIdentity( - byId: Map | null, - participantId: string | null, -): { entry: ParticipantIdentityEntry | null } { - if (!byId || !participantId) return { entry: null }; - // Stable IDs are canonical and exact. Display names and aliases are never - // searched here, so a similar-looking name cannot acquire another identity. - return { entry: byId.get(participantId) ?? null }; -} - -function sameStrings(left: string[], right: string[]): boolean { - const normalize = (values: string[]): string[] => values.map((value) => value.trim().toLowerCase()).sort(); - return JSON.stringify(normalize(left)) === JSON.stringify(normalize(right)); -} - -function parseEnvelope(value: string): CommunicationEnvelope { - const lines = value.split(/\r?\n/); - if (lines[0]?.trim() !== '---') return { body: value, bodyStartLine: 1, metadata: {} }; - const end = lines.slice(1).findIndex((line) => line.trim() === '---'); - if (end < 0) return { body: value, bodyStartLine: 1, metadata: {} }; - const metadata: Record = {}; - for (const line of lines.slice(1, end + 1)) { - const match = line.match(/^\s*([A-Za-z][A-Za-z0-9_-]*)\s*:\s*(.*?)\s*$/); - if (!match?.[1]) continue; - metadata[match[1].toLowerCase()] = unquote(match[2] ?? ''); - } - return { body: lines.slice(end + 2).join('\n'), bodyStartLine: end + 3, metadata }; -} - -function inferIdentity(relativePath: string): InferredCommunicationIdentity { - const parts = relativePath.split('/'); - const basename = path.basename(relativePath, path.extname(relativePath)); - const governance = basename.match(/^(user|human|ai|agent)-(.+)$/i); - if (governance?.[1] && governance[2] && !/-logs$/i.test(governance[2])) { - const role = /^(user|human)$/i.test(governance[1]) ? 'human' : 'agent'; - return { - role, - participant: governance[2].toLowerCase(), - type: role === 'human' ? 'request' : 'plan', - governanceParticipantFile: true, - }; - } - const fileParts = basename.split('.'); - const nestedRoleIndex = parts.findIndex((part) => /^(agents?|humans?|users?)$/i.test(part)); - const nestedRole = nestedRoleIndex >= 0 ? parts[nestedRoleIndex] ?? null : null; - const nestedParticipant = nestedRoleIndex >= 0 ? parts[nestedRoleIndex + 1] ?? null : null; - const filenameRole = /^(agent|human|user)$/i.test(fileParts[0] ?? '') ? fileParts[0] ?? null : null; - return { - role: filenameRole ?? nestedRole, - participant: filenameRole ? fileParts[1] ?? null : nestedParticipant, - type: filenameRole ? fileParts[2] ?? null : fileParts.find((part) => isCommunicationType(part)) ?? null, - governanceParticipantFile: false, - }; -} - -/** - * Governance tickets contain specifications, raw logs and captured results - * beside participant files. Those artifacts are evidence for the ticket, not - * utterances by an anonymous participant. Explicit communication front matter - * still wins, so a deliberately authored file with one of these names remains - * available to callers. - */ -function isTicketEvidenceFile(relativePath: string): boolean { - const basename = path.basename(relativePath).toLowerCase(); - return [ - 'readme.md', - 'preprompt.md', - 'changelog.md', - 'audit.md', - 'baseline.md', - 'logs.txt', - ].includes(basename) - || /^iteration-\d+(?:-[a-z0-9-]+)?\.md$/.test(basename) - || /^(?:ai|agent)-.+-logs\.txt$/.test(basename); -} - -/** - * The governance-standard participant files are structured documents rather - * than one homogeneous message. Heading ownership is deterministic: - * instructions/decisions belong to the human, while an agent's plan and actual - * changes remain different epistemic classes. Metadata and ownership boilerplate - * are deliberately skipped. - */ -function communicationSegments( - body: string, - defaultType: CommunicationType, - governanceRole: CommunicationRole | null, -): CommunicationSegment[] { - if (!governanceRole || governanceRole === 'unknown') { - return splitIntentLines(body) - .filter((segment) => !isCommunicationNoise(segment.text)) - .map((segment) => ({ ...segment, type: defaultType })); - } - const output: CommunicationSegment[] = []; - const lines = body.split(/\r?\n/); - let sectionType: CommunicationType | null = null; - let pending: { text: string; line: number; type: CommunicationType } | null = null; - const flush = (): void => { - if (!pending) return; - const item = pending; - pending = null; - if (/^(?:none|brak)[.!]?$/i.test(item.text.trim())) return; - for (const segment of splitIntentLines(item.text)) { - if (isCommunicationNoise(segment.text)) continue; - output.push({ text: segment.text, line: item.line + segment.line - 1, type: item.type }); - } - }; - for (let index = 0; index < lines.length; index += 1) { - const raw = lines[index] ?? ''; - const heading = raw.match(/^\s{0,3}#{2,6}\s+(.+?)\s*$/)?.[1]; - if (heading) { - flush(); - sectionType = governanceSectionType(heading, governanceRole); - continue; - } - if (!sectionType) { - flush(); - continue; - } - if (!raw.trim()) { - flush(); - continue; - } - const startsListItem = /^\s*(?:[-*+]|\d+[.)]|\[[ xX]\])\s+/.test(raw); - if (startsListItem) flush(); - const cleaned = raw - .replace(/^\s*[-*+]\s+/, '') - .replace(/^\s*\d+[.)]\s+/, '') - .replace(/^\s*\[[ xX]\]\s+/, '') - .trim(); - if (!cleaned) continue; - if (pending) pending.text = `${pending.text} ${cleaned}`; - else pending = { text: cleaned, line: index + 1, type: sectionType }; - } - flush(); - return output; -} - -function isCommunicationNoise(value: string): boolean { - const normalized = value.trim(); - return /^#{1,6}\s*\d+(?:[.):_-]\d+)*[.):_-]?\s*$/.test(normalized) - || /^(?:-{3,}|_{3,}|\*{3,})$/.test(normalized); -} - -function governanceSectionType(heading: string, role: Exclude): CommunicationType | null { - const normalized = heading.toLowerCase().replace(/[^a-z0-9Δ…Δ‡Δ™Ε‚Ε„Γ³Ε›ΕΊΕΌ]+/gi, ' ').trim(); - if (role === 'human') { - if (/\b(decision|decisions|decyzj|approval|zatwierdzen)/i.test(normalized)) return 'decision'; - if (/\b(instruction|instructions|request|requirements?|goal|scope|polecen|wymagan|zakres|cel)\b/i.test(normalized)) { - return 'request'; - } - return null; - } - if (/\b(actual changes?|result|results|report|unfinished|blockers?|wykonan|zmian|wynik|raport|blokad)\b/i.test(normalized)) { - return 'report'; - } - if (/\b(understanding|execution plan|plan|scope|guardrails?|risks?|hypotheses|code locations?|rozumien|zakres|ryzyk)\b/i.test(normalized)) { - return 'plan'; - } - if (/\b(approval|zatwierdzen)\b/i.test(normalized)) return 'claim'; - return null; -} - -function looksLikeTicket(value: string): boolean { - return /^[A-Za-z][A-Za-z0-9]*-\d+(?:[-_][A-Za-z0-9]+)*$/.test(value); -} - -function normalizeRole(value: string | null): CommunicationRole { - if (/^agents?$/i.test(value ?? '')) return 'agent'; - if (/^(human|humans|user|users|person)$/i.test(value ?? '')) return 'human'; - return 'unknown'; -} - -function normalizeType(value: string | null): CommunicationType { - const normalized = value?.toLowerCase(); - return isCommunicationType(normalized ?? '') ? normalized as CommunicationType : 'message'; -} - -function isCommunicationType(value: string): boolean { - return ['request', 'plan', 'decision', 'message', 'report', 'result', 'claim'].includes(value.toLowerCase()); -} - -function semanticsFor(type: CommunicationType, role: CommunicationRole): { lifecycle: LifecycleStatus; epistemicClass: EpistemicClass } { - if (type === 'plan') return { lifecycle: 'planned', epistemicClass: 'plan' }; - if (type === 'report' || type === 'result' || type === 'claim') return { lifecycle: 'implemented', epistemicClass: 'claim' }; - if (type === 'decision') return { lifecycle: 'completed', epistemicClass: 'declaration' }; - return { lifecycle: 'proposed', epistemicClass: role === 'agent' ? 'claim' : 'declaration' }; -} - -function first(...values: Array): string | null { - return values.find((value) => typeof value === 'string' && Boolean(value.trim()))?.trim() ?? null; -} - -function listValue(value: string | null): string[] { - if (!value) return []; - const stripped = value.replace(/^\[|\]$/g, ''); - return [...new Set(stripped.split(',').map((item) => unquote(item.trim())).filter(Boolean))].sort(); -} - -function unquote(value: string): string { - return value.replace(/^['"]|['"]$/g, '').trim(); -} - -function validTimestamp(value: string | null): string | null { - if (!value) return null; - const parsed = new Date(value); - return Number.isNaN(parsed.valueOf()) ? null : parsed.toISOString(); -} diff --git a/src/extractors/docs-deterministic.ts b/src/extractors/docs-deterministic.ts index def2085..b3a0346 100644 --- a/src/extractors/docs-deterministic.ts +++ b/src/extractors/docs-deterministic.ts @@ -101,69 +101,134 @@ function convertDocument(root: string, filePath: string, body: string, resolvePa const relative = relativePosix(root, filePath); const lines = body.split(/\r?\n/); const records: IntentRecord[] = []; - const headings: string[] = []; - let fence: string | null = null; + const context: DocumentationContext = { + relative, + headings: [], + fence: null, + }; for (let index = 0; index < lines.length; index += 1) { const raw = lines[index] ?? ''; + const lineResult = handleDocumentationLine(raw, index, lines, context, resolvePaths); + records.push(...lineResult.records); + index = lineResult.nextIndex; + } - // Fenced blocks are transparent to statement scanning: their content is - // code, not documentation prose, and would otherwise produce records for - // every commented line inside an example. - const fenceMatch = raw.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_+-]*)/); - if (fenceMatch) { - const marker = fenceMatch[1] ?? ''; - if (fence === null) { - fence = marker; - const language = (fenceMatch[2] ?? '').trim(); - const record = codeBlockRecord(relative, headings, language, index + 1); - if (record) records.push(record); - } else if (marker.startsWith(fence.slice(0, 3))) { - fence = null; - } - continue; - } - if (fence !== null) continue; + return records; +} - const heading = raw.match(/^\s{0,3}(#{1,6})\s+(.+?)\s*#*\s*$/); - if (heading) { - const level = heading[1]?.length ?? 1; - const title = heading[2]?.trim() ?? ''; - headings.splice(level - 1); - headings[level - 1] = title; - if (level <= MAX_HEADING_LEVEL && title) { - records.push(statementRecord(relative, headings, title, { start: index + 1, end: index + 1 }, 'heading', resolvePaths)); - } - continue; - } +interface DocumentationContext { + relative: string; + headings: string[]; + fence: string | null; +} - const bullet = raw.match(/^\s*[-*+]\s+(?:\[[ xX]\]\s+)?(.+?)\s*$/); - if (bullet) { - const block = readListBlock(lines, index, bullet[1] ?? ''); - index = block.endIndex; - const record = qualifyingStatement(relative, headings, block.text, { start: block.startLine, end: block.endLine }, resolvePaths); - if (record) records.push(record); - continue; - } +interface LineResult { + nextIndex: number; + records: IntentRecord[]; + consumed: boolean; +} - if (raw.trim()) { - // Prose wraps across lines. Reading one line at a time cuts sentences - // mid-clause and drops the very words that name the target β€” the same - // defect the TODO and CHANGELOG converters had. - const paragraph = readParagraph(lines, index); - index = paragraph.endIndex; - const record = qualifyingStatement( - relative, - headings, - paragraph.text, - { start: paragraph.startLine, end: paragraph.endLine }, - resolvePaths, - ); - if (record) records.push(record); - } +function handleDocumentationLine( + raw: string, + index: number, + lines: string[], + context: DocumentationContext, + resolvePaths: PathMapper, +): LineResult { + const headingRecord = parseFenceBlock(raw, index, context, resolvePaths); + if (headingRecord.consumed) return headingRecord; + + const sectionHeading = parseSectionHeading(raw, index, context, resolvePaths); + if (sectionHeading.consumed) return sectionHeading; + + const bulletRecord = parseBulletStatement(raw, index, lines, context, resolvePaths); + if (bulletRecord.consumed) return bulletRecord; + + const paragraphResult = parseParagraphStatement(raw, index, lines, context, resolvePaths); + if (paragraphResult.consumed) return paragraphResult; + + return { nextIndex: index, records: [], consumed: false }; +} + +function parseFenceBlock( + raw: string, + index: number, + context: DocumentationContext, + resolvePaths: PathMapper, +): LineResult { + const match = raw.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_+-]*)/); + if (!match) return { nextIndex: index, records: [], consumed: false }; + const marker = match[1] ?? ''; + if (context.fence === null) { + context.fence = marker; + const language = (match[2] ?? '').trim(); + const record = codeBlockRecord(context.relative, context.headings, language, index + 1); + return { nextIndex: index, records: record ? [record] : [], consumed: true }; } + if (marker.startsWith(context.fence.slice(0, 3))) context.fence = null; + return { nextIndex: index, records: [], consumed: true }; +} - return records; +function parseSectionHeading( + raw: string, + index: number, + context: DocumentationContext, + resolvePaths: PathMapper, +): LineResult { + if (context.fence !== null) return { nextIndex: index, records: [], consumed: false }; + const heading = raw.match(/^\s{0,3}(#{1,6})\s+(.+?)\s*#*\s*$/); + if (!heading) return { nextIndex: index, records: [], consumed: false }; + const level = heading[1]?.length ?? 1; + const title = heading[2]?.trim() ?? ''; + context.headings.splice(level - 1); + context.headings[level - 1] = title; + if (level > MAX_HEADING_LEVEL || !title) return { nextIndex: index, records: [], consumed: true }; + const record = statementRecord(context.relative, context.headings, title, { start: index + 1, end: index + 1 }, 'heading', resolvePaths); + return { nextIndex: index, records: [record], consumed: true }; +} + +function parseBulletStatement( + raw: string, + index: number, + lines: string[], + context: DocumentationContext, + resolvePaths: PathMapper, +): LineResult { + if (context.fence !== null) return { nextIndex: index, records: [], consumed: false }; + const bullet = raw.match(/^\s*[-*+]\s+(?:\[[ xX]\]\s+)?(.+?)\s*$/); + if (!bullet) return { nextIndex: index, records: [], consumed: false }; + const block = readListBlock(lines, index, bullet[1] ?? ''); + const record = qualifyingStatement( + context.relative, + context.headings, + block.text, + { start: block.startLine, end: block.endLine }, + resolvePaths, + ); + return { nextIndex: block.endIndex, records: record ? [record] : [], consumed: true }; +} + +function parseParagraphStatement( + raw: string, + index: number, + lines: string[], + context: DocumentationContext, + resolvePaths: PathMapper, +): LineResult { + if (context.fence !== null || !raw.trim()) return { nextIndex: index, records: [], consumed: false }; + // Prose wraps across lines. Reading one line at a time cuts sentences + // mid-clause and drops the very words that name the target β€” the same + // defect the TODO and CHANGELOG converters had. + const paragraph = readParagraph(lines, index); + const record = qualifyingStatement( + context.relative, + context.headings, + paragraph.text, + { start: paragraph.startLine, end: paragraph.endLine }, + resolvePaths, + ); + return { nextIndex: paragraph.endIndex, records: record ? [record] : [], consumed: true }; } /** Consecutive non-blank prose lines, joined into one statement. */ diff --git a/src/extractors/git.ts b/src/extractors/git.ts index 168d314..d5081aa 100644 --- a/src/extractors/git.ts +++ b/src/extractors/git.ts @@ -1,4 +1,6 @@ import { execFile } from 'node:child_process'; +import { promises as fs } from 'node:fs'; +import type { Dirent } from 'node:fs'; import { promisify } from 'node:util'; import path from 'node:path'; import type { T2CConfig } from '../config/env.js'; @@ -8,6 +10,13 @@ import type { ExtractionResult, IntentRecord, JsonValue } from '../core/types.js import { classifyAction } from '../tf/classifier.js'; const execFileAsync = promisify(execFile); +const MAX_DISCOVERED_REPOSITORIES = 100; +const MAX_DISCOVERY_DIRECTORIES = 10_000; +const REPOSITORY_READ_CONCURRENCY = 4; +const DISCOVERY_EXCLUDED_DIRECTORIES = new Set([ + '.cache', '.intent', '.venv', 'backups', 'build', 'coverage', 'dist', + 'node_modules', 'tmp', 'vendor', 'work', +]); interface GitCommit { sha: string; @@ -31,14 +40,45 @@ export interface GitExtractionOptions { export async function extractGitIntent(options: GitExtractionOptions, config: T2CConfig): Promise { const root = path.resolve(options.root); const count = options.count ?? config.gitCommitCount; - const warnings: string[] = []; - try { - const inside = (await runGit(root, ['rev-parse', '--is-inside-work-tree'])).trim(); - if (inside !== 'true') return { records: [], warnings: [`${root} is not a Git work tree`] }; - } catch { + if (await isGitWorkTree(root)) { + return extractRepositoryGitIntent(root, count, config, ''); + } + + const discovery = await discoverGitRepositories(root); + if (!discovery.repositories.length) { return { records: [], warnings: [`Git repository not available at ${root}`] }; } + const results = await mapWithConcurrency( + discovery.repositories, + REPOSITORY_READ_CONCURRENCY, + async (repository): Promise => { + try { + return await extractRepositoryGitIntent(repository.root, count, config, repository.prefix); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { + records: [], + warnings: [`Git history unavailable at ${repository.root}: ${message}`], + }; + } + }, + ); + + return { + records: results.flatMap((result) => result.records), + warnings: [...discovery.warnings, ...results.flatMap((result) => result.warnings)], + }; +} + +async function extractRepositoryGitIntent( + root: string, + count: number, + config: T2CConfig, + repositoryPrefix: string, +): Promise { + const warnings: string[] = []; + // A repository with no commits yet β€” the state `t2c init` leaves behind, and // the one `t2c watch` hits first β€” makes `git log` exit non-zero. That is an // absent source, not a failed run, so it degrades to a warning. @@ -63,7 +103,8 @@ export async function extractGitIntent(options: GitExtractionOptions, config: T2 const text = `${commit.subject}\n${commit.body}`.trim(); const classified = await classifyAction(text, config); const inferredSymbols = extractChangedSymbols(diff); - const targetPaths = [...new Set(changedFiles.map((item) => item.path))].sort(); + const scopedFiles = changedFiles.map((item) => scopeChangedFile(item, repositoryPrefix)); + const targetPaths = [...new Set(scopedFiles.map((item) => item.path))].sort(); const docOnly = targetPaths.length > 0 && targetPaths.every(isDocumentationPath); records.push(buildRecord({ kind: 'commit_intent_claim', @@ -83,7 +124,7 @@ export async function extractGitIntent(options: GitExtractionOptions, config: T2 sourceKind: 'git', revision: commit.sha, commitIndex: index + 1, - extractor: 't2c/git@1', + extractor: 't2c/git@2', rawExcerpt: text, epistemicClass: 'claim', confidence: Math.min(0.94, classified.confidence + (targetPaths.length > 0 ? 0.08 : 0)), @@ -93,7 +134,8 @@ export async function extractGitIntent(options: GitExtractionOptions, config: T2 author: commit.author, body: commit.body, docOnly, - changedFiles: changedFiles as unknown as JsonValue, + repositoryRoot: repositoryPrefix || '.', + changedFiles: scopedFiles as unknown as JsonValue, additions: stats.additions, deletions: stats.deletions, filesChanged: targetPaths.length, @@ -101,10 +143,185 @@ export async function extractGitIntent(options: GitExtractionOptions, config: T2 }, })); } - if (commits.length < count) warnings.push(`Requested ${count} commits, repository contains ${commits.length}`); + if (commits.length < count) { + warnings.push(`${root}: requested ${count} commits, repository contains ${commits.length}`); + } return { records, warnings }; } +interface DiscoveredRepository { + root: string; + prefix: string; +} + +interface RepositoryDiscoveryResult { + repositories: DiscoveredRepository[]; + warnings: string[]; +} + +interface DiscoveryState { + root: string; + cursor: number; + directoriesVisited: number; + queue: DiscoveredRepository[]; + repositories: DiscoveredRepository[]; + warnings: string[]; +} + +async function discoverGitRepositories(root: string): Promise { + const state = createDiscoveryState(root); + while (hasMoreDiscoveryWork(state)) { + const current = takeNextDiscoveryDirectory(state); + if (!current) continue; + const entries = await readDiscoveryEntries(current.root, state.warnings); + if (!entries) continue; + await processDiscoveryDirectory(current, filterDiscoveryChildren(entries), state); + } + + return finishDiscovery(root, state); +} + +function createDiscoveryState(root: string): DiscoveryState { + return { + root, + cursor: 0, + directoriesVisited: 0, + queue: [{ root, prefix: '' }], + repositories: [], + warnings: [], + }; +} + +function hasMoreDiscoveryWork(state: DiscoveryState): boolean { + return state.cursor < state.queue.length + && state.repositories.length < MAX_DISCOVERED_REPOSITORIES + && state.directoriesVisited < MAX_DISCOVERY_DIRECTORIES; +} + +function takeNextDiscoveryDirectory(state: DiscoveryState): DiscoveredRepository | null { + const current = state.queue[state.cursor]; + state.cursor += 1; + if (!current) return null; + state.directoriesVisited += 1; + return current; +} + +async function readDiscoveryEntries( + directory: string, + warnings: string[], +): Promise[] | null> { + try { + return await fs.readdir(directory, { withFileTypes: true }); + } catch (error) { + warnings.push(`Git repository discovery unavailable at ${directory}: ${error instanceof Error ? error.message : String(error)}`); + return null; + } +} + +function filterDiscoveryChildren(entries: Dirent[]): Dirent[] { + return entries + .filter((entry) => entry.isDirectory() && !entry.isSymbolicLink()) + .filter((entry) => !entry.name.startsWith('.') && !DISCOVERY_EXCLUDED_DIRECTORIES.has(entry.name)) + .sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0); +} + +async function processDiscoveryDirectory( + current: DiscoveredRepository, + directories: Dirent[], + state: DiscoveryState, +): Promise { + for (const entry of directories) { + const child = path.join(current.root, entry.name); + const prefix = resolveDiscoveryPrefix(current.prefix, entry.name); + const marker = await gitMarkerState(child); + if (marker === 'unsafe') { + state.warnings.push(`Git repository marker is a symlink at ${child}`); + continue; + } + if (marker === 'candidate') { + await registerDiscoveredRepository(child, prefix, state); + if (state.repositories.length >= MAX_DISCOVERED_REPOSITORIES) break; + // A checkout owns everything below it, including submodules, vendored + // repositories and temporary coding-agent worktrees. + continue; + } + state.queue.push({ root: child, prefix }); + } +} + +async function registerDiscoveredRepository( + directory: string, + prefix: string, + state: DiscoveryState, +): Promise { + if (await isGitWorkTree(directory)) { + state.repositories.push({ root: directory, prefix }); + return; + } + state.warnings.push(`Git repository marker is invalid at ${directory}`); +} + +function resolveDiscoveryPrefix(base: string, childName: string): string { + return base ? path.posix.join(base, childName) : childName; +} + +function finishDiscovery(root: string, state: DiscoveryState): RepositoryDiscoveryResult { + if (state.repositories.length >= MAX_DISCOVERED_REPOSITORIES) { + state.warnings.push(`Git repository discovery stopped at ${MAX_DISCOVERED_REPOSITORIES} repositories under ${root}`); + } else if (state.directoriesVisited >= MAX_DISCOVERY_DIRECTORIES && state.cursor < state.queue.length) { + state.warnings.push(`Git repository discovery stopped after ${MAX_DISCOVERY_DIRECTORIES} directories under ${root}`); + } + return { repositories: state.repositories, warnings: state.warnings }; +} + +async function gitMarkerState(root: string): Promise<'none' | 'candidate' | 'unsafe'> { + try { + const marker = await fs.lstat(path.join(root, '.git')); + if (marker.isSymbolicLink()) return 'unsafe'; + return marker.isDirectory() || marker.isFile() ? 'candidate' : 'none'; + } catch { + return 'none'; + } +} + +async function isGitWorkTree(root: string): Promise { + try { + return (await runGit(root, ['rev-parse', '--is-inside-work-tree'])).trim() === 'true'; + } catch { + return false; + } +} + +function scopeChangedFile(file: ChangedFile, repositoryPrefix: string): ChangedFile { + if (!repositoryPrefix) return file; + return { + ...file, + path: path.posix.join(repositoryPrefix, file.path.replace(/\\/g, '/')), + ...(file.previousPath + ? { previousPath: path.posix.join(repositoryPrefix, file.previousPath.replace(/\\/g, '/')) } + : {}), + }; +} + +async function mapWithConcurrency( + values: T[], + concurrency: number, + action: (value: T) => Promise, +): Promise { + const results = new Array(values.length); + let cursor = 0; + const workers = Array.from({ length: Math.min(concurrency, values.length) }, async () => { + while (cursor < values.length) { + const index = cursor; + cursor += 1; + const value = values[index]; + if (value !== undefined) results[index] = await action(value); + } + }); + await Promise.all(workers); + return results; +} + async function runGit(root: string, args: string[], maxBuffer = 4 * 1024 * 1024): Promise { const result = await execFileAsync('git', ['-C', root, ...args], { encoding: 'utf8', diff --git a/src/extractors/markdown-llm-helpers.ts b/src/extractors/markdown-llm-helpers.ts new file mode 100644 index 0000000..1eef97c --- /dev/null +++ b/src/extractors/markdown-llm-helpers.ts @@ -0,0 +1,383 @@ +import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { T2CConfig } from '../config/env.js'; +import { pathExists } from '../core/io.js'; +import { buildRecord, withRecordGeneration } from '../core/record.js'; +import type { + ExtractionResult, + IntentAction, + IntentRecord, + LlmResponseMetadata, + PipelineStageAudit, +} from '../core/types.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import { OpenRouterClient } from '../llm/openrouter.js'; +import { StructuredResponseError, structuredSchema as s, type StructuredSchema } from '../llm/structured-schema.js'; +import { T2C_VERSION } from '../version.js'; +import { mapConcurrent } from './docs-chunks.js'; + +export interface MarkdownEnrichment { + recordId: string; + actor: string | null; + action: IntentAction; + object: string; + polarity: 'positive' | 'negative'; + confidence: number; + basis: string[]; + target: { paths: string[]; symbols: string[]; tickets: string[]; versions: string[] }; + acceptanceEvidence: string[]; +} + +export interface MarkdownResponse { + enrichments: MarkdownEnrichment[]; +} + +export interface CoveredBatch { + enrichments: Map; + metadataByRecord: Map; + responses: LlmResponseMetadata[]; +} + +export const MARKDOWN_ACTIONS = [ + 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', + 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', +] as const satisfies readonly IntentAction[]; + +/** Keeps one provider request bounded even for repository-sized backlogs. */ +export const MARKDOWN_LLM_BATCH_RECORDS = 32; + +export class MarkdownAttemptError extends Error { + constructor(readonly failure: unknown, readonly responses: LlmResponseMetadata[]) { + super(failure instanceof Error ? failure.message : String(failure)); + this.name = 'MarkdownAttemptError'; + } +} + +export async function enrichMarkdownRecords( + client: OpenRouterClient, + prompt: string, + model: string, + records: IntentRecord[], + concurrency: number, +): Promise<{ enrichments: Map; responseByRecord: Map; responses: LlmResponseMetadata[] }> { + const responses: LlmResponseMetadata[] = []; + const enrichments = new Map(); + const responseByRecord = new Map(); + const batches: IntentRecord[][] = []; + for (let offset = 0; offset < records.length; offset += MARKDOWN_LLM_BATCH_RECORDS) { + batches.push(records.slice(offset, offset + MARKDOWN_LLM_BATCH_RECORDS)); + } + const outcomes = await mapConcurrent(batches, concurrency, async (batch) => { + try { + const corrected = await enrichBatchCovering(client, prompt, model, batch); + return { ok: true as const, batch, corrected }; + } catch (error) { + return { + ok: false as const, + failure: error instanceof MarkdownAttemptError ? error.failure : error, + responses: error instanceof MarkdownAttemptError + ? error.responses + : [], + }; + } + }); + responses.push(...outcomes.flatMap((outcome) => (outcome.ok ? outcome.corrected.responses : outcome.responses))); + const failed = outcomes.find((outcome) => !outcome.ok); + if (failed && !failed.ok) throw new MarkdownAttemptError(failed.failure, responses); + + for (const outcome of outcomes) { + if (!outcome.ok) continue; + const { batch, corrected } = outcome; + for (const record of batch) { + const enrichment = corrected.enrichments.get(record.id); + if (!enrichment) continue; + enrichments.set(record.id, enrichment); + const metadata = corrected.metadataByRecord.get(record.id); + if (metadata) responseByRecord.set(record.id, metadata); + } + } + return { enrichments, responseByRecord, responses }; +} + +/** + * Enriches every record of a batch, splitting the batch when a model truncates. + * + * Truncation is length-driven, so re-asking the same 32 records the same way + * reproduces it; halving the uncovered remainder is what actually converges. + * Splitting also keeps `require-llm` honest: partial coverage would otherwise + * be a silent per-record deterministic fallback inside a run that promised + * none. A single record the model still will not enrich is a real failure. + */ +async function enrichBatchCovering( + client: OpenRouterClient, + prompt: string, + model: string, + batch: IntentRecord[], +): Promise { + let attempt: Awaited>; + try { + attempt = await enrichMarkdownBatchWithCorrection(client, [ + { role: 'system', content: prompt }, + { role: 'user', content: JSON.stringify({ records: batch.map(promptRecord) }) }, + ], markdownResponseContract(batch.length), model, batch); + } catch (error) { + if (batch.length === 1) throw error; + return await enrichSplitBatch(client, prompt, model, batch, emptyCoverage(error)); + } + // Provenance is per record, not per batch: a record answered by the split + // retry must carry that response's ID, or the audit would credit it to a + // response that never mentioned it. + const metadataByRecord = new Map( + [...attempt.enrichments.keys()].map((recordId) => [recordId, attempt.metadata]), + ); + + const uncovered = batch.filter((record) => !attempt.enrichments.has(record.id)); + if (uncovered.length === 0) { + return { enrichments: attempt.enrichments, metadataByRecord, responses: attempt.responses }; + } + if (batch.length === 1) { + throw new MarkdownAttemptError( + new Error(`Structured response omitted the only requested record: ${batch[0]?.id}`), + attempt.responses, + ); + } + return await enrichSplitBatch(client, prompt, model, uncovered, { + enrichments: attempt.enrichments, + metadataByRecord, + responses: attempt.responses, + }); +} + +/** Re-asks for exactly the uncovered records, in halves, merging what returns. */ +async function enrichSplitBatch( + client: OpenRouterClient, + prompt: string, + model: string, + uncovered: IntentRecord[], + covered: CoveredBatch, +): Promise { + const half = Math.ceil(uncovered.length / 2); + const halves = [uncovered.slice(0, half), uncovered.slice(half)].filter((part) => part.length > 0); + const parts: CoveredBatch[] = []; + for (const part of halves) parts.push(await enrichBatchCovering(client, prompt, model, part)); + + return { + enrichments: new Map([ + ...covered.enrichments, + ...parts.flatMap((part) => [...part.enrichments]), + ]), + metadataByRecord: new Map([ + ...covered.metadataByRecord, + ...parts.flatMap((part) => [...part.metadataByRecord]), + ]), + responses: [...covered.responses, ...parts.flatMap((part) => part.responses)], + }; +} + +/** The responses a failed attempt still produced, with nothing covered. */ +function emptyCoverage(error: unknown): CoveredBatch { + return { + enrichments: new Map(), + metadataByRecord: new Map(), + responses: error instanceof MarkdownAttemptError ? error.responses : [], + }; +} + +async function enrichMarkdownBatchWithCorrection( + client: OpenRouterClient, + baseMessages: Array<{ role: 'system' | 'user'; content: string }>, + contract: StructuredSchema, + model: string, + batch: IntentRecord[], +): Promise<{ + enrichments: Map; + metadata: LlmResponseMetadata; + responses: LlmResponseMetadata[]; +}> { + const responses: LlmResponseMetadata[] = []; + let correction: string | null = null; + for (let attempt = 0; attempt < 2; attempt += 1) { + try { + const completion = await client.chatStructuredWithMetadata([ + ...baseMessages, + ...(correction ? [{ + role: 'user' as const, + content: `The previous response was rejected: ${correction}\n` + + 'Correct exactly that violation and re-emit the full object. Do not add, rename, or omit properties.\n' + + `The exact required JSON Schema is: ${JSON.stringify(contract.jsonSchema)}`, + }] : []), + ], 't2c_markdown_intent_enrichment', contract, model); + responses.push(completion.metadata); + try { + return { + enrichments: validateEnrichments(completion.value.enrichments, batch), + metadata: completion.metadata, + responses, + }; + } catch (error) { + if (attempt === 0) { + correction = error instanceof Error ? error.message : String(error); + continue; + } + throw new MarkdownAttemptError(error, [...responses]); + } + } catch (error) { + if (error instanceof MarkdownAttemptError) throw error; + if (error instanceof StructuredResponseError) { + if (error.responseMetadata) responses.push(error.responseMetadata); + if (attempt === 0) { + correction = error.message; + continue; + } + } + throw new MarkdownAttemptError(error, [...responses]); + } + } + throw new MarkdownAttemptError(new Error('Markdown correction retry budget exhausted'), responses); +} + +export function promptRecord(record: IntentRecord): Record { + return { + recordId: record.id, + sourceKind: record.source.kind, + sourcePath: record.source.path, + sourceLines: record.source.lines, + text: record.statement.text, + structural: { + lifecycle: record.lifecycle.status, + modality: record.statement.modality, + subject: record.statement.subject, + checked: record.metadata.checked ?? null, + headingPath: record.metadata.headingPath ?? [], + version: record.metadata.version ?? null, + releaseDate: record.metadata.releaseDate ?? null, + category: record.metadata.category ?? null, + }, + }; +} + +export function validateEnrichments(values: MarkdownEnrichment[] | undefined, records: IntentRecord[]): Map { + if (!Array.isArray(values)) throw new Error('Structured response does not contain enrichments'); + const expected = new Set(records.map((record) => record.id)); + const output = new Map(); + for (const value of values) { + if (!expected.has(value.recordId)) throw new Error(`Structured response contains unknown recordId: ${value.recordId}`); + if (output.has(value.recordId)) throw new Error(`Structured response duplicates recordId: ${value.recordId}`); + output.set(value.recordId, value); + } + // Partial coverage is not a violation here; the caller re-asks for exactly + // the records the model left out. + return output; +} + +export function enrichRecord( + record: IntentRecord, + enrichment: MarkdownEnrichment, + config: T2CConfig, + response: LlmResponseMetadata, +): IntentRecord { + const target = { + paths: [...record.statement.target.paths, ...(enrichment.target?.paths ?? [])], + symbols: [...record.statement.target.symbols, ...(enrichment.target?.symbols ?? [])], + tickets: [...record.statement.target.tickets, ...(enrichment.target?.tickets ?? [])], + versions: [...record.statement.target.versions, ...(enrichment.target?.versions ?? [])], + }; + return buildRecord({ + kind: record.statement.kind, + actor: enrichment.actor ?? record.statement.actor, + action: enrichment.action, + subject: record.statement.subject, + object: enrichment.object.trim() || record.statement.object, + target, + modality: record.statement.modality, + polarity: enrichment.polarity, + text: record.statement.text, + lifecycle: record.lifecycle.status, + sourceKind: record.source.kind, + sourcePath: record.source.path, + sourceLines: record.source.lines, + revision: record.source.revision, + symbol: record.source.symbol, + commitIndex: record.source.commitIndex, + extractor: record.source.kind === 'todo' + ? 't2c/markdown-todo-openrouter@1' + : 't2c/markdown-changelog-openrouter@1', + rawExcerpt: record.source.rawExcerpt, + epistemicClass: record.epistemic.class, + confidence: Math.min(0.94, Math.max(0.05, enrichment.confidence)), + basis: [...record.epistemic.basis, 'openrouter_markdown_enrichment', ...enrichment.basis], + observedAt: record.observedAt, + generation: { + requested: 'llm', used: 'llm', provider: response.provider ?? 'openrouter', + model: response.model ?? config.openRouter.markdownModel, responseId: response.responseId, + }, + metadata: { + ...record.metadata, + llmUsed: true, + acceptanceEvidence: enrichment.acceptanceEvidence, + response, + }, + }); +} + +export function markDeterministic(records: IntentRecord[], degraded: boolean, fallbackReason: string | null): IntentRecord[] { + return records.map((record) => { + const marked = withRecordGeneration(record, { + requested: degraded ? 'llm' : 'deterministic', used: 'deterministic', degraded, fallbackReason, + }); + return { ...marked, metadata: { ...marked.metadata, llmUsed: false } }; + }); +} + +export interface StageAuditInput { + status: PipelineStageAudit['status']; + requestedMode: PipelineStageAudit['requestedMode']; + effectiveMode: PipelineStageAudit['effectiveMode']; + degraded: boolean; + result: ExtractionResult; + model: string | null; + reason: PipelineStageAudit['reason']; + durationMs: number; + responses: LlmResponseMetadata[]; + config: T2CConfig; +} + +export function stageAudit(input: StageAuditInput): PipelineStageAudit { + return { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(input.config, input.model), + status: input.status, + requestedMode: input.requestedMode, + effectiveMode: input.effectiveMode, + degraded: input.degraded, + recordCount: input.result.records.length, + warningCount: input.result.warnings.length, + model: input.model, + durationMs: input.durationMs, + reason: input.reason, + responses: input.responses, + }; +} + +export async function readPrompt(name: string): Promise { + const promptPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../prompts', name); + if (!(await pathExists(promptPath))) throw new Error(`Prompt not found: ${promptPath}`); + return fs.readFile(promptPath, 'utf8'); +} + +function markdownResponseContract(batchSize: number): StructuredSchema { + const strings = () => s.array(s.string()); + const enrichment = s.object({ + recordId: s.string(), + actor: s.nullableString(), + action: s.enum(MARKDOWN_ACTIONS), + object: s.string(), + polarity: s.enum(['positive', 'negative']), + confidence: s.number({ minimum: 0, maximum: 0.94 }), + basis: strings(), + target: s.object({ paths: strings(), symbols: strings(), tickets: strings(), versions: strings() }), + acceptanceEvidence: strings(), + }) satisfies StructuredSchema; + return s.object({ enrichments: s.array(enrichment, { minItems: 1, maxItems: batchSize }) }); +} diff --git a/src/extractors/markdown-llm.ts b/src/extractors/markdown-llm.ts index 0bfbf31..e7671c2 100644 --- a/src/extractors/markdown-llm.ts +++ b/src/extractors/markdown-llm.ts @@ -1,45 +1,24 @@ -import { promises as fs } from 'node:fs'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; import type { T2CConfig } from '../config/env.js'; -import { pathExists } from '../core/io.js'; -import { buildRecord, withRecordGeneration } from '../core/record.js'; +import { extractMarkdownIntent, type MarkdownExtractionOptions } from './markdown.js'; import type { ExtractionResult, - IntentAction, - IntentRecord, LlmExtractionMode, LlmResponseMetadata, PipelineStageAudit, } from '../core/types.js'; import { classifyLlmFailure, rejectedLlmResponseMetadata, type LlmFailureReason } from '../llm/failure.js'; -import { openRouterAuditConfiguration } from '../llm/audit.js'; import { OpenRouterClient } from '../llm/openrouter.js'; -import { StructuredResponseError, structuredSchema as s, type StructuredSchema } from '../llm/structured-schema.js'; -import { T2C_VERSION } from '../version.js'; -import { mapConcurrent } from './docs-chunks.js'; -import { extractMarkdownIntent, type MarkdownExtractionOptions } from './markdown.js'; - -interface MarkdownEnrichment { - recordId: string; - actor: string | null; - action: IntentAction; - object: string; - polarity: 'positive' | 'negative'; - confidence: number; - basis: string[]; - target: { paths: string[]; symbols: string[]; tickets: string[]; versions: string[] }; - acceptanceEvidence: string[]; -} - -interface MarkdownResponse { enrichments: MarkdownEnrichment[] } - -const MARKDOWN_ACTIONS = [ - 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', - 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', -] as const satisfies readonly IntentAction[]; -/** Keeps one provider request bounded even for repository-sized backlogs. */ -export const MARKDOWN_LLM_BATCH_RECORDS = 32; +import { + enrichMarkdownRecords, + MARKDOWN_LLM_BATCH_RECORDS, + enrichRecord, + markDeterministic, + MarkdownAttemptError, + readPrompt, + stageAudit, +} from './markdown-llm-helpers.js'; + +export { MARKDOWN_LLM_BATCH_RECORDS }; export interface AuditedMarkdownExtractionResult extends ExtractionResult { audit: PipelineStageAudit; @@ -62,62 +41,57 @@ export async function extractMarkdownIntentAudited( if (deterministic.records.length === 0) { return { ...deterministic, - audit: stageAudit('skipped', mode === 'deterministic' ? 'deterministic' : 'llm', 'none', false, deterministic, null, { - code: 'NO_MARKDOWN_RECORDS', message: 'No TODO or CHANGELOG records were available for enrichment', - }, Date.now() - startedAt, [], config), + audit: stageAudit({ + status: 'skipped', + requestedMode: mode === 'deterministic' ? 'deterministic' : 'llm', + effectiveMode: 'none', + degraded: false, + result: deterministic, + model: null, + reason: { code: 'NO_MARKDOWN_RECORDS', message: 'No TODO or CHANGELOG records were available for enrichment' }, + durationMs: Date.now() - startedAt, + responses: [], + config, + }), }; } + if (mode === 'deterministic') { const result = { ...deterministic, records: markDeterministic(deterministic.records, false, null) }; return { ...result, - audit: stageAudit('succeeded', 'deterministic', 'deterministic', false, result, null, null, Date.now() - startedAt, [], config), + audit: stageAudit({ + status: 'succeeded', + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + result, + model: null, + reason: null, + durationMs: Date.now() - startedAt, + responses: [], + config, + }), }; } const client = new OpenRouterClient(config.openRouter); if (!client.isConfigured()) { return fallbackOrThrow(deterministic, config, mode, startedAt, { - code: 'LLM_NOT_CONFIGURED', message: 'OPENROUTER_API_KEY is not configured', + code: 'LLM_NOT_CONFIGURED', + message: 'OPENROUTER_API_KEY is not configured', }); } - const responses: LlmResponseMetadata[] = []; try { const prompt = await readPrompt('markdown-to-intent.system.md'); - const enrichments = new Map(); - const responseByRecord = new Map(); - const batches: IntentRecord[][] = []; - for (let offset = 0; offset < deterministic.records.length; offset += MARKDOWN_LLM_BATCH_RECORDS) { - batches.push(deterministic.records.slice(offset, offset + MARKDOWN_LLM_BATCH_RECORDS)); - } - const outcomes = await mapConcurrent(batches, config.markdownConcurrency, async (batch) => { - try { - const corrected = await enrichBatchCovering(client, prompt, config.openRouter.markdownModel, batch); - return { ok: true as const, batch, corrected }; - } catch (error) { - return { - ok: false as const, - failure: error instanceof MarkdownAttemptError ? error.failure : error, - responses: error instanceof MarkdownAttemptError - ? error.responses - : rejectedLlmResponseMetadata(error), - }; - } - }); - responses.push(...outcomes.flatMap((outcome) => ( - outcome.ok ? outcome.corrected.responses : outcome.responses - ))); - const failed = outcomes.find((outcome) => !outcome.ok); - if (failed && !failed.ok) throw new MarkdownAttemptError(failed.failure, []); - for (const outcome of outcomes) { - if (!outcome.ok) continue; - const { batch, corrected } = outcome; - for (const record of batch) { - enrichments.set(record.id, corrected.enrichments.get(record.id)!); - responseByRecord.set(record.id, corrected.metadataByRecord.get(record.id)!); - } - } + const { enrichments, responseByRecord, responses } = await enrichMarkdownRecords( + client, + prompt, + config.openRouter.markdownModel, + deterministic.records, + config.markdownConcurrency, + ); const result: ExtractionResult = { records: deterministic.records.map((record) => enrichRecord( record, @@ -129,176 +103,35 @@ export async function extractMarkdownIntentAudited( }; return { ...result, - audit: stageAudit('succeeded', 'llm', 'llm', false, result, config.openRouter.markdownModel, null, Date.now() - startedAt, responses, config), + audit: stageAudit({ + status: 'succeeded', + requestedMode: 'llm', + effectiveMode: 'llm', + degraded: false, + result, + model: config.openRouter.markdownModel, + reason: null, + durationMs: Date.now() - startedAt, + responses, + config, + }), }; } catch (error) { const failure = error instanceof MarkdownAttemptError ? error.failure : error; const failedResponses = error instanceof MarkdownAttemptError - ? [...responses, ...error.responses] - : [...responses, ...rejectedLlmResponseMetadata(error)]; + ? error.responses + : rejectedLlmResponseMetadata(error); return fallbackOrThrow( - deterministic, config, mode, startedAt, classifyLlmFailure(failure), failedResponses, + deterministic, + config, + mode, + startedAt, + classifyLlmFailure(failure), + failedResponses, ); } } -class MarkdownAttemptError extends Error { - constructor(readonly failure: unknown, readonly responses: LlmResponseMetadata[]) { - super(failure instanceof Error ? failure.message : String(failure)); - this.name = 'MarkdownAttemptError'; - } -} - -/** - * Enriches every record of a batch, splitting the batch when a model truncates. - * - * Truncation is length-driven, so re-asking the same 32 records the same way - * reproduces it; halving the uncovered remainder is what actually converges. - * Splitting also keeps `require-llm` honest: partial coverage would otherwise - * be a silent per-record deterministic fallback inside a run that promised - * none. A single record the model still will not enrich is a real failure. - */ -async function enrichBatchCovering( - client: OpenRouterClient, - prompt: string, - model: string, - batch: IntentRecord[], -): Promise { - let attempt: Awaited>; - try { - attempt = await enrichMarkdownBatchWithCorrection(client, [ - { role: 'system', content: prompt }, - { role: 'user', content: JSON.stringify({ records: batch.map(promptRecord) }) }, - ], markdownResponseContract(batch.length), model, batch); - } catch (error) { - // A malformed response is the same problem as a truncated one, one step - // earlier: measured live, `google/gemini-3.6-flash` answers a 32-record - // batch of this repository with prose instead of JSON, and the corrective - // retry re-asks the same oversized question. Fewer records per request is - // the remedy for both, so the failure splits like a short answer does β€” - // except for a single record, where it is simply a failure. - if (batch.length === 1) throw error; - return await enrichSplitBatch(client, prompt, model, batch, emptyCoverage(error)); - } - // Provenance is per record, not per batch: a record answered by the split - // retry must carry that response's ID, or the audit would credit it to a - // response that never mentioned it. - const metadataByRecord = new Map( - [...attempt.enrichments.keys()].map((recordId) => [recordId, attempt.metadata]), - ); - - const uncovered = batch.filter((record) => !attempt.enrichments.has(record.id)); - if (uncovered.length === 0) { - return { enrichments: attempt.enrichments, metadataByRecord, responses: attempt.responses }; - } - if (batch.length === 1) { - throw new MarkdownAttemptError( - new Error(`Structured response omitted the only requested record: ${batch[0]?.id}`), - attempt.responses, - ); - } - - return await enrichSplitBatch(client, prompt, model, uncovered, { - enrichments: attempt.enrichments, - metadataByRecord, - responses: attempt.responses, - }); -} - -/** Re-asks for exactly the uncovered records, in halves, merging what returns. */ -async function enrichSplitBatch( - client: OpenRouterClient, - prompt: string, - model: string, - uncovered: IntentRecord[], - covered: CoveredBatch, -): Promise { - const half = Math.ceil(uncovered.length / 2); - const halves = [uncovered.slice(0, half), uncovered.slice(half)].filter((part) => part.length > 0); - const parts: CoveredBatch[] = []; - for (const part of halves) parts.push(await enrichBatchCovering(client, prompt, model, part)); - - return { - enrichments: new Map([ - ...covered.enrichments, - ...parts.flatMap((part) => [...part.enrichments]), - ]), - metadataByRecord: new Map([ - ...covered.metadataByRecord, - ...parts.flatMap((part) => [...part.metadataByRecord]), - ]), - responses: [...covered.responses, ...parts.flatMap((part) => part.responses)], - }; -} - -/** The responses a failed attempt still produced, with nothing covered. */ -function emptyCoverage(error: unknown): CoveredBatch { - return { - enrichments: new Map(), - metadataByRecord: new Map(), - responses: error instanceof MarkdownAttemptError ? error.responses : [], - }; -} - -interface CoveredBatch { - enrichments: Map; - metadataByRecord: Map; - responses: LlmResponseMetadata[]; -} - -async function enrichMarkdownBatchWithCorrection( - client: OpenRouterClient, - baseMessages: Array<{ role: 'system' | 'user'; content: string }>, - contract: StructuredSchema, - model: string, - batch: IntentRecord[], -): Promise<{ - enrichments: Map; - metadata: LlmResponseMetadata; - responses: LlmResponseMetadata[]; -}> { - const responses: LlmResponseMetadata[] = []; - let correction: string | null = null; - for (let attempt = 0; attempt < 2; attempt += 1) { - try { - const completion = await client.chatStructuredWithMetadata([ - ...baseMessages, - ...(correction ? [{ - role: 'user' as const, - content: `The previous response was rejected: ${correction}\n` - + 'Correct exactly that violation and re-emit the full object. Do not add, rename, or omit properties.\n' - + `The exact required JSON Schema is: ${JSON.stringify(contract.jsonSchema)}`, - }] : []), - ], 't2c_markdown_intent_enrichment', contract, model); - responses.push(completion.metadata); - try { - return { - enrichments: validateEnrichments(completion.value.enrichments, batch), - metadata: completion.metadata, - responses, - }; - } catch (error) { - if (attempt === 0) { - correction = error instanceof Error ? error.message : String(error); - continue; - } - throw new MarkdownAttemptError(error, [...responses]); - } - } catch (error) { - if (error instanceof MarkdownAttemptError) throw error; - if (error instanceof StructuredResponseError) { - if (error.responseMetadata) responses.push(error.responseMetadata); - if (attempt === 0) { - correction = error.message; - continue; - } - } - throw new MarkdownAttemptError(error, [...responses]); - } - } - throw new MarkdownAttemptError(new Error('Markdown correction retry budget exhausted'), responses); -} - async function fallbackOrThrow( deterministic: ExtractionResult, config: T2CConfig, @@ -307,7 +140,18 @@ async function fallbackOrThrow( reason: LlmFailureReason, responses: LlmResponseMetadata[] = [], ): Promise { - const failed = stageAudit('failed', 'llm', 'none', true, { records: [], warnings: [] }, config.openRouter.markdownModel, reason, Date.now() - startedAt, responses, config); + const failed = stageAudit({ + status: 'failed', + requestedMode: 'llm', + effectiveMode: 'none', + degraded: true, + result: { records: [], warnings: [] }, + model: config.openRouter.markdownModel, + reason, + durationMs: Date.now() - startedAt, + responses, + config, + }); if (mode === 'require-llm') { throw new MarkdownLlmRequiredError(`TODO/CHANGELOG -> DSL requires LLM: ${reason.message}`, failed); } @@ -318,141 +162,17 @@ async function fallbackOrThrow( }; return { ...result, - audit: stageAudit('fallback', 'llm', 'deterministic', true, result, config.openRouter.markdownModel, reason, Date.now() - startedAt, responses, config), - }; -} - -function promptRecord(record: IntentRecord): Record { - return { - recordId: record.id, - sourceKind: record.source.kind, - sourcePath: record.source.path, - sourceLines: record.source.lines, - text: record.statement.text, - structural: { - lifecycle: record.lifecycle.status, - modality: record.statement.modality, - subject: record.statement.subject, - checked: record.metadata.checked ?? null, - headingPath: record.metadata.headingPath ?? [], - version: record.metadata.version ?? null, - releaseDate: record.metadata.releaseDate ?? null, - category: record.metadata.category ?? null, - }, - }; -} - -function validateEnrichments(values: MarkdownEnrichment[] | undefined, records: IntentRecord[]): Map { - if (!Array.isArray(values)) throw new Error('Structured response does not contain enrichments'); - const expected = new Set(records.map((record) => record.id)); - const output = new Map(); - for (const value of values) { - if (!expected.has(value.recordId)) throw new Error(`Structured response contains unknown recordId: ${value.recordId}`); - if (output.has(value.recordId)) throw new Error(`Structured response duplicates recordId: ${value.recordId}`); - output.set(value.recordId, value); - } - // Partial coverage is not a violation here; the caller re-asks for exactly - // the records the model left out. - return output; -} - -function enrichRecord(record: IntentRecord, enrichment: MarkdownEnrichment, config: T2CConfig, response: LlmResponseMetadata): IntentRecord { - const target = { - paths: [...record.statement.target.paths, ...(enrichment.target?.paths ?? [])], - symbols: [...record.statement.target.symbols, ...(enrichment.target?.symbols ?? [])], - tickets: [...record.statement.target.tickets, ...(enrichment.target?.tickets ?? [])], - versions: [...record.statement.target.versions, ...(enrichment.target?.versions ?? [])], - }; - return buildRecord({ - kind: record.statement.kind, - actor: enrichment.actor ?? record.statement.actor, - action: enrichment.action, - subject: record.statement.subject, - object: enrichment.object.trim() || record.statement.object, - target, - modality: record.statement.modality, - polarity: enrichment.polarity, - text: record.statement.text, - lifecycle: record.lifecycle.status, - sourceKind: record.source.kind, - sourcePath: record.source.path, - sourceLines: record.source.lines, - revision: record.source.revision, - symbol: record.source.symbol, - commitIndex: record.source.commitIndex, - extractor: record.source.kind === 'todo' ? 't2c/markdown-todo-openrouter@1' : 't2c/markdown-changelog-openrouter@1', - rawExcerpt: record.source.rawExcerpt, - epistemicClass: record.epistemic.class, - confidence: Math.min(0.94, Math.max(0.05, enrichment.confidence)), - basis: [...record.epistemic.basis, 'openrouter_markdown_enrichment', ...enrichment.basis], - observedAt: record.observedAt, - generation: { - requested: 'llm', used: 'llm', provider: response.provider ?? 'openrouter', - model: response.model ?? config.openRouter.markdownModel, responseId: response.responseId, - }, - metadata: { - ...record.metadata, - llmUsed: true, - acceptanceEvidence: enrichment.acceptanceEvidence, - response, - }, - }); -} - -function markDeterministic(records: IntentRecord[], degraded: boolean, fallbackReason: string | null): IntentRecord[] { - return records.map((record) => { - const marked = withRecordGeneration(record, { - requested: degraded ? 'llm' : 'deterministic', used: 'deterministic', degraded, fallbackReason, - }); - return { ...marked, metadata: { ...marked.metadata, llmUsed: false } }; - }); -} - -function stageAudit( - status: PipelineStageAudit['status'], - requestedMode: PipelineStageAudit['requestedMode'], - effectiveMode: PipelineStageAudit['effectiveMode'], - degraded: boolean, - result: ExtractionResult, - model: string | null, - reason: PipelineStageAudit['reason'], - durationMs: number, - responses: LlmResponseMetadata[], - config: T2CConfig, -): PipelineStageAudit { - return { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration(config, model), - status, requestedMode, effectiveMode, degraded, recordCount: result.records.length, - warningCount: result.warnings.length, model, durationMs, reason, responses, + audit: stageAudit({ + status: 'fallback', + requestedMode: 'llm', + effectiveMode: 'deterministic', + degraded: true, + result, + model: config.openRouter.markdownModel, + reason, + durationMs: Date.now() - startedAt, + responses, + config, + }), }; } - -async function readPrompt(name: string): Promise { - const promptPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../prompts', name); - if (!(await pathExists(promptPath))) throw new Error(`Prompt not found: ${promptPath}`); - return fs.readFile(promptPath, 'utf8'); -} - -function markdownResponseContract(batchSize: number): StructuredSchema { - const strings = () => s.array(s.string()); - const enrichment = s.object({ - recordId: s.string(), - actor: s.nullableString(), - action: s.enum(MARKDOWN_ACTIONS), - object: s.string(), - polarity: s.enum(['positive', 'negative']), - confidence: s.number({ minimum: 0, maximum: 0.94 }), - basis: strings(), - target: s.object({ paths: strings(), symbols: strings(), tickets: strings(), versions: strings() }), - acceptanceEvidence: strings(), - }) satisfies StructuredSchema; - // The floor used to equal the batch size, which made an incomplete response - // unreadable: a model that emitted 27 of 32 enrichments failed schema - // validation, and every enrichment it did produce was discarded with it. - // Measured live, both `qwen/qwen3.7-plus` and `google/gemini-3.6-flash` - // truncate long batches this way. Each enrichment names its `recordId`, so a - // short response is attributable; coverage is enforced by splitting the - // uncovered records into a smaller batch instead of by the schema. - return s.object({ enrichments: s.array(enrichment, { minItems: 1, maxItems: batchSize }) }); -} diff --git a/src/extractors/markdown-paths.ts b/src/extractors/markdown-paths.ts index 242f741..071c4f1 100644 --- a/src/extractors/markdown-paths.ts +++ b/src/extractors/markdown-paths.ts @@ -30,6 +30,12 @@ const PATH_SEARCH_EXCLUDES = new Set([ /** Bound the walk so a pathological tree cannot stall extraction. */ const MAX_INDEXED_FILES = 20_000; +interface BasenameIndexState { + base: string; + pending: string[]; + seen: number; +} + export function createMarkdownPathResolver(root: string): MarkdownPathResolver { const repositoryRoot = path.resolve(root); let index: Promise> | null = null; @@ -83,40 +89,70 @@ function headingScopes(headings: string[]): string[] { async function buildBasenameIndex(root: string): Promise> { const index = new Map(); - const base = path.resolve(root); - const pending = [base]; - let seen = 0; - while (pending.length && seen < MAX_INDEXED_FILES) { - const directory = pending.pop()!; - let entries: Dirent[]; - try { - entries = await fs.readdir(directory, { withFileTypes: true, encoding: 'utf8' }); - } catch { - continue; - } - // A directory carrying its own `.git` is a nested checkout or agent - // worktree. Indexing its copy of the tree duplicates every basename and - // blocks resolution repository-wide: on `if-uri/urirun`, 63 worktrees - // under `.claude/worktrees/` shadowed the real `docs/ARCHITECTURE.md`. - if (directory !== base && entries.some((entry) => entry.name === '.git')) continue; - for (const entry of entries) { - if (entry.isSymbolicLink()) continue; - const absolute = path.join(directory, entry.name); - if (entry.isDirectory()) { - if (!PATH_SEARCH_EXCLUDES.has(entry.name) && !entry.name.startsWith('.intent-')) { - pending.push(absolute); - } - continue; - } - if (!entry.isFile()) continue; - seen += 1; - if (seen > MAX_INDEXED_FILES) break; - const matches = index.get(entry.name); - // Two hits already prove ambiguity; more of them change no decision. - if (!matches) index.set(entry.name, [relativePosix(root, absolute)]); - else if (matches.length < 2) matches.push(relativePosix(root, absolute)); - } + const state = createBasenameIndexState(root); + while (state.pending.length && state.seen < MAX_INDEXED_FILES) { + const directory = state.pending.pop(); + if (!directory) continue; + const entries = await readBasenameDirectoryEntries(directory); + if (!entries) continue; + if (isNestedCheckout(directory, state.base, entries)) continue; + scanDirectoryForBasenames(directory, entries, root, index, state); } for (const matches of index.values()) matches.sort(); return index; } + +function createBasenameIndexState(root: string): BasenameIndexState { + return { + base: path.resolve(root), + pending: [path.resolve(root)], + seen: 0, + }; +} + +async function readBasenameDirectoryEntries(directory: string): Promise[] | null> { + try { + return await fs.readdir(directory, { withFileTypes: true, encoding: 'utf8' }); + } catch { + return null; + } +} + +function isNestedCheckout(directory: string, base: string, entries: Dirent[]): boolean { + return directory !== base && entries.some((entry) => entry.name === '.git'); +} + +function scanDirectoryForBasenames( + directory: string, + entries: Dirent[], + root: string, + index: Map, + state: BasenameIndexState, +): void { + for (const entry of entries) { + if (entry.isSymbolicLink()) continue; + const absolute = path.join(directory, entry.name); + if (entry.isDirectory()) { + if (!PATH_SEARCH_EXCLUDES.has(entry.name) && !entry.name.startsWith('.intent-')) { + state.pending.push(absolute); + } + continue; + } + if (!entry.isFile()) continue; + state.seen += 1; + if (state.seen > MAX_INDEXED_FILES) break; + addBasenameIndexMatch(index, root, absolute, entry.name); + } +} + +function addBasenameIndexMatch( + index: Map, + root: string, + absolute: string, + filename: string, +): void { + const matches = index.get(filename); + // Two hits already prove ambiguity; more of them change no decision. + if (!matches) index.set(filename, [relativePosix(root, absolute)]); + else if (matches.length < 2) matches.push(relativePosix(root, absolute)); +} diff --git a/src/extractors/nl-llm-helpers.ts b/src/extractors/nl-llm-helpers.ts new file mode 100644 index 0000000..882cdca --- /dev/null +++ b/src/extractors/nl-llm-helpers.ts @@ -0,0 +1,261 @@ +import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { T2CConfig } from '../config/env.js'; +import { pathExists } from '../core/io.js'; +import { buildRecord, withRecordGeneration } from '../core/record.js'; +import type { + ExtractionResult, + IntentAction, + Modality, + IntentRecord, + LlmResponseMetadata, + PipelineStageAudit, +} from '../core/types.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import { OpenRouterClient, type OpenRouterResult } from '../llm/openrouter.js'; +import { StructuredResponseError, structuredSchema as s, type StructuredSchema } from '../llm/structured-schema.js'; +import { T2C_VERSION } from '../version.js'; + +export interface RawNlRecord { + kind: string; + actor: string | null; + action: string; + subject: string | null; + object: string; + modality: string; + polarity: 'positive' | 'negative'; + lifecycle: string; + confidence: number; + basis: string[]; + target: { paths: string[]; symbols: string[]; tickets: string[]; versions: string[] }; + sourceLines: { start: number; end: number }; + text: string; +} + +export interface NlResponse { records: RawNlRecord[] } + +export class NlAttemptError extends Error { + constructor(readonly failure: unknown, readonly responses: LlmResponseMetadata[]) { + super(failure instanceof Error ? failure.message : String(failure)); + this.name = 'NlAttemptError'; + } +} + +export async function extractNlWithCorrection( + client: OpenRouterClient, + baseMessages: Array<{ role: 'system' | 'user'; content: string }>, + model: string, +): Promise<{ completion: OpenRouterResult; responses: LlmResponseMetadata[] }> { + const responses: LlmResponseMetadata[] = []; + let correction: string | null = null; + for (let attempt = 0; attempt < 2; attempt += 1) { + try { + const completion = await client.chatStructuredWithMetadata([ + ...baseMessages, + ...(correction ? [{ + role: 'user' as const, + content: `The previous response was rejected: ${correction}\n` + + 'Correct exactly that violation and re-emit the full object. Do not add, rename, or omit properties.\n' + + `The exact required JSON Schema is: ${JSON.stringify(NL_RESPONSE_CONTRACT.jsonSchema)}`, + }] : []), + ], 't2c_natural_language_intent', NL_RESPONSE_CONTRACT, model); + responses.push(completion.metadata); + return { completion, responses }; + } catch (error) { + if (error instanceof StructuredResponseError) { + if (error.responseMetadata) responses.push(error.responseMetadata); + if (attempt === 0) { + correction = error.message; + continue; + } + } + throw new NlAttemptError(error, [...responses]); + } + } + throw new NlAttemptError(new Error('NL correction retry budget exhausted'), responses); +} + +export function markDeterministicNlRecords(records: IntentRecord[], degraded: boolean, fallbackReason: string | null): IntentRecord[] { + return records.map((record) => withRecordGeneration(record, { + requested: degraded ? 'llm' : 'deterministic', used: 'deterministic', degraded, fallbackReason, + })); +} + +export function toIntentRecord(raw: RawNlRecord, sourcePath: string, body: string, maxLine: number, config: T2CConfig, response: LlmResponseMetadata): IntentRecord { + const lines = body.split(/\r?\n/); + const { start, end, excerpt } = sourceExcerpt(raw, lines, maxLine); + const action = resolveAction(raw.action); + const normalizedText = nonEmptyText(raw.text); + const { object, missingFields } = resolveObject(raw, action, normalizedText); + const statementText = normalizedText ?? object; + return buildRecord({ + kind: raw.kind || 'declared_intent', + actor: raw.actor ?? null, + action, + subject: raw.subject ?? null, + object, + target: raw.target, + modality: resolveModality(raw.modality), + polarity: raw.polarity === 'negative' ? 'negative' : 'positive', + text: statementText, + lifecycle: 'proposed', + sourceKind: 'nl', + sourcePath, + sourceLines: { start, end }, + extractor: 't2c/nl-openrouter@1', + rawExcerpt: excerpt || statementText, + epistemicClass: 'llm_inference', + confidence: Math.min(0.9, Math.max(0.05, Number(raw.confidence) || 0.5)), + basis: [...new Set(['openrouter_structured_extraction', ...(raw.basis ?? [])])], + generation: { + requested: 'llm', used: 'llm', provider: response.provider ?? 'openrouter', + model: response.model ?? config.openRouter.nlModel, responseId: response.responseId, + }, + metadata: { + missingFields, + llmUsed: true, + response, + }, + }); +} + +export function nlStageAudit(input: { + status: PipelineStageAudit['status']; + requestedMode: PipelineStageAudit['requestedMode']; + effectiveMode: PipelineStageAudit['effectiveMode']; + degraded: boolean; + result: ExtractionResult; + model: string | null; + reason: PipelineStageAudit['reason']; + durationMs: number; + responses: LlmResponseMetadata[]; + config: T2CConfig; +}): PipelineStageAudit { + return { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(input.config, input.model), + status: input.status, + requestedMode: input.requestedMode, + effectiveMode: input.effectiveMode, + degraded: input.degraded, + recordCount: input.result.records.length, + warningCount: input.result.warnings.length, + model: input.model, + durationMs: input.durationMs, + reason: input.reason, + responses: input.responses, + }; +} + +export async function readPrompt(name: string): Promise { + const promptPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../prompts', name); + if (!(await pathExists(promptPath))) throw new Error(`Prompt not found: ${promptPath}`); + return fs.readFile(promptPath, 'utf8'); +} + +function sourceExcerpt( + raw: RawNlRecord, + lines: string[], + maxLine: number, +): { start: number; end: number; excerpt: string } { + const start = clampLine(raw.sourceLines?.start ?? 1, 1, maxLine); + const end = clampLine(raw.sourceLines?.end ?? start, start, maxLine); + return { start, end, excerpt: lines.slice(start - 1, end).join('\n').slice(0, 2000) }; +} + +function resolveAction(rawAction: string): IntentAction { + return allowedAction(rawAction) ? rawAction : 'unknown'; +} + +function resolveModality(rawModality: string): Modality { + return allowedModality(rawModality) ? rawModality : 'unknown'; +} + +/** + * `statement.object` is free text, but neighbouring fields (`action`, `modality`, + * `lifecycle`) are enums that include the literal `unknown`. Models copy that + * token into the free-text slot, and the runtime used to accept it as content. + * + * That is worse than an empty field: `object` seeds the linker's keyword bucket, + * so every record carrying the placeholder would collide with every other one. + * A placeholder is therefore treated as an absent value β€” the statement falls + * back to its own text, and the gap is recorded in `missingFields` so the + * diagnostics can see it. + */ +const OBJECT_PLACEHOLDERS = new Set(['unknown', 'unspecified', 'none', 'null', 'n/a', 'na', '-', 'brak', 'nieznany', 'nieokreΕ›lony']); + +function nonEmptyText(value: unknown): string | null { + return typeof value === 'string' && value.trim() ? value.trim() : null; +} + +function isPlaceholder(value: unknown): boolean { + const text = nonEmptyText(value); + return text === null || OBJECT_PLACEHOLDERS.has(text.toLowerCase()); +} + +function resolveObject( + raw: RawNlRecord, + action: IntentAction, + normalizedText: string | null, +): { object: string; missingFields: string[] } { + const missingFields: string[] = []; + if (action === 'unknown') missingFields.push('action'); + if (normalizedText === null) { + missingFields.push('text'); + } + + if (!isPlaceholder(raw.object)) return { object: nonEmptyText(raw.object) as string, missingFields }; + + missingFields.push('object'); + const fallback = normalizedText; + if (fallback === null) { + return { object: 'unspecified', missingFields }; + } + return { object: isPlaceholder(fallback) ? 'unspecified' : (fallback as string), missingFields }; +} + +function clampLine(value: number, min: number, max: number): number { + return Math.max(min, Math.min(max, Math.trunc(value))); +} + +function allowedAction(value: string): value is IntentAction { + return NL_ACTION_SET.has(value); +} + +function allowedModality(value: string): value is Modality { + return NL_MODALITY_SET.has(value); +} + +const NL_ACTIONS = [ + 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', + 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', +] as const; +const NL_ACTION_SET = new Set(NL_ACTIONS); +const NL_MODALITIES = ['required', 'recommended', 'optional', 'observed', 'claimed', 'unknown'] as const; +const NL_MODALITY_SET = new Set(NL_MODALITIES); +const NL_LIFECYCLES = [ + 'proposed', 'planned', 'in_progress', 'implemented', 'verified', 'released', 'completed', 'blocked', 'unknown', +] as const; + +const nlStrings = () => s.array(s.string()); +const NL_RECORD_CONTRACT = s.object({ + kind: s.string(), + actor: s.nullableString(), + action: s.enum(NL_ACTIONS), + subject: s.nullableString(), + object: s.string({ + minLength: 1, + description: 'Concrete thing the statement is about, in the source language. Free text: never the literal word "unknown" β€” quote the subject matter instead.', + }), + modality: s.enum(NL_MODALITIES), + polarity: s.enum(['positive', 'negative']), + lifecycle: s.enum(NL_LIFECYCLES), + confidence: s.number({ minimum: 0, maximum: 0.9 }), + basis: nlStrings(), + target: s.object({ paths: nlStrings(), symbols: nlStrings(), tickets: nlStrings(), versions: nlStrings() }), + sourceLines: s.object({ start: s.integer({ minimum: 1 }), end: s.integer({ minimum: 1 }) }), + text: s.string(), +}) satisfies StructuredSchema; + +const NL_RESPONSE_CONTRACT = s.object({ records: s.array(NL_RECORD_CONTRACT) }) satisfies StructuredSchema; diff --git a/src/extractors/nl-llm.ts b/src/extractors/nl-llm.ts index 35673f3..5d29ce9 100644 --- a/src/extractors/nl-llm.ts +++ b/src/extractors/nl-llm.ts @@ -1,43 +1,23 @@ -import { promises as fs } from 'node:fs'; import path from 'node:path'; -import { fileURLToPath } from 'node:url'; import type { T2CConfig } from '../config/env.js'; -import { pathExists, readText, relativePosix } from '../core/io.js'; -import { buildRecord, withRecordGeneration } from '../core/record.js'; +import { readText, relativePosix } from '../core/io.js'; import type { ExtractionResult, - IntentAction, - IntentRecord, - LifecycleStatus, LlmResponseMetadata, - Modality, NlExtractionMode, PipelineStageAudit, } from '../core/types.js'; import { classifyLlmFailure, rejectedLlmResponseMetadata } from '../llm/failure.js'; -import { openRouterAuditConfiguration } from '../llm/audit.js'; -import { OpenRouterClient, type OpenRouterResult } from '../llm/openrouter.js'; -import { StructuredResponseError, structuredSchema as s, type StructuredSchema } from '../llm/structured-schema.js'; -import { T2C_VERSION } from '../version.js'; +import { OpenRouterClient } from '../llm/openrouter.js'; import { assertNlExtractionOptions, extractNlIntent, type NlExtractionOptions } from './nl.js'; - -interface RawNlRecord { - kind: string; - actor: string | null; - action: IntentAction; - subject: string | null; - object: string; - modality: Modality; - polarity: 'positive' | 'negative'; - lifecycle: LifecycleStatus; - confidence: number; - basis: string[]; - target: { paths: string[]; symbols: string[]; tickets: string[]; versions: string[] }; - sourceLines: { start: number; end: number }; - text: string; -} - -interface NlResponse { records: RawNlRecord[] } +import { + extractNlWithCorrection, + markDeterministicNlRecords, + NlAttemptError, + nlStageAudit, + readPrompt, + toIntentRecord, +} from './nl-llm-helpers.js'; export interface AuditedNlExtractionResult extends ExtractionResult { audit: PipelineStageAudit; @@ -57,12 +37,24 @@ export async function extractNlIntentAudited( ): Promise { assertNlExtractionOptions(options); const startedAt = Date.now(); + if (mode === 'deterministic') { const result = await extractNlIntent(options, config); return { ...result, - records: markDeterministic(result.records, false, null), - audit: audit('succeeded', 'deterministic', 'deterministic', false, result, null, null, Date.now() - startedAt, [], config), + records: markDeterministicNlRecords(result.records, false, null), + audit: nlStageAudit({ + status: 'succeeded', + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + result, + model: null, + reason: null, + durationMs: Date.now() - startedAt, + responses: [], + config, + }), }; } @@ -94,58 +86,33 @@ export async function extractNlIntentAudited( }; return { ...result, - audit: audit('succeeded', 'llm', 'llm', false, result, config.openRouter.nlModel, null, Date.now() - startedAt, responses, config), + audit: nlStageAudit({ + status: 'succeeded', + requestedMode: 'llm', + effectiveMode: 'llm', + degraded: false, + result, + model: config.openRouter.nlModel, + reason: null, + durationMs: Date.now() - startedAt, + responses, + config, + }), }; } catch (error) { const failure = error instanceof NlAttemptError ? error.failure : error; const responses = error instanceof NlAttemptError ? error.responses : rejectedLlmResponseMetadata(error); return fallbackOrThrow( - options, config, mode, startedAt, classifyLlmFailure(failure), responses, + options, + config, + mode, + startedAt, + classifyLlmFailure(failure), + responses, ); } } -class NlAttemptError extends Error { - constructor(readonly failure: unknown, readonly responses: LlmResponseMetadata[]) { - super(failure instanceof Error ? failure.message : String(failure)); - this.name = 'NlAttemptError'; - } -} - -async function extractNlWithCorrection( - client: OpenRouterClient, - baseMessages: Array<{ role: 'system' | 'user'; content: string }>, - model: string, -): Promise<{ completion: OpenRouterResult; responses: LlmResponseMetadata[] }> { - const responses: LlmResponseMetadata[] = []; - let correction: string | null = null; - for (let attempt = 0; attempt < 2; attempt += 1) { - try { - const completion = await client.chatStructuredWithMetadata([ - ...baseMessages, - ...(correction ? [{ - role: 'user' as const, - content: `The previous response was rejected: ${correction}\n` - + 'Correct exactly that violation and re-emit the full object. Do not add, rename, or omit properties.\n' - + `The exact required JSON Schema is: ${JSON.stringify(NL_RESPONSE_CONTRACT.jsonSchema)}`, - }] : []), - ], 't2c_natural_language_intent', NL_RESPONSE_CONTRACT, model); - responses.push(completion.metadata); - return { completion, responses }; - } catch (error) { - if (error instanceof StructuredResponseError) { - if (error.responseMetadata) responses.push(error.responseMetadata); - if (attempt === 0) { - correction = error.message; - continue; - } - } - throw new NlAttemptError(error, [...responses]); - } - } - throw new NlAttemptError(new Error('NL correction retry budget exhausted'), responses); -} - async function fallbackOrThrow( options: NlExtractionOptions, config: T2CConfig, @@ -154,163 +121,43 @@ async function fallbackOrThrow( reason: { code: string; message: string }, responses: LlmResponseMetadata[] = [], ): Promise { - const failedAudit = audit('failed', 'llm', 'none', true, { records: [], warnings: [] }, config.openRouter.nlModel, reason, Date.now() - startedAt, responses, config); - if (mode === 'require-llm') throw new NlLlmRequiredError(`NL -> DSL requires LLM: ${reason.message}`, failedAudit); + const failedAudit = nlStageAudit({ + status: 'failed', + requestedMode: 'llm', + effectiveMode: 'none', + degraded: true, + result: { records: [], warnings: [] }, + model: config.openRouter.nlModel, + reason, + durationMs: Date.now() - startedAt, + responses, + config, + }); + + if (mode === 'require-llm') { + throw new NlLlmRequiredError(`NL -> DSL requires LLM: ${reason.message}`, failedAudit); + } const deterministic = await extractNlIntent(options, config); const warning = `NL -> DSL used deterministic fallback (${reason.code}): ${reason.message}`; - const result = { records: markDeterministic(deterministic.records, true, reason.code), warnings: [...deterministic.warnings, warning] }; - return { - ...result, - audit: audit('fallback', 'llm', 'deterministic', true, result, config.openRouter.nlModel, reason, Date.now() - startedAt, responses, config), + const result = { + records: markDeterministicNlRecords(deterministic.records, true, reason.code), + warnings: [...deterministic.warnings, warning], }; -} - -function markDeterministic(records: IntentRecord[], degraded: boolean, fallbackReason: string | null): IntentRecord[] { - return records.map((record) => withRecordGeneration(record, { - requested: degraded ? 'llm' : 'deterministic', used: 'deterministic', degraded, fallbackReason, - })); -} - -function toIntentRecord(raw: RawNlRecord, sourcePath: string, body: string, maxLine: number, config: T2CConfig, response: LlmResponseMetadata): IntentRecord { - const start = clampLine(raw.sourceLines?.start ?? 1, 1, maxLine); - const end = clampLine(raw.sourceLines?.end ?? start, start, maxLine); - const lines = body.split(/\r?\n/); - const excerpt = lines.slice(start - 1, end).join('\n').slice(0, 2000); - const action = allowedAction(raw.action) ? raw.action : 'unknown'; - const { object, missingFields } = resolveObject(raw, action); - const normalizedText = nonEmptyText(raw.text); - if (normalizedText === null) missingFields.push('text'); - const statementText = normalizedText ?? object; - return buildRecord({ - kind: raw.kind || 'declared_intent', - actor: raw.actor ?? null, - action, - subject: raw.subject ?? null, - object, - target: raw.target, - modality: allowedModality(raw.modality) ? raw.modality : 'unknown', - polarity: raw.polarity === 'negative' ? 'negative' : 'positive', - text: statementText, - lifecycle: 'proposed', - sourceKind: 'nl', - sourcePath, - sourceLines: { start, end }, - extractor: 't2c/nl-openrouter@1', - rawExcerpt: excerpt || statementText, - epistemicClass: 'llm_inference', - confidence: Math.min(0.9, Math.max(0.05, Number(raw.confidence) || 0.5)), - basis: [...new Set(['openrouter_structured_extraction', ...(raw.basis ?? [])])], - generation: { - requested: 'llm', used: 'llm', provider: response.provider ?? 'openrouter', - model: response.model ?? config.openRouter.nlModel, responseId: response.responseId, - }, - metadata: { - missingFields, - llmUsed: true, - response, - }, - }); -} -/** - * `statement.object` is free text, but neighbouring fields (`action`, `modality`, - * `lifecycle`) are enums that include the literal `unknown`. Models copy that - * token into the free-text slot, and the runtime used to accept it as content. - * - * That is worse than an empty field: `object` seeds the linker's keyword bucket, - * so every record carrying the placeholder would collide with every other one. - * A placeholder is therefore treated as an absent value β€” the statement falls - * back to its own text, and the gap is recorded in `missingFields` so the - * diagnostics can see it. - */ -const OBJECT_PLACEHOLDERS = new Set(['unknown', 'unspecified', 'none', 'null', 'n/a', 'na', '-', 'brak', 'nieznany', 'nieokreΕ›lony']); - -function nonEmptyText(value: unknown): string | null { - return typeof value === 'string' && value.trim() ? value.trim() : null; -} - -function isPlaceholder(value: unknown): boolean { - const text = nonEmptyText(value); - return text === null || OBJECT_PLACEHOLDERS.has(text.toLowerCase()); -} - -function resolveObject(raw: RawNlRecord, action: IntentAction): { object: string; missingFields: string[] } { - const missingFields: string[] = []; - if (action === 'unknown') missingFields.push('action'); - - if (!isPlaceholder(raw.object)) return { object: nonEmptyText(raw.object) as string, missingFields }; - - missingFields.push('object'); - // Falling back to the statement text keeps the record linkable by its own - // wording instead of by a placeholder shared with unrelated records. - const fallback = nonEmptyText(raw.text); - return { object: isPlaceholder(fallback) ? 'unspecified' : (fallback as string), missingFields }; -} - -function audit( - status: PipelineStageAudit['status'], - requestedMode: PipelineStageAudit['requestedMode'], - effectiveMode: PipelineStageAudit['effectiveMode'], - degraded: boolean, - result: ExtractionResult, - model: string | null, - reason: PipelineStageAudit['reason'], - durationMs: number, - responses: LlmResponseMetadata[], - config: T2CConfig, -): PipelineStageAudit { return { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration(config, model), - status, requestedMode, effectiveMode, degraded, recordCount: result.records.length, - warningCount: result.warnings.length, model, durationMs, reason, responses, + ...result, + audit: nlStageAudit({ + status: 'fallback', + requestedMode: 'llm', + effectiveMode: 'deterministic', + degraded: true, + result, + model: config.openRouter.nlModel, + reason, + durationMs: Date.now() - startedAt, + responses, + config, + }), }; } - -function clampLine(value: number, min: number, max: number): number { - return Math.max(min, Math.min(max, Math.trunc(value))); -} - -function allowedAction(value: string): value is IntentAction { - return ['add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown'].includes(value); -} - -function allowedModality(value: string): value is Modality { - return ['required', 'recommended', 'optional', 'observed', 'claimed', 'unknown'].includes(value); -} - -async function readPrompt(name: string): Promise { - const promptPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../prompts', name); - if (!(await pathExists(promptPath))) throw new Error(`Prompt not found: ${promptPath}`); - return fs.readFile(promptPath, 'utf8'); -} - -const NL_ACTIONS = [ - 'add', 'fix', 'remove', 'refactor', 'test', 'document', 'configure', 'analyze', 'validate', - 'call', 'depend_on', 'declare', 'release', 'change', 'preserve', 'block', 'approve', 'unknown', -] as const; -const NL_MODALITIES = ['required', 'recommended', 'optional', 'observed', 'claimed', 'unknown'] as const; -const NL_LIFECYCLES = [ - 'proposed', 'planned', 'in_progress', 'implemented', 'verified', 'released', 'completed', 'blocked', 'unknown', -] as const; -const nlStrings = () => s.array(s.string()); -const NL_RECORD_CONTRACT = s.object({ - kind: s.string(), - actor: s.nullableString(), - action: s.enum(NL_ACTIONS), - subject: s.nullableString(), - object: s.string({ - minLength: 1, - description: 'Concrete thing the statement is about, in the source language. Free text: never the literal word "unknown" β€” quote the subject matter instead.', - }), - modality: s.enum(NL_MODALITIES), - polarity: s.enum(['positive', 'negative']), - lifecycle: s.enum(NL_LIFECYCLES), - confidence: s.number({ minimum: 0, maximum: 0.9 }), - basis: nlStrings(), - target: s.object({ paths: nlStrings(), symbols: nlStrings(), tickets: nlStrings(), versions: nlStrings() }), - sourceLines: s.object({ start: s.integer({ minimum: 1 }), end: s.integer({ minimum: 1 }) }), - text: s.string(), -}) satisfies StructuredSchema; -const NL_RESPONSE_CONTRACT = s.object({ records: s.array(NL_RECORD_CONTRACT) }) satisfies StructuredSchema; diff --git a/src/graph/diagnostics.ts b/src/graph/diagnostics.ts index fc56f06..899f2ee 100644 --- a/src/graph/diagnostics.ts +++ b/src/graph/diagnostics.ts @@ -15,120 +15,12 @@ import { hasCapabilityClaim, isFileAggregate } from './capability-evidence.js'; export function diagnoseGraph(graph: IntentGraph, generatedAt = new Date().toISOString()): DiagnosticReport { assertIntentGraph(graph); + const context = buildDiagnosticContext(graph); const diagnostics: Diagnostic[] = []; - const neighbors = buildNeighbors(graph); - const recordsById = new Map(graph.records.map((record) => [record.id, record])); - const groundedImplementation = indexGroundedImplementationEvidence(graph, recordsById); - const implementedPaths = indexImplementedPaths(graph); - const documentedPaths = indexDocumentedPaths(graph); - const symbolResolutionIndex = buildSymbolResolutionIndex(graph.records); - for (const record of graph.records) { - const related = (neighbors.get(record.id) ?? []) - .map((id) => recordsById.get(id)) - .filter((item): item is IntentRecord => Boolean(item)); - const evidenced = groundedImplementation.has(record.id) - || !hasCapabilityClaim(record) && hasImplementedTarget(record, implementedPaths) - || record.source.kind === 'changelog' && hasDocumentedTarget(record, documentedPaths); - if (isPlan(record) && !evidenced) { - const hasLocationOnlyEvidence = related.some(isImplementationEvidence); - diagnostics.push(makeDiagnostic( - record.lifecycle.status === 'completed' ? 'blocking' : 'warning', - 'PLANNED_NOT_IMPLEMENTED', - record.lifecycle.status === 'completed' ? 'Zadanie oznaczone jako ukoΕ„czone bez dowodu implementacji' : 'Zaplanowane zadanie bez dowodu implementacji', - hasLocationOnlyEvidence - ? `PowiΔ…zany rekord Git/AST wskazuje lokalizacjΔ™, ale nie potwierdza wymaganej zmiany: ${record.statement.text}` - : `Nie znaleziono powiΔ…zanego rekordu Git ani faktu AST dla: ${record.statement.text}`, - [record.id], - hasLocationOnlyEvidence - ? 'ZrealizowaΔ‡ konkretnΔ… zmianΔ™ opisanΔ… w rekordzie ΕΊrΓ³dΕ‚owym albo wskazaΔ‡ jednoznaczny symbol lub dowΓ³d; nastΔ™pnie ponownie uruchomiΔ‡ linker.' - : 'DodaΔ‡ identyfikator ticketu/symbolu albo dostarczyΔ‡ implementacjΔ™ i ponownie uruchomiΔ‡ linker.', - )); - } - - if (isPublicImplementation(record) && !related.some(isPlan)) { - diagnostics.push(makeDiagnostic( - 'warning', - 'IMPLEMENTED_NOT_PLANNED', - 'Implementacja bez powiΔ…zanego planu', - `Fakt implementacyjny nie ma relacji do NL, TODO ani dokumentacji intencji: ${record.statement.object}`, - [record.id], - 'PowiΔ…zaΔ‡ symbol z ticketem/TODO lub udokumentowaΔ‡, dlaczego implementacja jest poza planem.', - )); - } - - if (isReleaseCandidate(record) && !related.some((item) => item.source.kind === 'changelog' || item.source.kind === 'document')) { - diagnostics.push(makeDiagnostic( - 'info', - 'IMPLEMENTED_NOT_DOCUMENTED', - 'Zmiana bez dokumentacji wydania', - `Zmiana ${record.statement.object} nie ma powiΔ…zanego wpisu dokumentacyjnego lub changelogu.`, - [record.id], - 'DodaΔ‡ albo powiΔ…zaΔ‡ wpis CHANGELOG/dokumentacji, jeΕ›li zmiana jest publiczna.', - )); - } - - if (record.source.kind === 'changelog' && isActionableChangelogRecord(record) && !evidenced) { - diagnostics.push(makeDiagnostic( - 'review_required', - 'CHANGELOG_WITHOUT_IMPLEMENTATION', - 'Wpis changelogu bez dowodu implementacji', - `Wpis wydania nie ma powiΔ…zanego commita ani faktu AST: ${record.statement.text}`, - [record.id], - 'ZweryfikowaΔ‡ wpis lub dodaΔ‡ jednoznaczne odwoΕ‚anie do ticketu, commita, pliku albo symbolu.', - )); - } - - const missingFields = Array.isArray(record.metadata.missingFields) - ? record.metadata.missingFields.filter((item): item is string => typeof item === 'string') - : []; - const symbolIssues = (symbolResolutionIndex.byNlRecord.get(record.id) ?? []) - .filter((resolution) => resolution.status === 'ambiguous' || resolution.status === 'conflicting'); - if (missingFields.length > 0 || symbolIssues.length > 0) { - const detail = ambiguityDetail(record, missingFields, symbolIssues); - diagnostics.push(makeDiagnostic( - 'review_required', - 'AMBIGUOUS_REQUIREMENT', - symbolIssues.length > 0 ? 'Niejednoznaczny cel wymagania' : 'Niekompletne wymaganie', - detail, - [record.id], - ambiguityAction(missingFields, symbolIssues), - )); - } - - if (record.epistemic.confidence < 0.5 && record.source.kind !== 'ast') { - diagnostics.push(makeDiagnostic( - 'info', - 'LOW_CONFIDENCE', - 'Niska pewnoΕ›Δ‡ ekstrakcji', - `Rekord ma confidence=${record.epistemic.confidence}: ${record.statement.text}`, - [record.id], - 'DoprecyzowaΔ‡ ΕΊrΓ³dΕ‚o lub dodaΔ‡ jawny identyfikator, Ε›cieΕΌkΔ™ albo symbol.', - )); - } - - if ((neighbors.get(record.id)?.length ?? 0) === 0 && isImportantRecord(record)) { - diagnostics.push(makeDiagnostic( - 'warning', - 'UNLINKED_RECORD', - 'Rekord niepoΕ‚Δ…czony z przepΕ‚ywem wiedzy', - `Nie znaleziono relacji dla ${record.id}: ${record.statement.text}`, - [record.id], - 'DodaΔ‡ wspΓ³lny ticket, symbol, Ε›cieΕΌkΔ™ lub bardziej jednoznaczny obiekt intencji.', - )); - } - } - - for (const relation of graph.relations.filter((item) => item.type === 'contradicts')) { - diagnostics.push(makeDiagnostic( - 'blocking', - 'CONFLICTING_INTENT', - 'Sprzeczne intencje lub dowody', - `Relacja ${relation.id} Ε‚Δ…czy rekordy o przeciwnej polaryzacji.`, - [relation.from, relation.to], - 'RozstrzygnΔ…Δ‡ konflikt w kanonicznym tickecie lub decyzji czΕ‚owieka.', - )); + diagnostics.push(...collectRecordDiagnostics(record, context)); } + diagnostics.push(...collectContradictionDiagnostics(graph.relations)); if (!diagnostics.some((item) => item.severity === 'blocking' || item.severity === 'review_required')) { diagnostics.push(makeDiagnostic( @@ -154,6 +46,212 @@ export function diagnoseGraph(graph: IntentGraph, generatedAt = new Date().toISO }; } +interface DiagnosticContext { + neighbors: Map; + recordsById: Map; + groundedImplementation: Set; + implementedPaths: Set; + documentedPaths: Set; + symbolResolutionIndex: ReturnType; +} + +function buildDiagnosticContext(graph: IntentGraph): DiagnosticContext { + const neighbors = buildNeighbors(graph); + const recordsById = new Map(graph.records.map((record) => [record.id, record])); + return { + neighbors, + recordsById, + groundedImplementation: indexGroundedImplementationEvidence(graph, recordsById), + implementedPaths: indexImplementedPaths(graph), + documentedPaths: indexDocumentedPaths(graph), + symbolResolutionIndex: buildSymbolResolutionIndex(graph.records), + }; +} + +function collectRecordDiagnostics(record: IntentRecord, context: DiagnosticContext): Diagnostic[] { + const diagnostics: Diagnostic[] = []; + const related = collectRelatedRecords(record.id, context); + const missingFields = collectMissingFields(record); + const symbolIssues = collectSymbolIssues(record, context); + const isEvidence = isRecordEvidenced(record, context); + + const planned = buildPlannedNotImplementedDiagnostic(record, related, isEvidence); + if (planned) diagnostics.push(planned); + + const notPlanned = buildImplementedWithoutPlanDiagnostic(record, related); + if (notPlanned) diagnostics.push(notPlanned); + + const notDocumented = buildUndocumentedImplementationDiagnostic(record, related); + if (notDocumented) diagnostics.push(notDocumented); + + const changelog = buildChangelogWithoutImplementationDiagnostic(record, isEvidence); + if (changelog) diagnostics.push(changelog); + + const ambiguous = buildAmbiguousRequirementDiagnostic(record, missingFields, symbolIssues); + if (ambiguous) diagnostics.push(ambiguous); + + const lowConfidence = buildLowConfidenceDiagnostic(record); + if (lowConfidence) diagnostics.push(lowConfidence); + + const unlinked = buildUnlinkedRecordDiagnostic(record, related); + if (unlinked) diagnostics.push(unlinked); + + return diagnostics; +} + +function collectRelatedRecords(recordId: string, context: DiagnosticContext): IntentRecord[] { + return (context.neighbors.get(recordId) ?? []) + .map((id) => context.recordsById.get(id)) + .filter((item): item is IntentRecord => Boolean(item)); +} + +function collectMissingFields(record: IntentRecord): string[] { + return Array.isArray(record.metadata.missingFields) + ? record.metadata.missingFields.filter((item): item is string => typeof item === 'string') + : []; +} + +function collectSymbolIssues(record: IntentRecord, context: DiagnosticContext): NlSymbolResolution[] { + return (context.symbolResolutionIndex.byNlRecord.get(record.id) ?? []) + .filter((resolution) => resolution.status === 'ambiguous' || resolution.status === 'conflicting'); +} + +function isRecordEvidenced( + record: IntentRecord, + context: DiagnosticContext, +): boolean { + const hasImplementedTargetEvidence = !hasCapabilityClaim(record) && hasImplementedTarget(record, context.implementedPaths); + const hasDocumentedTargetEvidence = record.source.kind === 'changelog' && hasDocumentedTarget(record, context.documentedPaths); + return context.groundedImplementation.has(record.id) + || hasImplementedTargetEvidence + || hasDocumentedTargetEvidence; +} + +function buildPlannedNotImplementedDiagnostic( + record: IntentRecord, + related: IntentRecord[], + evidenced: boolean, +): Diagnostic | null { + if (!isPlan(record) || evidenced) return null; + const hasLocationOnlyEvidence = related.some(isImplementationEvidence); + const severity: DiagnosticSeverity = record.lifecycle.status === 'completed' ? 'blocking' : 'warning'; + return makeDiagnostic( + severity, + 'PLANNED_NOT_IMPLEMENTED', + record.lifecycle.status === 'completed' + ? 'Zadanie oznaczone jako ukoΕ„czone bez dowodu implementacji' + : 'Zaplanowane zadanie bez dowodu implementacji', + hasLocationOnlyEvidence + ? `PowiΔ…zany rekord Git/AST wskazuje lokalizacjΔ™, ale nie potwierdza wymaganej zmiany: ${record.statement.text}` + : `Nie znaleziono powiΔ…zanego rekordu Git ani faktu AST dla: ${record.statement.text}`, + [record.id], + hasLocationOnlyEvidence + ? 'ZrealizowaΔ‡ konkretnΔ… zmianΔ™ opisanΔ… w rekordzie ΕΊrΓ³dΕ‚owym albo wskazaΔ‡ jednoznaczny symbol lub dowΓ³d; nastΔ™pnie ponownie uruchomiΔ‡ linker.' + : 'DodaΔ‡ identyfikator ticketu/symbolu albo dostarczyΔ‡ implementacjΔ™ i ponownie uruchomiΔ‡ linker.', + ); +} + +function buildImplementedWithoutPlanDiagnostic( + record: IntentRecord, + related: IntentRecord[], +): Diagnostic | null { + if (!isPublicImplementation(record) || related.some(isPlan)) return null; + return makeDiagnostic( + 'warning', + 'IMPLEMENTED_NOT_PLANNED', + 'Implementacja bez powiΔ…zanego planu', + `Fakt implementacyjny nie ma relacji do NL, TODO ani dokumentacji intencji: ${record.statement.object}`, + [record.id], + 'PowiΔ…zaΔ‡ symbol z ticketem/TODO lub udokumentowaΔ‡, dlaczego implementacja jest poza planem.', + ); +} + +function buildUndocumentedImplementationDiagnostic( + record: IntentRecord, + related: IntentRecord[], +): Diagnostic | null { + if (!isReleaseCandidate(record) || related.some((item) => item.source.kind === 'changelog' || item.source.kind === 'document')) { + return null; + } + return makeDiagnostic( + 'info', + 'IMPLEMENTED_NOT_DOCUMENTED', + 'Zmiana bez dokumentacji wydania', + `Zmiana ${record.statement.object} nie ma powiΔ…zanego wpisu dokumentacyjnego lub changelogu.`, + [record.id], + 'DodaΔ‡ albo powiΔ…zaΔ‡ wpis CHANGELOG/dokumentacji, jeΕ›li zmiana jest publiczna.', + ); +} + +function buildChangelogWithoutImplementationDiagnostic( + record: IntentRecord, + evidenced: boolean, +): Diagnostic | null { + if (record.source.kind !== 'changelog' || !isActionableChangelogRecord(record) || evidenced) return null; + return makeDiagnostic( + 'review_required', + 'CHANGELOG_WITHOUT_IMPLEMENTATION', + 'Wpis changelogu bez dowodu implementacji', + `Wpis wydania nie ma powiΔ…zanego commita ani faktu AST: ${record.statement.text}`, + [record.id], + 'ZweryfikowaΔ‡ wpis lub dodaΔ‡ jednoznaczne odwoΕ‚anie do ticketu, commita, pliku albo symbolu.', + ); +} + +function buildAmbiguousRequirementDiagnostic( + record: IntentRecord, + missingFields: string[], + symbolIssues: NlSymbolResolution[], +): Diagnostic | null { + if (missingFields.length === 0 && symbolIssues.length === 0) return null; + const detail = ambiguityDetail(record, missingFields, symbolIssues); + return makeDiagnostic( + 'review_required', + 'AMBIGUOUS_REQUIREMENT', + symbolIssues.length > 0 ? 'Niejednoznaczny cel wymagania' : 'Niekompletne wymaganie', + detail, + [record.id], + ambiguityAction(missingFields, symbolIssues), + ); +} + +function buildLowConfidenceDiagnostic(record: IntentRecord): Diagnostic | null { + if (record.epistemic.confidence >= 0.5 || record.source.kind === 'ast') return null; + return makeDiagnostic( + 'info', + 'LOW_CONFIDENCE', + 'Niska pewnoΕ›Δ‡ ekstrakcji', + `Rekord ma confidence=${record.epistemic.confidence}: ${record.statement.text}`, + [record.id], + 'DoprecyzowaΔ‡ ΕΊrΓ³dΕ‚o lub dodaΔ‡ jawny identyfikator, Ε›cieΕΌkΔ™ albo symbol.', + ); +} + +function buildUnlinkedRecordDiagnostic(record: IntentRecord, related: IntentRecord[]): Diagnostic | null { + if (related.length !== 0 || !isImportantRecord(record)) return null; + return makeDiagnostic( + 'warning', + 'UNLINKED_RECORD', + 'Rekord niepoΕ‚Δ…czony z przepΕ‚ywem wiedzy', + `Nie znaleziono relacji dla ${record.id}: ${record.statement.text}`, + [record.id], + 'DodaΔ‡ wspΓ³lny ticket, symbol, Ε›cieΕΌkΔ™ lub bardziej jednoznaczny obiekt intencji.', + ); +} + +function collectContradictionDiagnostics(relations: IntentGraph['relations']): Diagnostic[] { + return relations + .filter((relation) => relation.type === 'contradicts') + .map((relation) => makeDiagnostic( + 'blocking', + 'CONFLICTING_INTENT', + 'Sprzeczne intencje lub dowody', + `Relacja ${relation.id} Ε‚Δ…czy rekordy o przeciwnej polaryzacji.`, + [relation.from, relation.to], + 'RozstrzygnΔ…Δ‡ konflikt w kanonicznym tickecie lub decyzji czΕ‚owieka.', + )); +} + /** * Relations are navigation until their basis proves the requested behaviour. * In particular, `shared_path + module_coverage` says only that a file exists. diff --git a/src/graph/linker-candidates.ts b/src/graph/linker-candidates.ts new file mode 100644 index 0000000..51bfb7c --- /dev/null +++ b/src/graph/linker-candidates.ts @@ -0,0 +1,163 @@ +import type { IntentRecord } from '../core/types.js'; +import { keywords, topicKeywords } from '../core/text.js'; +import { pathAliases, symbolAliases } from '../core/target.js'; +import { isFileAggregate } from './capability-evidence.js'; + +export interface RecordKeywords { + object: Set; + text: Set; + topics: Set; +} + +export function indexKeywords(records: IntentRecord[]): Map { + return new Map(records.map((record) => [record.id, { + object: new Set(keywords(record.statement.object)), + text: new Set(keywords(record.statement.text)), + topics: new Set(topicKeywords(`${record.statement.object} ${record.statement.text}`)), + }])); +} + +export function collectCandidatePairs( + records: IntentRecord[], + keywordIndex: Map, +): Array<[string, string]> { + const buckets = new Map(); + const astIds = new Set(); + const moduleAstIds = new Set(); + const declarationAstIds = new Set(); + const configurationIds = new Set(); + for (const record of records) { + if (record.source.kind === 'ast') { + astIds.add(record.id); + if (isFileAggregate(record)) moduleAstIds.add(record.id); + if (record.statement.action === 'declare' && record.statement.target.symbols.length > 0) { + declarationAstIds.add(record.id); + } + } + if (record.source.kind === 'system') configurationIds.add(record.id); + indexTargetBuckets(buckets, record); + indexKeywordBuckets(buckets, record.id, keywordIndex.get(record.id)?.object); + if (isModuleTopicSource(record)) { + indexTopicBuckets(buckets, record.id, keywordIndex.get(record.id)?.topics); + } + } + return pairsFromBuckets(buckets, astIds, moduleAstIds, declarationAstIds, configurationIds); +} + +function isModuleTopicSource(record: IntentRecord): boolean { + return record.statement.kind === 'module_fact' + || record.source.kind === 'nl' + || record.source.kind === 'todo' + || record.source.kind === 'document'; +} + +function indexTargetBuckets(buckets: Map, record: IntentRecord): void { + for (const ticket of record.statement.target.tickets) { + addToBucket(buckets, `ticket:${ticket.toLowerCase()}`, record.id); + } + indexAliases(buckets, 'symbol', record.id, record.statement.target.symbols, symbolAliases); + indexAliases(buckets, 'path', record.id, record.statement.target.paths, pathAliases); +} + +function indexAliases( + buckets: Map, + prefix: string, + recordId: string, + values: string[], + aliases: (value: string) => string[], +): void { + for (const value of values) { + for (const alias of aliases(value)) addToBucket(buckets, `${prefix}:${alias}`, recordId); + } +} + +function indexKeywordBuckets( + buckets: Map, + recordId: string, + objectKeywords: Set | undefined, +): void { + // A Set preserves the sorted insertion order of `keywords()`, so slicing the + // materialized values keeps the same five-token candidate limit. + for (const token of [...(objectKeywords ?? [])].slice(0, 5)) { + addToBucket(buckets, `token:${token}`, recordId); + } +} + +function indexTopicBuckets( + buckets: Map, + recordId: string, + topics: Set | undefined, +): void { + for (const topic of [...(topics ?? [])].slice(0, 12)) { + addToBucket(buckets, `topic:${topic}`, recordId); + } +} + +function addToBucket(buckets: Map, key: string, recordId: string): void { + const values = buckets.get(key); + if (values) values.push(recordId); + else buckets.set(key, [recordId]); +} + +function pairsFromBuckets( + buckets: Map, + astIds: Set, + moduleAstIds: Set, + declarationAstIds: Set, + configurationIds: Set, +): Array<[string, string]> { + const output = new Map(); + for (const [bucketKey, ids] of buckets) { + const limited = [...new Set(ids)].sort().slice(0, 300); + for (let left = 0; left < limited.length; left += 1) { + for (let right = left + 1; right < limited.length; right += 1) { + const leftId = limited[left]; + const rightId = limited[right]; + if (!leftId || !rightId) continue; + if (isSuppressedAstPair(bucketKey, leftId, rightId, astIds, moduleAstIds, declarationAstIds)) continue; + if (isSuppressedConfigurationPair(bucketKey, leftId, rightId, configurationIds)) continue; + output.set(`${leftId}|${rightId}`, [leftId, rightId]); + } + } + } + + return [...output.entries()] + .sort(([left], [right]) => left.localeCompare(right)) + .map(([, pair]) => pair); +} + +function isSuppressedAstPair( + bucketKey: string, + leftId: string, + rightId: string, + astIds: Set, + moduleAstIds: Set, + declarationAstIds: Set, +): boolean { + const leftAst = astIds.has(leftId); + const rightAst = astIds.has(rightId); + // AST details may relate only through an explicit shared symbol. Shared file + // and generic keyword buckets otherwise create a quadratic graph of calls + // within one module without adding plan/code evidence. + if (leftAst && rightAst) { + return !bucketKey.startsWith('symbol:') + || !declarationAstIds.has(leftId) + || !declarationAstIds.has(rightId); + } + if (!bucketKey.startsWith('path:')) return false; + // A file-level declaration links to one module aggregate, not every call and + // symbol extracted from that file. Exact symbol and semantic token matches + // remain available through their stronger buckets. + const astId = leftAst ? leftId : rightAst ? rightId : null; + return astId !== null && !moduleAstIds.has(astId); +} + +function isSuppressedConfigurationPair( + bucketKey: string, + leftId: string, + rightId: string, + configurationIds: Set, +): boolean { + if (bucketKey.startsWith('ticket:')) return false; + return configurationIds.has(leftId) && configurationIds.has(rightId); +} diff --git a/src/graph/linker-relations.ts b/src/graph/linker-relations.ts new file mode 100644 index 0000000..a3b8080 --- /dev/null +++ b/src/graph/linker-relations.ts @@ -0,0 +1,83 @@ +import type { IntentRecord, RelationType } from '../core/types.js'; + +interface RelationEvidence { + score: number; + textScore: number; +} + +interface SourceRelationRule { + anchor: IntentRecord['source']['kind']; + others: ReadonlySet; + type: RelationType; + anchorPosition: 'from' | 'to'; +} + +interface DirectedRelation { + from: IntentRecord; + to: IntentRecord; + type: RelationType; +} + +const SOURCE_RELATION_RULES: SourceRelationRule[] = [ + { anchor: 'git', others: new Set(['todo', 'nl', 'document']), type: 'implements', anchorPosition: 'from' }, + { + anchor: 'ast', + others: new Set(['nl', 'git', 'todo', 'changelog', 'document', 'agent_log', 'test', 'system']), + type: 'evidenced_by', + anchorPosition: 'to', + }, + { anchor: 'changelog', others: new Set(['git', 'ast']), type: 'releases', anchorPosition: 'from' }, + { anchor: 'todo', others: new Set(['nl', 'document']), type: 'plans', anchorPosition: 'from' }, + { anchor: 'document', others: new Set(['nl']), type: 'documents', anchorPosition: 'from' }, +]; + +export function determineRelation( + left: IntentRecord, + right: IntentRecord, + evidence: RelationEvidence, +): DirectedRelation { + // `scorePair` already computed this over the same two strings. + const textScore = evidence.textScore; + if (left.statement.polarity !== right.statement.polarity && textScore >= 0.45) { + return { from: left, to: right, type: 'contradicts' }; + } + if (left.source.kind === right.source.kind && textScore >= 0.82) { + return { from: left, to: right, type: 'duplicates' }; + } + const sourceRelation = relationForSourceKinds(left, right); + if (sourceRelation) return sourceRelation; + if (evidence.score >= 0.8) return { from: left, to: right, type: 'same_as' }; + return { from: left, to: right, type: 'related_to' }; +} + +function relationForSourceKinds(left: IntentRecord, right: IntentRecord): DirectedRelation | null { + for (const rule of SOURCE_RELATION_RULES) { + const relation = matchSourceRule(left, right, rule); + if (relation) return relation; + } + return null; +} + +function matchSourceRule( + left: IntentRecord, + right: IntentRecord, + rule: SourceRelationRule, +): DirectedRelation | null { + if (left.source.kind === rule.anchor && rule.others.has(right.source.kind)) { + return orientRelation(left, right, rule); + } + if (right.source.kind === rule.anchor && rule.others.has(left.source.kind)) { + return orientRelation(right, left, rule); + } + return null; +} + +function orientRelation( + anchor: IntentRecord, + other: IntentRecord, + rule: SourceRelationRule, +): DirectedRelation { + return rule.anchorPosition === 'from' + ? { from: anchor, to: other, type: rule.type } + : { from: other, to: anchor, type: rule.type }; +} diff --git a/src/graph/linker.ts b/src/graph/linker.ts index e3243d0..24eb08e 100644 --- a/src/graph/linker.ts +++ b/src/graph/linker.ts @@ -1,10 +1,15 @@ import { createRelationId, graphFingerprint } from '../core/id.js'; import { assertIntentRecords } from '../core/schema.js'; -import { keywords, topicKeywords } from '../core/text.js'; import { pathAliases, symbolAliases } from '../core/target.js'; -import type { IntentGraph, IntentRecord, IntentRelation, RelationType, SourceKind } from '../core/types.js'; +import type { IntentGraph, IntentRecord, IntentRelation } from '../core/types.js'; import { buildSymbolResolutionIndex, hasResolvedNlAstSymbolPair, type SymbolResolutionIndex } from './symbol-resolution.js'; import { aggregateCapabilityOverlap, isFileAggregate } from './capability-evidence.js'; +import { + collectCandidatePairs, + indexKeywords as buildKeywordIndex, + type RecordKeywords, +} from './linker-candidates.js'; +import { determineRelation } from './linker-relations.js'; interface PairEvidence { score: number; @@ -13,52 +18,6 @@ interface PairEvidence { textScore: number; } -/** - * Tokenising `statement.object` and `statement.text` is the linker's hot path: - * scoring recomputed both for every candidate pair, so a repository producing - * ~177k pairs performed ~1.4M tokenisations. Keyword sets are computed once per - * record instead and compared with a plain Jaccard index. - */ -interface RecordKeywords { - object: Set; - text: Set; - topics: Set; -} - -interface DirectedRelation { - from: IntentRecord; - to: IntentRecord; - type: RelationType; -} - -interface SourceRelationRule { - anchor: SourceKind; - others: ReadonlySet; - type: RelationType; - anchorPosition: 'from' | 'to'; -} - -const SOURCE_RELATION_RULES: SourceRelationRule[] = [ - { anchor: 'git', others: new Set(['todo', 'nl', 'document']), type: 'implements', anchorPosition: 'from' }, - { - anchor: 'ast', - others: new Set(['nl', 'git', 'todo', 'changelog', 'document', 'agent_log', 'test', 'system']), - type: 'evidenced_by', - anchorPosition: 'to', - }, - { anchor: 'changelog', others: new Set(['git', 'ast']), type: 'releases', anchorPosition: 'from' }, - { anchor: 'todo', others: new Set(['nl', 'document']), type: 'plans', anchorPosition: 'from' }, - { anchor: 'document', others: new Set(['nl']), type: 'documents', anchorPosition: 'from' }, -]; - -function indexKeywords(records: IntentRecord[]): Map { - return new Map(records.map((record) => [record.id, { - object: new Set(keywords(record.statement.object)), - text: new Set(keywords(record.statement.text)), - topics: new Set(topicKeywords(`${record.statement.object} ${record.statement.text}`)), - }])); -} - function jaccard(left: Set, right: Set): number { if (left.size === 0 || right.size === 0) return 0; // Iterate the smaller set: membership tests dominate this loop. @@ -74,7 +33,7 @@ export function linkIntentRecords(inputRecords: IntentRecord[], generatedAt = ne assertIntentRecords(inputRecords); const records = deduplicateRecords(inputRecords).sort((a, b) => a.id.localeCompare(b.id)); const byId = new Map(records.map((record) => [record.id, record])); - const keywordIndex = indexKeywords(records); + const keywordIndex = buildKeywordIndex(records); const symbolResolutionIndex = buildSymbolResolutionIndex(records); const candidatePairs = collectCandidatePairs(records, keywordIndex); const resolvableBasenames = indexResolvableBasenames(records); @@ -122,169 +81,6 @@ function deduplicateRecords(records: IntentRecord[]): IntentRecord[] { return [...byId.values()]; } -/** - * Builds the candidate pairs the scorer has to inspect. - * - * Pairs are returned as tuples rather than `"left|right"` keys so the scoring - * loop does not re-split a string per pair; the map key exists only to - * deduplicate, and the result is sorted by it to keep output deterministic. - */ -function collectCandidatePairs( - records: IntentRecord[], - keywordIndex: Map, -): Array<[string, string]> { - const buckets = new Map(); - const astIds = new Set(); - const moduleAstIds = new Set(); - const declarationAstIds = new Set(); - const configurationIds = new Set(); - for (const record of records) { - if (record.source.kind === 'ast') { - astIds.add(record.id); - if (isFileAggregate(record)) moduleAstIds.add(record.id); - if (record.statement.action === 'declare' && record.statement.target.symbols.length > 0) { - declarationAstIds.add(record.id); - } - } - if (record.source.kind === 'system') configurationIds.add(record.id); - indexTargetBuckets(buckets, record); - indexKeywordBuckets(buckets, record.id, keywordIndex.get(record.id)?.object); - if (isModuleTopicSource(record)) { - indexTopicBuckets(buckets, record.id, keywordIndex.get(record.id)?.topics); - } - } - return pairsFromBuckets(buckets, astIds, moduleAstIds, declarationAstIds, configurationIds); -} - -function isModuleTopicSource(record: IntentRecord): boolean { - return record.statement.kind === 'module_fact' - || record.source.kind === 'nl' - || record.source.kind === 'todo' - || record.source.kind === 'document'; -} - -function indexTargetBuckets(buckets: Map, record: IntentRecord): void { - for (const ticket of record.statement.target.tickets) { - addToBucket(buckets, `ticket:${ticket.toLowerCase()}`, record.id); - } - indexAliases(buckets, 'symbol', record.id, record.statement.target.symbols, symbolAliases); - indexAliases(buckets, 'path', record.id, record.statement.target.paths, pathAliases); -} - -function indexAliases( - buckets: Map, - prefix: string, - recordId: string, - values: string[], - aliases: (value: string) => string[], -): void { - for (const value of values) { - for (const alias of aliases(value)) addToBucket(buckets, `${prefix}:${alias}`, recordId); - } -} - -function indexKeywordBuckets( - buckets: Map, - recordId: string, - objectKeywords: Set | undefined, -): void { - // A Set preserves the sorted insertion order of `keywords()`, so slicing the - // materialized values keeps the same five-token candidate limit. - for (const token of [...(objectKeywords ?? [])].slice(0, 5)) { - addToBucket(buckets, `token:${token}`, recordId); - } -} - -function indexTopicBuckets( - buckets: Map, - recordId: string, - topics: Set | undefined, -): void { - for (const topic of [...(topics ?? [])].slice(0, 12)) { - addToBucket(buckets, `topic:${topic}`, recordId); - } -} - -function addToBucket(buckets: Map, key: string, recordId: string): void { - const values = buckets.get(key); - if (values) values.push(recordId); - else buckets.set(key, [recordId]); -} - -/** - * Two configuration declarations sharing a key name are not evidence. - * - * Config records are uniform by construction: every one carries action - * `configure` and a fragment of text such as `params:` or `version: 1`, so - * `same_action` plus text similarity clears the threshold for almost any pair. - * On an infrastructure repository 1 263 configuration records produced 28 896 - * mutual relations β€” 72% of the entire graph β€” restating only that YAML files - * reuse key names. A shared ticket still connects them, because that names one - * piece of work rather than a shared vocabulary. - */ -function isSuppressedConfigurationPair( - bucketKey: string, - leftId: string, - rightId: string, - configurationIds: Set, -): boolean { - if (bucketKey.startsWith('ticket:')) return false; - return configurationIds.has(leftId) && configurationIds.has(rightId); -} - -function pairsFromBuckets( - buckets: Map, - astIds: Set, - moduleAstIds: Set, - declarationAstIds: Set, - configurationIds: Set, -): Array<[string, string]> { - const output = new Map(); - for (const [bucketKey, ids] of buckets) { - const limited = [...new Set(ids)].sort().slice(0, 300); - for (let left = 0; left < limited.length; left += 1) { - for (let right = left + 1; right < limited.length; right += 1) { - const leftId = limited[left]; - const rightId = limited[right]; - if (!leftId || !rightId) continue; - if (isSuppressedAstPair(bucketKey, leftId, rightId, astIds, moduleAstIds, declarationAstIds)) continue; - if (isSuppressedConfigurationPair(bucketKey, leftId, rightId, configurationIds)) continue; - output.set(`${leftId}|${rightId}`, [leftId, rightId]); - } - } - } - - return [...output.entries()] - .sort(([left], [right]) => left.localeCompare(right)) - .map(([, pair]) => pair); -} - -function isSuppressedAstPair( - bucketKey: string, - leftId: string, - rightId: string, - astIds: Set, - moduleAstIds: Set, - declarationAstIds: Set, -): boolean { - const leftAst = astIds.has(leftId); - const rightAst = astIds.has(rightId); - // AST details may relate only through an explicit shared symbol. Shared file - // and generic keyword buckets otherwise create a quadratic graph of calls - // within one module without adding plan/code evidence. - if (leftAst && rightAst) { - return !bucketKey.startsWith('symbol:') - || !declarationAstIds.has(leftId) - || !declarationAstIds.has(rightId); - } - if (!bucketKey.startsWith('path:')) return false; - // A file-level declaration links to one module aggregate, not every call and - // symbol extracted from that file. Exact symbol and semantic token matches - // remain available through their stronger buckets. - const astId = leftAst ? leftId : rightAst ? rightId : null; - return astId !== null && !moduleAstIds.has(astId); -} - /** * Basenames that identify exactly one file in this repository. * @@ -350,29 +146,67 @@ function scorePair( const basis: string[] = []; const leftKeywords = index.get(left.id); const rightKeywords = index.get(right.id); - if (intersects(left.statement.target.tickets, right.statement.target.tickets)) { - score += 0.62; - basis.push('shared_ticket'); - } - const resolvedNlAstSymbol = hasResolvedNlAstSymbolPair(left, right, symbolResolutionIndex); - if ((resolvedNlAstSymbol ?? intersectsAliases(left.statement.target.symbols, right.statement.target.symbols, symbolAliases))) { - score += 0.48; - basis.push('shared_symbol'); - } - if (pathsIntersect(left.statement.target.paths, right.statement.target.paths, resolvableBasenames)) { - score += 0.28; - basis.push('shared_path'); - if (isFileAggregateEvidencePair(left, right)) { - score += 0.24; - basis.push('module_coverage'); - const capabilityOverlap = aggregateCapabilityOverlap(left, right); - if (capabilityOverlap > 0) basis.push(`capability_overlap:${capabilityOverlap}`); - } - } - if (left.statement.action === right.statement.action && left.statement.action !== 'unknown') { - score += 0.13; - basis.push('same_action'); - } + score += scoreSharedTickets(left, right, basis); + score += scoreSharedSymbol(left, right, symbolResolutionIndex, basis); + score += scoreSharedPath(left, right, resolvableBasenames, basis); + score += scoreSameAction(left, right, basis); + const objectSimilarity = scoreObjectSimilarity(leftKeywords, rightKeywords, basis); + score += scoreSharedTopics(left, right, leftKeywords, rightKeywords, basis); + score += scoreSourceKindPenalty(left, right); + return { + score: Math.max(0, score), + basis: [...new Set(basis)].sort(), + textScore: objectSimilarity, + }; +} + +function scoreSharedTickets(left: IntentRecord, right: IntentRecord, basis: string[]): number { + if (!intersects(left.statement.target.tickets, right.statement.target.tickets)) return 0; + basis.push('shared_ticket'); + return 0.62; +} + +function scoreSharedSymbol( + left: IntentRecord, + right: IntentRecord, + symbolResolutionIndex: SymbolResolutionIndex, + basis: string[], +): number { + const hasResolvedSymbol = hasResolvedNlAstSymbolPair(left, right, symbolResolutionIndex); + const hasSharedAlias = intersectsAliases(left.statement.target.symbols, right.statement.target.symbols, symbolAliases); + if (!(hasResolvedSymbol ?? hasSharedAlias)) return 0; + basis.push('shared_symbol'); + return 0.48; +} + +function scoreSharedPath( + left: IntentRecord, + right: IntentRecord, + resolvableBasenames: Set, + basis: string[], +): number { + if (!pathsIntersect(left.statement.target.paths, right.statement.target.paths, resolvableBasenames)) return 0; + let points = 0.28; + basis.push('shared_path'); + if (!isFileAggregateEvidencePair(left, right)) return points; + points += 0.24; + basis.push('module_coverage'); + const capabilityOverlap = aggregateCapabilityOverlap(left, right); + if (capabilityOverlap > 0) basis.push(`capability_overlap:${capabilityOverlap}`); + return points; +} + +function scoreSameAction(left: IntentRecord, right: IntentRecord, basis: string[]): number { + if (!(left.statement.action === right.statement.action && left.statement.action !== 'unknown')) return 0; + basis.push('same_action'); + return 0.13; +} + +function scoreObjectSimilarity( + leftKeywords: RecordKeywords | undefined, + rightKeywords: RecordKeywords | undefined, + basis: string[], +): number { const objectSimilarity = leftKeywords && rightKeywords ? Math.max( jaccard(leftKeywords.object, rightKeywords.object), @@ -380,21 +214,31 @@ function scorePair( ) : 0; if (objectSimilarity >= 0.2) { - score += objectSimilarity * 0.48; basis.push(`text_similarity:${objectSimilarity.toFixed(3)}`); + return objectSimilarity * 0.48; } - if (isModuleTopicEvidencePair(left, right) && leftKeywords && rightKeywords) { - const sharedTopics = intersectionSize(leftKeywords.topics, rightKeywords.topics); - // Two generic words still connected one declaration to dozens of modules - // in the measured repository. Three independently normalised topics keeps - // prose-only matching useful while retaining a precision-oriented floor. - if (sharedTopics >= 3) { - score += Math.min(0.64, 0.32 + sharedTopics * 0.08); - basis.push(`module_topic:${sharedTopics}`); - } - } - if (left.source.kind === right.source.kind) score -= 0.08; - return { score: Math.max(0, score), basis: [...new Set(basis)].sort(), textScore: objectSimilarity }; + return 0; +} + +function scoreSharedTopics( + left: IntentRecord, + right: IntentRecord, + leftKeywords: RecordKeywords | undefined, + rightKeywords: RecordKeywords | undefined, + basis: string[], +): number { + if (!isModuleTopicEvidencePair(left, right) || !leftKeywords || !rightKeywords) return 0; + const sharedTopics = intersectionSize(leftKeywords.topics, rightKeywords.topics); + // Two generic words still connected one declaration to dozens of modules + // in the measured repository. Three independently normalised topics keeps + // prose-only matching useful while retaining a precision-oriented floor. + if (sharedTopics < 3) return 0; + basis.push(`module_topic:${sharedTopics}`); + return Math.min(0.64, 0.32 + sharedTopics * 0.08); +} + +function scoreSourceKindPenalty(left: IntentRecord, right: IntentRecord): number { + return left.source.kind === right.source.kind ? -0.08 : 0; } function intersectionSize(left: Set, right: Set): number { @@ -422,53 +266,6 @@ function isModuleTopicEvidencePair(left: IntentRecord, right: IntentRecord): boo && (left.statement.kind === 'module_fact' || right.statement.kind === 'module_fact'); } -function determineRelation(left: IntentRecord, right: IntentRecord, evidence: PairEvidence): DirectedRelation { - // `scorePair` already computed this over the same two strings. - const textScore = evidence.textScore; - if (left.statement.polarity !== right.statement.polarity && textScore >= 0.45) { - return { from: left, to: right, type: 'contradicts' }; - } - if (left.source.kind === right.source.kind && textScore >= 0.82) { - return { from: left, to: right, type: 'duplicates' }; - } - const sourceRelation = relationForSourceKinds(left, right); - if (sourceRelation) return sourceRelation; - if (evidence.score >= 0.8) return { from: left, to: right, type: 'same_as' }; - return { from: left, to: right, type: 'related_to' }; -} - -function relationForSourceKinds(left: IntentRecord, right: IntentRecord): DirectedRelation | null { - for (const rule of SOURCE_RELATION_RULES) { - const relation = matchSourceRule(left, right, rule); - if (relation) return relation; - } - return null; -} - -function matchSourceRule( - left: IntentRecord, - right: IntentRecord, - rule: SourceRelationRule, -): DirectedRelation | null { - if (left.source.kind === rule.anchor && rule.others.has(right.source.kind)) { - return orientRelation(left, right, rule); - } - if (right.source.kind === rule.anchor && rule.others.has(left.source.kind)) { - return orientRelation(right, left, rule); - } - return null; -} - -function orientRelation( - anchor: IntentRecord, - other: IntentRecord, - rule: SourceRelationRule, -): DirectedRelation { - return rule.anchorPosition === 'from' - ? { from: anchor, to: other, type: rule.type } - : { from: other, to: anchor, type: rule.type }; -} - function intersects(left: string[], right: string[]): boolean { const set = new Set(left); return right.some((value) => set.has(value)); diff --git a/src/graph/symbol-resolution.ts b/src/graph/symbol-resolution.ts index f40b2d6..4d1aebf 100644 --- a/src/graph/symbol-resolution.ts +++ b/src/graph/symbol-resolution.ts @@ -20,15 +20,17 @@ export interface SymbolResolutionIndex { /** Resolves explicit NL symbols only against observed AST declarations. */ export function buildSymbolResolutionIndex(records: IntentRecord[]): SymbolResolutionIndex { + const byAlias = collectAstCandidates(records); + sortCandidates(byAlias); + return { byNlRecord: collectNlResolutions(records, byAlias) }; +} + +function collectAstCandidates(records: IntentRecord[]): Map { const byAlias = new Map(); for (const record of records) { if (!isAstDeclaration(record) || !record.source.path) continue; - const symbols = [...new Set([ - ...record.statement.target.symbols, - ...(record.source.symbol ? [record.source.symbol] : []), - ])]; - for (const symbol of symbols) { - const candidate = { recordId: record.id, path: normalizePath(record.source.path), symbol }; + for (const symbol of uniqueSymbols(record)) { + const candidate = buildAstCandidate(record, symbol); for (const alias of symbolAliases(symbol)) { const values = byAlias.get(alias) ?? []; if (!values.some((value) => value.recordId === candidate.recordId)) values.push(candidate); @@ -36,12 +38,36 @@ export function buildSymbolResolutionIndex(records: IntentRecord[]): SymbolResol } } } + return byAlias; +} + +function buildAstCandidate(record: IntentRecord, symbol: string): AstSymbolCandidate { + return { + recordId: record.id, + path: normalizePath(record.source.path ?? ''), + symbol, + }; +} + +function uniqueSymbols(record: IntentRecord): string[] { + return [...new Set([ + ...record.statement.target.symbols, + ...(record.source.symbol ? [record.source.symbol] : []), + ])]; +} + +function sortCandidates(byAlias: Map): void { for (const values of byAlias.values()) { values.sort((left, right) => left.path.localeCompare(right.path) || left.symbol.localeCompare(right.symbol) || left.recordId.localeCompare(right.recordId)); } +} +function collectNlResolutions( + records: IntentRecord[], + byAlias: Map, +): Map { const byNlRecord = new Map(); for (const record of records) { if (record.source.kind !== 'nl' || record.statement.target.symbols.length === 0) continue; @@ -51,7 +77,7 @@ export function buildSymbolResolutionIndex(records: IntentRecord[]): SymbolResol byAlias, ))); } - return { byNlRecord }; + return byNlRecord; } /** diff --git a/src/interfaces/a2a-history.ts b/src/interfaces/a2a-history.ts index 43e4d96..15630da 100644 --- a/src/interfaces/a2a-history.ts +++ b/src/interfaces/a2a-history.ts @@ -2,37 +2,11 @@ import { promises as fs, type Dirent } from 'node:fs'; import path from 'node:path'; import type { T2CConfig } from '../config/env.js'; import { assertPathWithinRoot } from '../core/security.js'; -import { isRecord } from './a2a-types.js'; - -interface IntentRunListItem { - runId: string; - createdAt: string; - graphFingerprint: string | null; - graphPath: string | null; - summaryPath: string | null; - warningCount: number; - status: 'succeeded' | 'degraded' | 'failed' | null; - failure: Record | null; - runtimeVersion: string | null; - stages: Record | null; - files: Record; - llm: { - naturalLanguageExtraction: boolean; - markdownExtraction: boolean; - documentationExtraction: boolean; - taskSynthesis: boolean; - summary: boolean; - } | null; - graphBytes: number; - communication: CommunicationRunSummary | null; -} - -interface CommunicationRunSummary { - tickets: string[]; - participants: Array<{ participant: string; role: string; tickets: string[]; issueIds: string[] }>; - issueSeverities: string[]; - issueCount: number; -} +import { + type CommunicationRunSummary, + type IntentRunListItem, + runListItem, +} from './a2a-run-list-item.js'; export interface RunHistoryFilters { participant: string | null; @@ -100,95 +74,6 @@ async function readRun( } } -async function safeRunPath(config: T2CConfig, directory: string, name: string): Promise { - return assertPathWithinRoot(config.root, path.join(directory, name), config.allowOutsideRoot); -} - -async function runListItem( - root: string, - fallbackRunId: string, - graphPath: string, - graphStat: import('node:fs').Stats | null, - manifestStat: import('node:fs').Stats, - manifest: Record, -): Promise { - const files = safeManifestFiles(root, isRecord(manifest.files) ? manifest.files : {}); - const llm = isRecord(manifest.llm) ? manifest.llm : null; - const runtime = isRecord(manifest.runtime) ? manifest.runtime : null; - const warnings = Array.isArray(manifest.warnings) ? manifest.warnings : []; - return { - runId: typeof manifest.runId === 'string' ? manifest.runId : fallbackRunId, - createdAt: validTimestamp(manifest.createdAt) ?? manifestStat.mtime.toISOString(), - graphFingerprint: typeof manifest.graphFingerprint === 'string' ? manifest.graphFingerprint : null, - graphPath: graphStat?.isFile() ? relativeApiPath(root, graphPath) : null, - summaryPath: typeof files.summary === 'string' ? files.summary : null, - warningCount: warnings.length, - status: validStatus(manifest.status), - failure: isRecord(manifest.failure) ? manifest.failure : null, - runtimeVersion: runtime && typeof runtime.version === 'string' ? runtime.version : null, - stages: isRecord(manifest.stages) ? manifest.stages : null, - files, - llm: llm ? llmSummary(llm) : null, - graphBytes: graphStat?.isFile() ? graphStat.size : 0, - communication: await readCommunicationSummary(root, files), - }; -} - -function validTimestamp(value: unknown): string | null { - return typeof value === 'string' && Number.isFinite(Date.parse(value)) ? value : null; -} - -function validStatus(value: unknown): IntentRunListItem['status'] { - return value === 'succeeded' || value === 'degraded' || value === 'failed' ? value : null; -} - -function llmSummary(value: Record): NonNullable { - return { - naturalLanguageExtraction: value.naturalLanguageExtraction === true, - markdownExtraction: value.markdownExtraction === true, - documentationExtraction: value.documentationExtraction === true, - taskSynthesis: value.taskSynthesis === true, - summary: value.summary === true, - }; -} - -async function readCommunicationSummary( - root: string, - files: Record, -): Promise { - const relative = files.communicationAnalysis; - if (!relative) return null; - try { - const filePath = path.resolve(root, relative); - const stat = await fs.stat(filePath); - if (!stat.isFile() || stat.size > 4 * 1024 * 1024) return null; - const value = JSON.parse(await fs.readFile(filePath, 'utf8')) as Record; - const participants = Array.isArray(value.participants) - ? value.participants.filter(isRecord).map(participantSummary).filter((item) => item.participant) - : []; - const issues = Array.isArray(value.issues) ? value.issues.filter(isRecord) : []; - return { - tickets: stringArray(value.tickets), - participants, - issueSeverities: [...new Set(issues.flatMap((item) => ( - typeof item.severity === 'string' ? [item.severity] : [] - )))].sort(), - issueCount: issues.length, - }; - } catch { - return null; - } -} - -function participantSummary(item: Record): CommunicationRunSummary['participants'][number] { - return { - participant: typeof item.participant === 'string' ? item.participant : '', - role: typeof item.role === 'string' ? item.role : 'unknown', - tickets: stringArray(item.tickets), - issueIds: stringArray(item.issueIds), - }; -} - function matchesRunFilters(summary: CommunicationRunSummary | null, filters: RunHistoryFilters): boolean { const participant = normalized(filters.participant); const role = normalized(filters.role); @@ -206,21 +91,6 @@ function normalized(value: string | null): string { return value?.trim().toLowerCase() ?? ''; } -function stringArray(value: unknown): string[] { - return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []; -} - -function safeManifestFiles(root: string, files: Record): Record { - const output: Record = {}; - for (const [name, value] of Object.entries(files)) { - if (typeof value !== 'string') continue; - const absolute = path.resolve(root, value); - const relative = path.relative(root, absolute); - if (!relative.startsWith('..') && !path.isAbsolute(relative)) output[name] = value; - } - return output; -} - -function relativeApiPath(root: string, filePath: string): string { - return path.relative(root, filePath).replace(/\\/g, '/'); +async function safeRunPath(config: T2CConfig, directory: string, name: string): Promise { + return assertPathWithinRoot(config.root, path.join(directory, name), config.allowOutsideRoot); } diff --git a/src/interfaces/a2a-message-command.ts b/src/interfaces/a2a-message-command.ts new file mode 100644 index 0000000..2c2b41b --- /dev/null +++ b/src/interfaces/a2a-message-command.ts @@ -0,0 +1,144 @@ +import { decodeIntakeEnvelope } from '../communication/intake-protobuf.js'; +import { + A2A_ACTIONS, + A2ARequestError, + isRecord, + type A2AAction, + type A2AMessage, +} from './a2a-types.js'; + +export function parseCommand( + message: A2AMessage, + params: Record, +): { action: A2AAction; input: Record } { + const protobufCommand = parseCommandFromProtobuf(message); + if (protobufCommand) return protobufCommand; + + const objectCommand = parseCommandFromObject(message, params); + if (objectCommand) return objectCommand; + + return parseCommandFromText(message, params); +} + +function parseCommandFromProtobuf(message: A2AMessage): { action: A2AAction; input: Record } | null { + const protobuf = message.parts.find((part) => typeof part.raw === 'string' && part.mediaType === 'application/x-protobuf'); + if (protobuf?.raw) { + const bytes = Buffer.from(protobuf.raw, 'base64'); + try { + decodeIntakeEnvelope(bytes, 'command'); + return { action: 'intake_command', input: { protobuf: protobuf.raw, outputFormat: 'protobuf' } }; + } catch { + decodeIntakeEnvelope(bytes, 'query'); + return { action: 'intake_query', input: { protobuf: protobuf.raw, outputFormat: 'protobuf' } }; + } + } + return null; +} + +function parseCommandFromObject( + message: A2AMessage, + params: Record, +): { action: A2AAction; input: Record } | null { + const objectData = message.parts.find((part) => isRecord(part.data))?.data; + if (isRecord(objectData)) return commandFromData(objectData, message, params); + return null; +} + +function parseCommandFromText( + message: A2AMessage, + params: Record, +): { action: A2AAction; input: Record } { + const text = parseText(message); + if (looksLikeJson(text)) return parseCommandFromJson(text, message, params); + return parseCommandFromSentence(text); +} + +function looksLikeJson(text: string): boolean { + return text.startsWith('{'); +} + +function parseCommandFromJson( + text: string, + message: A2AMessage, + params: Record, +): { action: A2AAction; input: Record } { + return commandFromData(JSON.parse(text) as Record, message, params); +} + +function parseCommandFromSentence(text: string): { action: A2AAction; input: Record } { + return commandInputFromSentence(text); +} + +function parseSentenceInput(text: string, start: number): Record { + return parseKeyValues(text.slice(start)); +} + +function defaultTextCommand(text: string): { action: A2AAction; input: Record } { + return { action: 'extract_nl', input: { text, file: 'a2a-message.md' } }; +} + +function isSupportedAction(value: string): value is A2AAction { + return A2A_ACTIONS.includes(value as A2AAction); +} + +function commandInputFromSentence( + text: string, +): { action: A2AAction; input: Record } { + const first = firstToken(text); + if (!first || !isSupportedAction(first)) return defaultTextCommand(text); + return { + action: first, + input: parseSentenceInput(text, first.length), + }; +} + +function parseText(message: A2AMessage): string { + return message.parts.map((part) => part.text ?? '').join('\n').trim(); +} + +function firstToken(text: string): string { + return text.split(/\s+/, 1)[0]?.toLowerCase() ?? ''; +} + +function commandFromData( + data: Record, + message: A2AMessage, + params: Record, +): { action: A2AAction; input: Record } { + const action = normalizeAction(data.action ?? data.skill ?? message.metadata?.action ?? params.skillId); + const nested = isRecord(data.input) ? data.input : data; + return { action, input: { ...nested } }; +} + +function parseKeyValues(text: string): Record { + const output: Record = {}; + for (const match of text.matchAll(/([A-Za-z][\w.-]*)=("[^"]*"|'[^']*'|\S+)/g)) { + const key = match[1]; + const raw = match[2]; + if (!key || raw === undefined) continue; + const stringValue = raw.replace(/^['"]|['"]$/g, ''); + output[key] = parseScalar(stringValue); + } + return output; +} + +function parseScalar(value: string): string | boolean | number { + if (value === 'true' || value === 'false') return value === 'true'; + return /^\d+$/.test(value) ? Number(value) : value; +} + +function normalizeAction(value: unknown): A2AAction { + if (typeof value !== 'string') return 'pipeline'; + const normalized = value.toLowerCase().replace(/[- ]/g, '_'); + const aliases: Record = { + analyze_repository: 'pipeline', + extract_intent: 'extract_nl', + summarize_team_state: 'summarize', + diagnose_alignment: 'diagnose', + }; + const action = aliases[normalized] ?? normalized; + if (!A2A_ACTIONS.includes(action as A2AAction)) { + throw new A2ARequestError(-32602, `Unknown todo2code action: ${value}`); + } + return action as A2AAction; +} diff --git a/src/interfaces/a2a-message.ts b/src/interfaces/a2a-message.ts index cbe7696..6cf8a0e 100644 --- a/src/interfaces/a2a-message.ts +++ b/src/interfaces/a2a-message.ts @@ -1,6 +1,4 @@ -import { decodeIntakeEnvelope } from '../communication/intake-protobuf.js'; import { - A2A_ACTIONS, A2ARequestError, isRecord, optionalBoolean, @@ -12,8 +10,8 @@ import { type A2AMessage, type A2APart, type SendConfiguration, - type A2AAction, } from './a2a-types.js'; +export { parseCommand } from './a2a-message-command.js'; export function parseSendConfiguration(value: unknown): SendConfiguration { if (value === undefined) return { returnImmediately: false, historyLength: undefined }; @@ -39,60 +37,6 @@ function validateOutputModes(value: unknown): void { } } -export function parseCommand( - message: A2AMessage, - params: Record, -): { action: A2AAction; input: Record } { - const protobuf = message.parts.find((part) => typeof part.raw === 'string' && part.mediaType === 'application/x-protobuf'); - if (protobuf?.raw) { - const bytes = Buffer.from(protobuf.raw, 'base64'); - try { - decodeIntakeEnvelope(bytes, 'command'); - return { action: 'intake_command', input: { protobuf: protobuf.raw, outputFormat: 'protobuf' } }; - } catch { - decodeIntakeEnvelope(bytes, 'query'); - return { action: 'intake_query', input: { protobuf: protobuf.raw, outputFormat: 'protobuf' } }; - } - } - const objectData = message.parts.find((part) => isRecord(part.data))?.data; - if (isRecord(objectData)) return commandFromData(objectData, message, params); - - const text = message.parts.map((part) => part.text ?? '').join('\n').trim(); - if (text.startsWith('{')) return commandFromData(JSON.parse(text) as Record, message, params); - const first = text.split(/\s+/, 1)[0]?.toLowerCase(); - if (first && A2A_ACTIONS.includes(first as A2AAction)) { - return { action: first as A2AAction, input: parseKeyValues(text.slice(first.length)) }; - } - return { action: 'extract_nl', input: { text, file: 'a2a-message.md' } }; -} - -function commandFromData( - data: Record, - message: A2AMessage, - params: Record, -): { action: A2AAction; input: Record } { - const action = normalizeAction(data.action ?? data.skill ?? message.metadata?.action ?? params.skillId); - const nested = isRecord(data.input) ? data.input : data; - return { action, input: { ...nested } }; -} - -function parseKeyValues(text: string): Record { - const output: Record = {}; - for (const match of text.matchAll(/([A-Za-z][\w.-]*)=("[^"]*"|'[^']*'|\S+)/g)) { - const key = match[1]; - const raw = match[2]; - if (!key || raw === undefined) continue; - const stringValue = raw.replace(/^['"]|['"]$/g, ''); - output[key] = parseScalar(stringValue); - } - return output; -} - -function parseScalar(value: string): string | boolean | number { - if (value === 'true' || value === 'false') return value === 'true'; - return /^\d+$/.test(value) ? Number(value) : value; -} - export function parseMessage(value: unknown): A2AMessage { if (!isRecord(value)) throw new A2ARequestError(-32602, 'params.message is required'); const messageId = stringParam(value.messageId, 'message.messageId'); @@ -151,22 +95,6 @@ export function ensureSupportedMessageContent(message: A2AMessage): void { if (!supported) throw new A2ARequestError(-32005, 'todo2code accepts text, object-valued JSON or canonical Protobuf parts'); } -function normalizeAction(value: unknown): A2AAction { - if (typeof value !== 'string') return 'pipeline'; - const normalized = value.toLowerCase().replace(/[- ]/g, '_'); - const aliases: Record = { - analyze_repository: 'pipeline', - extract_intent: 'extract_nl', - summarize_team_state: 'summarize', - diagnose_alignment: 'diagnose', - }; - const action = aliases[normalized] ?? normalized; - if (!A2A_ACTIONS.includes(action as A2AAction)) { - throw new A2ARequestError(-32602, `Unknown todo2code action: ${value}`); - } - return action as A2AAction; -} - export function cloneMessage(message: A2AMessage): A2AMessage { return { messageId: message.messageId, diff --git a/src/interfaces/a2a-run-list-item.ts b/src/interfaces/a2a-run-list-item.ts new file mode 100644 index 0000000..84af530 --- /dev/null +++ b/src/interfaces/a2a-run-list-item.ts @@ -0,0 +1,171 @@ +import path from 'node:path'; +import { promises as fs } from 'node:fs'; +import { isRecord } from './a2a-types.js'; + +export interface IntentRunListItem { + runId: string; + createdAt: string; + graphFingerprint: string | null; + graphPath: string | null; + summaryPath: string | null; + warningCount: number; + status: 'succeeded' | 'degraded' | 'failed' | null; + failure: Record | null; + runtimeVersion: string | null; + stages: Record | null; + files: Record; + llm: { + naturalLanguageExtraction: boolean; + markdownExtraction: boolean; + documentationExtraction: boolean; + taskSynthesis: boolean; + summary: boolean; + } | null; + graphBytes: number; + communication: CommunicationRunSummary | null; +} + +export interface CommunicationRunSummary { + tickets: string[]; + participants: Array<{ participant: string; role: string; tickets: string[]; issueIds: string[] }>; + issueSeverities: string[]; + issueCount: number; +} + +export async function runListItem( + root: string, + fallbackRunId: string, + graphPath: string, + graphStat: import('node:fs').Stats | null, + manifestStat: import('node:fs').Stats, + manifest: Record, +): Promise { + const files = safeManifestFiles(root, asRecord(manifest.files)); + return { + runId: resolveRunId(manifest, fallbackRunId), + createdAt: resolveCreatedAt(manifest, manifestStat), + graphFingerprint: valueString(manifest.graphFingerprint), + graphPath: graphStat?.isFile() ? relativeApiPath(root, graphPath) : null, + summaryPath: valueString(files.summary), + warningCount: warningCount(manifest), + status: resolveStatus(manifest.status), + failure: isRecord(manifest.failure) ? manifest.failure : null, + runtimeVersion: runtimeVersion(manifest), + stages: isRecord(manifest.stages) ? manifest.stages : null, + files, + llm: readLlmSummary(manifest), + graphBytes: graphStat?.isFile() ? graphStat.size : 0, + communication: await readCommunicationSummary(root, files), + }; +} + +function resolveRunId(manifest: Record, fallbackRunId: string): string { + return typeof manifest.runId === 'string' ? manifest.runId : fallbackRunId; +} + +function resolveCreatedAt(manifest: Record, manifestStat: import('node:fs').Stats): string { + return validTimestamp(manifest.createdAt) ?? manifestStat.mtime.toISOString(); +} + +function valueString(value: unknown): string | null { + return typeof value === 'string' ? value : null; +} + +function warningCount(manifest: Record): number { + const warnings = Array.isArray(manifest.warnings) ? manifest.warnings : []; + return warnings.length; +} + +function resolveStatus(statusValue: unknown): IntentRunListItem['status'] { + return statusValue === 'succeeded' || statusValue === 'degraded' || statusValue === 'failed' ? statusValue : null; +} + +function runtimeVersion(manifest: Record): string | null { + const runtime = asRecord(manifest.runtime); + if (!runtime || typeof runtime.version !== 'string') return null; + return runtime.version; +} + +function readLlmSummary(manifest: Record): IntentRunListItem['llm'] { + const llm = asRecord(manifest.llm); + return llm ? llmSummary(llm) : null; +} + +function asRecord(value: unknown): Record | null { + return isRecord(value) ? value : null; +} + +function validTimestamp(value: unknown): string | null { + return typeof value === 'string' && Number.isFinite(Date.parse(value)) ? value : null; +} + +function llmSummary(value: Record): NonNullable { + return { + naturalLanguageExtraction: value.naturalLanguageExtraction === true, + markdownExtraction: value.markdownExtraction === true, + documentationExtraction: value.documentationExtraction === true, + taskSynthesis: value.taskSynthesis === true, + summary: value.summary === true, + }; +} + +async function readCommunicationSummary( + root: string, + files: Record, +): Promise { + const relative = files.communicationAnalysis; + if (!relative) return null; + try { + const filePath = path.resolve(root, relative.replace(/^\//, '')); + const stat = await fs.stat(filePath); + if (!stat.isFile() || stat.size > 4 * 1024 * 1024) return null; + const value = JSON.parse(await fs.readFile(filePath, 'utf8')) as Record; + const participants = Array.isArray(value.participants) + ? value.participants.filter(isRecord).map(participantSummary).filter((item) => item.participant) + : []; + const issues = Array.isArray(value.issues) ? value.issues.filter(isRecord) : []; + return { + tickets: stringArray(value.tickets), + participants, + issueSeverities: [...new Set(issues.flatMap((item) => ( + typeof item.severity === 'string' ? [item.severity] : [] + )))].sort(), + issueCount: issues.length, + }; + } catch { + return null; + } +} + +function participantSummary(item: Record): CommunicationRunSummary['participants'][number] { + return { + participant: typeof item.participant === 'string' ? item.participant : '', + role: typeof item.role === 'string' ? item.role : 'unknown', + tickets: stringArray(item.tickets), + issueIds: stringArray(item.issueIds), + }; +} + +function stringArray(value: unknown): string[] { + return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []; +} + +function safeManifestFiles(root: string, files: Record): Record { + const output: Record = {}; + for (const [name, value] of Object.entries(files)) { + if (typeof value !== 'string') continue; + const safePath = value.replace(/^\//, ''); + const absolute = path.resolve(root, safePath); + if (isWithinRoot(root, absolute)) output[name] = value; + } + return output; +} + +function isWithinRoot(root: string, candidate: string): boolean { + const relative = path.relative(root, candidate); + return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative)); +} + +function relativeApiPath(root: string, filePath: string): string { + return path.relative(root, filePath).replace(/\\/g, '/'); +} diff --git a/src/llm/openrouter-request.ts b/src/llm/openrouter-request.ts new file mode 100644 index 0000000..1982f7f --- /dev/null +++ b/src/llm/openrouter-request.ts @@ -0,0 +1,242 @@ +interface ParsedOpenRouterResponse { + parsed: OpenRouterResponse; + text: string; +} + +interface OpenRouterChoice { + message?: { + content?: string | Array<{ type?: string; text?: string }>; + }; +} + +export interface OpenRouterResponse { + id?: string; + model?: string; + provider?: string; + usage?: { + prompt_tokens?: number; + completion_tokens?: number; + total_tokens?: number; + cost?: number; + }; + choices?: OpenRouterChoice[]; + error?: { message?: string }; +} + +export interface OpenRouterRequestContext { + apiKey: string; + baseUrl: string; + appName: string; + timeoutMs: number; + siteUrl?: string; + signal?: AbortSignal; +} + +type RequestAction = + | { action: 'success' } + | { action: 'retry'; retryAfterMs: number; error: Error } + | { action: 'fail'; error: Error }; + +export async function requestOpenRouter( + context: OpenRouterRequestContext, + body: Record, + listAvailableModels: () => Promise, + createModelError: (message: string, model: string, availableModels: string[]) => Error, +): Promise { + const { apiKey, timeoutMs } = context; + ensureApiKeyConfigured(apiKey); + + const controller = new AbortController(); + const detachAbort = connectAbortSignal(controller, context.signal); + const timeout = setTimeout(() => controller.abort(), timeoutMs); + + try { + let lastError: Error | null = null; + for (let attempt = 0; attempt < 3; attempt += 1) { + try { + const response = await sendRequest(context, body, controller); + const parsed = await parseResponse(response); + const resolution = await resolveHttpResponse( + response, + parsed, + body, + attempt, + listAvailableModels, + createModelError, + ); + if (resolution.action === 'retry') { + lastError = resolution.error; + await sleep(resolution.retryAfterMs); + continue; + } + if (resolution.action === 'fail') throw resolution.error; + return parsed; + } catch (error) { + const resolution = resolveTransportError(error, attempt, timeoutMs, context.signal); + if (resolution.action === 'retry') { + lastError = resolution.error; + await sleep(resolution.retryAfterMs); + continue; + } + lastError = resolution.error; + throw lastError; + } + } + throw lastError ?? new Error('OpenRouter request failed'); + } finally { + clearTimeout(timeout); + detachAbort(); + } +} + +function ensureApiKeyConfigured(apiKey: string): void { + if (!apiKey) throw new Error('OPENROUTER_API_KEY is required for this operation'); +} + +function connectAbortSignal(controller: AbortController, externalSignal?: AbortSignal): () => void { + const abortFromExternal = () => controller.abort(); + if (externalSignal) externalSignal.addEventListener('abort', abortFromExternal, { once: true }); + if (externalSignal?.aborted) controller.abort(); + return () => externalSignal?.removeEventListener('abort', abortFromExternal); +} + +function sendRequest( + context: OpenRouterRequestContext, + body: Record, + controller: AbortController, +): Promise { + return fetch(`${context.baseUrl}/chat/completions`, { + method: 'POST', + headers: buildRequestHeaders(context), + body: JSON.stringify(removeUndefined(body)), + signal: controller.signal, + }); +} + +async function resolveHttpResponse( + response: Response, + parsed: ParsedOpenRouterResponse, + body: Record, + attempt: number, + listAvailableModels: () => Promise, + createModelError: (message: string, model: string, availableModels: string[]) => Error, +): Promise { + if (response.ok && !parsed.error) return { action: 'success' }; + + const message = parsed.error?.message ?? parsed.text.slice(0, 500); + const error = new Error(`OpenRouter HTTP ${response.status}: ${message}`); + + if (isInvalidModelError(response.status, message)) { + return createModelErrorResponse( + error.message, + body, + listAvailableModels, + createModelError, + ); + } + + if (isRetryableServerError(response.status) && attempt < 2) { + return { action: 'retry', retryAfterMs: retryDelay(attempt), error }; + } + + return { action: 'fail', error }; +} + +async function createModelErrorResponse( + message: string, + body: Record, + listAvailableModels: () => Promise, + createModelError: (message: string, model: string, availableModels: string[]) => Error, +): Promise { + const model = typeof body.model === 'string' ? body.model : '(unknown)'; + try { + const availableModels = await listAvailableModels(); + return { action: 'fail', error: createModelError(message, model, availableModels) }; + } catch (listError) { + const listErrorMessage = listError instanceof Error ? listError.message : String(listError); + return { + action: 'fail', + error: createModelError( + `${message}\nAvailable OpenRouter models could not be fetched: ${listErrorMessage}`, + model, + [], + ), + }; + } +} + +function resolveTransportError( + error: unknown, + attempt: number, + timeoutMs: number, + externalSignal?: AbortSignal, +): RequestAction { + if (error instanceof Error && error.name === 'AbortError') { + if (externalSignal?.aborted) return { action: 'fail', error: new Error('OpenRouter request aborted by pipeline deadline') }; + return { action: 'fail', error: new Error(`OpenRouter request timed out after ${timeoutMs} ms`) }; + } + + if (error instanceof Error && isTransientNetworkError(error.message) && attempt < 2) { + return { action: 'retry', retryAfterMs: retryDelay(attempt), error }; + } + return { action: 'fail', error: error instanceof Error ? error : new Error(String(error)) }; +} + +function retryDelay(attempt: number): number { + return 300 * (2 ** attempt); +} + +function buildRequestHeaders(context: OpenRouterRequestContext): Record { + const headers: Record = { + Authorization: `Bearer ${context.apiKey}`, + 'Content-Type': 'application/json', + 'X-OpenRouter-Title': context.appName, + }; + if (context.siteUrl) headers['HTTP-Referer'] = context.siteUrl; + return headers; +} + +function shouldRetryWithoutJsonSchema(error: Error): boolean { + return /OpenRouter HTTP 4\d\d:|returned non-JSON|response does not contain choices|returned invalid JSON/i.test(error.message); +} + +export function shouldRetryRequestWithoutSchema(error: unknown): boolean { + return error instanceof Error && shouldRetryWithoutJsonSchema(error); +} + +function isRetryableServerError(status: number): boolean { + return status >= 500 || status === 429; +} + +function isTransientNetworkError(message: string): boolean { + return /fetch failed|ECONNRESET|ETIMEDOUT/i.test(message); +} + +function isInvalidModelError(status: number, message: string): boolean { + return status === 400 && /(?:not a valid model ID|invalid model(?: ID)?|model ID .*not found)/i.test(message); +} + +async function parseResponse(response: Response): Promise { + const text = await response.text(); + try { + return { parsed: JSON.parse(text) as OpenRouterResponse, text }; + } catch { + throw new Error(`OpenRouter returned non-JSON HTTP ${response.status}: ${text.slice(0, 500)}`); + } +} + +function removeUndefined(value: unknown): unknown { + if (Array.isArray(value)) return value.map(removeUndefined); + if (value !== null && typeof value === 'object') { + return Object.fromEntries( + Object.entries(value as Record) + .filter(([, item]) => item !== undefined) + .map(([key, item]) => [key, removeUndefined(item)]), + ); + } + return value; +} + +function sleep(milliseconds: number): Promise { + return new Promise((resolve) => setTimeout(resolve, milliseconds)); +} diff --git a/src/llm/openrouter.ts b/src/llm/openrouter.ts index 64c1371..f3606e9 100644 --- a/src/llm/openrouter.ts +++ b/src/llm/openrouter.ts @@ -1,32 +1,18 @@ import type { T2CConfig } from '../config/env.js'; import type { LlmResponseMetadata } from '../core/types.js'; import { StructuredResponseError, type StructuredSchema } from './structured-schema.js'; +import { + OpenRouterResponse, + OpenRouterRequestContext, + requestOpenRouter, + shouldRetryRequestWithoutSchema, +} from './openrouter-request.js'; export interface ChatMessage { role: 'system' | 'user' | 'assistant'; content: string; } -interface OpenRouterChoice { - message?: { - content?: string | Array<{ type?: string; text?: string }>; - }; -} - -interface OpenRouterResponse { - id?: string; - model?: string; - provider?: string; - usage?: { - prompt_tokens?: number; - completion_tokens?: number; - total_tokens?: number; - cost?: number; - }; - choices?: OpenRouterChoice[]; - error?: { message?: string }; -} - export interface OpenRouterResult { value: T; metadata: LlmResponseMetadata; @@ -169,84 +155,15 @@ export class OpenRouterClient { } private async request(body: Record): Promise { - const apiKey = this.config.apiKey; - if (!apiKey) throw new Error('OPENROUTER_API_KEY is required for this operation'); - const controller = new AbortController(); - const externalSignal = this.config.signal; - const abortFromExternal = () => controller.abort(); - externalSignal?.addEventListener('abort', abortFromExternal, { once: true }); - if (externalSignal?.aborted) controller.abort(); - const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs); - try { - let lastError: Error | null = null; - for (let attempt = 0; attempt < 3; attempt += 1) { - try { - const headers: Record = { - Authorization: `Bearer ${apiKey}`, - 'Content-Type': 'application/json', - 'X-OpenRouter-Title': this.config.appName, - }; - if (this.config.siteUrl) headers['HTTP-Referer'] = this.config.siteUrl; - const response = await fetch(`${this.config.baseUrl}/chat/completions`, { - method: 'POST', - headers, - body: JSON.stringify(removeUndefined(body)), - signal: controller.signal, - }); - const text = await response.text(); - let parsed: OpenRouterResponse; - try { - parsed = JSON.parse(text) as OpenRouterResponse; - } catch { - throw new Error(`OpenRouter returned non-JSON HTTP ${response.status}: ${text.slice(0, 500)}`); - } - if (!response.ok || parsed.error) { - const message = parsed.error?.message ?? text.slice(0, 500); - const error = new Error(`OpenRouter HTTP ${response.status}: ${message}`); - if ((response.status === 429 || response.status >= 500) && attempt < 2) { - lastError = error; - await sleep(300 * (2 ** attempt)); - continue; - } - if (isInvalidModelError(response.status, message)) { - const model = typeof body.model === 'string' ? body.model : '(unknown)'; - try { - const availableModels = await this.listAvailableModels(); - throw new OpenRouterModelError( - formatInvalidModelError(error.message, availableModels), - model, - availableModels, - ); - } catch (listError) { - if (listError instanceof OpenRouterModelError) throw listError; - throw new OpenRouterModelError( - `${error.message}\nAvailable OpenRouter models could not be fetched: ${listError instanceof Error ? listError.message : String(listError)}`, - model, - [], - ); - } - } - throw error; - } - return parsed; - } catch (error) { - if (error instanceof Error && error.name === 'AbortError') { - if (externalSignal?.aborted) throw new Error('OpenRouter request aborted by pipeline deadline'); - throw new Error(`OpenRouter request timed out after ${this.config.timeoutMs} ms`); - } - lastError = error instanceof Error ? error : new Error(String(error)); - if (attempt < 2 && /fetch failed|ECONNRESET|ETIMEDOUT/i.test(lastError.message)) { - await sleep(300 * (2 ** attempt)); - continue; - } - throw lastError; - } - } - throw lastError ?? new Error('OpenRouter request failed'); - } finally { - clearTimeout(timeout); - externalSignal?.removeEventListener('abort', abortFromExternal); - } + const context: OpenRouterRequestContext = { + apiKey: this.config.apiKey ?? '', + baseUrl: this.config.baseUrl, + appName: this.config.appName, + timeoutMs: this.config.timeoutMs, + siteUrl: this.config.siteUrl ?? undefined, + signal: this.config.signal, + }; + return requestOpenRouter(context, body, () => this.listAvailableModels(), createModelError); } } @@ -273,13 +190,8 @@ function finiteOrNull(value: unknown): number | null { return typeof value === 'number' && Number.isFinite(value) ? value : null; } -function shouldRetryWithoutJsonSchema(error: unknown): boolean { - if (!(error instanceof Error)) return false; - return /OpenRouter HTTP 4\d\d:|returned non-JSON|response does not contain choices|returned invalid JSON/i.test(error.message); -} - -function isInvalidModelError(status: number, message: string): boolean { - return status === 400 && /(?:not a valid model ID|invalid model(?: ID)?|model ID .*not found)/i.test(message); +function createModelError(message: string, model: string, availableModels: string[]): Error { + return new OpenRouterModelError(formatInvalidModelError(message, availableModels), model, availableModels); } function formatInvalidModelError(message: string, availableModels: string[]): string { @@ -288,16 +200,6 @@ function formatInvalidModelError(message: string, availableModels: string[]): st return `${message}\n${heading}\n${availableModels.map((model) => `- ${model}`).join('\n')}`; } -function removeUndefined(value: unknown): unknown { - if (Array.isArray(value)) return value.map(removeUndefined); - if (value !== null && typeof value === 'object') { - return Object.fromEntries(Object.entries(value as Record) - .filter(([, item]) => item !== undefined) - .map(([key, item]) => [key, removeUndefined(item)])); - } - return value; -} - function extractContent(response: OpenRouterResponse): string { const content = response.choices?.[0]?.message?.content; if (typeof content === 'string') return content; @@ -333,6 +235,6 @@ function parseJsonResponse(response: OpenRouterResponse): OpenRouterResult } } -function sleep(milliseconds: number): Promise { - return new Promise((resolve) => setTimeout(resolve, milliseconds)); +function shouldRetryWithoutJsonSchema(error: unknown): boolean { + return shouldRetryRequestWithoutSchema(error); } diff --git a/src/operations/generation-validation.ts b/src/operations/generation-validation.ts new file mode 100644 index 0000000..a8a9a2a --- /dev/null +++ b/src/operations/generation-validation.ts @@ -0,0 +1,69 @@ +import type { GroundedGenerationMetadata } from '../core/types.js'; + +const SHA256 = /^[a-f0-9]{64}$/; + +function asObject(value: unknown, name: string): Record { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + throw new Error(`${name} must be an object`); + } + return value as Record; +} + +function assertExactKeys(value: Record, expected: string[], name: string): void { + const actual = Object.keys(value).sort(); + const wanted = [...expected].sort(); + if (JSON.stringify(actual) !== JSON.stringify(wanted)) { + throw new Error(`${name} keys must be exactly: ${expected.join(', ')}`); + } +} + +function assertNonBlank(value: unknown, name: string): asserts value is string { + if (typeof value !== 'string' || !value.trim()) throw new Error(`${name} must be a non-blank string`); +} + +function assertDateString(value: unknown, name: string): void { + assertNonBlank(value, name); + if (!Number.isFinite(Date.parse(value))) throw new Error(`${name} must be an ISO date-time`); +} + +export function assertGeneration(value: unknown): asserts value is GroundedGenerationMetadata { + const generation = asObject(value, 'Operation plan generation'); + assertExactKeys( + generation, + [ + 'generator', + 'generatorVersion', + 'runtimeVersion', + 'generatedAt', + 'requestedMode', + 'effectiveMode', + 'degraded', + 'model', + 'provider', + 'responseId', + 'configurationFingerprint', + 'reason', + ], + 'Operation plan generation', + ); + for (const field of ['generator', 'generatorVersion', 'runtimeVersion'] as const) assertNonBlank(generation[field], `generation.${field}`); + assertDateString(generation.generatedAt, 'generation.generatedAt'); + if (!['deterministic', 'prefer-llm', 'require-llm'].includes(String(generation.requestedMode))) throw new Error('generation.requestedMode is invalid'); + if (!['deterministic', 'llm'].includes(String(generation.effectiveMode))) throw new Error('generation.effectiveMode is invalid'); + if (typeof generation.degraded !== 'boolean') throw new Error('generation.degraded must be a boolean'); + if (typeof generation.configurationFingerprint !== 'string' || !SHA256.test(generation.configurationFingerprint)) { + throw new Error('generation.configurationFingerprint must be SHA-256'); + } + for (const field of ['model', 'provider', 'responseId', 'reason'] as const) { + if (generation[field] !== null) assertNonBlank(generation[field], `generation.${field}`); + } + if (generation.effectiveMode === 'llm' && (generation.model === null || generation.provider === null)) { + throw new Error('LLM operation plans require model and provider provenance'); + } + if ( + generation.effectiveMode === 'deterministic' + && (generation.model !== null || generation.provider !== null || generation.responseId !== null) + ) { + throw new Error('Deterministic operation plans cannot claim LLM provenance'); + } +} diff --git a/src/operations/validation.ts b/src/operations/validation.ts index 2232e93..182f1ba 100644 --- a/src/operations/validation.ts +++ b/src/operations/validation.ts @@ -1,8 +1,8 @@ import { shortHash, stableStringify } from '../core/id.js'; import type { JsonValue } from '../core/types.js'; import type { OperationPlan, VariableContract } from './types.js'; +import { assertGeneration } from './generation-validation.js'; -const SHA256 = /^[a-f0-9]{64}$/; const VARIABLE_ID = /^VAR-[a-f0-9]{20}$/; const PLAN_ID = /^OPLAN-[a-f0-9]{20}$/; const STEP_ID = /^[a-z][a-z0-9-]{1,79}$/; @@ -61,14 +61,38 @@ function isJsonValue(value: unknown): value is JsonValue { export function assertVariableContract(value: unknown): asserts value is VariableContract { const contract = objectValue(value, 'Variable contract'); + assertVariableContractShape(contract); + assertVariableContractCore(contract); + const source = assertVariableSource(contract); + const access = assertVariableAccess(contract); + const readers = access.readers; + const writers = access.writers; + assertVariableAuthoritativeness(contract.id, readers, writers); + assertVariableMutability(contract.id, writers, contract.mutable, contract.freshnessSeconds); + const expectedId = buildVariableContractId(contract, readers, writers, source); + if (contract.id !== expectedId) { + throw new Error(`Variable contract id does not match semantic content: expected ${expectedId}`); + } +} + +function assertVariableContractShape(contract: Record): void { exactKeys(contract, [ 'schemaVersion', 'id', 'name', 'valueType', 'classification', 'source', 'access', 'mutable', 'freshnessSeconds', ], 'Variable contract'); +} + +function assertVariableContractCore(contract: Record): void { if (contract.schemaVersion !== 't2c.variable-contract/v1') throw new Error('Unsupported variable contract schemaVersion'); if (typeof contract.id !== 'string' || !VARIABLE_ID.test(contract.id)) throw new Error('Variable contract id is invalid'); if (typeof contract.name !== 'string' || !VARIABLE_NAME.test(contract.name)) throw new Error('Variable contract name is invalid'); if (!VALUE_TYPES.has(String(contract.valueType))) throw new Error('Variable contract valueType is invalid'); if (!CLASSIFICATIONS.has(String(contract.classification))) throw new Error('Variable contract classification is invalid'); +} + +function assertVariableSource(contract: Record): { + kind: VariableContract['source']['kind']; + ref: string; +} { const source = objectValue(contract.source, `Variable ${contract.id}: source`); exactKeys(source, ['kind', 'ref'], `Variable ${contract.id}: source`); if (!SOURCE_KINDS.has(String(source.kind))) throw new Error(`Variable ${contract.id}: source.kind is invalid`); @@ -76,59 +100,63 @@ export function assertVariableContract(value: unknown): asserts value is Variabl if (String(contract.classification) === 'secret' && source.kind !== 'vault') { throw new Error(`Variable ${contract.id}: secret variables must use a vault source`); } + return { kind: source.kind as VariableContract['source']['kind'], ref: source.ref as string }; +} + +function assertVariableAccess(contract: Record): { + readers: string[]; + writers: string[]; +} { const access = objectValue(contract.access, `Variable ${contract.id}: access`); exactKeys(access, ['readers', 'writers'], `Variable ${contract.id}: access`); - const readers = assertPrincipalList(access.readers, `Variable ${contract.id}: access.readers`); - const writers = assertPrincipalList(access.writers, `Variable ${contract.id}: access.writers`); + return { + readers: assertPrincipalList(access.readers, `Variable ${contract.id}: access.readers`), + writers: assertPrincipalList(access.writers, `Variable ${contract.id}: access.writers`), + }; +} + +function assertVariableAuthoritativeness(contractId: string, readers: string[], writers: string[]): void { if (!readers.includes('authority:founder') || !writers.includes('authority:founder')) { - throw new Error(`Variable ${contract.id}: authority:founder must be able to read and write every variable`); + throw new Error(`Variable ${contractId}: authority:founder must be able to read and write every variable`); } - if (typeof contract.mutable !== 'boolean') throw new Error(`Variable ${contract.id}: mutable must be a boolean`); - if (!contract.mutable && writers.some((item) => item !== 'authority:founder')) { - throw new Error(`Variable ${contract.id}: immutable variables may only be written by authority:founder`); +} + +function assertVariableMutability( + contractId: string, + writers: string[], + mutable: unknown, + freshnessSeconds: unknown, +): void { + if (typeof mutable !== 'boolean') throw new Error(`Variable ${contractId}: mutable must be a boolean`); + if (!mutable && writers.some((item) => item !== 'authority:founder')) { + throw new Error(`Variable ${contractId}: immutable variables may only be written by authority:founder`); } - if (contract.freshnessSeconds !== null - && (!Number.isInteger(contract.freshnessSeconds) || (contract.freshnessSeconds as number) < 1)) { - throw new Error(`Variable ${contract.id}: freshnessSeconds must be null or an integer >= 1`); + if (freshnessSeconds !== null + && (!Number.isInteger(freshnessSeconds) || (freshnessSeconds as number) < 1)) { + throw new Error(`Variable ${contractId}: freshnessSeconds must be null or an integer >= 1`); } +} + +function buildVariableContractId( + contract: Record, + readers: string[], + writers: string[], + source: { kind: VariableContract['source']['kind']; ref: string }, +): string { const semanticValue = { name: contract.name as string, valueType: contract.valueType as VariableContract['valueType'], classification: contract.classification as VariableContract['classification'], - source: contract.source as VariableContract['source'], + source, access: { - readers: [...(contract.access as VariableContract['access']).readers].sort(), - writers: [...(contract.access as VariableContract['access']).writers].sort(), + readers: [...readers].sort(), + writers: [...writers].sort(), }, - mutable: contract.mutable as boolean, - freshnessSeconds: contract.freshnessSeconds as number | null, + mutable: contract.mutable as VariableContract['mutable'], + freshnessSeconds: contract.freshnessSeconds as VariableContract['freshnessSeconds'], }; const expectedId = `VAR-${shortHash(stableStringify(semanticValue), 20)}`; - if (contract.id !== expectedId) throw new Error(`Variable contract id does not match semantic content: expected ${expectedId}`); -} - -function assertGeneration(value: unknown): void { - const generation = objectValue(value, 'Operation plan generation'); - exactKeys(generation, [ - 'generator', 'generatorVersion', 'runtimeVersion', 'generatedAt', 'requestedMode', 'effectiveMode', 'degraded', - 'model', 'provider', 'responseId', 'configurationFingerprint', 'reason', - ], 'Operation plan generation'); - for (const field of ['generator', 'generatorVersion', 'runtimeVersion'] as const) nonBlank(generation[field], `generation.${field}`); - dateString(generation.generatedAt, 'generation.generatedAt'); - if (!['deterministic', 'prefer-llm', 'require-llm'].includes(String(generation.requestedMode))) throw new Error('generation.requestedMode is invalid'); - if (!['deterministic', 'llm'].includes(String(generation.effectiveMode))) throw new Error('generation.effectiveMode is invalid'); - if (typeof generation.degraded !== 'boolean') throw new Error('generation.degraded must be a boolean'); - if (typeof generation.configurationFingerprint !== 'string' || !SHA256.test(generation.configurationFingerprint)) throw new Error('generation.configurationFingerprint must be SHA-256'); - for (const field of ['model', 'provider', 'responseId', 'reason'] as const) { - if (generation[field] !== null) nonBlank(generation[field], `generation.${field}`); - } - if (generation.effectiveMode === 'llm' && (generation.model === null || generation.provider === null)) { - throw new Error('LLM operation plans require model and provider provenance'); - } - if (generation.effectiveMode === 'deterministic' - && (generation.model !== null || generation.provider !== null || generation.responseId !== null)) { - throw new Error('Deterministic operation plans cannot claim LLM provenance'); - } + return expectedId; } function assertAcyclic(steps: OperationPlan['steps']): void { @@ -152,10 +180,26 @@ function assertAcyclic(steps: OperationPlan['steps']): void { export function assertOperationPlan(value: unknown): asserts value is OperationPlan { const plan = objectValue(value, 'Operation plan'); + validateOperationPlanShape(plan); + validateOperationPlanMetadata(plan); + validateOperationPlanEvidence(plan.evidence); + const variables = collectOperationPlanVariables(plan.variables); + const variableById = new Map(variables.map((item) => [item.id, item])); + const { steps, stepIds, hasCommandStep, founderDecisionRequired } = validateOperationSteps(plan.steps, variableById); + validateOperationExpectations(plan.expectations, stepIds); + validateOperationDecision(plan.decision, founderDecisionRequired); + validateOperationVerification(plan.verification, hasCommandStep); + validateOperationPlanHash(plan); +} + +function validateOperationPlanShape(plan: Record): void { exactKeys(plan, [ 'schemaVersion', 'id', 'planHash', 'status', 'createdAt', 'contractVersion', 'capabilitySnapshotHash', 'requestedBy', 'reason', 'evidence', 'generation', 'variables', 'steps', 'expectations', 'decision', 'verification', ], 'Operation plan'); +} + +function validateOperationPlanMetadata(plan: Record): void { if (plan.schemaVersion !== 't2c.operation-plan/v1') throw new Error('Unsupported operation plan schemaVersion'); if (typeof plan.id !== 'string' || !PLAN_ID.test(plan.id)) throw new Error('Operation plan id is invalid'); if (typeof plan.planHash !== 'string' || !SHA256.test(plan.planHash)) throw new Error('Operation plan planHash must be SHA-256'); @@ -165,83 +209,151 @@ export function assertOperationPlan(value: unknown): asserts value is OperationP if (typeof plan.capabilitySnapshotHash !== 'string' || !SHA256.test(plan.capabilitySnapshotHash)) throw new Error('Operation plan capabilitySnapshotHash must be SHA-256'); nonBlank(plan.requestedBy, 'Operation plan requestedBy'); nonBlank(plan.reason, 'Operation plan reason'); - const evidence = objectValue(plan.evidence, 'Operation plan evidence'); + assertGeneration(plan.generation); +} + +function validateOperationPlanEvidence(value: unknown): void { + const evidence = objectValue(value, 'Operation plan evidence'); exactKeys(evidence, ['graphFingerprint', 'recordIds', 'diagnosticIds', 'conclusionIds'], 'Operation plan evidence'); if (typeof evidence.graphFingerprint !== 'string' || !SHA256.test(evidence.graphFingerprint)) throw new Error('Operation plan evidence.graphFingerprint must be SHA-256'); uniqueStrings(evidence.recordIds, 'Operation plan evidence.recordIds', { nonEmpty: true }); uniqueStrings(evidence.diagnosticIds, 'Operation plan evidence.diagnosticIds'); uniqueStrings(evidence.conclusionIds, 'Operation plan evidence.conclusionIds'); - assertGeneration(plan.generation); - if (!Array.isArray(plan.variables)) throw new Error('Operation plan variables must be an array'); - plan.variables.forEach(assertVariableContract); - const variables = plan.variables as VariableContract[]; +} + +function collectOperationPlanVariables(value: unknown): VariableContract[] { + if (!Array.isArray(value)) throw new Error('Operation plan variables must be an array'); + value.forEach(assertVariableContract); + const variables = value as VariableContract[]; if (new Set(variables.map((item) => item.id)).size !== variables.length) throw new Error('Operation plan variable IDs must be unique'); if (new Set(variables.map((item) => item.name)).size !== variables.length) throw new Error('Operation plan variable names must be unique'); - const variableById = new Map(variables.map((item) => [item.id, item])); - if (!Array.isArray(plan.steps) || plan.steps.length === 0) throw new Error('Operation plan steps must not be empty'); - const steps = plan.steps as OperationPlan['steps']; + return variables; +} + +function validateOperationSteps( + value: unknown, + variableById: Map, +): { steps: OperationPlan['steps']; stepIds: Set; hasCommandStep: boolean; founderDecisionRequired: boolean } { + if (!Array.isArray(value) || value.length === 0) throw new Error('Operation plan steps must not be empty'); const stepIds = new Set(); + const steps = value as OperationPlan['steps']; + const validatedSteps: OperationPlan['steps'] = []; + let hasCommandStep = false; let founderDecisionRequired = false; for (const rawStep of steps) { - const step = objectValue(rawStep, 'Operation step'); - exactKeys(step, ['id', 'name', 'capability', 'uriProcess', 'actor', 'effect', 'reversible', 'riskClass', 'parameters', 'dependsOn', 'humanApproval', 'rollback'], `Operation step ${String(step.id)}`); - if (typeof step.id !== 'string' || !STEP_ID.test(step.id) || stepIds.has(step.id)) throw new Error('Operation step id is invalid or duplicate'); - stepIds.add(step.id); - nonBlank(step.name, `Operation step ${step.id}: name`); - nonBlank(step.capability, `Operation step ${step.id}: capability`); - if (typeof step.uriProcess !== 'string' || !URI.test(step.uriProcess)) throw new Error(`Operation step ${step.id}: uriProcess must be concrete and contain no wildcard`); - if (typeof step.actor !== 'string' || !PRINCIPAL.test(step.actor) || step.actor.startsWith('human:')) throw new Error(`Operation step ${step.id}: actor must be a non-human registered principal`); - if (!['query', 'command'].includes(String(step.effect))) throw new Error(`Operation step ${step.id}: effect is invalid`); - if (![true, false, null].includes(step.reversible as boolean | null)) throw new Error(`Operation step ${step.id}: reversible is invalid`); - if (!RISK_CLASSES.has(String(step.riskClass))) throw new Error(`Operation step ${step.id}: riskClass is invalid`); - if (typeof step.humanApproval !== 'boolean') throw new Error(`Operation step ${step.id}: humanApproval must be a boolean`); - const parameters = objectValue(step.parameters, `Operation step ${step.id}: parameters`); - for (const [name, rawReference] of Object.entries(parameters)) { - if (!PARAMETER_NAME.test(name)) throw new Error(`Operation step ${step.id}: parameter name ${name} is invalid`); - const reference = objectValue(rawReference, `Operation step ${step.id}: parameter ${name}`); - exactKeys(reference, ['kind', 'variableId'], `Operation step ${step.id}: parameter ${name}`); - if (reference.kind !== 'variable' || typeof reference.variableId !== 'string' || !variableById.has(reference.variableId)) { - throw new Error(`Operation step ${step.id}: parameter ${name} must reference a declared variable`); - } - const variable = variableById.get(reference.variableId); - if (variable?.classification === 'secret') throw new Error(`Operation step ${step.id}: secret variable ${reference.variableId} cannot enter a process envelope payload`); - if (!variable?.access.readers.includes(step.actor as string) && step.actor !== 'authority:founder') { - throw new Error(`Operation step ${step.id}: actor cannot read variable ${reference.variableId}`); - } + const step = validateOperationStep(rawStep, variableById, stepIds); + validatedSteps.push(step); + hasCommandStep ||= step.effect === 'command'; + founderDecisionRequired ||= step.effect === 'command' && (step.reversible !== true || ['boundary', 'governance'].includes(step.riskClass)); + } + assertAcyclic(validatedSteps); + return { steps: validatedSteps, stepIds, hasCommandStep, founderDecisionRequired }; +} + +function validateOperationStep( + value: unknown, + variableById: Map, + stepIds: Set, +): OperationPlan['steps'][number] { + const step = objectValue(value, 'Operation step'); + exactKeys(step, ['id', 'name', 'capability', 'uriProcess', 'actor', 'effect', 'reversible', 'riskClass', 'parameters', 'dependsOn', 'humanApproval', 'rollback'], `Operation step ${String(step.id)}`); + if (typeof step.id !== 'string' || !STEP_ID.test(step.id) || stepIds.has(step.id)) throw new Error('Operation step id is invalid or duplicate'); + stepIds.add(step.id); + nonBlank(step.name, `Operation step ${step.id}: name`); + nonBlank(step.capability, `Operation step ${step.id}: capability`); + if (typeof step.uriProcess !== 'string' || !URI.test(step.uriProcess)) throw new Error(`Operation step ${step.id}: uriProcess must be concrete and contain no wildcard`); + if (typeof step.actor !== 'string' || !PRINCIPAL.test(step.actor) || step.actor.startsWith('human:')) throw new Error(`Operation step ${step.id}: actor must be a non-human registered principal`); + if (!['query', 'command'].includes(String(step.effect))) throw new Error(`Operation step ${step.id}: effect is invalid`); + if (![true, false, null].includes(step.reversible as boolean | null)) throw new Error(`Operation step ${step.id}: reversible is invalid`); + if (!RISK_CLASSES.has(String(step.riskClass))) throw new Error(`Operation step ${step.id}: riskClass is invalid`); + if (typeof step.humanApproval !== 'boolean') throw new Error(`Operation step ${step.id}: humanApproval must be a boolean`); + const parameters = validateOperationStepParameters(step.parameters, variableById, step.id as string, step.actor as string); + uniqueStrings(step.dependsOn, `Operation step ${step.id}: dependsOn`); + const rollback = validateOperationStepRollback(step.rollback, step.id as string); + if (step.effect === 'query') { + if (step.riskClass !== 'read_only' || step.reversible !== true || step.humanApproval || rollback !== null) { + throw new Error(`Operation step ${step.id}: queries must be read_only, reversible, autonomous and have no rollback`); + } + } else { + if (step.riskClass === 'read_only' || rollback === null) { + throw new Error(`Operation step ${step.id}: commands require a non-read-only risk and rollback declaration`); + } + if ((step.reversible !== true || ['boundary', 'governance'].includes(String(step.riskClass))) && !step.humanApproval) { + throw new Error(`Operation step ${step.id}: safety-sensitive commands require humanApproval`); + } + } + return { + id: step.id as string, + name: step.name as string, + capability: step.capability as string, + uriProcess: step.uriProcess as string, + actor: step.actor as string, + effect: step.effect as OperationPlan['steps'][number]['effect'], + reversible: step.reversible as boolean | null, + riskClass: step.riskClass as OperationPlan['steps'][number]['riskClass'], + parameters, + dependsOn: step.dependsOn as string[], + humanApproval: step.humanApproval as boolean, + rollback, + }; +} + +function validateOperationStepParameters( + value: unknown, + variableById: Map, + stepId: string, + actor: string, +): Record { + const parameters = objectValue(value, `Operation step ${stepId}: parameters`); + const parsed: Record = {}; + for (const [name, rawReference] of Object.entries(parameters)) { + if (!PARAMETER_NAME.test(name)) throw new Error(`Operation step ${stepId}: parameter name ${name} is invalid`); + const reference = objectValue(rawReference, `Operation step ${stepId}: parameter ${name}`); + exactKeys(reference, ['kind', 'variableId'], `Operation step ${stepId}: parameter ${name}`); + if (reference.kind !== 'variable' || typeof reference.variableId !== 'string' || !variableById.has(reference.variableId)) { + throw new Error(`Operation step ${stepId}: parameter ${name} must reference a declared variable`); } - uniqueStrings(step.dependsOn, `Operation step ${step.id}: dependsOn`); - const rollback = step.rollback === null ? null : objectValue(step.rollback, `Operation step ${step.id}: rollback`); - if (rollback) { - exactKeys(rollback, ['kind', 'uriProcess', 'reason'], `Operation step ${step.id}: rollback`); - if (!['uri_process', 'unavailable'].includes(String(rollback.kind))) throw new Error(`Operation step ${step.id}: rollback.kind is invalid`); - if (rollback.kind === 'uri_process') { - if (typeof rollback.uriProcess !== 'string' || !URI.test(rollback.uriProcess)) throw new Error(`Operation step ${step.id}: rollback URI is invalid`); - if (rollback.reason !== null) throw new Error(`Operation step ${step.id}: URI rollback reason must be null`); - } else { - if (rollback.uriProcess !== null) throw new Error(`Operation step ${step.id}: unavailable rollback URI must be null`); - nonBlank(rollback.reason, `Operation step ${step.id}: unavailable rollback reason`); - } + const variable = variableById.get(reference.variableId); + if (variable?.classification === 'secret') { + throw new Error(`Operation step ${stepId}: secret variable ${reference.variableId} cannot enter a process envelope payload`); } - if (step.effect === 'query') { - if (step.riskClass !== 'read_only' || step.reversible !== true || step.humanApproval || rollback !== null) { - throw new Error(`Operation step ${step.id}: queries must be read_only, reversible, autonomous and have no rollback`); - } - } else { - if (step.riskClass === 'read_only' || rollback === null) throw new Error(`Operation step ${step.id}: commands require a non-read-only risk and rollback declaration`); - if (step.reversible !== true || ['boundary', 'governance'].includes(String(step.riskClass))) founderDecisionRequired = true; - if ((step.reversible !== true || ['boundary', 'governance'].includes(String(step.riskClass))) && !step.humanApproval) { - throw new Error(`Operation step ${step.id}: safety-sensitive commands require humanApproval`); - } + if (!variable?.access.readers.includes(actor) && actor !== 'authority:founder') { + throw new Error(`Operation step ${stepId}: actor cannot read variable ${reference.variableId}`); } + parsed[name] = { kind: 'variable', variableId: reference.variableId }; } - assertAcyclic(steps); - if (!Array.isArray(plan.expectations) || plan.expectations.length === 0) throw new Error('Operation plan expectations must not be empty'); + return parsed; +} + +function validateOperationStepRollback(value: unknown, stepId: string): OperationPlan['steps'][number]['rollback'] { + if (value === null) return null; + const rollback = objectValue(value, `Operation step ${stepId}: rollback`); + exactKeys(rollback, ['kind', 'uriProcess', 'reason'], `Operation step ${stepId}: rollback`); + if (!['uri_process', 'unavailable'].includes(String(rollback.kind))) throw new Error(`Operation step ${stepId}: rollback.kind is invalid`); + if (rollback.kind === 'uri_process') { + if (typeof rollback.uriProcess !== 'string' || !URI.test(rollback.uriProcess)) throw new Error(`Operation step ${stepId}: rollback URI is invalid`); + if (rollback.reason !== null) throw new Error(`Operation step ${stepId}: URI rollback reason must be null`); + } else { + if (rollback.uriProcess !== null) throw new Error(`Operation step ${stepId}: unavailable rollback URI must be null`); + nonBlank(rollback.reason, `Operation step ${stepId}: unavailable rollback reason`); + } + return { + kind: rollback.kind as OperationPlan['steps'][number]['rollback']['kind'], + uriProcess: rollback.uriProcess as string | null, + reason: rollback.reason as string | null, + }; +} + +function validateOperationExpectations(value: unknown, stepIds: Set): void { + if (!Array.isArray(value) || value.length === 0) throw new Error('Operation plan expectations must not be empty'); const coveredSteps = new Set(); const expectationIds = new Set(); - for (const rawExpectation of plan.expectations) { + for (const rawExpectation of value) { const expectation = objectValue(rawExpectation, 'Operation expectation'); exactKeys(expectation, ['id', 'expected', 'verifier', 'verifiedBy'], `Operation expectation ${String(expectation.id)}`); - if (typeof expectation.id !== 'string' || !STEP_ID.test(expectation.id) || expectationIds.has(expectation.id)) throw new Error('Operation expectation id is invalid or duplicate'); + if (typeof expectation.id !== 'string' || !STEP_ID.test(expectation.id) || expectationIds.has(expectation.id)) { + throw new Error('Operation expectation id is invalid or duplicate'); + } expectationIds.add(expectation.id); if (!isJsonValue(expectation.expected)) throw new Error(`Operation expectation ${expectation.id}: expected must be JSON`); nonBlank(expectation.verifier, `Operation expectation ${expectation.id}: verifier`); @@ -253,7 +365,10 @@ export function assertOperationPlan(value: unknown): asserts value is OperationP } const uncovered = [...stepIds].filter((id) => !coveredSteps.has(id)); if (uncovered.length) throw new Error(`Operation plan has steps without expectations: ${uncovered.join(',')}`); - const decision = objectValue(plan.decision, 'Operation plan decision'); +} + +function validateOperationDecision(value: unknown, founderDecisionRequired: boolean): void { + const decision = objectValue(value, 'Operation plan decision'); exactKeys(decision, ['required', 'authority', 'reason'], 'Operation plan decision'); if (typeof decision.required !== 'boolean') throw new Error('Operation plan decision.required must be a boolean'); if (founderDecisionRequired && (!decision.required || decision.authority !== 'authority:founder')) { @@ -265,17 +380,26 @@ export function assertOperationPlan(value: unknown): asserts value is OperationP } else if (decision.authority !== null || decision.reason !== null) { throw new Error('Operation plan decision authority and reason must be null when no decision is required'); } - const verification = objectValue(plan.verification, 'Operation plan verification'); +} + +function validateOperationVerification(value: unknown, hasCommandStep: boolean): void { + const verification = objectValue(value, 'Operation plan verification'); exactKeys(verification, ['serviceRestartRequired', 'exerciseRequired', 'independentReadback'], 'Operation plan verification'); for (const field of ['serviceRestartRequired', 'exerciseRequired', 'independentReadback'] as const) { if (typeof verification[field] !== 'boolean') throw new Error(`Operation plan verification.${field} must be a boolean`); } - if (steps.some((step) => step.effect === 'command') && (!verification.exerciseRequired || !verification.independentReadback)) { + if (hasCommandStep && (!verification.exerciseRequired || !verification.independentReadback)) { throw new Error('Command plans require exercise and independent readback verification'); } - const base = { ...(plan as unknown as OperationPlan) }; +} + +function validateOperationPlanHash(plan: Record): void { + const castPlan = plan as unknown as OperationPlan; + const base = { ...castPlan }; const { id: _id, planHash: _planHash, ...hashValue } = base; const expectedHash = shortHash(stableStringify(hashValue), 64); - if (plan.planHash !== expectedHash) throw new Error(`Operation plan hash does not match content: expected ${expectedHash}`); - if (plan.id !== `OPLAN-${expectedHash.slice(0, 20)}`) throw new Error('Operation plan id does not match planHash'); + if (castPlan.planHash !== expectedHash) { + throw new Error(`Operation plan hash does not match content: expected ${expectedHash}`); + } + if (castPlan.id !== `OPLAN-${expectedHash.slice(0, 20)}`) throw new Error('Operation plan id does not match planHash'); } diff --git a/src/pipeline/run-documentation.ts b/src/pipeline/run-documentation.ts new file mode 100644 index 0000000..8352e5d --- /dev/null +++ b/src/pipeline/run-documentation.ts @@ -0,0 +1,80 @@ +import { hasOpenRouter } from '../config/env.js'; +import type { PipelineOptions, PipelineStageAudit } from '../core/types.js'; +import type { T2CConfig } from '../config/env.js'; +import { extractDocumentationIntent } from '../extractors/docs-llm.js'; +import { extractDocumentationBaseline } from '../extractors/docs-deterministic.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import { T2C_VERSION } from '../version.js'; +import type { PipelineContext } from './run-types.js'; +import { collectTargetHints } from './run-helpers.js'; +import { skippedAudit } from './run-failed.js'; + +export async function collectDocumentationExtraction( + context: PipelineContext, + options: PipelineOptions, + config: T2CConfig, + deterministicDocumentFiles: string[], +): Promise<{ documentationAudit: PipelineStageAudit; deterministicDocsCount: number }> { + const { root, warnings, bySource } = context; + const documentationStartedAt = Date.now(); + const deterministicDocs = await extractDocumentationBaseline({ root, files: deterministicDocumentFiles }, config); + bySource.document = deterministicDocs.records; + warnings.push(...deterministicDocs.warnings); + + let documentationAudit: PipelineStageAudit = deterministicDocumentFiles.length === 0 + ? skippedAudit('deterministic', 'No documentation files matched the configured patterns') + : { + runtimeVersion: T2C_VERSION, + configuration: { generator: 't2c/markdown-documentation', generatorVersion: '2' }, + status: deterministicDocs.warnings.length ? 'partial' : 'succeeded', + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: deterministicDocs.warnings.length > 0, + recordCount: deterministicDocs.records.length, + warningCount: deterministicDocs.warnings.length, + model: null, + durationMs: Date.now() - documentationStartedAt, + reason: deterministicDocs.warnings.length + ? { code: 'DOCUMENT_EXTRACTION_PARTIAL', message: `${deterministicDocs.warnings.length} deterministic documentation warning(s)` } + : null, + responses: [], + }; + + if (options.includeDocumentationLlm) { + if (hasOpenRouter(config)) { + const docs = await extractDocumentationIntent({ + root, + patterns: options.documentPatterns, + excludes: options.documentExcludes ?? config.documentExcludes, + targetHints: collectTargetHints(Object.values(bySource).flat()), + }, config); + bySource.document.push(...docs.records); + warnings.push(...docs.warnings); + documentationAudit = { + ...docs.audit, + recordCount: bySource.document.length, + configuration: { + ...docs.audit.configuration, + deterministicGenerator: 't2c/markdown-documentation@2', + deterministicRecordCount: deterministicDocs.records.length, + }, + }; + } else { + const message = 'OPENROUTER_API_KEY is not configured; documentation -> Intent DSL was skipped'; + warnings.push(message); + documentationAudit = { + ...skippedAudit('llm', message), + configuration: openRouterAuditConfiguration(config, config.openRouter.documentModel, config.documentTimeoutMs), + status: deterministicDocs.records.length ? 'fallback' : 'failed', + effectiveMode: deterministicDocs.records.length ? 'deterministic' : 'none', + degraded: true, + recordCount: deterministicDocs.records.length, + model: config.openRouter.documentModel, + reason: { code: 'LLM_NOT_CONFIGURED', message }, + responses: [], + }; + } + } + + return { documentationAudit, deterministicDocsCount: deterministicDocs.records.length }; +} diff --git a/src/pipeline/run-execution.ts b/src/pipeline/run-execution.ts new file mode 100644 index 0000000..541e56e --- /dev/null +++ b/src/pipeline/run-execution.ts @@ -0,0 +1,189 @@ +import path from 'node:path'; + +import { hasOpenRouter } from '../config/env.js'; +import type { T2CConfig } from '../config/env.js'; +import { addCommunicationIssuesToDiagnostics, analyzeCommunication } from '../communication/analyzer.js'; +import { ensureDir, pathExists, resolveGlobs } from '../core/io.js'; +import { newRunId } from '../core/id.js'; +import type { PipelineOptions } from '../core/types.js'; +import { extractAstIntent } from '../extractors/ast.js'; +import { extractConfigurationIntent } from '../extractors/configuration.js'; +import { extractRuntimeCycleIntent } from '../extractors/runtime-cycle.js'; +import { extractGitIntent } from '../extractors/git.js'; +import { extractMarkdownIntentAudited } from '../extractors/markdown-llm.js'; +import { extractNlIntentAudited } from '../extractors/nl-llm.js'; +import { diagnoseGraph } from '../graph/diagnostics.js'; +import { linkIntentRecords } from '../graph/linker.js'; +import { + appendLlmNotConfigured, + collectCommunicationAnalysis, + collectTaskSynthesis, + createCodeChangeArtifacts, +} from './run-helpers.js'; +import { collectDocumentationExtraction } from './run-documentation.js'; +import { collectSummary } from './run-summary.js'; +import { skippedAudit } from './run-failed.js'; +import type { PipelineContext, PipelineExecutionOutput } from './run-types.js'; + +export async function initializePipelineContext(options: PipelineOptions): Promise { + const root = path.resolve(options.root); + if (!(await pathExists(root))) throw new Error(`Root does not exist: ${root}`); + const runId = newRunId(); + const baseOutput = path.resolve(root, options.outputDir); + const runDirectory = path.join(baseOutput, 'runs', runId); + await ensureDir(runDirectory); + + return { + root, + runId, + baseOutput, + runDirectory, + activeStage: 'setup', + warnings: [], + bySource: { + nl: [], + git: [], + ast: [], + todo: [], + changelog: [], + document: [], + configuration: [], + runtime: [], + communication: [], + }, + completedStages: {}, + }; +} + +export async function executePipeline(context: PipelineContext, options: PipelineOptions, config: T2CConfig): Promise { + const { root, warnings, bySource, completedStages } = context; + const deterministicDocumentFiles = await resolveGlobs( + root, + options.documentPatterns, + options.documentExcludes ?? config.documentExcludes, + ); + + let naturalLanguageAudit = skippedAudit('disabled', 'No NL task file was selected'); + if (options.taskFile) { + context.activeStage = 'naturalLanguageExtraction'; + const result = await extractNlIntentAudited( + { root, sourcePath: options.taskFile }, + config, + options.nlMode ?? config.nlMode, + ); + bySource.nl = result.records; + warnings.push(...result.warnings); + naturalLanguageAudit = result.audit; + } + completedStages.naturalLanguageExtraction = naturalLanguageAudit; + + context.activeStage = 'gitExtraction'; + const git = await extractGitIntent({ root, count: options.gitCommitCount }, config); + bySource.git = git.records; + warnings.push(...git.warnings); + + context.activeStage = 'astExtraction'; + const ast = await extractAstIntent({ root }, config); + bySource.ast = ast.records; + warnings.push(...ast.warnings); + + context.activeStage = 'markdownExtraction'; + const markdown = await extractMarkdownIntentAudited( + { root, todoPath: options.todoFile, changelogPath: options.changelogFile }, + config, + options.markdownMode ?? config.markdownMode, + ); + bySource.todo = markdown.records.filter((record) => record.source.kind === 'todo'); + bySource.changelog = markdown.records.filter((record) => record.source.kind === 'changelog'); + warnings.push(...markdown.warnings); + const markdownAudit = markdown.audit; + completedStages.markdownExtraction = markdownAudit; + + context.activeStage = 'documentationExtraction'; + const documentationResult = await collectDocumentationExtraction(context, options, config, deterministicDocumentFiles); + const documentationAudit = documentationResult.documentationAudit; + completedStages.documentationExtraction = documentationAudit; + + context.activeStage = 'configurationExtraction'; + const configurationExtraction = await extractConfigurationIntent(root, config); + bySource.configuration = configurationExtraction.records; + warnings.push(...configurationExtraction.warnings); + + context.activeStage = 'runtimeExtraction'; + if (options.cycleFile) { + try { + const runtime = await extractRuntimeCycleIntent(options.cycleFile, config, root); + bySource.runtime = runtime.records; + warnings.push(...runtime.warnings); + } catch (error) { + warnings.push(`runtime cycle ignored: ${error instanceof Error ? error.message : String(error)}`); + } + } + + const communicationInput = await collectCommunicationAnalysis(context, options, config); + const communicationAudit = communicationInput.audit; + const communicationInputPresent = !communicationInput.missingDirectory; + const communicationSyntheses = communicationInput.syntheses; + completedStages.communicationAnalysis = communicationAudit; + + context.activeStage = 'linking'; + const allRecords = Object.values(bySource).flat(); + const generatedAt = new Date().toISOString(); + const graph = linkIntentRecords(allRecords, generatedAt); + + context.activeStage = 'diagnostics'; + let diagnostics = diagnoseGraph(graph, generatedAt); + const communicationAnalysis = communicationInputPresent + ? analyzeCommunication(graph, generatedAt, communicationSyntheses) + : null; + if (communicationAnalysis) diagnostics = addCommunicationIssuesToDiagnostics(diagnostics, communicationAnalysis); + if (options.includeDocumentationLlm && !hasOpenRouter(config)) appendLlmNotConfigured(diagnostics); + + const taskSynthesis = await collectTaskSynthesis( + context, + options, + config, + root, + graph, + diagnostics, + ); + completedStages.taskSynthesis = taskSynthesis.audit; + + context.activeStage = 'codeChangePlanning'; + const { codeChangePlans, codeChangeReview, codeChangeSourcePatches, codeChangePlanningAudit } = createCodeChangeArtifacts( + graph, + diagnostics, + generatedAt, + root, + taskSynthesis.result, + config, + ); + completedStages.codeChangePlanning = codeChangePlanningAudit; + + context.activeStage = 'summary'; + const { summary, audit: summaryAudit } = await collectSummary(graph, diagnostics, config, options); + warnings.push(...summary.warnings); + completedStages.summary = summaryAudit; + + return { + generatedAt, + bySource, + graph, + diagnostics, + communicationAnalysis, + communicationSyntheses, + naturalLanguageAudit, + markdownAudit, + documentationAudit, + communicationAudit, + taskSynthesisAudit: taskSynthesis.audit, + codeChangePlanningAudit, + summary, + summaryAudit, + taskSynthesis: taskSynthesis.result, + todoPatch: taskSynthesis.patch, + codeChangePlans, + codeChangeReview, + codeChangeSourcePatches, + }; +} diff --git a/src/pipeline/run-failed.ts b/src/pipeline/run-failed.ts new file mode 100644 index 0000000..4e9d400 --- /dev/null +++ b/src/pipeline/run-failed.ts @@ -0,0 +1,167 @@ +import path from 'node:path'; + +import { DocumentationLlmRequiredError, MarkdownLlmRequiredError } from '../extractors/docs-llm.js'; +import { NlLlmRequiredError } from '../extractors/nl-llm.js'; +import { CommunicationLlmRequiredError } from '../communication/llm.js'; +import { TaskSynthesisRequiredError } from '../synthesis/tasks-llm.js'; +import { T2C_VERSION } from '../version.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import { writeJson } from '../core/io.js'; +import type { PipelineManifest, PipelineFailureStage, PipelineOptions, PipelineStageAudit } from '../core/types.js'; +import type { T2CConfig } from '../config/env.js'; +import type { PipelineContext } from './run-types.js'; +import { manifestConfiguration } from './run-persistence.js'; + +type PipelineManifestStage = keyof PipelineManifest['stages']; + +const abortStageLabels: Record = { + naturalLanguageExtraction: 'natural-language extraction', + markdownExtraction: 'Markdown extraction', + documentationExtraction: 'documentation extraction', + communicationAnalysis: 'communication analysis', + taskSynthesis: 'task synthesis', + codeChangePlanning: 'code-change planning', + summary: 'summary generation', +}; + +function isLlMFailureStage(stage: PipelineManifestStage): boolean { + return stage === 'summary' || stage === 'taskSynthesis'; +} + +function failureModelForStage(config: T2CConfig, stage: PipelineManifestStage): string | null { + if (stage === 'summary') return config.openRouter.summaryModel; + if (stage === 'taskSynthesis') return config.openRouter.taskModel; + return null; +} + +export async function persistFailedRun( + context: PipelineContext, + error: unknown, + options: PipelineOptions, + config: T2CConfig, +): Promise { + await persistFailedRunState( + context.runId, + context.root, + context.runDirectory, + options, + config, + error, + context.activeStage, + context.completedStages, + ); +} + +export function persistFailedRunState( + runId: string, + root: string, + runDirectory: string, + options: PipelineOptions, + config: T2CConfig, + error: unknown, + failedStage: PipelineFailureStage, + completedStages: Partial, +): Promise { + const message = error instanceof Error ? error.message : String(error); + const knownAudit = error instanceof NlLlmRequiredError + || error instanceof MarkdownLlmRequiredError + || error instanceof DocumentationLlmRequiredError + || error instanceof CommunicationLlmRequiredError + || error instanceof TaskSynthesisRequiredError + ? error.audit + : null; + const stageFailureCode = failureCode(failedStage); + const manifestFailureReason = knownAudit?.reason ?? { code: stageFailureCode, message }; + const failureStatus = failureAuditForStage.bind(null, message, knownAudit, stageFailureCode, config); + const stageValue = makeStageValue.bind(null, failureStatus, completedStages, failedStage); + const stages: PipelineManifest['stages'] = { + naturalLanguageExtraction: stageValue('naturalLanguageExtraction'), + markdownExtraction: stageValue('markdownExtraction'), + documentationExtraction: stageValue('documentationExtraction'), + communicationAnalysis: stageValue('communicationAnalysis'), + taskSynthesis: stageValue('taskSynthesis'), + codeChangePlanning: stageValue('codeChangePlanning'), + summary: stageValue('summary'), + }; + const reason = manifestFailureReason; + const manifest: PipelineManifest = { + schemaVersion: 't2c.run/v1', + runId, + root, + createdAt: new Date().toISOString(), + graphFingerprint: null, + files: {}, + warnings: [message], + status: 'failed', + failure: { stage: failedStage, code: reason.code, message: reason.message }, + runtime: { name: 'todo2code', version: T2C_VERSION }, + configuration: manifestConfiguration(options, config), + stages, + llm: { + naturalLanguageExtraction: stages.naturalLanguageExtraction.effectiveMode === 'llm', + markdownExtraction: stages.markdownExtraction.effectiveMode === 'llm', + communicationEnrichment: stages.communicationAnalysis.effectiveMode === 'llm', + documentationExtraction: false, + taskSynthesis: false, + summary: false, + }, + }; + return writeJson(path.join(runDirectory, 'manifest.json'), manifest); +} + +function failureCode(stage: PipelineFailureStage): string { + return `PIPELINE_${stage.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase()}_FAILED`; +} + +function failureAuditForStage( + message: string, + knownAudit: PipelineStageAudit | null, + stageFailureCode: string, + config: T2CConfig, + stage: PipelineManifestStage, + failedStage: PipelineFailureStage, +): PipelineStageAudit { + if (knownAudit && stage === failedStage) return knownAudit; + return { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(config, isLlMFailureStage(stage) ? failureModelForStage(config, stage) : null), + status: 'failed', + requestedMode: isLlMFailureStage(stage) ? 'llm' : 'disabled', + effectiveMode: 'none', + degraded: true, + recordCount: 0, + warningCount: 1, + model: failureModelForStage(config, stage), + durationMs: 0, + reason: { code: stageFailureCode, message }, + responses: [], + }; +} + +function makeStageValue( + failureStatus: ( + stage: PipelineManifestStage, + failedStage: PipelineFailureStage, + ) => PipelineStageAudit, + completedStages: Partial, + failedStage: PipelineFailureStage, + stage: PipelineManifestStage, +): PipelineStageAudit { + if (completedStages[stage]) return completedStages[stage]!; + if (stage === failedStage) return failureStatus(stage, failedStage); + return { + ...skippedAudit('disabled', `Pipeline aborted before ${abortStageLabels[stage]}`), + reason: { code: 'PIPELINE_ABORTED', message: `Pipeline aborted before ${abortStageLabels[stage]}` }, + }; +} + +export function skippedAudit(requestedMode: PipelineStageAudit['requestedMode'], message: string): PipelineStageAudit { + return { + runtimeVersion: T2C_VERSION, + configuration: {}, + status: 'skipped', requestedMode, effectiveMode: 'none', degraded: false, + recordCount: 0, warningCount: 0, model: null, durationMs: 0, + reason: { code: 'STAGE_SKIPPED', message }, + responses: [], + }; +} diff --git a/src/pipeline/run-helpers.ts b/src/pipeline/run-helpers.ts new file mode 100644 index 0000000..e5adadb --- /dev/null +++ b/src/pipeline/run-helpers.ts @@ -0,0 +1,177 @@ +import path from 'node:path'; + +import { createCodeChangeReviewPatch, createCodeChangeSourcePatchSet, createRepositoryPathProbe, proposeCodeChangePlans } from '../synthesis/code-change-plan.js'; +import { extractCommunicationIntentAudited, type ParticipantCommunicationSynthesis } from '../communication/llm.js'; +import { type AuditedTaskSynthesisResult, synthesizeTodoProposals } from '../synthesis/tasks-llm.js'; +import { createTodoPatch, type CreatedTodoPatch } from '../synthesis/todo-patch.js'; +import { createIntentId } from '../core/id.js'; +import type { Diagnostic, DiagnosticReport, IntentRecord, PipelineOptions, PipelineStageAudit } from '../core/types.js'; +import { readText } from '../core/io.js'; +import { T2C_VERSION } from '../version.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import type { T2CConfig } from '../config/env.js'; +import type { PipelineContext } from './run-types.js'; +import { skippedAudit } from './run-failed.js'; + +export async function collectCommunicationAnalysis( + context: PipelineContext, + options: Pick, + config: T2CConfig, +): Promise<{ + audit: PipelineStageAudit; + syntheses: ParticipantCommunicationSynthesis[]; + missingDirectory: boolean; +}> { + const { root, warnings, bySource } = context; + const includeCommunication = options.includeCommunication !== false; + const communicationStartedAt = Date.now(); + let communicationAudit: PipelineStageAudit = skippedAudit('disabled', 'Communication analysis was disabled'); + let missingDirectory = false; + let communicationSyntheses: ParticipantCommunicationSynthesis[] = []; + + if (!includeCommunication) { + return { audit: communicationAudit, syntheses: communicationSyntheses, missingDirectory: true }; + } + + context.activeStage = 'communicationAnalysis'; + const communication = await extractCommunicationIntentAudited({ + root, + projectDir: options.projectDirectory ?? 'project', + ticket: options.communicationTicket ?? null, + }, config, options.communicationMode ?? config.communicationMode); + const foundMissingDirectory = communication.records.length === 0 + && communication.warnings.length === 1 + && communication.warnings[0]?.startsWith('Communication directory not found:'); + if (!foundMissingDirectory) warnings.push(...communication.warnings); + bySource.communication = communication.records; + communicationSyntheses = communication.participants; + missingDirectory = foundMissingDirectory; + if (!foundMissingDirectory) { + communicationAudit = { + ...communication.audit, + durationMs: Date.now() - communicationStartedAt, + effectiveMode: communication.audit.effectiveMode, + }; + } else { + communicationAudit = skippedAudit('deterministic', communication.warnings[0] ?? 'Communication directory not found'); + } + + return { + audit: communicationAudit, + syntheses: communicationSyntheses, + missingDirectory, + }; +} + +export async function collectTaskSynthesis( + context: PipelineContext, + options: Pick, + config: T2CConfig, + root: string, + graph: Parameters[0], + diagnostics: DiagnosticReport, +): Promise<{ result: AuditedTaskSynthesisResult | null; patch: CreatedTodoPatch | null; audit: PipelineStageAudit }> { + const { warnings } = context; + const taskSynthesisMode = options.taskSynthesisMode ?? 'disabled'; + let taskSynthesis: AuditedTaskSynthesisResult | null = null; + let todoPatch: CreatedTodoPatch | null = null; + let taskSynthesisAudit = skippedAudit('disabled', 'Task synthesis was disabled'); + + if (taskSynthesisMode === 'disabled') { + return { result: taskSynthesis, patch: todoPatch, audit: taskSynthesisAudit }; + } + + context.activeStage = 'taskSynthesis'; + taskSynthesis = await synthesizeTodoProposals(graph, diagnostics, config, taskSynthesisMode); + warnings.push(...taskSynthesis.warnings); + taskSynthesisAudit = taskSynthesis.audit; + + if (!options.todoFile) throw new Error('Task synthesis rendering requires a TODO source file'); + context.activeStage = 'todoRendering'; + const todoContent = await readText(path.resolve(root, options.todoFile), config.maxFileBytes); + todoPatch = createTodoPatch({ + todoPath: path.relative(root, path.resolve(root, options.todoFile)).replace(/\\/g, '/'), + todoContent, + graph, + diagnostics, + conclusions: taskSynthesis.conclusions, + proposals: taskSynthesis.proposals, + validation: taskSynthesis.validation, + synthesisAudit: taskSynthesis.audit, + }); + return { result: taskSynthesis, patch: todoPatch, audit: taskSynthesisAudit }; +} + +export function createCodeChangeArtifacts( + graph: Parameters[0]['graph'], + diagnostics: DiagnosticReport, + generatedAt: string, + root: string, + taskSynthesis: AuditedTaskSynthesisResult | null, + config: T2CConfig, +) { + const codeChangePlans = proposeCodeChangePlans({ + graph, + diagnostics, + ...(taskSynthesis + ? { conclusions: taskSynthesis.conclusions, proposals: taskSynthesis.proposals } + : {}), + generatedAt, + pathExists: createRepositoryPathProbe(root), + }); + const codeChangeReview = createCodeChangeReviewPatch({ + plans: codeChangePlans.plans, + graphFingerprint: graph.fingerprint, + createdAt: generatedAt, + }); + const codeChangeSourcePatches = createCodeChangeSourcePatchSet({ + plans: codeChangePlans.plans, + graphFingerprint: graph.fingerprint, + generatedAt, + }); + const codeChangePlanningAudit: PipelineStageAudit = { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(config, null), + status: 'succeeded', + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + recordCount: codeChangePlans.plans.length, + warningCount: 0, + model: null, + durationMs: 0, + reason: null, + responses: [], + }; + return { + codeChangePlans, + codeChangeReview, + codeChangeSourcePatches, + codeChangePlanningAudit, + }; +} + +export function collectTargetHints(records: IntentRecord[]): { paths: string[]; symbols: string[]; tickets: string[]; versions: string[] } { + const values = (key: K): string[] => [ + ...new Set(records.flatMap((record) => record.statement.target[key])), + ].slice(0, 200); + return { + paths: values('paths'), + symbols: values('symbols'), + tickets: values('tickets'), + versions: values('versions'), + }; +} + +export function appendLlmNotConfigured(report: DiagnosticReport): void { + const diagnostic: Diagnostic = { + id: createIntentId({ code: 'LLM_NOT_CONFIGURED', graph: report.graphFingerprint }, 'DIAG'), + code: 'LLM_NOT_CONFIGURED', + severity: 'warning', + title: 'OpenRouter nie jest skonfigurowany', + detail: 'Etap dokumentacja -> Intent DSL zostaΕ‚ pominiΔ™ty, poniewaΕΌ brakuje OPENROUTER_API_KEY.', + recordIds: [], + suggestedAction: 'UstawiΔ‡ OPENROUTER_API_KEY w .env i ponownie uruchomiΔ‡ pipeline.', + }; + report.diagnostics.unshift(diagnostic); + report.counts.warning += 1; diff --git a/src/pipeline/run-persistence.ts b/src/pipeline/run-persistence.ts new file mode 100644 index 0000000..668b958 --- /dev/null +++ b/src/pipeline/run-persistence.ts @@ -0,0 +1,292 @@ +import path from 'node:path'; + +import { sha256, stableStringify } from '../core/id.js'; +import { writeJson, writeJsonl, writeText } from '../core/io.js'; +import { T2C_VERSION } from '../version.js'; +import { renderCommunicationMarkdown } from '../communication/analyzer.js'; +import { hasOpenRouter } from '../config/env.js'; +import type { PipelineManifest, PipelineOptions, PipelineStageAudit } from '../core/types.js'; +import type { T2CConfig } from '../config/env.js'; +import type { PipelineContext, PipelineExecutionOutput, PipelinePersistedPaths } from './run-types.js'; + +export function makePipelineManifest( + context: PipelineContext, + options: PipelineOptions, + config: T2CConfig, + execution: PipelineExecutionOutput, + files: Record, + stageAudits: { + naturalLanguageExtraction: PipelineStageAudit; + markdownExtraction: PipelineStageAudit; + documentationExtraction: PipelineStageAudit; + communicationAnalysis: PipelineStageAudit; + taskSynthesis: PipelineStageAudit; + codeChangePlanning: PipelineStageAudit; + summary: PipelineStageAudit; + }, +): PipelineManifest { + return { + schemaVersion: 't2c.run/v1', + runId: context.runId, + root: context.root, + createdAt: execution.generatedAt, + graphFingerprint: execution.graph.fingerprint, + files, + warnings: [...new Set(context.warnings)].sort(), + status: Object.values(stageAudits).some((stage) => stage.degraded) ? 'degraded' : 'succeeded', + failure: null, + runtime: { name: 'todo2code', version: T2C_VERSION }, + configuration: manifestConfiguration(options, config), + stages: stageAudits, + llm: { + naturalLanguageExtraction: stageAudits.naturalLanguageExtraction.effectiveMode === 'llm', + markdownExtraction: stageAudits.markdownExtraction.effectiveMode === 'llm', + documentationExtraction: stageAudits.documentationExtraction.effectiveMode === 'llm', + communicationEnrichment: stageAudits.communicationAnalysis.effectiveMode === 'llm', + taskSynthesis: stageAudits.taskSynthesis.effectiveMode === 'llm', + summary: execution.summary.llmUsed, + }, + }; +} + +export async function persistPipelineArtifacts(context: PipelineContext, execution: PipelineExecutionOutput): Promise { + const { root, runDirectory, bySource } = context; + const { + graph, + diagnostics, + summary, + taskSynthesis, + todoPatch, + codeChangePlans, + codeChangeReview, + codeChangeSourcePatches, + communicationAnalysis, + } = execution; + + const files: Record = {}; + + Object.assign(files, await persistIntentArtifacts(runDirectory, root, bySource)); + + const coreArtifacts = await persistCoreArtifacts( + runDirectory, + root, + graph, + diagnostics, + summary, + codeChangePlans, + codeChangeReview, + codeChangeSourcePatches, + ); + Object.assign(files, coreArtifacts.files); + + const optionalArtifacts = await persistOptionalArtifacts( + runDirectory, + root, + taskSynthesis, + todoPatch, + communicationAnalysis, + ); + Object.assign(files, optionalArtifacts.files); + + return { + files, + graphPath: coreArtifacts.graphPath, + diagnosticsPath: coreArtifacts.diagnosticsPath, + summaryPath: coreArtifacts.summaryPath, + summaryConclusionsPath: coreArtifacts.summaryConclusionsPath, + taskSynthesisPath: optionalArtifacts.taskSynthesisPath, + todoPatchPath: optionalArtifacts.todoPatchPath, + todoPatchAuditPath: optionalArtifacts.todoPatchAuditPath, + codeChangePlansPath: coreArtifacts.codeChangePlansPath, + codeChangeReviewPath: coreArtifacts.codeChangeReviewPath, + codeChangeReviewAuditPath: coreArtifacts.codeChangeReviewAuditPath, + codeChangeSourcePatchesPath: coreArtifacts.codeChangeSourcePatchesPath, + communicationAnalysisPath: optionalArtifacts.communicationAnalysisPath, + }; +} + +async function persistIntentArtifacts( + runDirectory: string, + root: string, + bySource: PipelineContext['bySource'], +): Promise> { + const files: Record = {}; + for (const [source, records] of Object.entries(bySource)) { + const filePath = path.join(runDirectory, `${source}.intent.jsonl`); + await writeJsonl(filePath, records); + files[`${source}Intent`] = path.relative(root, filePath).replace(/\\/g, '/'); + } + return files; +} + +type PersistCoreArtifactsResult = { + files: Record; + graphPath: string; + diagnosticsPath: string; + summaryPath: string; + summaryConclusionsPath: string; + codeChangePlansPath: string; + codeChangeReviewPath: string; + codeChangeReviewAuditPath: string; + codeChangeSourcePatchesPath: string; +}; + +async function persistCoreArtifacts( + runDirectory: string, + root: string, + graph: PipelineExecutionOutput['graph'], + diagnostics: PipelineExecutionOutput['diagnostics'], + summary: PipelineExecutionOutput['summary'], + codeChangePlans: PipelineExecutionOutput['codeChangePlans'], + codeChangeReview: PipelineExecutionOutput['codeChangeReview'], + codeChangeSourcePatches: PipelineExecutionOutput['codeChangeSourcePatches'], +): Promise { + const files: Record = {}; + + const graphPath = path.join(runDirectory, 'intent.graph.json'); + const diagnosticsPath = path.join(runDirectory, 'diagnostics.json'); + const summaryPath = path.join(runDirectory, 'team-summary.md'); + const summaryConclusionsPath = path.join(runDirectory, 'summary-conclusions.json'); + const codeChangePlansPath = path.join(runDirectory, 'code-change-plans.json'); + const codeChangeReviewPath = path.join(runDirectory, 'CODE_CHANGE.review.md'); + const codeChangeReviewAuditPath = path.join(runDirectory, 'CODE_CHANGE.review.json'); + const codeChangeSourcePatchesPath = path.join(runDirectory, 'code-change-source-patches.json'); + + await writeJson(graphPath, graph); + await writeJson(diagnosticsPath, diagnostics); + await writeText(summaryPath, summary.markdown); + await writeJson(summaryConclusionsPath, summary.conclusions); + await writeJson(codeChangePlansPath, codeChangePlans); + await writeText(codeChangeReviewPath, codeChangeReview.markdown); + await writeJson(codeChangeReviewAuditPath, codeChangeReview.artifact); + await writeJson(codeChangeSourcePatchesPath, codeChangeSourcePatches); + + files.graph = path.relative(root, graphPath).replace(/\\/g, '/'); + files.diagnostics = path.relative(root, diagnosticsPath).replace(/\\/g, '/'); + files.summary = path.relative(root, summaryPath).replace(/\\/g, '/'); + files.summaryConclusions = path.relative(root, summaryConclusionsPath).replace(/\\/g, '/'); + files.codeChangePlans = path.relative(root, codeChangePlansPath).replace(/\\/g, '/'); + files.codeChangeReview = path.relative(root, codeChangeReviewPath).replace(/\\/g, '/'); + files.codeChangeReviewAudit = path.relative(root, codeChangeReviewAuditPath).replace(/\\/g, '/'); + files.codeChangeSourcePatches = path.relative(root, codeChangeSourcePatchesPath).replace(/\\/g, '/'); + + return { + files, + graphPath, + diagnosticsPath, + summaryPath, + summaryConclusionsPath, + codeChangePlansPath, + codeChangeReviewPath, + codeChangeReviewAuditPath, + codeChangeSourcePatchesPath, + }; +} + +type PersistOptionalArtifactsResult = { + files: Record; + taskSynthesisPath: string | null; + todoPatchPath: string | null; + todoPatchAuditPath: string | null; + communicationAnalysisPath: string | null; +}; + +async function persistOptionalArtifacts( + runDirectory: string, + root: string, + taskSynthesis: PipelineExecutionOutput['taskSynthesis'], + todoPatch: PipelineExecutionOutput['todoPatch'], + communicationAnalysis: PipelineExecutionOutput['communicationAnalysis'], +): Promise { + const files: Record = {}; + + const taskSynthesisPath = taskSynthesis ? path.join(runDirectory, 'task-synthesis.json') : null; + const todoValidationPath = taskSynthesis ? path.join(runDirectory, 'todo-validation.json') : null; + const todoPatchPath = todoPatch ? path.join(runDirectory, 'TODO.patch') : null; + const todoPatchAuditPath = todoPatch ? path.join(runDirectory, 'TODO.patch.json') : null; + + const communicationAnalysisPath = communicationAnalysis ? path.join(runDirectory, 'communication-analysis.json') : null; + const communicationMarkdownPath = communicationAnalysis ? path.join(runDirectory, 'communication-analysis.md') : null; + + if (communicationAnalysisPath && communicationMarkdownPath && communicationAnalysis) { + await Promise.all([ + writeJson(communicationAnalysisPath, communicationAnalysis), + writeText(communicationMarkdownPath, renderCommunicationMarkdown(communicationAnalysis)), + ]); + files.communicationAnalysis = path.relative(root, communicationAnalysisPath).replace(/\\/g, '/'); + files.communicationAnalysisMarkdown = path.relative(root, communicationMarkdownPath).replace(/\\/g, '/'); + } + + if (taskSynthesisPath && todoValidationPath && todoPatchPath && todoPatchAuditPath && taskSynthesis && todoPatch) { + await Promise.all([ + writeJson(taskSynthesisPath, taskSynthesis), + writeJson(todoValidationPath, taskSynthesis.validation), + writeText(todoPatchPath, todoPatch.markdown), + writeJson(todoPatchAuditPath, todoPatch.artifact), + ]); + files.taskSynthesis = path.relative(root, taskSynthesisPath).replace(/\\/g, '/'); + files.todoValidation = path.relative(root, todoValidationPath).replace(/\\/g, '/'); + files.todoPatch = path.relative(root, todoPatchPath).replace(/\\/g, '/'); + files.todoPatchAudit = path.relative(root, todoPatchAuditPath).replace(/\\/g, '/'); + } + + return { + files, + taskSynthesisPath, + todoPatchPath, + todoPatchAuditPath, + communicationAnalysisPath, + }; +} + +export function manifestConfiguration(options: PipelineOptions, config: T2CConfig): PipelineManifest['configuration'] { + const configuration = { + nlMode: options.nlMode ?? config.nlMode, + markdownMode: options.markdownMode ?? config.markdownMode, + communicationMode: options.communicationMode ?? config.communicationMode, + gitCommitCount: options.gitCommitCount, + maxFileBytes: config.maxFileBytes, + markdownConcurrency: config.markdownConcurrency, + documentConcurrency: config.documentConcurrency, + documentChunkChars: config.documentChunkChars, + documentMaxChunks: config.documentMaxChunks, + documentRecordsPerChunk: config.documentRecordsPerChunk, + documentTimeoutMs: config.documentTimeoutMs, + summaryLlm: options.includeSummaryLlm !== false, + taskSynthesisMode: options.taskSynthesisMode ?? 'disabled', + includeCommunication: options.includeCommunication !== false, + projectDirectory: options.projectDirectory ?? 'project', + communicationTicket: options.communicationTicket ?? null, + documentPatterns: [...options.documentPatterns], + documentExcludes: [...(options.documentExcludes ?? config.documentExcludes)], + adapters: { + python: { enabled: config.enablePythonAst, executable: config.pythonExecutable }, + go: { enabled: config.enableGoAst, executable: config.goExecutable }, + java: { enabled: config.enableJavaAst, executable: config.javaExecutable }, + rust: { enabled: config.enableRustAst, executable: config.cargoExecutable }, + php: { enabled: config.enablePhpAst, executable: config.phpExecutable }, + tensorflow: { + enabled: config.enableTensorFlow, + modelPath: config.tensorflowModelPath, + modulePath: config.tensorflowModulePath, + labels: [...config.tensorflowLabels], + }, + }, + llm: { + configured: hasOpenRouter(config), + baseUrl: config.openRouter.baseUrl, + nlModel: config.openRouter.nlModel, + markdownModel: config.openRouter.markdownModel, + communicationModel: config.openRouter.communicationModel, + documentModel: config.openRouter.documentModel, + summaryModel: config.openRouter.summaryModel, + taskModel: config.openRouter.taskModel, + timeoutMs: config.openRouter.timeoutMs, + maxTokens: config.openRouter.maxTokens, + temperature: config.openRouter.temperature, + requireStructuredOutput: config.openRouter.requireStructuredOutput, + responseHealing: config.openRouter.responseHealing, + }, + }; + return { fingerprint: sha256(stableStringify(configuration)), ...configuration }; +} diff --git a/src/pipeline/run-summary.ts b/src/pipeline/run-summary.ts new file mode 100644 index 0000000..8d55632 --- /dev/null +++ b/src/pipeline/run-summary.ts @@ -0,0 +1,58 @@ +import { summarizeGraph } from '../summary/summarizer.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import { T2C_VERSION } from '../version.js'; +import type { PipelineOptions, PipelineStageAudit } from '../core/types.js'; +import type { DiagnosticReport } from '../core/types.js'; +import type { T2CConfig } from '../config/env.js'; +import { hasOpenRouter } from '../config/env.js'; + +export interface SummaryResult { + summary: Awaited>; + audit: PipelineStageAudit; +} + +export async function collectSummary( + graph: Parameters[0], + diagnostics: DiagnosticReport, + config: T2CConfig, + options: PipelineOptions, +): Promise { + const summaryStartedAt = Date.now(); + const includeSummaryLlm = options.includeSummaryLlm !== false; + const summary = await summarizeGraph(graph, diagnostics, config, { + allowDeterministicFallback: options.allowSummaryFallback, + preferLlm: includeSummaryLlm, + }); + const summaryAudit: PipelineStageAudit = !includeSummaryLlm + ? { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(config, null), + status: 'skipped', requestedMode: 'deterministic', effectiveMode: 'deterministic', degraded: false, + recordCount: summary.conclusions.length, warningCount: 0, model: null, + durationMs: Date.now() - summaryStartedAt, + reason: { code: 'LLM_DISABLED', message: 'LLM summary was disabled; generated the deterministic report' }, + responses: [], + } + : summary.llmUsed + ? { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(config, config.openRouter.summaryModel), + status: 'succeeded', requestedMode: 'llm', effectiveMode: 'llm', degraded: false, + recordCount: summary.conclusions.length, warningCount: summary.warnings.length, model: config.openRouter.summaryModel, + durationMs: Date.now() - summaryStartedAt, reason: null, responses: summary.responses, + } + : { + runtimeVersion: T2C_VERSION, + configuration: openRouterAuditConfiguration(config, config.openRouter.summaryModel), + status: 'fallback', requestedMode: 'llm', effectiveMode: 'deterministic', degraded: true, + recordCount: summary.conclusions.length, warningCount: summary.warnings.length, model: config.openRouter.summaryModel, + durationMs: Date.now() - summaryStartedAt, + reason: { + code: hasOpenRouter(config) ? 'LLM_UNAVAILABLE' : 'LLM_NOT_CONFIGURED', + message: summary.warnings[0] ?? 'Deterministic summary fallback was used', + }, + responses: [], + }; + + return { summary, audit: summaryAudit }; +} diff --git a/src/pipeline/run-types.ts b/src/pipeline/run-types.ts new file mode 100644 index 0000000..50505b4 --- /dev/null +++ b/src/pipeline/run-types.ts @@ -0,0 +1,89 @@ +import type { + DiagnosticReport, + IntentRecord, + PipelineFailureStage, + PipelineManifest, + PipelineStageAudit, +} from '../core/types.js'; +import type { analyzeCommunication } from '../communication/analyzer.js'; +import type { summarizeGraph } from '../summary/summarizer.js'; +import type { collectCommunicationAnalysis, collectTaskSynthesis, createCodeChangeArtifacts } from './run-helpers.js'; +import type { linkIntentRecords } from '../graph/linker.js'; + +export type PipelineBySource = { + nl: IntentRecord[]; + git: IntentRecord[]; + ast: IntentRecord[]; + todo: IntentRecord[]; + changelog: IntentRecord[]; + document: IntentRecord[]; + configuration: IntentRecord[]; + runtime: IntentRecord[]; + communication: IntentRecord[]; +}; + +export interface PipelineContext { + root: string; + baseOutput: string; + runDirectory: string; + runId: string; + activeStage: PipelineFailureStage; + warnings: string[]; + bySource: PipelineBySource; + completedStages: Partial; +} + +export interface PipelineExecutionOutput { + generatedAt: string; + bySource: PipelineBySource; + graph: ReturnType; + diagnostics: DiagnosticReport; + communicationAnalysis: ReturnType | null; + communicationSyntheses: ReturnType['syntheses']; + naturalLanguageAudit: PipelineStageAudit; + markdownAudit: PipelineStageAudit; + documentationAudit: PipelineStageAudit; + communicationAudit: PipelineStageAudit; + taskSynthesisAudit: PipelineStageAudit; + codeChangePlanningAudit: PipelineStageAudit; + summary: Awaited>; + summaryAudit: PipelineStageAudit; + taskSynthesis: ReturnType['result']; + todoPatch: ReturnType['patch']; + codeChangePlans: ReturnType['codeChangePlans']; + codeChangeReview: ReturnType['codeChangeReview']; + codeChangeSourcePatches: ReturnType['codeChangeSourcePatches']; +} + +export interface PipelinePersistedPaths { + files: Record; + graphPath: string; + diagnosticsPath: string; + summaryPath: string; + summaryConclusionsPath: string; + taskSynthesisPath: string | null; + todoPatchPath: string | null; + todoPatchAuditPath: string | null; + codeChangePlansPath: string; + codeChangeReviewPath: string; + codeChangeReviewAuditPath: string; + codeChangeSourcePatchesPath: string; + communicationAnalysisPath: string | null; +} + +export interface PipelineResult { + runDirectory: string; + manifest: PipelineManifest; + graphPath: string; + diagnosticsPath: string; + summaryPath: string; + summaryConclusionsPath: string; + taskSynthesisPath: string | null; + todoPatchPath: string | null; + todoPatchAuditPath: string | null; + codeChangePlansPath: string | null; + codeChangeReviewPath: string | null; + codeChangeReviewAuditPath: string | null; + codeChangeSourcePatchesPath: string | null; + communicationAnalysisPath: string | null; +} diff --git a/src/pipeline/run.ts b/src/pipeline/run.ts index 77687dc..156f680 100644 --- a/src/pipeline/run.ts +++ b/src/pipeline/run.ts @@ -1,617 +1,66 @@ import path from 'node:path'; +import { writeJson } from '../core/io.js'; import type { T2CConfig } from '../config/env.js'; -import { hasOpenRouter } from '../config/env.js'; -import { addCommunicationIssuesToDiagnostics, analyzeCommunication, renderCommunicationMarkdown } from '../communication/analyzer.js'; -import { CommunicationLlmRequiredError, extractCommunicationIntentAudited, type ParticipantCommunicationSynthesis } from '../communication/llm.js'; -import { createIntentId, newRunId, sha256, stableStringify } from '../core/id.js'; -import { ensureDir, pathExists, readText, resolveGlobs, writeJson, writeJsonl, writeText } from '../core/io.js'; -import type { - Diagnostic, - DiagnosticReport, - IntentRecord, - PipelineManifest, - PipelineFailureStage, - PipelineOptions, - PipelineStageAudit, -} from '../core/types.js'; -import { extractAstIntent } from '../extractors/ast.js'; -import { extractConfigurationIntent } from '../extractors/configuration.js'; -import { extractRuntimeCycleIntent } from '../extractors/runtime-cycle.js'; -import { DocumentationLlmRequiredError, extractDocumentationIntent } from '../extractors/docs-llm.js'; -import { extractDocumentationBaseline } from '../extractors/docs-deterministic.js'; -import { extractGitIntent } from '../extractors/git.js'; -import { extractMarkdownIntentAudited, MarkdownLlmRequiredError } from '../extractors/markdown-llm.js'; -import { extractNlIntentAudited, NlLlmRequiredError } from '../extractors/nl-llm.js'; -import { openRouterAuditConfiguration } from '../llm/audit.js'; -import { diagnoseGraph } from '../graph/diagnostics.js'; -import { linkIntentRecords } from '../graph/linker.js'; -import { summarizeGraph } from '../summary/summarizer.js'; +import type { PipelineOptions } from '../core/types.js'; +import { type PipelineResult } from './run-types.js'; import { - createCodeChangeReviewPatch, - createCodeChangeSourcePatchSet, - createRepositoryPathProbe, - proposeCodeChangePlans, -} from '../synthesis/code-change-plan.js'; -import { synthesizeTodoProposals, TaskSynthesisRequiredError, type AuditedTaskSynthesisResult } from '../synthesis/tasks-llm.js'; -import { createTodoPatch, type CreatedTodoPatch } from '../synthesis/todo-patch.js'; -import { T2C_VERSION } from '../version.js'; - -export interface PipelineResult { - runDirectory: string; - manifest: PipelineManifest; - graphPath: string; - diagnosticsPath: string; - summaryPath: string; - summaryConclusionsPath: string; - taskSynthesisPath: string | null; - todoPatchPath: string | null; - todoPatchAuditPath: string | null; - codeChangePlansPath: string | null; - codeChangeReviewPath: string | null; - codeChangeReviewAuditPath: string | null; - codeChangeSourcePatchesPath: string | null; - communicationAnalysisPath: string | null; -} + makePipelineManifest, + persistPipelineArtifacts, +} from './run-persistence.js'; +import { persistFailedRun } from './run-failed.js'; +import { executePipeline, initializePipelineContext } from './run-execution.js'; + +export type { + PipelineBySource, + PipelineContext, + PipelineExecutionOutput, + PipelinePersistedPaths, + PipelineResult, +} from './run-types.js'; export async function runPipeline(options: PipelineOptions, config: T2CConfig): Promise { - const root = path.resolve(options.root); - if (!(await pathExists(root))) throw new Error(`Root does not exist: ${root}`); - const runId = newRunId(); - const baseOutput = path.resolve(root, options.outputDir); - const runDirectory = path.join(baseOutput, 'runs', runId); - await ensureDir(runDirectory); - let activeStage: PipelineFailureStage = 'setup'; - const completedStages: Partial = {}; - + const context = await initializePipelineContext(options); try { - - const warnings: string[] = []; - const bySource: Record = { - nl: [], - git: [], - ast: [], - todo: [], - changelog: [], - document: [], - configuration: [], - runtime: [], - communication: [], - }; - - let naturalLanguageAudit = skippedAudit('disabled', 'No NL task file was selected'); - - if (options.taskFile) { - activeStage = 'naturalLanguageExtraction'; - const result = await extractNlIntentAudited( - { root, sourcePath: options.taskFile }, - config, - options.nlMode ?? config.nlMode, - ); - bySource.nl = result.records; - warnings.push(...result.warnings); - naturalLanguageAudit = result.audit; - } - completedStages.naturalLanguageExtraction = naturalLanguageAudit; - - activeStage = 'gitExtraction'; - const git = await extractGitIntent({ root, count: options.gitCommitCount }, config); - bySource.git = git.records; - warnings.push(...git.warnings); - - activeStage = 'astExtraction'; - const ast = await extractAstIntent({ root }, config); - bySource.ast = ast.records; - warnings.push(...ast.warnings); - - activeStage = 'markdownExtraction'; - const markdown = await extractMarkdownIntentAudited( - { root, todoPath: options.todoFile, changelogPath: options.changelogFile }, - config, - options.markdownMode ?? config.markdownMode, - ); - bySource.todo = markdown.records.filter((record) => record.source.kind === 'todo'); - bySource.changelog = markdown.records.filter((record) => record.source.kind === 'changelog'); - warnings.push(...markdown.warnings); - completedStages.markdownExtraction = markdown.audit; - - activeStage = 'documentationExtraction'; - const deterministicDocumentFiles = await resolveGlobs( - root, - options.documentPatterns, - options.documentExcludes ?? config.documentExcludes, - ); - const documentationStartedAt = Date.now(); - const deterministicDocs = await extractDocumentationBaseline({ root, files: deterministicDocumentFiles }, config); - bySource.document = deterministicDocs.records; - warnings.push(...deterministicDocs.warnings); - let documentationAudit: PipelineStageAudit = deterministicDocumentFiles.length === 0 - ? skippedAudit('deterministic', 'No documentation files matched the configured patterns') - : { - runtimeVersion: T2C_VERSION, - configuration: { generator: 't2c/markdown-documentation', generatorVersion: '2' }, - status: deterministicDocs.warnings.length ? 'partial' : 'succeeded', - requestedMode: 'deterministic', - effectiveMode: 'deterministic', - degraded: deterministicDocs.warnings.length > 0, - recordCount: deterministicDocs.records.length, - warningCount: deterministicDocs.warnings.length, - model: null, - durationMs: Date.now() - documentationStartedAt, - reason: deterministicDocs.warnings.length - ? { code: 'DOCUMENT_EXTRACTION_PARTIAL', message: `${deterministicDocs.warnings.length} deterministic documentation warning(s)` } - : null, - responses: [], - }; - if (options.includeDocumentationLlm) { - if (hasOpenRouter(config)) { - activeStage = 'documentationExtraction'; - const docs = await extractDocumentationIntent({ - root, - patterns: options.documentPatterns, - excludes: options.documentExcludes ?? config.documentExcludes, - targetHints: collectTargetHints(Object.values(bySource).flat()), - }, config); - bySource.document.push(...docs.records); - warnings.push(...docs.warnings); - documentationAudit = { - ...docs.audit, - recordCount: bySource.document.length, - configuration: { - ...docs.audit.configuration, - deterministicGenerator: 't2c/markdown-documentation@2', - deterministicRecordCount: deterministicDocs.records.length, - }, - }; - } else { - const message = 'OPENROUTER_API_KEY is not configured; documentation -> Intent DSL was skipped'; - warnings.push(message); - documentationAudit = { - ...skippedAudit('llm', message), - configuration: openRouterAuditConfiguration(config, config.openRouter.documentModel, config.documentTimeoutMs), - status: deterministicDocs.records.length ? 'fallback' : 'failed', - effectiveMode: deterministicDocs.records.length ? 'deterministic' : 'none', - degraded: true, - recordCount: deterministicDocs.records.length, - model: config.openRouter.documentModel, - reason: { code: 'LLM_NOT_CONFIGURED', message }, - responses: [], - }; - } - } - completedStages.documentationExtraction = documentationAudit; - - activeStage = 'configurationExtraction'; - const configurationExtraction = await extractConfigurationIntent(root, config); - bySource.configuration = configurationExtraction.records; - warnings.push(...configurationExtraction.warnings); - - // Runtime evidence is optional: most repositories have no observer running, - // and a missing cycle must degrade the run rather than fail it. - activeStage = 'runtimeExtraction'; - if (options.cycleFile) { - try { - const runtime = await extractRuntimeCycleIntent(options.cycleFile, config, root); - bySource.runtime = runtime.records; - warnings.push(...runtime.warnings); - } catch (error) { - warnings.push(`runtime cycle ignored: ${error instanceof Error ? error.message : String(error)}`); - } - } - - const includeCommunication = options.includeCommunication !== false; - const communicationStartedAt = Date.now(); - let communicationAudit = skippedAudit('disabled', 'Communication analysis was disabled'); - let communicationInputPresent = false; - let communicationSyntheses: ParticipantCommunicationSynthesis[] = []; - if (includeCommunication) { - activeStage = 'communicationAnalysis'; - const communication = await extractCommunicationIntentAudited({ - root, - projectDir: options.projectDirectory ?? 'project', - ticket: options.communicationTicket ?? null, - }, config, options.communicationMode ?? config.communicationMode); - const missingDirectory = communication.records.length === 0 - && communication.warnings.length === 1 - && communication.warnings[0]?.startsWith('Communication directory not found:'); - communicationInputPresent = !missingDirectory; - bySource.communication = communication.records; - communicationSyntheses = communication.participants; - if (!missingDirectory) warnings.push(...communication.warnings); - communicationAudit = missingDirectory - ? skippedAudit('deterministic', communication.warnings[0] ?? 'Communication directory not found') - : { ...communication.audit, durationMs: Date.now() - communicationStartedAt }; - } - completedStages.communicationAnalysis = communicationAudit; - - activeStage = 'linking'; - const allRecords = Object.values(bySource).flat(); - const generatedAt = new Date().toISOString(); - const graph = linkIntentRecords(allRecords, generatedAt); - activeStage = 'diagnostics'; - const communicationAnalysis = communicationInputPresent - ? analyzeCommunication(graph, generatedAt, communicationSyntheses) - : null; - let diagnostics = diagnoseGraph(graph, generatedAt); - if (communicationAnalysis) diagnostics = addCommunicationIssuesToDiagnostics(diagnostics, communicationAnalysis); - if (options.includeDocumentationLlm && !hasOpenRouter(config)) appendLlmNotConfigured(diagnostics); - const taskSynthesisMode = options.taskSynthesisMode ?? 'disabled'; - let taskSynthesis: AuditedTaskSynthesisResult | null = null; - let todoPatch: CreatedTodoPatch | null = null; - let taskSynthesisAudit = skippedAudit('disabled', 'Task synthesis was disabled'); - if (taskSynthesisMode !== 'disabled') { - activeStage = 'taskSynthesis'; - taskSynthesis = await synthesizeTodoProposals(graph, diagnostics, config, taskSynthesisMode); - warnings.push(...taskSynthesis.warnings); - taskSynthesisAudit = taskSynthesis.audit; - completedStages.taskSynthesis = taskSynthesisAudit; - if (!options.todoFile) throw new Error('Task synthesis rendering requires a TODO source file'); - activeStage = 'todoRendering'; - const todoContent = await readText(path.resolve(root, options.todoFile), config.maxFileBytes); - todoPatch = createTodoPatch({ - todoPath: path.relative(root, path.resolve(root, options.todoFile)).replace(/\\/g, '/'), - todoContent, - graph, - diagnostics, - conclusions: taskSynthesis.conclusions, - proposals: taskSynthesis.proposals, - validation: taskSynthesis.validation, - synthesisAudit: taskSynthesis.audit, + const execution = await executePipeline(context, options, config); + context.activeStage = 'persistence'; + const persisted = await persistPipelineArtifacts(context, execution); + const stageAudits = { + naturalLanguageExtraction: execution.naturalLanguageAudit, + markdownExtraction: execution.markdownAudit, + documentationExtraction: execution.documentationAudit, + communicationAnalysis: execution.communicationAudit, + taskSynthesis: execution.taskSynthesisAudit, + codeChangePlanning: execution.codeChangePlanningAudit, + summary: execution.summaryAudit, + }; + const manifest = makePipelineManifest(context, options, config, execution, persisted.files, stageAudits); + const manifestPath = path.join(context.runDirectory, 'manifest.json'); + await writeJson(manifestPath, manifest); + await writeJson(path.join(context.baseOutput, 'latest.json'), { + runId: context.runId, + runDirectory: path.relative(context.root, context.runDirectory).replace(/\\/g, '/'), + graphFingerprint: execution.graph.fingerprint, + summary: persisted.files.summary, + summaryConclusions: persisted.files.summaryConclusions, }); - } - completedStages.taskSynthesis = taskSynthesisAudit; - - // Deterministic code-change plans from open implementation diagnostics. - // Never applies source edits; only materialises grounded review proposals. - activeStage = 'codeChangePlanning'; - const codeChangePlans = proposeCodeChangePlans({ - graph, - diagnostics, - ...(taskSynthesis - ? { conclusions: taskSynthesis.conclusions, proposals: taskSynthesis.proposals } - : {}), - generatedAt, - pathExists: createRepositoryPathProbe(root), - }); - const codeChangeReview = createCodeChangeReviewPatch({ - plans: codeChangePlans.plans, - graphFingerprint: graph.fingerprint, - createdAt: generatedAt, - }); - const codeChangeSourcePatches = createCodeChangeSourcePatchSet({ - plans: codeChangePlans.plans, - graphFingerprint: graph.fingerprint, - generatedAt, - }); - const codeChangePlanningAudit: PipelineStageAudit = { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration(config, null), - status: 'succeeded', - requestedMode: 'deterministic', - effectiveMode: 'deterministic', - degraded: false, - recordCount: codeChangePlans.plans.length, - warningCount: 0, - model: null, - durationMs: 0, - reason: null, - responses: [], - }; - completedStages.codeChangePlanning = codeChangePlanningAudit; - - activeStage = 'summary'; - const summaryStartedAt = Date.now(); - const includeSummaryLlm = options.includeSummaryLlm !== false; - const summary = await summarizeGraph(graph, diagnostics, config, { - allowDeterministicFallback: options.allowSummaryFallback, - preferLlm: includeSummaryLlm, - }); - warnings.push(...summary.warnings); - const summaryAudit: PipelineStageAudit = !includeSummaryLlm - ? { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration(config, null), - status: 'skipped', requestedMode: 'deterministic', effectiveMode: 'deterministic', degraded: false, - recordCount: summary.conclusions.length, warningCount: 0, model: null, - durationMs: Date.now() - summaryStartedAt, - reason: { code: 'LLM_DISABLED', message: 'LLM summary was disabled; generated the deterministic report' }, - responses: [], - } - : summary.llmUsed - ? { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration(config, config.openRouter.summaryModel), - status: 'succeeded', requestedMode: 'llm', effectiveMode: 'llm', degraded: false, - recordCount: summary.conclusions.length, warningCount: summary.warnings.length, model: config.openRouter.summaryModel, - durationMs: Date.now() - summaryStartedAt, reason: null, responses: summary.responses, - } - : { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration(config, config.openRouter.summaryModel), - status: 'fallback', requestedMode: 'llm', effectiveMode: 'deterministic', degraded: true, - recordCount: summary.conclusions.length, warningCount: summary.warnings.length, model: config.openRouter.summaryModel, - durationMs: Date.now() - summaryStartedAt, - reason: { code: hasOpenRouter(config) ? 'LLM_UNAVAILABLE' : 'LLM_NOT_CONFIGURED', message: summary.warnings[0] ?? 'Deterministic summary fallback was used' }, - responses: [], - }; - completedStages.summary = summaryAudit; - - activeStage = 'persistence'; - const files: Record = {}; - for (const [source, records] of Object.entries(bySource)) { - const filePath = path.join(runDirectory, `${source}.intent.jsonl`); - await writeJsonl(filePath, records); - files[`${source}Intent`] = path.relative(root, filePath).replace(/\\/g, '/'); - } - const graphPath = path.join(runDirectory, 'intent.graph.json'); - const diagnosticsPath = path.join(runDirectory, 'diagnostics.json'); - const summaryPath = path.join(runDirectory, 'team-summary.md'); - const summaryConclusionsPath = path.join(runDirectory, 'summary-conclusions.json'); - const taskSynthesisPath = taskSynthesis ? path.join(runDirectory, 'task-synthesis.json') : null; - const todoValidationPath = taskSynthesis ? path.join(runDirectory, 'todo-validation.json') : null; - const todoPatchPath = todoPatch ? path.join(runDirectory, 'TODO.patch') : null; - const todoPatchAuditPath = todoPatch ? path.join(runDirectory, 'TODO.patch.json') : null; - const codeChangePlansPath = path.join(runDirectory, 'code-change-plans.json'); - const codeChangeReviewPath = path.join(runDirectory, 'CODE_CHANGE.review.md'); - const codeChangeReviewAuditPath = path.join(runDirectory, 'CODE_CHANGE.review.json'); - const codeChangeSourcePatchesPath = path.join(runDirectory, 'code-change-source-patches.json'); - const communicationAnalysisPath = communicationAnalysis ? path.join(runDirectory, 'communication-analysis.json') : null; - const communicationMarkdownPath = communicationAnalysis ? path.join(runDirectory, 'communication-analysis.md') : null; - await writeJson(graphPath, graph); - await writeJson(diagnosticsPath, diagnostics); - await writeText(summaryPath, summary.markdown); - await writeJson(summaryConclusionsPath, summary.conclusions); - await writeJson(codeChangePlansPath, codeChangePlans); - await writeText(codeChangeReviewPath, codeChangeReview.markdown); - await writeJson(codeChangeReviewAuditPath, codeChangeReview.artifact); - await writeJson(codeChangeSourcePatchesPath, codeChangeSourcePatches); - files.codeChangePlans = path.relative(root, codeChangePlansPath).replace(/\\/g, '/'); - files.codeChangeReview = path.relative(root, codeChangeReviewPath).replace(/\\/g, '/'); - files.codeChangeReviewAudit = path.relative(root, codeChangeReviewAuditPath).replace(/\\/g, '/'); - files.codeChangeSourcePatches = path.relative(root, codeChangeSourcePatchesPath).replace(/\\/g, '/'); - if (communicationAnalysisPath && communicationMarkdownPath && communicationAnalysis) { - await Promise.all([ - writeJson(communicationAnalysisPath, communicationAnalysis), - writeText(communicationMarkdownPath, renderCommunicationMarkdown(communicationAnalysis)), - ]); - files.communicationAnalysis = path.relative(root, communicationAnalysisPath).replace(/\\/g, '/'); - files.communicationAnalysisMarkdown = path.relative(root, communicationMarkdownPath).replace(/\\/g, '/'); - } - if (taskSynthesisPath && todoValidationPath && todoPatchPath && todoPatchAuditPath && taskSynthesis && todoPatch) { - await Promise.all([ - writeJson(taskSynthesisPath, taskSynthesis), - writeJson(todoValidationPath, taskSynthesis.validation), - writeText(todoPatchPath, todoPatch.markdown), - writeJson(todoPatchAuditPath, todoPatch.artifact), - ]); - files.taskSynthesis = path.relative(root, taskSynthesisPath).replace(/\\/g, '/'); - files.todoValidation = path.relative(root, todoValidationPath).replace(/\\/g, '/'); - files.todoPatch = path.relative(root, todoPatchPath).replace(/\\/g, '/'); - files.todoPatchAudit = path.relative(root, todoPatchAuditPath).replace(/\\/g, '/'); - } - files.graph = path.relative(root, graphPath).replace(/\\/g, '/'); - files.diagnostics = path.relative(root, diagnosticsPath).replace(/\\/g, '/'); - files.summary = path.relative(root, summaryPath).replace(/\\/g, '/'); - files.summaryConclusions = path.relative(root, summaryConclusionsPath).replace(/\\/g, '/'); - - const configuration = manifestConfiguration(options, config); - const stageAudits = { - naturalLanguageExtraction: naturalLanguageAudit, - markdownExtraction: markdown.audit, - documentationExtraction: documentationAudit, - communicationAnalysis: communicationAudit, - taskSynthesis: taskSynthesisAudit, - codeChangePlanning: codeChangePlanningAudit, - summary: summaryAudit, - }; - const manifest: PipelineManifest = { - schemaVersion: 't2c.run/v1', - runId, - root, - createdAt: generatedAt, - graphFingerprint: graph.fingerprint, - files, - warnings: [...new Set(warnings)].sort(), - status: Object.values(stageAudits).some((stage) => stage.degraded) ? 'degraded' : 'succeeded', - failure: null, - runtime: { name: 'todo2code', version: T2C_VERSION }, - configuration, - stages: stageAudits, - llm: { - naturalLanguageExtraction: naturalLanguageAudit.effectiveMode === 'llm', - markdownExtraction: markdown.audit.effectiveMode === 'llm', - documentationExtraction: documentationAudit.effectiveMode === 'llm', - communicationEnrichment: communicationAudit.effectiveMode === 'llm', - taskSynthesis: taskSynthesisAudit.effectiveMode === 'llm', - summary: summary.llmUsed, - }, - }; - await writeJson(path.join(runDirectory, 'manifest.json'), manifest); - await writeJson(path.join(baseOutput, 'latest.json'), { - runId, - runDirectory: path.relative(root, runDirectory).replace(/\\/g, '/'), - graphFingerprint: graph.fingerprint, - summary: files.summary, - summaryConclusions: files.summaryConclusions, - }); - return { - runDirectory, manifest, graphPath, diagnosticsPath, summaryPath, summaryConclusionsPath, - taskSynthesisPath, todoPatchPath, todoPatchAuditPath, codeChangePlansPath, - codeChangeReviewPath, codeChangeReviewAuditPath, codeChangeSourcePatchesPath, - communicationAnalysisPath, - }; + return { + runDirectory: context.runDirectory, + manifest, + graphPath: persisted.graphPath, + diagnosticsPath: persisted.diagnosticsPath, + summaryPath: persisted.summaryPath, + summaryConclusionsPath: persisted.summaryConclusionsPath, + taskSynthesisPath: persisted.taskSynthesisPath, + todoPatchPath: persisted.todoPatchPath, + todoPatchAuditPath: persisted.todoPatchAuditPath, + codeChangePlansPath: persisted.codeChangePlansPath, + codeChangeReviewPath: persisted.codeChangeReviewPath, + codeChangeReviewAuditPath: persisted.codeChangeReviewAuditPath, + codeChangeSourcePatchesPath: persisted.codeChangeSourcePatchesPath, + communicationAnalysisPath: persisted.communicationAnalysisPath, + }; } catch (error) { - await persistFailedRun(runId, root, runDirectory, options, config, error, activeStage, completedStages); + await persistFailedRun(context, error, options, config); throw error; } } - -function manifestConfiguration(options: PipelineOptions, config: T2CConfig): PipelineManifest['configuration'] { - const configuration = { - nlMode: options.nlMode ?? config.nlMode, - markdownMode: options.markdownMode ?? config.markdownMode, - communicationMode: options.communicationMode ?? config.communicationMode, - gitCommitCount: options.gitCommitCount, - maxFileBytes: config.maxFileBytes, - markdownConcurrency: config.markdownConcurrency, - documentConcurrency: config.documentConcurrency, - documentChunkChars: config.documentChunkChars, - documentMaxChunks: config.documentMaxChunks, - documentRecordsPerChunk: config.documentRecordsPerChunk, - documentTimeoutMs: config.documentTimeoutMs, - summaryLlm: options.includeSummaryLlm !== false, - taskSynthesisMode: options.taskSynthesisMode ?? 'disabled', - includeCommunication: options.includeCommunication !== false, - projectDirectory: options.projectDirectory ?? 'project', - communicationTicket: options.communicationTicket ?? null, - documentPatterns: [...options.documentPatterns], - documentExcludes: [...(options.documentExcludes ?? config.documentExcludes)], - adapters: { - python: { enabled: config.enablePythonAst, executable: config.pythonExecutable }, - go: { enabled: config.enableGoAst, executable: config.goExecutable }, - java: { enabled: config.enableJavaAst, executable: config.javaExecutable }, - rust: { enabled: config.enableRustAst, executable: config.cargoExecutable }, - php: { enabled: config.enablePhpAst, executable: config.phpExecutable }, - tensorflow: { - enabled: config.enableTensorFlow, - modelPath: config.tensorflowModelPath, - modulePath: config.tensorflowModulePath, - labels: [...config.tensorflowLabels], - }, - }, - llm: { - configured: hasOpenRouter(config), - baseUrl: config.openRouter.baseUrl, - nlModel: config.openRouter.nlModel, - markdownModel: config.openRouter.markdownModel, - communicationModel: config.openRouter.communicationModel, - documentModel: config.openRouter.documentModel, - summaryModel: config.openRouter.summaryModel, - taskModel: config.openRouter.taskModel, - timeoutMs: config.openRouter.timeoutMs, - maxTokens: config.openRouter.maxTokens, - temperature: config.openRouter.temperature, - requireStructuredOutput: config.openRouter.requireStructuredOutput, - responseHealing: config.openRouter.responseHealing, - }, - }; - return { fingerprint: sha256(stableStringify(configuration)), ...configuration }; -} - -function collectTargetHints(records: IntentRecord[]): { paths: string[]; symbols: string[]; tickets: string[]; versions: string[] } { - const values = (key: K): string[] => [ - ...new Set(records.flatMap((record) => record.statement.target[key])), - ].slice(0, 200); - return { - paths: values('paths'), - symbols: values('symbols'), - tickets: values('tickets'), - versions: values('versions'), - }; -} - -async function persistFailedRun( - runId: string, - root: string, - runDirectory: string, - options: PipelineOptions, - config: T2CConfig, - error: unknown, - failedStage: PipelineFailureStage, - completedStages: Partial, -): Promise { - const aborted = (stage: string): PipelineStageAudit => ({ - ...skippedAudit('disabled', `Pipeline aborted before ${stage}`), - reason: { code: 'PIPELINE_ABORTED', message: `Pipeline aborted before ${stage}` }, - }); - const message = error instanceof Error ? error.message : String(error); - const knownAudit = error instanceof NlLlmRequiredError - || error instanceof MarkdownLlmRequiredError - || error instanceof DocumentationLlmRequiredError - || error instanceof CommunicationLlmRequiredError - || error instanceof TaskSynthesisRequiredError - ? error.audit - : null; - const failedAudit = (stage: keyof PipelineManifest['stages']): PipelineStageAudit => { - if (knownAudit && stage === failedStage) return knownAudit; - return { - runtimeVersion: T2C_VERSION, - configuration: openRouterAuditConfiguration( - config, - stage === 'summary' ? config.openRouter.summaryModel : stage === 'taskSynthesis' ? config.openRouter.taskModel : null, - ), - status: 'failed', requestedMode: stage === 'summary' || stage === 'taskSynthesis' ? 'llm' : 'disabled', effectiveMode: 'none', degraded: true, - recordCount: 0, warningCount: 1, - model: stage === 'summary' ? config.openRouter.summaryModel : stage === 'taskSynthesis' ? config.openRouter.taskModel : null, - durationMs: 0, - reason: { code: failureCode(failedStage), message }, - responses: [], - }; - }; - const stageValue = (stage: keyof PipelineManifest['stages'], label: string): PipelineStageAudit => { - if (completedStages[stage]) return completedStages[stage]; - if (stage === failedStage) return failedAudit(stage); - return aborted(label); - }; - const stages: PipelineManifest['stages'] = { - naturalLanguageExtraction: stageValue('naturalLanguageExtraction', 'natural-language extraction'), - markdownExtraction: stageValue('markdownExtraction', 'Markdown extraction'), - documentationExtraction: stageValue('documentationExtraction', 'documentation extraction'), - communicationAnalysis: stageValue('communicationAnalysis', 'communication analysis'), - taskSynthesis: stageValue('taskSynthesis', 'task synthesis'), - codeChangePlanning: stageValue('codeChangePlanning', 'code-change planning'), - summary: stageValue('summary', 'summary generation'), - }; - const reason = knownAudit?.reason ?? { code: failureCode(failedStage), message }; - const manifest: PipelineManifest = { - schemaVersion: 't2c.run/v1', - runId, - root, - createdAt: new Date().toISOString(), - graphFingerprint: null, - files: {}, - warnings: [message], - status: 'failed', - failure: { stage: failedStage, code: reason.code, message: reason.message }, - runtime: { name: 'todo2code', version: T2C_VERSION }, - configuration: manifestConfiguration(options, config), - stages, - llm: { - naturalLanguageExtraction: stages.naturalLanguageExtraction.effectiveMode === 'llm', - markdownExtraction: stages.markdownExtraction.effectiveMode === 'llm', - communicationEnrichment: stages.communicationAnalysis.effectiveMode === 'llm', - documentationExtraction: false, - taskSynthesis: false, - summary: false, - }, - }; - await writeJson(path.join(runDirectory, 'manifest.json'), manifest); -} - -function failureCode(stage: PipelineFailureStage): string { - return `PIPELINE_${stage.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase()}_FAILED`; -} - -function skippedAudit(requestedMode: PipelineStageAudit['requestedMode'], message: string): PipelineStageAudit { - return { - runtimeVersion: T2C_VERSION, - configuration: {}, - status: 'skipped', requestedMode, effectiveMode: 'none', degraded: false, - recordCount: 0, warningCount: 0, model: null, durationMs: 0, - reason: { code: 'STAGE_SKIPPED', message }, - responses: [], - }; -} - -function appendLlmNotConfigured(report: DiagnosticReport): void { - const diagnostic: Diagnostic = { - id: createIntentId({ code: 'LLM_NOT_CONFIGURED', graph: report.graphFingerprint }, 'DIAG'), - code: 'LLM_NOT_CONFIGURED', - severity: 'warning', - title: 'OpenRouter nie jest skonfigurowany', - detail: 'Etap dokumentacja -> Intent DSL zostaΕ‚ pominiΔ™ty, poniewaΕΌ brakuje OPENROUTER_API_KEY.', - recordIds: [], - suggestedAction: 'UstawiΔ‡ OPENROUTER_API_KEY w .env i ponownie uruchomiΔ‡ pipeline.', - }; - report.diagnostics.unshift(diagnostic); - report.counts.warning += 1; -} diff --git a/src/semantic/reranker-llm.ts b/src/semantic/reranker-llm.ts index 200c155..e33462b 100644 --- a/src/semantic/reranker-llm.ts +++ b/src/semantic/reranker-llm.ts @@ -15,6 +15,7 @@ import { } from './reranker.js'; import { assertSemanticRerankerResponse, + type SemanticRerankerResponse, SEMANTIC_RERANK_RESPONSE_CONTRACT, } from './reranker-response.js'; @@ -42,41 +43,89 @@ export async function rerankSemanticCandidates( options: SemanticRerankerOptions, ): Promise { assertSemanticCandidateSet(candidateSet, graph); + validateCandidateSetSize(candidateSet); + const model = resolveRerankerModel(config, options.model); + const modelRevision = resolveModelRevision(options.modelRevision); + const cached = resolveCachedResult(options.cachedResult, candidateSet, graph, model, modelRevision); + if (cached) return cached; + + const client = assertRerankerClient(config); + await assertTrackedSnapshotAvailable(graph, candidateSet, options.trackedSnapshot); + const payload = buildRerankerPayload(graph, candidateSet); + const response = await callReranker(client, messagesForCandidates(graph, candidateSet, payload), model); + return buildRerankResult(graph, candidateSet, response, model, modelRevision); +} + +function validateCandidateSetSize(candidateSet: SemanticCandidateSet): void { if (!candidateSet.candidates.length) { throw new Error('Semantic reranker requires at least one candidate'); } if (candidateSet.candidates.length > 100) { throw new Error('Semantic reranker payload is limited to 100 candidates'); } - const model = options.model?.trim() || config.openRouter.taskModel; - const modelRevision = options.modelRevision?.trim(); - if (!modelRevision) throw new Error('Semantic reranker requires an explicit modelRevision'); - if (options.cachedResult) { - assertSemanticRerankResult(options.cachedResult, candidateSet, graph); - if (options.cachedResult.generation.requestedModel !== model - || options.cachedResult.generation.modelRevision !== modelRevision) { - throw new Error('Cached semantic rerank result has a different model identity'); - } - return options.cachedResult; +} + +function resolveRerankerModel(config: T2CConfig, modelOverride?: string): string { + return modelOverride?.trim() || config.openRouter.taskModel; +} + +function resolveModelRevision(modelRevision: string): string { + const revision = modelRevision?.trim(); + if (!revision) throw new Error('Semantic reranker requires an explicit modelRevision'); + return revision; +} + +function resolveCachedResult( + cachedResult: SemanticRerankResult | null | undefined, + candidateSet: SemanticCandidateSet, + graph: IntentGraph, + model: string, + modelRevision: string, +): SemanticRerankResult | null { + if (!cachedResult) return null; + assertSemanticRerankResult(cachedResult, candidateSet, graph); + if (cachedResult.generation.requestedModel !== model || cachedResult.generation.modelRevision !== modelRevision) { + throw new Error('Cached semantic rerank result has a different model identity'); } + return cachedResult; +} + +function assertRerankerClient(config: T2CConfig): OpenRouterClient { const client = new OpenRouterClient(config.openRouter); if (!client.isConfigured()) { throw new SemanticRerankerRequiredError( 'Cross-language reranking requires OpenRouter; no deterministic or embedding-only fallback is allowed', ); } - if (!options.trackedSnapshot) { - throw new Error('Cross-language reranking requires a verified trackedSnapshot'); - } - await assertTrackedSnapshot(graph, candidateSet, options.trackedSnapshot); + return client; +} + +function assertTrackedSnapshotAvailable( + graph: IntentGraph, + candidateSet: SemanticCandidateSet, + trackedSnapshot: { root: string; revision: string } | undefined, +): Promise { + if (!trackedSnapshot) throw new Error('Cross-language reranking requires a verified trackedSnapshot'); + return assertTrackedSnapshot(graph, candidateSet, trackedSnapshot); +} + +function buildRerankerPayload(graph: IntentGraph, candidateSet: SemanticCandidateSet): Array<{ + candidateId: string; + retrieval: { score: number; rank: number }; + declaration: Record; + module: Record; +}> { const records = new Map(graph.records.map((record) => [record.id, record])); - const payload = candidateSet.candidates.map((candidate) => ({ + return candidateSet.candidates.map((candidate) => ({ candidateId: candidate.id, retrieval: { score: candidate.score, rank: candidate.rank }, declaration: projectRecord(records.get(candidate.declarationRecordId), candidate.declarationRecordId), module: projectRecord(records.get(candidate.moduleRecordId), candidate.moduleRecordId), })); - const messages = [ +} + +function messagesForCandidates(graph: IntentGraph, candidateSet: SemanticCandidateSet, payload: ReturnType): Array<{ role: 'system' | 'user'; content: string }> { + return [ { role: 'system' as const, content: [ @@ -100,19 +149,51 @@ export async function rerankSemanticCandidates( }), }, ]; - const response = await client.chatStructuredWithMetadata( - messages, - 't2c_cross_language_rerank_v1', - SEMANTIC_RERANK_RESPONSE_CONTRACT, - model, - ).catch((error: unknown) => { +} + +async function callReranker( + client: OpenRouterClient, + messages: Array<{ role: 'system' | 'user'; content: string }>, + model: string, +): Promise<{ + value: SemanticRerankerResponse; + metadata: { + provider?: string | null; + model?: string | null; + responseId?: string | null; + }; +}> { + try { + return await client.chatStructuredWithMetadata( + messages, + 't2c_cross_language_rerank_v1', + SEMANTIC_RERANK_RESPONSE_CONTRACT, + model, + ); + } catch (error: unknown) { const metadata = error instanceof StructuredResponseError ? error.responseMetadata : undefined; const identity = [metadata?.provider, metadata?.model, metadata?.responseId].filter(Boolean).join('/'); throw new Error( `Invalid semantic reranker response${identity ? ` from ${identity}` : ''}: ` + `${error instanceof Error ? error.message : String(error)}`, ); - }); + } +} + +function buildRerankResult( + graph: IntentGraph, + candidateSet: SemanticCandidateSet, + response: { + value: SemanticRerankerResponse; + metadata: { + provider?: string | null; + model?: string | null; + responseId?: string | null; + }; + }, + model: string, + modelRevision: string, +): SemanticRerankResult { try { assertSemanticRerankerResponse(response.value); } catch (error) { @@ -131,7 +212,7 @@ export async function rerankSemanticCandidates( requestedModel: model, model: response.metadata.model ?? model, modelRevision, - responseId: response.metadata.responseId, + responseId: response.metadata.responseId ?? null, }); } diff --git a/src/semantic/reranker.ts b/src/semantic/reranker.ts index de6a512..3fe58e5 100644 --- a/src/semantic/reranker.ts +++ b/src/semantic/reranker.ts @@ -1,509 +1 @@ -import { createRelationId, graphFingerprint, sha256, stableStringify } from '../core/id.js'; -import { assertIntentGraph } from '../core/schema.js'; -import type { IntentGraph, IntentRecord, IntentRelation } from '../core/types.js'; -import { T2C_VERSION } from '../version.js'; - -export type SemanticRerankVerdict = 'accept' | 'reject' | 'abstain'; -export type SemanticRerankReason = - | 'repository_evidence_supports_match' - | 'wrong_target' - | 'contradicted' - | 'insufficient_evidence' - | 'ambiguous' - | 'multi_module'; - -export const SEMANTIC_RERANK_VERDICTS = ['accept', 'reject', 'abstain'] as const; -export const SEMANTIC_RERANK_REASONS = [ - 'repository_evidence_supports_match', - 'wrong_target', - 'contradicted', - 'insufficient_evidence', - 'ambiguous', - 'multi_module', -] as const; - -export interface SemanticRetrievalIdentity { - provider: string; - model: string; - revision: string; - metric: string; - inputHash: string; -} - -export interface SemanticCandidate { - id: string; - declarationRecordId: string; - moduleRecordId: string; - score: number; - rank: number; -} - -export interface SemanticCandidateSet { - schemaVersion: 't2c.semantic-candidate-set/v1'; - generatedAt: string; - graphFingerprint: string; - maxCandidatesPerDeclaration: number; - retrieval: SemanticRetrievalIdentity; - candidates: SemanticCandidate[]; - candidateSetHash: string; -} - -export interface SemanticCandidateInput { - declarationRecordId: string; - moduleRecordId: string; - score: number; -} - -export interface SemanticRetrievalInput { - provider: string; - model: string; - revision: string; - metric: string; -} - -export interface SemanticEvidenceCitation { - recordId: string; - quote: string; -} - -export interface SemanticRerankDecisionInput { - candidateId: string; - verdict: SemanticRerankVerdict; - confidence: number; - reasonCode: SemanticRerankReason; - rationale: string; - citedRecordIds: string[]; - evidence: SemanticEvidenceCitation[]; -} - -export interface SemanticRerankDecision extends SemanticRerankDecisionInput { - id: string; -} - -export interface SemanticRerankGeneration { - generator: 't2c/cross-language-reranker'; - generatorVersion: '1'; - runtimeVersion: string; - provider: string; - requestedModel: string; - model: string; - modelRevision: string; - responseId: string | null; - promptHash: string; -} - -export interface SemanticRerankResult { - schemaVersion: 't2c.semantic-rerank/v1'; - generatedAt: string; - graphFingerprint: string; - candidateSetHash: string; - generation: SemanticRerankGeneration; - decisions: SemanticRerankDecision[]; - resultHash: string; -} - -export interface SemanticRerankGenerationInput { - provider: string; - requestedModel?: string; - model: string; - modelRevision: string; - responseId?: string | null; -} - -export function createSemanticCandidateSet( - graph: IntentGraph, - inputs: SemanticCandidateInput[], - retrieval: SemanticRetrievalInput, - maxCandidatesPerDeclaration = 5, - generatedAt = new Date().toISOString(), -): SemanticCandidateSet { - assertIntentGraph(graph); - if (!Number.isInteger(maxCandidatesPerDeclaration) - || maxCandidatesPerDeclaration < 1 - || maxCandidatesPerDeclaration > 10) { - throw new Error('maxCandidatesPerDeclaration must be an integer between 1 and 10'); - } - const identity = { - provider: requiredText(retrieval.provider, 'retrieval.provider'), - model: requiredText(retrieval.model, 'retrieval.model'), - revision: requiredText(retrieval.revision, 'retrieval.revision'), - metric: requiredText(retrieval.metric, 'retrieval.metric'), - inputHash: sha256(stableStringify({ - graphFingerprint: graph.fingerprint, - pairs: inputs.map((item) => ({ - declarationRecordId: item.declarationRecordId, - moduleRecordId: item.moduleRecordId, - })).sort(comparePair), - })), - } satisfies SemanticRetrievalIdentity; - const grouped = new Map(); - for (const input of inputs) { - const values = grouped.get(input.declarationRecordId); - if (values) values.push(input); - else grouped.set(input.declarationRecordId, [input]); - } - const candidates: SemanticCandidate[] = []; - for (const [declarationRecordId, values] of [...grouped.entries()].sort(([left], [right]) => left.localeCompare(right))) { - const ranked = [...values] - .sort((left, right) => right.score - left.score || left.moduleRecordId.localeCompare(right.moduleRecordId)) - .slice(0, maxCandidatesPerDeclaration); - ranked.forEach((input, index) => { - const seed = { - graphFingerprint: graph.fingerprint, - retrieval: identity, - declarationRecordId, - moduleRecordId: input.moduleRecordId, - score: boundedScore(input.score), - rank: index + 1, - }; - candidates.push({ - id: `SCAND-${sha256(stableStringify(seed)).slice(0, 20)}`, - declarationRecordId, - moduleRecordId: input.moduleRecordId, - score: seed.score, - rank: seed.rank, - }); - }); - } - const payload = { - graphFingerprint: graph.fingerprint, - maxCandidatesPerDeclaration, - retrieval: identity, - candidates, - }; - const result: SemanticCandidateSet = { - schemaVersion: 't2c.semantic-candidate-set/v1', - generatedAt, - ...payload, - candidateSetHash: sha256(stableStringify(payload)), - }; - assertSemanticCandidateSet(result, graph); - return result; -} - -export function assertSemanticCandidateSet( - value: SemanticCandidateSet, - graph: IntentGraph, -): void { - assertIntentGraph(graph); - if (value.schemaVersion !== 't2c.semantic-candidate-set/v1') { - throw new Error('Unsupported semantic candidate-set schemaVersion'); - } - validDate(value.generatedAt, 'candidateSet.generatedAt'); - if (value.graphFingerprint !== graph.fingerprint) { - throw new Error('Semantic candidate set graphFingerprint does not match the graph'); - } - if (!Number.isInteger(value.maxCandidatesPerDeclaration) - || value.maxCandidatesPerDeclaration < 1 - || value.maxCandidatesPerDeclaration > 10) { - throw new Error('candidateSet.maxCandidatesPerDeclaration must be an integer between 1 and 10'); - } - validateRetrieval(value.retrieval); - const records = new Map(graph.records.map((record) => [record.id, record])); - const seenIds = new Set(); - const seenPairs = new Set(); - const byDeclaration = new Map(); - for (const candidate of value.candidates) { - if (!/^SCAND-[a-f0-9]{20}$/.test(candidate.id)) throw new Error(`Invalid semantic candidate ID: ${candidate.id}`); - if (seenIds.has(candidate.id)) throw new Error(`Duplicate semantic candidate ID: ${candidate.id}`); - seenIds.add(candidate.id); - const declaration = records.get(candidate.declarationRecordId); - const module = records.get(candidate.moduleRecordId); - if (!declaration || !module) throw new Error(`Semantic candidate ${candidate.id} cites an unknown record`); - if (declaration.statement.kind === 'module_fact') { - throw new Error(`Semantic candidate ${candidate.id} declarationRecordId points to a module`); - } - if (module.statement.kind !== 'module_fact' || module.source.kind !== 'ast') { - throw new Error(`Semantic candidate ${candidate.id} moduleRecordId must point to an AST module_fact`); - } - const pair = `${candidate.declarationRecordId}|${candidate.moduleRecordId}`; - if (seenPairs.has(pair)) throw new Error(`Duplicate semantic candidate pair: ${pair}`); - seenPairs.add(pair); - boundedScore(candidate.score); - if (!Number.isInteger(candidate.rank) || candidate.rank < 1 || candidate.rank > value.maxCandidatesPerDeclaration) { - throw new Error(`Semantic candidate ${candidate.id} has an invalid rank`); - } - const values = byDeclaration.get(candidate.declarationRecordId); - if (values) values.push(candidate); - else byDeclaration.set(candidate.declarationRecordId, [candidate]); - } - for (const [declarationRecordId, candidates] of byDeclaration) { - if (candidates.length > value.maxCandidatesPerDeclaration) { - throw new Error(`Declaration ${declarationRecordId} exceeds the bounded candidate limit`); - } - const ranked = [...candidates].sort((left, right) => left.rank - right.rank); - ranked.forEach((candidate, index) => { - if (candidate.rank !== index + 1) throw new Error(`Declaration ${declarationRecordId} has non-contiguous ranks`); - if (index > 0 && candidate.score > (ranked[index - 1]?.score ?? 1)) { - throw new Error(`Declaration ${declarationRecordId} ranks a higher score below a lower score`); - } - }); - } - const expectedHash = sha256(stableStringify({ - graphFingerprint: value.graphFingerprint, - maxCandidatesPerDeclaration: value.maxCandidatesPerDeclaration, - retrieval: value.retrieval, - candidates: value.candidates, - })); - if (value.candidateSetHash !== expectedHash) throw new Error('Semantic candidateSetHash does not match its content'); -} - -export function createSemanticRerankResult( - graph: IntentGraph, - candidateSet: SemanticCandidateSet, - inputs: SemanticRerankDecisionInput[], - generation: SemanticRerankGenerationInput, - generatedAt = new Date().toISOString(), -): SemanticRerankResult { - assertSemanticCandidateSet(candidateSet, graph); - const generationValue: SemanticRerankGeneration = { - generator: 't2c/cross-language-reranker', - generatorVersion: '1', - runtimeVersion: T2C_VERSION, - provider: requiredText(generation.provider, 'generation.provider'), - requestedModel: requiredText(generation.requestedModel ?? generation.model, 'generation.requestedModel'), - model: requiredText(generation.model, 'generation.model'), - modelRevision: requiredText(generation.modelRevision, 'generation.modelRevision'), - responseId: generation.responseId ?? null, - promptHash: sha256(stableStringify({ - graphFingerprint: graph.fingerprint, - candidateSetHash: candidateSet.candidateSetHash, - candidates: candidateSet.candidates, - })), - }; - const decisions = inputs.map((input) => { - const seed = { - candidateSetHash: candidateSet.candidateSetHash, - candidateId: input.candidateId, - verdict: input.verdict, - confidence: roundedConfidence(input.confidence), - reasonCode: input.reasonCode, - rationale: requiredText(input.rationale, 'decision.rationale'), - citedRecordIds: [...new Set(input.citedRecordIds)].sort(), - evidence: [...input.evidence] - .map((item) => ({ - recordId: item.recordId, - quote: requiredText(item.quote, 'decision.evidence.quote'), - })) - .sort((left, right) => left.recordId.localeCompare(right.recordId) || left.quote.localeCompare(right.quote)), - }; - return { - id: `SDEC-${sha256(stableStringify(seed)).slice(0, 20)}`, - ...seed, - } satisfies SemanticRerankDecision; - }).sort((left, right) => left.candidateId.localeCompare(right.candidateId)); - const payload = { - graphFingerprint: graph.fingerprint, - candidateSetHash: candidateSet.candidateSetHash, - generation: generationValue, - decisions, - }; - const result: SemanticRerankResult = { - schemaVersion: 't2c.semantic-rerank/v1', - generatedAt, - ...payload, - resultHash: sha256(stableStringify(payload)), - }; - assertSemanticRerankResult(result, candidateSet, graph); - return result; -} - -export function assertSemanticRerankResult( - value: SemanticRerankResult, - candidateSet: SemanticCandidateSet, - graph: IntentGraph, -): void { - assertSemanticCandidateSet(candidateSet, graph); - if (value.schemaVersion !== 't2c.semantic-rerank/v1') { - throw new Error('Unsupported semantic rerank schemaVersion'); - } - validDate(value.generatedAt, 'rerank.generatedAt'); - if (value.graphFingerprint !== graph.fingerprint || value.candidateSetHash !== candidateSet.candidateSetHash) { - throw new Error('Semantic rerank result does not match its graph or candidate set'); - } - validateGeneration(value.generation); - const candidates = new Map(candidateSet.candidates.map((candidate) => [candidate.id, candidate])); - const records = new Map(graph.records.map((record) => [record.id, record])); - const seenDecisions = new Set(); - const acceptedDeclarations = new Set(); - for (const decision of value.decisions) { - if (!/^SDEC-[a-f0-9]{20}$/.test(decision.id)) throw new Error(`Invalid semantic decision ID: ${decision.id}`); - if (seenDecisions.has(decision.candidateId)) throw new Error(`Duplicate decision for candidate ${decision.candidateId}`); - seenDecisions.add(decision.candidateId); - const candidate = candidates.get(decision.candidateId); - if (!candidate) throw new Error(`Semantic decision cites unknown candidate ${decision.candidateId}`); - roundedConfidence(decision.confidence); - validateVerdictReason(decision); - requiredText(decision.rationale, `Decision ${decision.id} rationale`); - const expectedRecords = [candidate.declarationRecordId, candidate.moduleRecordId].sort(); - const citedRecords = [...new Set(decision.citedRecordIds)].sort(); - if (stableStringify(citedRecords) !== stableStringify(expectedRecords)) { - throw new Error(`Decision ${decision.id} must cite exactly both candidate records`); - } - for (const recordId of expectedRecords) { - const citations = decision.evidence.filter((item) => item.recordId === recordId); - if (citations.length === 0) throw new Error(`Decision ${decision.id} lacks evidence for ${recordId}`); - const record = records.get(recordId); - if (!record) throw new Error(`Decision ${decision.id} cites unknown record ${recordId}`); - for (const citation of citations) assertGroundedQuote(citation, record, decision.id); - } - if (decision.evidence.some((item) => !expectedRecords.includes(item.recordId))) { - throw new Error(`Decision ${decision.id} evidence escapes its candidate pair`); - } - if (decision.verdict === 'accept') { - if (acceptedDeclarations.has(candidate.declarationRecordId)) { - throw new Error(`Reranker accepted more than one module for ${candidate.declarationRecordId}`); - } - acceptedDeclarations.add(candidate.declarationRecordId); - } - } - if (seenDecisions.size !== candidates.size) { - throw new Error('Semantic rerank result must decide every bounded candidate'); - } - const expectedHash = sha256(stableStringify({ - graphFingerprint: value.graphFingerprint, - candidateSetHash: value.candidateSetHash, - generation: value.generation, - decisions: value.decisions, - })); - if (value.resultHash !== expectedHash) throw new Error('Semantic rerank resultHash does not match its content'); -} - -export function applyAcceptedSemanticRelations( - graph: IntentGraph, - candidateSet: SemanticCandidateSet, - rerank: SemanticRerankResult, - generatedAt = new Date().toISOString(), -): IntentGraph { - assertSemanticRerankResult(rerank, candidateSet, graph); - const candidates = new Map(candidateSet.candidates.map((candidate) => [candidate.id, candidate])); - const added = rerank.decisions - .filter((decision) => decision.verdict === 'accept') - .map((decision): IntentRelation => { - const candidate = candidates.get(decision.candidateId); - if (!candidate) throw new Error(`Accepted decision cites unknown candidate ${decision.candidateId}`); - const relationWithoutId = { - from: candidate.declarationRecordId, - to: candidate.moduleRecordId, - type: 'evidenced_by' as const, - confidence: Math.min(0.95, decision.confidence), - basis: [ - 'cross_language_reranker', - `candidate:${candidate.id}`, - `decision:${decision.id}`, - `retrieval:${candidateSet.retrieval.provider}/${candidateSet.retrieval.model}@${candidateSet.retrieval.revision}`, - `retrieval_score:${candidate.score}`, - `reranker:${rerank.generation.provider}/${rerank.generation.model}@${rerank.generation.modelRevision}`, - ...decision.evidence.map((item) => `citation:${item.recordId}`), - ], - }; - return { id: createRelationId(relationWithoutId), ...relationWithoutId }; - }); - const relations = [...new Map([...graph.relations, ...added].map((relation) => [relation.id, relation])).values()] - .sort((left, right) => left.id.localeCompare(right.id)); - const output: IntentGraph = { - ...graph, - generatedAt, - fingerprint: graphFingerprint(graph.records, relations), - relations, - }; - assertIntentGraph(output); - return output; -} - -function validateRetrieval(value: SemanticRetrievalIdentity): void { - requiredText(value.provider, 'retrieval.provider'); - requiredText(value.model, 'retrieval.model'); - requiredText(value.revision, 'retrieval.revision'); - requiredText(value.metric, 'retrieval.metric'); - if (!/^[a-f0-9]{64}$/.test(value.inputHash)) throw new Error('retrieval.inputHash must be SHA-256'); -} - -function validateGeneration(value: SemanticRerankGeneration): void { - if (value.generator !== 't2c/cross-language-reranker' || value.generatorVersion !== '1') { - throw new Error('Unsupported semantic reranker generator'); - } - requiredText(value.runtimeVersion, 'generation.runtimeVersion'); - requiredText(value.provider, 'generation.provider'); - requiredText(value.requestedModel, 'generation.requestedModel'); - requiredText(value.model, 'generation.model'); - requiredText(value.modelRevision, 'generation.modelRevision'); - if (value.responseId !== null) requiredText(value.responseId, 'generation.responseId'); - if (!/^[a-f0-9]{64}$/.test(value.promptHash)) throw new Error('generation.promptHash must be SHA-256'); -} - -function validateVerdictReason(decision: SemanticRerankDecision): void { - assertSemanticVerdictReason( - decision.verdict, - decision.reasonCode, - `Decision ${decision.id}`, - ); -} - -export function assertSemanticVerdictReason( - verdict: SemanticRerankVerdict, - reasonCode: SemanticRerankReason, - location = 'Semantic decision', -): void { - const allowed = new Set(SEMANTIC_RERANK_VERDICTS); - if (!allowed.has(verdict)) throw new Error(`${location} has invalid verdict`); - const reasons = new Set(SEMANTIC_RERANK_REASONS); - if (!reasons.has(reasonCode)) throw new Error(`${location} has invalid reasonCode`); - if (verdict === 'accept' && reasonCode !== 'repository_evidence_supports_match') { - throw new Error(`${location}: accept requires repository_evidence_supports_match`); - } - if (verdict !== 'accept' && reasonCode === 'repository_evidence_supports_match') { - throw new Error(`${location}: non-accept cannot use repository_evidence_supports_match`); - } -} - -function assertGroundedQuote( - citation: SemanticEvidenceCitation, - record: IntentRecord, - decisionId: string, -): void { - const quote = requiredText(citation.quote, `Decision ${decisionId} evidence.quote`); - const evidence = [ - record.statement.text, - record.statement.object, - ...record.statement.target.paths, - ...record.statement.target.symbols, - ...(Array.isArray(record.metadata.capabilities) - ? record.metadata.capabilities.filter((item): item is string => typeof item === 'string') - : []), - ].join('\n').toLowerCase(); - if (!evidence.includes(quote.toLowerCase())) { - throw new Error(`Decision ${decisionId} quote is not grounded in record ${record.id}`); - } -} - -function boundedScore(value: number): number { - if (!Number.isFinite(value) || value < -1 || value > 1) { - throw new Error('Semantic retrieval score must be a finite number between -1 and 1'); - } - return Math.round(value * 1_000_000) / 1_000_000; -} - -function roundedConfidence(value: number): number { - if (!Number.isFinite(value) || value < 0 || value > 1) { - throw new Error('Semantic rerank confidence must be a finite number between 0 and 1'); - } - return Math.round(value * 1_000_000) / 1_000_000; -} - -function requiredText(value: string, name: string): string { - if (typeof value !== 'string' || !value.trim()) throw new Error(`${name} must be non-blank`); - return value.trim(); -} - -function validDate(value: string, name: string): void { - if (!value || Number.isNaN(Date.parse(value))) throw new Error(`${name} must be an ISO date-time`); -} - -function comparePair( - left: Pick, - right: Pick, -): number { - return left.declarationRecordId.localeCompare(right.declarationRecordId) - || left.moduleRecordId.localeCompare(right.moduleRecordId); -} +export * from './reranker/index.js'; diff --git a/src/semantic/reranker/candidate.ts b/src/semantic/reranker/candidate.ts new file mode 100644 index 0000000..0b84d15 --- /dev/null +++ b/src/semantic/reranker/candidate.ts @@ -0,0 +1,250 @@ +import { + sha256, + stableStringify, +} from '../../core/id.js'; +import { assertIntentGraph } from '../../core/schema.js'; +import type { IntentGraph, IntentRecord } from '../../core/types.js'; +import { boundedScore, requiredText, validDate, validateRetrieval } from './validation.js'; +import { + type SemanticCandidate, + type SemanticCandidateInput, + type SemanticCandidateSet, + type SemanticRetrievalIdentity, + type SemanticRetrievalInput, +} from './types.js'; + +export function createSemanticCandidateSet( + graph: IntentGraph, + inputs: SemanticCandidateInput[], + retrieval: SemanticRetrievalInput, + maxCandidatesPerDeclaration = 5, + generatedAt = new Date().toISOString(), +): SemanticCandidateSet { + assertIntentGraph(graph); + if ( + !Number.isInteger(maxCandidatesPerDeclaration) + || maxCandidatesPerDeclaration < 1 + || maxCandidatesPerDeclaration > 10 + ) { + throw new Error('maxCandidatesPerDeclaration must be an integer between 1 and 10'); + } + + const identity = { + provider: requiredText(retrieval.provider, 'retrieval.provider'), + model: requiredText(retrieval.model, 'retrieval.model'), + revision: requiredText(retrieval.revision, 'retrieval.revision'), + metric: requiredText(retrieval.metric, 'retrieval.metric'), + inputHash: sha256(stableStringify({ + graphFingerprint: graph.fingerprint, + pairs: inputs + .map((item) => ({ + declarationRecordId: item.declarationRecordId, + moduleRecordId: item.moduleRecordId, + })) + .sort(comparePair), + })), + } satisfies SemanticRetrievalIdentity; + + const grouped = new Map(); + for (const input of inputs) { + const values = grouped.get(input.declarationRecordId); + if (values) { + values.push(input); + } else { + grouped.set(input.declarationRecordId, [input]); + } + } + + const candidates: SemanticCandidate[] = []; + for (const [declarationRecordId, values] of [...grouped.entries()].sort(([left], [right]) => left.localeCompare(right))) { + const ranked = [...values] + .sort((left, right) => right.score - left.score || left.moduleRecordId.localeCompare(right.moduleRecordId)) + .slice(0, maxCandidatesPerDeclaration); + ranked.forEach((input, index) => { + const seed = { + graphFingerprint: graph.fingerprint, + retrieval: identity, + declarationRecordId, + moduleRecordId: input.moduleRecordId, + score: boundedScore(input.score), + rank: index + 1, + }; + candidates.push({ + id: `SCAND-${sha256(stableStringify(seed)).slice(0, 20)}`, + declarationRecordId, + moduleRecordId: input.moduleRecordId, + score: seed.score, + rank: seed.rank, + }); + }); + } + + const payload = { + graphFingerprint: graph.fingerprint, + maxCandidatesPerDeclaration, + retrieval: identity, + candidates, + }; + const result: SemanticCandidateSet = { + schemaVersion: 't2c.semantic-candidate-set/v1', + generatedAt, + ...payload, + candidateSetHash: sha256(stableStringify(payload)), + }; + assertSemanticCandidateSet(result, graph); + return result; +} + +export function assertSemanticCandidateSet( + value: SemanticCandidateSet, + graph: IntentGraph, +): void { + assertIntentGraph(graph); + assertCandidateSetHeader(value, graph); + + const state = createCandidateValidationState(graph); + for (const candidate of value.candidates) { + addValidatedCandidate(value, candidate, state); + } + + assertBoundedRanks(value, state.byDeclaration); + assertCandidateSetHash(value); +} + +function assertCandidateSetHeader(value: SemanticCandidateSet, graph: IntentGraph): void { + if (value.schemaVersion !== 't2c.semantic-candidate-set/v1') { + throw new Error('Unsupported semantic candidate-set schemaVersion'); + } + validDate(value.generatedAt, 'candidateSet.generatedAt'); + if (value.graphFingerprint !== graph.fingerprint) { + throw new Error('Semantic candidate set graphFingerprint does not match the graph'); + } + if ( + !Number.isInteger(value.maxCandidatesPerDeclaration) + || value.maxCandidatesPerDeclaration < 1 + || value.maxCandidatesPerDeclaration > 10 + ) { + throw new Error('candidateSet.maxCandidatesPerDeclaration must be an integer between 1 and 10'); + } + validateRetrieval(value.retrieval); +} + +interface CandidateValidationState { + records: Map; + seenIds: Set; + seenPairs: Set; + byDeclaration: Map; +} + +function createCandidateValidationState(graph: IntentGraph): CandidateValidationState { + return { + records: new Map(graph.records.map((record) => [record.id, record])), + seenIds: new Set(), + seenPairs: new Set(), + byDeclaration: new Map(), + }; +} + +function addValidatedCandidate( + value: SemanticCandidateSet, + candidate: SemanticCandidate, + state: CandidateValidationState, +): void { + validateCandidateId(candidate); + validateCandidateRecords(candidate, state); + validateCandidateRank(value.maxCandidatesPerDeclaration, candidate); + boundedScore(candidate.score); + registerCandidate(candidate, state); +} + +function validateCandidateId(candidate: SemanticCandidate): void { + if (!/^SCAND-[a-f0-9]{20}$/.test(candidate.id)) { + throw new Error(`Invalid semantic candidate ID: ${candidate.id}`); + } +} + +function validateCandidateRecords( + candidate: SemanticCandidate, + state: CandidateValidationState, +): void { + if (state.seenIds.has(candidate.id)) { + throw new Error(`Duplicate semantic candidate ID: ${candidate.id}`); + } + state.seenIds.add(candidate.id); + + const declaration = state.records.get(candidate.declarationRecordId); + const module = state.records.get(candidate.moduleRecordId); + if (!declaration || !module) { + throw new Error(`Semantic candidate ${candidate.id} cites an unknown record`); + } + if (declaration.statement.kind === 'module_fact') { + throw new Error(`Semantic candidate ${candidate.id} declarationRecordId points to a module`); + } + if (module.statement.kind !== 'module_fact' || module.source.kind !== 'ast') { + throw new Error(`Semantic candidate ${candidate.id} moduleRecordId must point to an AST module_fact`); + } + + const pair = `${candidate.declarationRecordId}|${candidate.moduleRecordId}`; + if (state.seenPairs.has(pair)) { + throw new Error(`Duplicate semantic candidate pair: ${pair}`); + } + state.seenPairs.add(pair); +} + +function validateCandidateRank(maxCandidatesPerDeclaration: number, candidate: SemanticCandidate): void { + if (!Number.isInteger(candidate.rank) + || candidate.rank < 1 + || candidate.rank > maxCandidatesPerDeclaration + ) { + throw new Error(`Semantic candidate ${candidate.id} has an invalid rank`); + } +} + +function registerCandidate(candidate: SemanticCandidate, state: CandidateValidationState): void { + const existing = state.byDeclaration.get(candidate.declarationRecordId); + if (existing) { + existing.push(candidate); + } else { + state.byDeclaration.set(candidate.declarationRecordId, [candidate]); + } +} + +function assertBoundedRanks( + value: SemanticCandidateSet, + byDeclaration: Map, +): void { + for (const [declarationRecordId, candidates] of byDeclaration) { + if (candidates.length > value.maxCandidatesPerDeclaration) { + throw new Error(`Declaration ${declarationRecordId} exceeds the bounded candidate limit`); + } + const ranked = [...candidates].sort((left, right) => left.rank - right.rank); + ranked.forEach((candidate, index) => { + if (candidate.rank !== index + 1) { + throw new Error(`Declaration ${declarationRecordId} has non-contiguous ranks`); + } + if (index > 0 && candidate.score > (ranked[index - 1]?.score ?? 1)) { + throw new Error(`Declaration ${declarationRecordId} ranks a higher score below a lower score`); + } + }); + } +} + +function assertCandidateSetHash(value: SemanticCandidateSet): void { + const expectedHash = sha256(stableStringify({ + graphFingerprint: value.graphFingerprint, + maxCandidatesPerDeclaration: value.maxCandidatesPerDeclaration, + retrieval: value.retrieval, + candidates: value.candidates, + })); + if (value.candidateSetHash !== expectedHash) { + throw new Error('Semantic candidateSetHash does not match its content'); + } +} + +function comparePair( + left: Pick, + right: Pick, +): number { + return left.declarationRecordId.localeCompare(right.declarationRecordId) + || left.moduleRecordId.localeCompare(right.moduleRecordId); +} diff --git a/src/semantic/reranker/index.ts b/src/semantic/reranker/index.ts new file mode 100644 index 0000000..8a639da --- /dev/null +++ b/src/semantic/reranker/index.ts @@ -0,0 +1,8 @@ +export * from './types.js'; +export { createSemanticCandidateSet, assertSemanticCandidateSet } from './candidate.js'; +export { + createSemanticRerankResult, + assertSemanticRerankResult, + applyAcceptedSemanticRelations, + assertSemanticVerdictReason, +} from './result.js'; diff --git a/src/semantic/reranker/result.ts b/src/semantic/reranker/result.ts new file mode 100644 index 0000000..38bdf68 --- /dev/null +++ b/src/semantic/reranker/result.ts @@ -0,0 +1,311 @@ +import { createRelationId, graphFingerprint, sha256, stableStringify } from '../../core/id.js'; +import { assertIntentGraph } from '../../core/schema.js'; +import { T2C_VERSION } from '../../version.js'; +import type { IntentGraph, IntentRelation } from '../../core/types.js'; +import { assertSemanticCandidateSet } from './candidate.js'; +import { + assertGroundedQuote, + requiredText, + roundedConfidence, + validateGeneration, + validateVerdictReason, + validDate, +} from './validation.js'; +import { + type SemanticCandidateSet, + type SemanticRerankDecision, + type SemanticRerankDecisionInput, + type SemanticRerankGeneration, + type SemanticRerankGenerationInput, + type SemanticRerankResult, +} from './types.js'; + +export function createSemanticRerankResult( + graph: IntentGraph, + candidateSet: SemanticCandidateSet, + inputs: SemanticRerankDecisionInput[], + generation: SemanticRerankGenerationInput, + generatedAt = new Date().toISOString(), +): SemanticRerankResult { + assertSemanticCandidateSet(candidateSet, graph); + + const generationValue: SemanticRerankGeneration = { + generator: 't2c/cross-language-reranker', + generatorVersion: '1', + runtimeVersion: T2C_VERSION, + provider: requiredText(generation.provider, 'generation.provider'), + requestedModel: requiredText(generation.requestedModel ?? generation.model, 'generation.requestedModel'), + model: requiredText(generation.model, 'generation.model'), + modelRevision: requiredText(generation.modelRevision, 'generation.modelRevision'), + responseId: generation.responseId ?? null, + promptHash: sha256(stableStringify({ + graphFingerprint: graph.fingerprint, + candidateSetHash: candidateSet.candidateSetHash, + candidates: candidateSet.candidates, + })), + }; + + const decisions = inputs + .map((input) => { + const seed = { + candidateSetHash: candidateSet.candidateSetHash, + candidateId: input.candidateId, + verdict: input.verdict, + confidence: roundedConfidence(input.confidence), + reasonCode: input.reasonCode, + rationale: requiredText(input.rationale, 'decision.rationale'), + citedRecordIds: [...new Set(input.citedRecordIds)].sort(), + evidence: [...input.evidence] + .map((item) => ({ + recordId: item.recordId, + quote: requiredText(item.quote, 'decision.evidence.quote'), + })) + .sort((left, right) => left.recordId.localeCompare(right.recordId) + || left.quote.localeCompare(right.quote)), + }; + return { + id: `SDEC-${sha256(stableStringify(seed)).slice(0, 20)}`, + ...seed, + } satisfies SemanticRerankDecision; + }) + .sort((left, right) => left.candidateId.localeCompare(right.candidateId)); + + const payload = { + graphFingerprint: graph.fingerprint, + candidateSetHash: candidateSet.candidateSetHash, + generation: generationValue, + decisions, + }; + + const result: SemanticRerankResult = { + schemaVersion: 't2c.semantic-rerank/v1', + generatedAt, + ...payload, + resultHash: sha256(stableStringify(payload)), + }; + + assertSemanticRerankResult(result, candidateSet, graph); + return result; +} + +export function assertSemanticRerankResult( + value: SemanticRerankResult, + candidateSet: SemanticCandidateSet, + graph: IntentGraph, +): void { + assertSemanticCandidateSet(candidateSet, graph); + const { candidates, records } = createCandidateAndRecordIndex(candidateSet, graph); + const seenDecisions = new Set(); + const acceptedDeclarations = new Set(); + + assertSemanticRerankHeader(value, candidateSet, graph); + for (const decision of value.decisions) { + const candidate = validateSemanticDecisionCandidate(decision, candidates, seenDecisions); + validateSemanticDecisionDecision(decision); + validateSemanticDecisionEvidence(decision, candidate, records); + validateDecisionEvidenceScope(decision, candidate); + validateSemanticDecisionVerdict(decision, candidate, acceptedDeclarations); + } + + if (seenDecisions.size !== candidates.size) { + throw new Error('Semantic rerank result must decide every bounded candidate'); + } + assertRerankResultHash(value); +} + +function assertSemanticRerankHeader( + value: SemanticRerankResult, + candidateSet: SemanticCandidateSet, + graph: IntentGraph, +): void { + if (value.schemaVersion !== 't2c.semantic-rerank/v1') { + throw new Error('Unsupported semantic rerank schemaVersion'); + } + validDate(value.generatedAt, 'rerank.generatedAt'); + + if (value.graphFingerprint !== graph.fingerprint || value.candidateSetHash !== candidateSet.candidateSetHash) { + throw new Error('Semantic rerank result does not match its graph or candidate set'); + } + validateGeneration(value.generation); +} + +function createCandidateAndRecordIndex(candidateSet: SemanticCandidateSet, graph: IntentGraph) { + return { + candidates: new Map(candidateSet.candidates.map((candidate) => [candidate.id, candidate])), + records: new Map(graph.records.map((record) => [record.id, record])), + }; +} + +function validateSemanticDecisionCandidate( + decision: SemanticRerankDecision, + candidates: Map, + seenDecisions: Set, +): SemanticCandidateSet['candidates'][number] { + if (!/^SDEC-[a-f0-9]{20}$/.test(decision.id)) { + throw new Error(`Invalid semantic decision ID: ${decision.id}`); + } + if (seenDecisions.has(decision.candidateId)) { + throw new Error(`Duplicate decision for candidate ${decision.candidateId}`); + } + seenDecisions.add(decision.candidateId); + + const candidate = candidates.get(decision.candidateId); + if (!candidate) { + throw new Error(`Semantic decision cites unknown candidate ${decision.candidateId}`); + } + return candidate; +} + +function validateSemanticDecisionDecision(decision: SemanticRerankDecision): void { + roundedConfidence(decision.confidence); + validateVerdictReason(decision); + requiredText(decision.rationale, `Decision ${decision.id} rationale`); +} + +function validateSemanticDecisionEvidence( + decision: SemanticRerankDecision, + candidate: SemanticCandidateSet['candidates'][number], + records: Map, +): void { + const expectedRecords = [candidate.declarationRecordId, candidate.moduleRecordId].sort(); + const citedRecords = [...new Set(decision.citedRecordIds)].sort(); + if (stableStringify(citedRecords) !== stableStringify(expectedRecords)) { + throw new Error(`Decision ${decision.id} must cite exactly both candidate records`); + } + + for (const recordId of expectedRecords) { + const citations = decision.evidence.filter((item) => item.recordId === recordId); + if (citations.length === 0) { + throw new Error(`Decision ${decision.id} lacks evidence for ${recordId}`); + } + const record = records.get(recordId); + if (!record) { + throw new Error(`Decision ${decision.id} cites unknown record ${recordId}`); + } + for (const citation of citations) { + assertGroundedQuote(citation, record, decision.id); + } + } +} + +function validateDecisionEvidenceScope( + decision: SemanticRerankDecision, + candidate: SemanticCandidateSet['candidates'][number], +): void { + const expectedRecords = [candidate.declarationRecordId, candidate.moduleRecordId].sort(); + if (decision.evidence.some((item) => !expectedRecords.includes(item.recordId))) { + throw new Error(`Decision ${decision.id} evidence escapes its candidate pair`); + } +} + +function validateSemanticDecisionVerdict( + decision: SemanticRerankDecision, + candidate: SemanticCandidateSet['candidates'][number], + acceptedDeclarations: Set, +): void { + if (decision.verdict === 'accept') { + if (acceptedDeclarations.has(candidate.declarationRecordId)) { + throw new Error(`Reranker accepted more than one module for ${candidate.declarationRecordId}`); + } + acceptedDeclarations.add(candidate.declarationRecordId); + } +} + +function assertRerankResultHash(value: SemanticRerankResult): void { + const expectedHash = sha256(stableStringify({ + graphFingerprint: value.graphFingerprint, + candidateSetHash: value.candidateSetHash, + generation: value.generation, + decisions: value.decisions, + })); + if (value.resultHash !== expectedHash) { + throw new Error('Semantic rerank resultHash does not match its content'); + } +} + +export function applyAcceptedSemanticRelations( + graph: IntentGraph, + candidateSet: SemanticCandidateSet, + rerank: SemanticRerankResult, + generatedAt = new Date().toISOString(), +): IntentGraph { + assertSemanticRerankResult(rerank, candidateSet, graph); + + const candidates = new Map(candidateSet.candidates.map((candidate) => [candidate.id, candidate])); + const added = rerank.decisions + .filter((decision) => decision.verdict === 'accept') + .map((decision): IntentRelation => { + const candidate = candidates.get(decision.candidateId); + if (!candidate) { + throw new Error(`Accepted decision cites unknown candidate ${decision.candidateId}`); + } + + const relationWithoutId = { + from: candidate.declarationRecordId, + to: candidate.moduleRecordId, + type: 'evidenced_by' as const, + confidence: Math.min(0.95, decision.confidence), + basis: [ + 'cross_language_reranker', + `candidate:${candidate.id}`, + `decision:${decision.id}`, + `retrieval:${candidateSet.retrieval.provider}/${candidateSet.retrieval.model}@${candidateSet.retrieval.revision}`, + `retrieval_score:${candidate.score}`, + `reranker:${rerank.generation.provider}/${rerank.generation.model}@${rerank.generation.modelRevision}`, + ...decision.evidence.map((item) => `citation:${item.recordId}`), + ], + }; + return { + id: createRelationId(relationWithoutId), + ...relationWithoutId, + }; + }); + + const relations = [...new Map([...graph.relations, ...added].map((relation) => [relation.id, relation])).values()] + .sort((left, right) => left.id.localeCompare(right.id)); + + const output: IntentGraph = { + ...graph, + generatedAt, + fingerprint: graphFingerprint(graph.records, relations), + relations, + }; + assertIntentGraph(output); + return output; +} + +export function assertSemanticVerdictReason( + verdict: 'accept' | 'reject' | 'abstain', + reasonCode: + | 'repository_evidence_supports_match' + | 'wrong_target' + | 'contradicted' + | 'insufficient_evidence' + | 'ambiguous' + | 'multi_module', + location = 'Semantic decision', +): void { + const allowedVerdicts = new Set(['accept', 'reject', 'abstain']); + if (!allowedVerdicts.has(verdict)) { + throw new Error(`${location} has invalid verdict`); + } + + const allowedReasons = new Set([ + 'repository_evidence_supports_match', + 'wrong_target', + 'contradicted', + 'insufficient_evidence', + 'ambiguous', + 'multi_module', + ]); + if (!allowedReasons.has(reasonCode)) { + throw new Error(`${location} has invalid reasonCode`); + } + + if (verdict === 'accept' && reasonCode !== 'repository_evidence_supports_match') { + throw new Error(`${location}: accept requires repository_evidence_supports_match`); + } + if (verdict !== 'accept' && reasonCode === 'repository_evidence_supports_match') { + throw new Error(`${location}: non-accept cannot use repository_evidence_supports_match`); + } +} diff --git a/src/semantic/reranker/types.ts b/src/semantic/reranker/types.ts new file mode 100644 index 0000000..88d81e1 --- /dev/null +++ b/src/semantic/reranker/types.ts @@ -0,0 +1,106 @@ +export type SemanticRerankVerdict = 'accept' | 'reject' | 'abstain'; +export type SemanticRerankReason = + | 'repository_evidence_supports_match' + | 'wrong_target' + | 'contradicted' + | 'insufficient_evidence' + | 'ambiguous' + | 'multi_module'; + +export const SEMANTIC_RERANK_VERDICTS = ['accept', 'reject', 'abstain'] as const; +export const SEMANTIC_RERANK_REASONS = [ + 'repository_evidence_supports_match', + 'wrong_target', + 'contradicted', + 'insufficient_evidence', + 'ambiguous', + 'multi_module', +] as const; + +export interface SemanticRetrievalIdentity { + provider: string; + model: string; + revision: string; + metric: string; + inputHash: string; +} + +export interface SemanticCandidate { + id: string; + declarationRecordId: string; + moduleRecordId: string; + score: number; + rank: number; +} + +export interface SemanticCandidateSet { + schemaVersion: 't2c.semantic-candidate-set/v1'; + generatedAt: string; + graphFingerprint: string; + maxCandidatesPerDeclaration: number; + retrieval: SemanticRetrievalIdentity; + candidates: SemanticCandidate[]; + candidateSetHash: string; +} + +export interface SemanticCandidateInput { + declarationRecordId: string; + moduleRecordId: string; + score: number; +} + +export interface SemanticRetrievalInput { + provider: string; + model: string; + revision: string; + metric: string; +} + +export interface SemanticEvidenceCitation { + recordId: string; + quote: string; +} + +export interface SemanticRerankDecisionInput { + candidateId: string; + verdict: SemanticRerankVerdict; + confidence: number; + reasonCode: SemanticRerankReason; + rationale: string; + citedRecordIds: string[]; + evidence: SemanticEvidenceCitation[]; +} + +export interface SemanticRerankDecision extends SemanticRerankDecisionInput { + id: string; +} + +export interface SemanticRerankGeneration { + generator: 't2c/cross-language-reranker'; + generatorVersion: '1'; + runtimeVersion: string; + provider: string; + requestedModel: string; + model: string; + modelRevision: string; + responseId: string | null; + promptHash: string; +} + +export interface SemanticRerankResult { + schemaVersion: 't2c.semantic-rerank/v1'; + generatedAt: string; + graphFingerprint: string; + candidateSetHash: string; + generation: SemanticRerankGeneration; + decisions: SemanticRerankDecision[]; + resultHash: string; +} + +export interface SemanticRerankGenerationInput { + provider: string; + requestedModel?: string; + model: string; + modelRevision: string; + responseId?: string | null; +} diff --git a/src/semantic/reranker/validation.ts b/src/semantic/reranker/validation.ts new file mode 100644 index 0000000..ed7a4c8 --- /dev/null +++ b/src/semantic/reranker/validation.ts @@ -0,0 +1,111 @@ +import type { IntentRecord } from '../../core/types.js'; +import type { + SemanticRerankDecision, + SemanticRerankGeneration, + SemanticRetrievalIdentity, +} from './types.js'; + +function requiredText(value: string, name: string): string { + if (typeof value !== 'string' || !value.trim()) { + throw new Error(`${name} must be non-blank`); + } + return value.trim(); +} + +export function validateRetrieval(value: SemanticRetrievalIdentity): void { + requiredText(value.provider, 'retrieval.provider'); + requiredText(value.model, 'retrieval.model'); + requiredText(value.revision, 'retrieval.revision'); + requiredText(value.metric, 'retrieval.metric'); + if (!/^[a-f0-9]{64}$/.test(value.inputHash)) { + throw new Error('retrieval.inputHash must be SHA-256'); + } +} + +export function validateGeneration(value: SemanticRerankGeneration): void { + if (value.generator !== 't2c/cross-language-reranker' || value.generatorVersion !== '1') { + throw new Error('Unsupported semantic reranker generator'); + } + requiredText(value.runtimeVersion, 'generation.runtimeVersion'); + requiredText(value.provider, 'generation.provider'); + requiredText(value.requestedModel, 'generation.requestedModel'); + requiredText(value.model, 'generation.model'); + requiredText(value.modelRevision, 'generation.modelRevision'); + if (value.responseId !== null) { + requiredText(value.responseId, 'generation.responseId'); + } + if (!/^[a-f0-9]{64}$/.test(value.promptHash)) { + throw new Error('generation.promptHash must be SHA-256'); + } +} + +export function validateVerdictReason(decision: SemanticRerankDecision): void { + const allowedVerdicts = new Set(['accept', 'reject', 'abstain']); + if (!allowedVerdicts.has(decision.verdict)) { + throw new Error(`Decision ${decision.id} has invalid verdict`); + } + + const allowedReasons = new Set([ + 'repository_evidence_supports_match', + 'wrong_target', + 'contradicted', + 'insufficient_evidence', + 'ambiguous', + 'multi_module', + ]); + if (!allowedReasons.has(decision.reasonCode)) { + throw new Error(`Decision ${decision.id} has invalid reasonCode`); + } + + if (decision.verdict === 'accept' && decision.reasonCode !== 'repository_evidence_supports_match') { + throw new Error(`Decision ${decision.id}: accept requires repository_evidence_supports_match`); + } + if (decision.verdict !== 'accept' && decision.reasonCode === 'repository_evidence_supports_match') { + throw new Error(`Decision ${decision.id}: non-accept cannot use repository_evidence_supports_match`); + } +} + +export function assertGroundedQuote( + citation: { + recordId: string; + quote: string; + }, + record: IntentRecord, + decisionId: string, +): void { + const quote = requiredText(citation.quote, `Decision ${decisionId} evidence.quote`); + const evidence = [ + record.statement.text, + record.statement.object, + ...record.statement.target.paths, + ...record.statement.target.symbols, + ...(Array.isArray(record.metadata.capabilities) + ? record.metadata.capabilities.filter((item): item is string => typeof item === 'string') + : []), + ].join('\n').toLowerCase(); + if (!evidence.includes(quote.toLowerCase())) { + throw new Error(`Decision ${decisionId} quote is not grounded in record ${record.id}`); + } +} + +export function validDate(value: string, name: string): void { + if (!value || Number.isNaN(Date.parse(value))) { + throw new Error(`${name} must be an ISO date-time`); + } +} + +export function boundedScore(value: number): number { + if (!Number.isFinite(value) || value < -1 || value > 1) { + throw new Error('Semantic retrieval score must be a finite number between -1 and 1'); + } + return Math.round(value * 1_000_000) / 1_000_000; +} + +export function roundedConfidence(value: number): number { + if (!Number.isFinite(value) || value < 0 || value > 1) { + throw new Error('Semantic rerank confidence must be a finite number between 0 and 1'); + } + return Math.round(value * 1_000_000) / 1_000_000; +} + +export { requiredText }; diff --git a/src/services/actions.ts b/src/services/actions.ts index 2e40c7d..1d0b712 100644 --- a/src/services/actions.ts +++ b/src/services/actions.ts @@ -69,460 +69,566 @@ export type T2CAction = | 'evaluate_code_change' | 'close_code_change'; +type ActionInputHandler = (input: Record, root: string, config: T2CConfig) => unknown | Promise; + +const ACTION_HANDLERS: Record = { + extract_nl: executeExtractNlAction, + extract_git: executeExtractGitAction, + extract_ast: executeExtractAstAction, + extract_config: executeExtractConfigAction, + extract_markdown: executeExtractMarkdownAction, + extract_docs: executeExtractDocsAction, + extract_communication: executeExtractCommunicationAction, + analyze_communication: executeAnalyzeCommunicationAction, + link: executeLinkAction, + diagnose: executeDiagnoseAction, + summarize: executeSummarizeAction, + diff: executeDiffAction, + diff_files: executeDiffFilesAction, + diff_git: executeDiffGitAction, + reality: executeRealityAction, + pipeline: executePipelineAction, + compare_workspace: executeCompareWorkspaceAction, + propose_todo: executeProposeTodoAction, + render_todo: executeRenderTodoAction, + apply_todo: executeApplyTodoAction, + propose_code_change: executeProposeCodeChangeAction, + render_code_change: executeRenderCodeChangeAction, + propose_source_patch: executeProposeSourcePatchAction, + apply_source_patch: executeApplySourcePatchAction, + evaluate_code_change: executeEvaluateCodeChangeAction, + close_code_change: executeCloseCodeChangeAction, +}; + export async function executeAction(action: T2CAction, input: Record, config: T2CConfig): Promise { const root = await resolveRoot(input.root, config); - switch (action) { - case 'extract_nl': { - const file = await scopedPath(input.file, 'TASK.md', root, config); - const text = typeof input.text === 'string' ? input.text : undefined; - return extractNlIntentAudited( - { root, sourcePath: file, ...(text !== undefined ? { text } : {}) }, - config, - nlModeValue(input.nlMode, config.nlMode), - ); - } - case 'extract_git': - return extractGitIntent({ root, count: numberValue(input.count, config.gitCommitCount, 1, 100) }, config); - case 'extract_ast': - return extractAstIntent({ root }, config); - case 'extract_config': - return extractConfigurationIntent(root, config); - case 'extract_markdown': - return extractMarkdownIntentAudited({ - root, - todoPath: await nullableScopedPath(input.todo, 'TODO.md', root, config), - changelogPath: await nullableScopedPath(input.changelog, 'CHANGELOG.md', root, config), - }, config, llmModeValue(input.markdownMode, config.markdownMode, 'markdownMode')); - case 'extract_docs': - return extractDocumentationIntent({ - root, - patterns: stringList(input.patterns, config.documentPatterns), - excludes: stringList(input.excludes, config.documentExcludes), - }, config); - case 'extract_communication': - return extractCommunicationIntentAudited({ + const handler = ACTION_HANDLERS[action]; + if (!handler) { + throw new Error(`Unknown action: ${action}`); + } + return handler(input, root, config); +} + +async function executeExtractNlAction(input: Record, root: string, config: T2CConfig): Promise { + const file = await scopedPath(input.file, 'TASK.md', root, config); + const text = typeof input.text === 'string' ? input.text : undefined; + return extractNlIntentAudited( + { root, sourcePath: file, ...(text !== undefined ? { text } : {}) }, + config, + nlModeValue(input.nlMode, config.nlMode), + ); +} + +function executeExtractGitAction(input: Record, root: string, config: T2CConfig): Promise { + return extractGitIntent({ root, count: numberValue(input.count, config.gitCommitCount, 1, 100) }, config); +} + +function executeExtractAstAction(_input: Record, root: string, config: T2CConfig): Promise { + return extractAstIntent({ root }, config); +} + +function executeExtractConfigAction(_input: Record, root: string, config: T2CConfig): Promise { + return extractConfigurationIntent(root, config); +} + +async function executeExtractMarkdownAction(input: Record, root: string, config: T2CConfig): Promise { + return extractMarkdownIntentAudited({ + root, + todoPath: await nullableScopedPath(input.todo, 'TODO.md', root, config), + changelogPath: await nullableScopedPath(input.changelog, 'CHANGELOG.md', root, config), + }, config, llmModeValue(input.markdownMode, config.markdownMode, 'markdownMode')); +} + +async function executeExtractDocsAction(input: Record, root: string, config: T2CConfig): Promise { + return extractDocumentationIntent({ + root, + patterns: stringList(input.patterns, config.documentPatterns), + excludes: stringList(input.excludes, config.documentExcludes), + }, config); +} + +async function executeExtractCommunicationAction(input: Record, root: string, config: T2CConfig): Promise { + return extractCommunicationIntentAudited({ + root, + projectDir: await scopedPath(input.projectDir, 'project', root, config), + ticket: nullableString(input.ticket, null), + }, config, llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode')); +} + +async function executeAnalyzeCommunicationAction( + input: Record, + root: string, + config: T2CConfig, +): Promise { + let graph: IntentGraph; + const warnings: string[] = []; + let communicationSyntheses: ParticipantCommunicationSynthesis[] = []; + let communicationAudit: PipelineStageAudit | null = null; + if (input.graph !== undefined) { + graph = objectValue(input.graph, 'graph'); + } else { + const [communication, git, ast] = await Promise.all([ + extractCommunicationIntentAudited({ root, projectDir: await scopedPath(input.projectDir, 'project', root, config), ticket: nullableString(input.ticket, null), - }, config, llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode')); - case 'analyze_communication': { - let graph: IntentGraph; - const warnings: string[] = []; - let communicationSyntheses: ParticipantCommunicationSynthesis[] = []; - let communicationAudit: PipelineStageAudit | null = null; - if (input.graph !== undefined) { - graph = objectValue(input.graph, 'graph'); - } else { - const [communication, git, ast] = await Promise.all([ - extractCommunicationIntentAudited({ - root, - projectDir: await scopedPath(input.projectDir, 'project', root, config), - ticket: nullableString(input.ticket, null), - }, config, llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode')), - extractGitIntent({ root, count: numberValue(input.gitCount, config.gitCommitCount, 1, 100) }, config), - booleanValue(input.includeAst, true) ? extractAstIntent({ root }, config) : Promise.resolve({ records: [], warnings: [] }), - ]); - warnings.push(...communication.warnings, ...git.warnings, ...ast.warnings); - communicationSyntheses = communication.participants; - communicationAudit = communication.audit; - graph = linkIntentRecords([...communication.records, ...git.records, ...ast.records]); - } - const analysis = analyzeCommunication(graph, new Date().toISOString(), communicationSyntheses); - return { - analysis, - markdown: renderCommunicationMarkdown(analysis), - warnings: [...new Set(warnings)].sort(), - audit: communicationAudit, - ...(booleanValue(input.includeGraph, false) ? { graph } : {}), - }; - } - case 'link': { - const records = await readRecords(input, root, config); - return linkIntentRecords(records); - } - case 'diagnose': { - const graph = objectValue(input.graph, 'graph'); - return diagnoseGraph(graph); - } - case 'summarize': { - const graph = objectValue(input.graph, 'graph'); - const diagnostics = input.diagnostics - ? objectValue(input.diagnostics, 'diagnostics') - : diagnoseGraph(graph); - return summarizeGraph(graph, diagnostics, config, { - mode: summaryModeValue(input.mode, input.fallback), - }); - } - case 'propose_todo': { - const graph = await readActionObject(input.graph, input.graphPath, 'graph', root, config); - const diagnostics = input.diagnostics !== undefined || input.diagnosticsPath !== undefined - ? await readActionObject(input.diagnostics, input.diagnosticsPath, 'diagnostics', root, config) - : diagnoseGraph(graph); - const result = await synthesizeTodoProposals(graph, diagnostics, config, taskSynthesisMode(input.mode)); - if (input.output !== undefined) { - const output = await scopedPath(input.output, '', root, config); - await writeJson(output, result); - await registerRunArtifacts(root, { taskSynthesis: output }); - } - return result; - } - case 'render_todo': { - const graph = await readActionObject(input.graph, input.graphPath, 'graph', root, config); - const diagnostics = await readActionObject( - input.diagnostics, input.diagnosticsPath, 'diagnostics', root, config, - ); - const synthesis = await readActionObject( - input.synthesis, input.synthesisPath, 'synthesis', root, config, - ); - const todoPath = await scopedPath(input.todo, 'TODO.md', root, config); - const patchPath = await scopedPath(input.patch, 'TODO.patch', root, config); - const auditPath = await scopedPath(input.audit, 'TODO.patch.json', root, config); - const todoContent = await readText(todoPath, config.maxFileBytes); - const rendered = createTodoPatch({ - todoPath: path.relative(root, todoPath).replace(/\\/g, '/'), - todoContent, - graph, - diagnostics, - conclusions: synthesis.conclusions, - proposals: synthesis.proposals, - validation: synthesis.validation, - synthesisAudit: synthesis.audit, - }); - await Promise.all([writeText(patchPath, rendered.markdown), writeJson(auditPath, rendered.artifact)]); - await registerRunArtifacts(root, { todoPatch: patchPath, todoPatchAudit: auditPath }); - return { - schemaVersion: 't2c.todo-render-result/v1', - patchPath: path.relative(root, patchPath).replace(/\\/g, '/'), - auditPath: path.relative(root, auditPath).replace(/\\/g, '/'), - artifact: rendered.artifact, - }; - } - case 'apply_todo': { - const todoPath = await scopedPath(input.todo, 'TODO.md', root, config); - const patchPath = await scopedPath(input.patch, 'TODO.patch', root, config); - const auditPath = await scopedPath(input.audit, 'TODO.patch.json', root, config); - const receiptPath = await scopedPath(input.receipt, 'TODO.patch.receipt.json', root, config); - const result = await applyTodoPatch({ - todoPath, - patchPath, - auditPath, - receiptPath, - approval: { - actor: stringValue(input.actor, ''), - patchHash: stringValue(input.approvalHash, ''), - }, - }); - await registerRunArtifacts(root, { todoApplyReceipt: receiptPath }); - return result; - } - case 'propose_code_change': { - const graph = await readActionObject(input.graph, input.graphPath, 'graph', root, config); - const diagnostics = hasInputValue(input.diagnostics) || hasInputValue(input.diagnosticsPath) - ? await readActionObject(input.diagnostics, input.diagnosticsPath, 'diagnostics', root, config) - : diagnoseGraph(graph); - const conclusions = hasInputValue(input.conclusions) || hasInputValue(input.conclusionsPath) - ? await readActionObject(input.conclusions, input.conclusionsPath, 'conclusions', root, config) - : undefined; - const proposals = hasInputValue(input.proposals) || hasInputValue(input.proposalsPath) - ? await readActionObject(input.proposals, input.proposalsPath, 'proposals', root, config) - : undefined; - const result = proposeCodeChangePlans({ - graph, - diagnostics, - ...(conclusions !== undefined ? { conclusions } : {}), - ...(proposals !== undefined ? { proposals } : {}), - maxPlans: numberValue(input.maxPlans, 50, 1, 500), - pathExists: createRepositoryPathProbe(root), - }); - if (input.output !== undefined) { - const output = await scopedPath(input.output, '', root, config); - await writeJson(output, result); - } - return result; - } - case 'render_code_change': { - const planSet = await readActionObject( - input.plans, input.plansPath, 'plans', root, config, - ); - if (planSet.schemaVersion !== 't2c.code-change-plan-set/v1') { - throw new Error('render_code_change requires a t2c.code-change-plan-set/v1 object'); - } - const review = createCodeChangeReviewPatch({ - plans: planSet.plans, - graphFingerprint: planSet.graphFingerprint, - }); - const patchPath = input.patch !== undefined - ? await scopedPath(input.patch, 'CODE_CHANGE.review.md', root, config) - : null; - const auditPath = input.audit !== undefined - ? await scopedPath(input.audit, 'CODE_CHANGE.review.json', root, config) - : null; - if (patchPath) await writeText(patchPath, review.markdown); - if (auditPath) await writeJson(auditPath, review.artifact); - return { - schemaVersion: 't2c.code-change-render-result/v1', - markdown: review.markdown, - artifact: review.artifact, - ...(patchPath ? { patchPath: path.relative(root, patchPath).replace(/\\/g, '/') } : {}), - ...(auditPath ? { auditPath: path.relative(root, auditPath).replace(/\\/g, '/') } : {}), - }; - } - case 'propose_source_patch': { - // Single plan path or full plan-set path. - if (hasInputValue(input.plan) || hasInputValue(input.planPath)) { - const plan = await readActionObject(input.plan, input.planPath, 'plan', root, config); - const unifiedDiffs = objectMapOfStrings(input.unifiedDiffs); - const patch = createCodeChangeSourcePatch({ - plan, - ...(unifiedDiffs ? { unifiedDiffs } : {}), - }); - if (input.output !== undefined) { - const output = await scopedPath(input.output, '', root, config); - await writeJson(output, patch); - } - return patch; - } - const planSet = await readActionObject( - input.plans, input.plansPath, 'plans', root, config, - ); - if (planSet.schemaVersion !== 't2c.code-change-plan-set/v1') { - throw new Error('propose_source_patch requires a plan or t2c.code-change-plan-set/v1'); - } - const result = createCodeChangeSourcePatchSet({ - plans: planSet.plans, - graphFingerprint: planSet.graphFingerprint, - }); - if (input.output !== undefined) { - const output = await scopedPath(input.output, '', root, config); - await writeJson(output, result); - } - return result; - } - case 'apply_source_patch': { - const patch = await readActionObject(input.patch, input.patchPath, 'patch', root, config); - const receiptPath = await scopedPath(input.receipt, 'CODE_CHANGE.source.receipt.json', root, config); - const result = await applyCodeChangeSourcePatch({ - root, - patch, - approval: { - actor: stringValue(input.actor, ''), - patchHash: stringValue(input.approvalHash, ''), - }, - receiptPath, - }); - return { - ...result, - receiptPath: path.relative(root, receiptPath).replace(/\\/g, '/'), - }; - } - case 'evaluate_code_change': { - const plan = await readActionObject(input.plan, input.planPath, 'plan', root, config); - const beforeGraph = await readActionObject( - input.beforeGraph, input.beforeGraphPath, 'beforeGraph', root, config, - ); - const beforeDiagnostics = hasInputValue(input.beforeDiagnostics) || hasInputValue(input.beforeDiagnosticsPath) - ? await readActionObject( - input.beforeDiagnostics, input.beforeDiagnosticsPath, 'beforeDiagnostics', root, config, - ) - : diagnoseGraph(beforeGraph); - const afterGraph = await readActionObject( - input.afterGraph, input.afterGraphPath, 'afterGraph', root, config, - ); - const afterDiagnostics = hasInputValue(input.afterDiagnostics) || hasInputValue(input.afterDiagnosticsPath) - ? await readActionObject( - input.afterDiagnostics, input.afterDiagnosticsPath, 'afterDiagnostics', root, config, - ) - : undefined; - const result = evaluateCodeChangeAcceptance({ - plan, - before: { graph: beforeGraph, diagnostics: beforeDiagnostics }, - afterGraph, - ...(afterDiagnostics !== undefined ? { afterDiagnostics } : {}), - }); - if (input.output !== undefined) { - const output = await scopedPath(input.output, '', root, config); - await writeJson(output, result); - } - return result; - } - case 'close_code_change': { - // Evaluate one plan or every plan in a set against before/after graphs. - const beforeGraph = await readActionObject( - input.beforeGraph, input.beforeGraphPath, 'beforeGraph', root, config, - ); - const beforeDiagnostics = hasInputValue(input.beforeDiagnostics) || hasInputValue(input.beforeDiagnosticsPath) - ? await readActionObject( - input.beforeDiagnostics, input.beforeDiagnosticsPath, 'beforeDiagnostics', root, config, - ) - : diagnoseGraph(beforeGraph); - const afterGraph = await readActionObject( - input.afterGraph, input.afterGraphPath, 'afterGraph', root, config, - ); - const afterDiagnostics = hasInputValue(input.afterDiagnostics) || hasInputValue(input.afterDiagnosticsPath) - ? await readActionObject( - input.afterDiagnostics, input.afterDiagnosticsPath, 'afterDiagnostics', root, config, - ) - : diagnoseGraph(afterGraph); - - let plans: CodeChangePlan[]; - if (hasInputValue(input.input) || hasInputValue(input.inputPath)) { - const value = await readActionObject( - input.input, input.inputPath, 'input', root, config, - ); - if (value.schemaVersion === 't2c.code-change-plan/v1') plans = [value]; - else if (value.schemaVersion === 't2c.code-change-plan-set/v1') plans = value.plans; - else throw new Error('close_code_change input must be a code-change plan or plan set'); - } else if (hasInputValue(input.plan) || hasInputValue(input.planPath)) { - plans = [await readActionObject(input.plan, input.planPath, 'plan', root, config)]; - } else { - const planSet = await readActionObject( - input.plans, input.plansPath, 'plans', root, config, - ); - if (planSet.schemaVersion !== 't2c.code-change-plan-set/v1') { - throw new Error('close_code_change requires a plan or t2c.code-change-plan-set/v1'); - } - plans = planSet.plans; - } + }, config, llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode')), + extractGitIntent({ root, count: numberValue(input.gitCount, config.gitCommitCount, 1, 100) }, config), + booleanValue(input.includeAst, true) ? extractAstIntent({ root }, config) : Promise.resolve({ records: [], warnings: [] }), + ]); + warnings.push(...communication.warnings, ...git.warnings, ...ast.warnings); + communicationSyntheses = communication.participants; + communicationAudit = communication.audit; + graph = linkIntentRecords([...communication.records, ...git.records, ...ast.records]); + } + const analysis = analyzeCommunication(graph, new Date().toISOString(), communicationSyntheses); + return { + analysis, + markdown: renderCommunicationMarkdown(analysis), + warnings: [...new Set(warnings)].sort(), + audit: communicationAudit, + ...(booleanValue(input.includeGraph, false) ? { graph } : {}), + }; +} - const result = closeCodeChanges({ - plans, - before: { graph: beforeGraph, diagnostics: beforeDiagnostics }, - afterGraph, - afterDiagnostics, - }); - if (input.output !== undefined) { - const output = await scopedPath(input.output, '', root, config); - await writeJson(output, result); - } - return result; - } - case 'diff': { - const beforeInput = await readGraphInput(input.beforeGraph, input.before, 'before', root, config); - const afterInput = await readGraphInput(input.afterGraph, input.after, 'after', root, config); - const before = filterCommunicationGraph(beforeInput, input); - const after = filterCommunicationGraph(afterInput, input); - const diff = diffIntentGraphs(before, after); - const svg = booleanValue(input.includeSvg, true) - ? renderGraphDiffSvg(diff, { maxItems: numberValue(input.maxItems, 18, 1, 100) }) - : undefined; - if (booleanValue(input.compact, false)) { - return { - compact: true, - diff: { - generatedAt: diff.generatedAt, - fingerprint: diff.fingerprint, - beforeFingerprint: diff.beforeFingerprint, - afterFingerprint: diff.afterFingerprint, - summary: diff.summary, - }, - ...(svg === undefined ? {} : { svg }), - }; - } - return { - diff, - ...(svg === undefined ? {} : { svg }), - }; - } - case 'diff_files': { - const beforePath = await scopedPath(input.before, '', root, config); - const afterPath = await scopedPath(input.after, '', root, config); - const [before, after] = await Promise.all([ - readText(beforePath, config.maxFileBytes), - readText(afterPath, config.maxFileBytes), - ]); - const diff = diffText(before, after, { - path: stringValue(input.path, path.relative(root, afterPath)), - beforePath: path.relative(root, beforePath), - afterPath: path.relative(root, afterPath), - context: numberValue(input.context, 3, 0, 100), - }); - return withTextDiffViews([diff], input); - } - case 'diff_git': { - const result = await collectGitDiff({ - root, - revision: stringValue(input.revision, 'HEAD'), - staged: booleanValue(input.staged, false), - context: numberValue(input.context, 3, 0, 100), - maxFiles: numberValue(input.maxFiles, 50, 1, 500), - }); - return { ...withTextDiffViews(result.diffs, input), revision: result.revision, staged: result.staged, warnings: result.warnings }; - } - case 'reality': { - const graph = objectValue(input.graph, 'graph'); - const diagnostics = input.diagnostics - ? objectValue(input.diagnostics, 'diagnostics') - : diagnoseGraph(graph); - const view = buildRealityView(graph, diagnostics); - return { - view, - markdown: renderRealityMarkdown(view), - ...(booleanValue(input.includeSvg, true) - ? { - svg: renderRealitySvg(view, { - maxRows: numberValue(input.maxRows, 30, 1, 500), - gapsOnly: booleanValue(input.gapsOnly, false), - }), - } - : {}), - }; +async function executeLinkAction(input: Record, root: string, config: T2CConfig): Promise { + const records = await readRecords(input, root, config); + return linkIntentRecords(records); +} + +function executeDiagnoseAction(input: Record): unknown { + const graph = objectValue(input.graph, 'graph'); + return diagnoseGraph(graph); +} + +function executeSummarizeAction(input: Record, root: string, config: T2CConfig): unknown { + const graph = objectValue(input.graph, 'graph'); + const diagnostics = input.diagnostics + ? objectValue(input.diagnostics, 'diagnostics') + : diagnoseGraph(graph); + return summarizeGraph(graph, diagnostics, config, { + mode: summaryModeValue(input.mode, input.fallback), + }); +} + +async function executeProposeTodoAction(input: Record, root: string, config: T2CConfig): Promise { + const graph = await readActionObject(input.graph, input.graphPath, 'graph', root, config); + const diagnostics = input.diagnostics !== undefined || input.diagnosticsPath !== undefined + ? await readActionObject(input.diagnostics, input.diagnosticsPath, 'diagnostics', root, config) + : diagnoseGraph(graph); + const result = await synthesizeTodoProposals(graph, diagnostics, config, taskSynthesisMode(input.mode)); + if (input.output !== undefined) { + const output = await scopedPath(input.output, '', root, config); + await writeJson(output, result); + await registerRunArtifacts(root, { taskSynthesis: output }); + } + return result; +} + +async function executeRenderTodoAction(input: Record, root: string, config: T2CConfig): Promise { + const graph = await readActionObject(input.graph, input.graphPath, 'graph', root, config); + const diagnostics = await readActionObject( + input.diagnostics, input.diagnosticsPath, 'diagnostics', root, config, + ); + const synthesis = await readActionObject( + input.synthesis, input.synthesisPath, 'synthesis', root, config, + ); + const todoPath = await scopedPath(input.todo, 'TODO.md', root, config); + const patchPath = await scopedPath(input.patch, 'TODO.patch', root, config); + const auditPath = await scopedPath(input.audit, 'TODO.patch.json', root, config); + const todoContent = await readText(todoPath, config.maxFileBytes); + const rendered = createTodoPatch({ + todoPath: path.relative(root, todoPath).replace(/\\/g, '/'), + todoContent, + graph, + diagnostics, + conclusions: synthesis.conclusions, + proposals: synthesis.proposals, + validation: synthesis.validation, + synthesisAudit: synthesis.audit, + }); + await Promise.all([writeText(patchPath, rendered.markdown), writeJson(auditPath, rendered.artifact)]); + await registerRunArtifacts(root, { todoPatch: patchPath, todoPatchAudit: auditPath }); + return { + schemaVersion: 't2c.todo-render-result/v1', + patchPath: path.relative(root, patchPath).replace(/\\/g, '/'), + auditPath: path.relative(root, auditPath).replace(/\\/g, '/'), + artifact: rendered.artifact, + }; +} + +async function executeApplyTodoAction(input: Record, root: string, config: T2CConfig): Promise { + const todoPath = await scopedPath(input.todo, 'TODO.md', root, config); + const patchPath = await scopedPath(input.patch, 'TODO.patch', root, config); + const auditPath = await scopedPath(input.audit, 'TODO.patch.json', root, config); + const receiptPath = await scopedPath(input.receipt, 'TODO.patch.receipt.json', root, config); + const result = await applyTodoPatch({ + todoPath, + patchPath, + auditPath, + receiptPath, + approval: { + actor: stringValue(input.actor, ''), + patchHash: stringValue(input.approvalHash, ''), + }, + }); + await registerRunArtifacts(root, { todoApplyReceipt: receiptPath }); + return result; +} + +async function executeProposeCodeChangeAction(input: Record, root: string, config: T2CConfig): Promise { + const graph = await readActionObject(input.graph, input.graphPath, 'graph', root, config); + const diagnostics = hasInputValue(input.diagnostics) || hasInputValue(input.diagnosticsPath) + ? await readActionObject(input.diagnostics, input.diagnosticsPath, 'diagnostics', root, config) + : diagnoseGraph(graph); + const conclusions = hasInputValue(input.conclusions) || hasInputValue(input.conclusionsPath) + ? await readActionObject(input.conclusions, input.conclusionsPath, 'conclusions', root, config) + : undefined; + const proposals = hasInputValue(input.proposals) || hasInputValue(input.proposalsPath) + ? await readActionObject(input.proposals, input.proposalsPath, 'proposals', root, config) + : undefined; + const result = proposeCodeChangePlans({ + graph, + diagnostics, + ...(conclusions !== undefined ? { conclusions } : {}), + ...(proposals !== undefined ? { proposals } : {}), + maxPlans: numberValue(input.maxPlans, 50, 1, 500), + pathExists: createRepositoryPathProbe(root), + }); + if (input.output !== undefined) { + const output = await scopedPath(input.output, '', root, config); + await writeJson(output, result); + } + return result; +} + +async function executeRenderCodeChangeAction(input: Record, root: string, config: T2CConfig): Promise { + const planSet = await readActionObject( + input.plans, input.plansPath, 'plans', root, config, + ); + if (planSet.schemaVersion !== 't2c.code-change-plan-set/v1') { + throw new Error('render_code_change requires a t2c.code-change-plan-set/v1 object'); + } + const review = createCodeChangeReviewPatch({ + plans: planSet.plans, + graphFingerprint: planSet.graphFingerprint, + }); + const patchPath = input.patch !== undefined + ? await scopedPath(input.patch, 'CODE_CHANGE.review.md', root, config) + : null; + const auditPath = input.audit !== undefined + ? await scopedPath(input.audit, 'CODE_CHANGE.review.json', root, config) + : null; + if (patchPath) await writeText(patchPath, review.markdown); + if (auditPath) await writeJson(auditPath, review.artifact); + return { + schemaVersion: 't2c.code-change-render-result/v1', + markdown: review.markdown, + artifact: review.artifact, + ...(patchPath ? { patchPath: path.relative(root, patchPath).replace(/\\/g, '/') } : {}), + ...(auditPath ? { auditPath: path.relative(root, auditPath).replace(/\\/g, '/') } : {}), + }; +} + +async function executeProposeSourcePatchAction(input: Record, root: string, config: T2CConfig): Promise { + if (hasInputValue(input.plan) || hasInputValue(input.planPath)) { + const plan = await readActionObject(input.plan, input.planPath, 'plan', root, config); + const unifiedDiffs = objectMapOfStrings(input.unifiedDiffs); + const patch = createCodeChangeSourcePatch({ + plan, + ...(unifiedDiffs ? { unifiedDiffs } : {}), + }); + if (input.output !== undefined) { + const output = await scopedPath(input.output, '', root, config); + await writeJson(output, patch); } - case 'compare_workspace': - return compareWorkspaceIntent({ - root, - baseRef: stringValue(input.base, 'origin/main'), - taskFile: nullableString(input.task, null), - todoFile: nullableString(input.todo, 'TODO.md'), - changelogFile: nullableString(input.changelog, 'CHANGELOG.md'), - documentPatterns: stringList(input.docs, config.documentPatterns), - documentExcludes: stringList(input.docExcludes, config.documentExcludes), - includeDocumentationLlm: booleanValue(input.includeDocsLlm, false), - markdownMode: llmModeValue(input.markdownMode, config.markdownMode, 'markdownMode'), - communicationMode: llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode'), - outputDir: stringValue(input.output, config.outputDir), - gitCommitCount: numberValue(input.gitCount, config.gitCommitCount, 1, 100), - }, config); - case 'pipeline': { - const options: PipelineOptions = { - root, - taskFile: await nullableScopedPath(input.task, null, root, config), - todoFile: await nullableScopedPath(input.todo, 'TODO.md', root, config), - changelogFile: await nullableScopedPath(input.changelog, 'CHANGELOG.md', root, config), - documentPatterns: stringList(input.docs, config.documentPatterns), - includeDocumentationLlm: booleanValue(input.includeDocsLlm, true), - outputDir: await scopedPath(input.output, config.outputDir, root, config), - gitCommitCount: numberValue(input.gitCount, config.gitCommitCount, 1, 100), - allowSummaryFallback: booleanValue(input.summaryFallback, false), - includeSummaryLlm: booleanValue(input.includeSummaryLlm, true), - nlMode: nlModeValue(input.nlMode, config.nlMode), - markdownMode: llmModeValue(input.markdownMode, config.markdownMode, 'markdownMode'), - communicationMode: llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode'), - documentExcludes: stringList(input.docExcludes, config.documentExcludes), - taskSynthesisMode: pipelineTaskMode(input.taskMode), - includeCommunication: booleanValue(input.includeCommunication, true), - projectDirectory: stringValue(input.projectDir, 'project'), - communicationTicket: nullableString(input.communicationTicket, null), - }; - return runPipeline(options, config); + return patch; + } + const planSet = await readActionObject( + input.plans, input.plansPath, 'plans', root, config, + ); + if (planSet.schemaVersion !== 't2c.code-change-plan-set/v1') { + throw new Error('propose_source_patch requires a plan or t2c.code-change-plan-set/v1'); + } + const result = createCodeChangeSourcePatchSet({ + plans: planSet.plans, + graphFingerprint: planSet.graphFingerprint, + }); + if (input.output !== undefined) { + const output = await scopedPath(input.output, '', root, config); + await writeJson(output, result); + } + return result; +} + +async function executeApplySourcePatchAction(input: Record, root: string, config: T2CConfig): Promise { + const patch = await readActionObject(input.patch, input.patchPath, 'patch', root, config); + const receiptPath = await scopedPath(input.receipt, 'CODE_CHANGE.source.receipt.json', root, config); + const result = await applyCodeChangeSourcePatch({ + root, + patch, + approval: { + actor: stringValue(input.actor, ''), + patchHash: stringValue(input.approvalHash, ''), + }, + receiptPath, + }); + return { + ...result, + receiptPath: path.relative(root, receiptPath).replace(/\\/g, '/'), + }; +} + +async function executeEvaluateCodeChangeAction(input: Record, root: string, config: T2CConfig): Promise { + const plan = await readActionObject(input.plan, input.planPath, 'plan', root, config); + const beforeGraph = await readActionObject( + input.beforeGraph, input.beforeGraphPath, 'beforeGraph', root, config, + ); + const beforeDiagnostics = hasInputValue(input.beforeDiagnostics) || hasInputValue(input.beforeDiagnosticsPath) + ? await readActionObject( + input.beforeDiagnostics, input.beforeDiagnosticsPath, 'beforeDiagnostics', root, config, + ) + : diagnoseGraph(beforeGraph); + const afterGraph = await readActionObject( + input.afterGraph, input.afterGraphPath, 'afterGraph', root, config, + ); + const afterDiagnostics = hasInputValue(input.afterDiagnostics) || hasInputValue(input.afterDiagnosticsPath) + ? await readActionObject( + input.afterDiagnostics, input.afterDiagnosticsPath, 'afterDiagnostics', root, config, + ) + : undefined; + const result = evaluateCodeChangeAcceptance({ + plan, + before: { graph: beforeGraph, diagnostics: beforeDiagnostics }, + afterGraph, + ...(afterDiagnostics !== undefined ? { afterDiagnostics } : {}), + }); + if (input.output !== undefined) { + const output = await scopedPath(input.output, '', root, config); + await writeJson(output, result); + } + return result; +} + +async function executeCloseCodeChangeAction(input: Record, root: string, config: T2CConfig): Promise { + const beforeGraph = await readActionObject( + input.beforeGraph, input.beforeGraphPath, 'beforeGraph', root, config, + ); + const beforeDiagnostics = hasInputValue(input.beforeDiagnostics) || hasInputValue(input.beforeDiagnosticsPath) + ? await readActionObject( + input.beforeDiagnostics, input.beforeDiagnosticsPath, 'beforeDiagnostics', root, config, + ) + : diagnoseGraph(beforeGraph); + const afterGraph = await readActionObject( + input.afterGraph, input.afterGraphPath, 'afterGraph', root, config, + ); + const afterDiagnostics = hasInputValue(input.afterDiagnostics) || hasInputValue(input.afterDiagnosticsPath) + ? await readActionObject( + input.afterDiagnostics, input.afterDiagnosticsPath, 'afterDiagnostics', root, config, + ) + : diagnoseGraph(afterGraph); + + let plans: CodeChangePlan[]; + if (hasInputValue(input.input) || hasInputValue(input.inputPath)) { + const value = await readActionObject( + input.input, input.inputPath, 'input', root, config, + ); + if (value.schemaVersion === 't2c.code-change-plan/v1') plans = [value]; + else if (value.schemaVersion === 't2c.code-change-plan-set/v1') plans = value.plans; + else throw new Error('close_code_change input must be a code-change plan or plan set'); + } else if (hasInputValue(input.plan) || hasInputValue(input.planPath)) { + plans = [await readActionObject(input.plan, input.planPath, 'plan', root, config)]; + } else { + const planSet = await readActionObject( + input.plans, input.plansPath, 'plans', root, config, + ); + if (planSet.schemaVersion !== 't2c.code-change-plan-set/v1') { + throw new Error('close_code_change requires a plan or t2c.code-change-plan-set/v1'); } + plans = planSet.plans; + } + + const result = closeCodeChanges({ + plans, + before: { graph: beforeGraph, diagnostics: beforeDiagnostics }, + afterGraph, + afterDiagnostics, + }); + if (input.output !== undefined) { + const output = await scopedPath(input.output, '', root, config); + await writeJson(output, result); } + return result; +} + +async function executeDiffAction(input: Record, root: string, config: T2CConfig): Promise { + const beforeInput = await readGraphInput(input.beforeGraph, input.before, 'before', root, config); + const afterInput = await readGraphInput(input.afterGraph, input.after, 'after', root, config); + const before = filterCommunicationGraph(beforeInput, input); + const after = filterCommunicationGraph(afterInput, input); + const diff = diffIntentGraphs(before, after); + const svg = booleanValue(input.includeSvg, true) + ? renderGraphDiffSvg(diff, { maxItems: numberValue(input.maxItems, 18, 1, 100) }) + : undefined; + if (booleanValue(input.compact, false)) { + return { + compact: true, + diff: { + generatedAt: diff.generatedAt, + fingerprint: diff.fingerprint, + beforeFingerprint: diff.beforeFingerprint, + afterFingerprint: diff.afterFingerprint, + summary: diff.summary, + }, + ...(svg === undefined ? {} : { svg }), + }; + } + return { + diff, + ...(svg === undefined ? {} : { svg }), + }; +} + +async function executeDiffFilesAction(input: Record, root: string, config: T2CConfig): Promise { + const beforePath = await scopedPath(input.before, '', root, config); + const afterPath = await scopedPath(input.after, '', root, config); + const [before, after] = await Promise.all([ + readText(beforePath, config.maxFileBytes), + readText(afterPath, config.maxFileBytes), + ]); + const diff = diffText(before, after, { + path: stringValue(input.path, path.relative(root, afterPath)), + beforePath: path.relative(root, beforePath), + afterPath: path.relative(root, afterPath), + context: numberValue(input.context, 3, 0, 100), + }); + return withTextDiffViews([diff], input); +} + +async function executeDiffGitAction(input: Record, root: string, _config: T2CConfig): Promise { + const result = await collectGitDiff({ + root, + revision: stringValue(input.revision, 'HEAD'), + staged: booleanValue(input.staged, false), + context: numberValue(input.context, 3, 0, 100), + maxFiles: numberValue(input.maxFiles, 50, 1, 500), + }); + return { ...withTextDiffViews(result.diffs, input), revision: result.revision, staged: result.staged, warnings: result.warnings }; +} + +function executeRealityAction(input: Record, _root: string, config: T2CConfig): unknown { + const graph = objectValue(input.graph, 'graph'); + const diagnostics = input.diagnostics + ? objectValue(input.diagnostics, 'diagnostics') + : diagnoseGraph(graph); + const view = buildRealityView(graph, diagnostics); + return { + view, + markdown: renderRealityMarkdown(view), + ...(booleanValue(input.includeSvg, true) + ? { + svg: renderRealitySvg(view, { + maxRows: numberValue(input.maxRows, 30, 1, 500), + gapsOnly: booleanValue(input.gapsOnly, false), + }), + } + : {}), + }; +} + +async function executeCompareWorkspaceAction(input: Record, root: string, config: T2CConfig): Promise { + return compareWorkspaceIntent({ + root, + baseRef: stringValue(input.base, 'origin/main'), + taskFile: nullableString(input.task, null), + todoFile: nullableString(input.todo, 'TODO.md'), + changelogFile: nullableString(input.changelog, 'CHANGELOG.md'), + documentPatterns: stringList(input.docs, config.documentPatterns), + documentExcludes: stringList(input.docExcludes, config.documentExcludes), + includeDocumentationLlm: booleanValue(input.includeDocsLlm, false), + markdownMode: llmModeValue(input.markdownMode, config.markdownMode, 'markdownMode'), + communicationMode: llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode'), + outputDir: stringValue(input.output, config.outputDir), + gitCommitCount: numberValue(input.gitCount, config.gitCommitCount, 1, 100), + }, config); +} + +async function executePipelineAction(input: Record, root: string, config: T2CConfig): Promise { + const options: PipelineOptions = { + root, + taskFile: await nullableScopedPath(input.task, null, root, config), + todoFile: await nullableScopedPath(input.todo, 'TODO.md', root, config), + changelogFile: await nullableScopedPath(input.changelog, 'CHANGELOG.md', root, config), + documentPatterns: stringList(input.docs, config.documentPatterns), + includeDocumentationLlm: booleanValue(input.includeDocsLlm, true), + outputDir: await scopedPath(input.output, config.outputDir, root, config), + gitCommitCount: numberValue(input.gitCount, config.gitCommitCount, 1, 100), + allowSummaryFallback: booleanValue(input.summaryFallback, false), + includeSummaryLlm: booleanValue(input.includeSummaryLlm, true), + nlMode: nlModeValue(input.nlMode, config.nlMode), + markdownMode: llmModeValue(input.markdownMode, config.markdownMode, 'markdownMode'), + communicationMode: llmModeValue(input.communicationMode, config.communicationMode, 'communicationMode'), + documentExcludes: stringList(input.docExcludes, config.documentExcludes), + taskSynthesisMode: pipelineTaskMode(input.taskMode), + includeCommunication: booleanValue(input.includeCommunication, true), + projectDirectory: stringValue(input.projectDir, 'project'), + communicationTicket: nullableString(input.communicationTicket, null), + }; + return runPipeline(options, config); } function filterCommunicationGraph(graph: IntentGraph, input: Record): IntentGraph { + const filter = parseCommunicationGraphFilter(input); + if (!filter.hasFilters) return graph; + const records = graph.records.filter((record) => matchesCommunicationFilter(record, filter)); + return linkIntentRecords(records, graph.generatedAt); +} + +interface CommunicationGraphFilter { + hasFilters: boolean; + participant: string; + role: string; + ticket: string; + communicationOnly: boolean; +} + +function parseCommunicationGraphFilter(input: Record): CommunicationGraphFilter { const participant = stringValue(input.participant, '').toLowerCase(); const role = stringValue(input.role, '').toLowerCase(); const ticket = stringValue(input.ticket, '').toLowerCase(); const communicationOnly = booleanValue(input.communicationOnly, false); - if (!participant && !role && !ticket && !communicationOnly) return graph; - const records = graph.records.filter((record) => { - const isCommunication = record.source.kind === 'agent_log'; - if (communicationOnly && !isCommunication) return false; - if (participant && (!isCommunication || String(record.metadata.participant ?? '').toLowerCase() !== participant)) return false; - if (role && (!isCommunication || String(record.metadata.participantRole ?? '').toLowerCase() !== role)) return false; - if (ticket && !record.statement.target.tickets.some((value) => value.toLowerCase() === ticket)) return false; - return true; - }); - return linkIntentRecords(records, graph.generatedAt); + return { + participant, + role, + ticket, + communicationOnly, + hasFilters: participant !== '' || role !== '' || ticket !== '' || communicationOnly, + }; +} + +function matchesCommunicationFilter(record: IntentRecord, filter: CommunicationGraphFilter): boolean { + if (filter.communicationOnly && record.source.kind !== 'agent_log') return false; + if (!matchesParticipant(record, filter.participant)) return false; + if (!matchesRole(record, filter.role)) return false; + if (!matchesTicket(record, filter.ticket)) return false; + return true; +} + +function matchesParticipant(record: IntentRecord, participant: string): boolean { + if (!participant) return true; + if (record.source.kind !== 'agent_log') return false; + return String(record.metadata.participant ?? '').toLowerCase() === participant; +} + +function matchesRole(record: IntentRecord, role: string): boolean { + if (!role) return true; + if (record.source.kind !== 'agent_log') return false; + return String(record.metadata.participantRole ?? '').toLowerCase() === role; +} + +function matchesTicket(record: IntentRecord, ticket: string): boolean { + if (!ticket) return true; + return record.statement.target.tickets.some((value) => value.toLowerCase() === ticket); } function nlModeValue(value: unknown, fallback: NlExtractionMode): NlExtractionMode { diff --git a/src/summary/generation-metadata.ts b/src/summary/generation-metadata.ts new file mode 100644 index 0000000..6433cba --- /dev/null +++ b/src/summary/generation-metadata.ts @@ -0,0 +1,36 @@ +import { sha256, stableStringify } from '../core/id.js'; +import type { T2CConfig } from '../config/env.js'; +import { openRouterAuditConfiguration } from '../llm/audit.js'; +import { T2C_VERSION } from '../version.js'; +import type { + GroundedGenerationMetadata, + LlmResponseMetadata, +} from '../core/types.js'; + +export function generationMetadata( + config: T2CConfig, + mode: GroundedGenerationMetadata['requestedMode'], + response?: LlmResponseMetadata, + reason?: string, +): GroundedGenerationMetadata { + const effectiveMode = response ? 'llm' : 'deterministic'; + const degraded = mode === 'prefer-llm' && effectiveMode === 'deterministic'; + const configuration = openRouterAuditConfiguration( + config, + mode === 'deterministic' ? null : config.openRouter.summaryModel, + ); + return { + generator: 't2c/grounded-summary', + generatorVersion: '2', + runtimeVersion: T2C_VERSION, + generatedAt: new Date().toISOString(), + requestedMode: mode, + effectiveMode, + degraded, + model: response ? response.model ?? config.openRouter.summaryModel : null, + provider: response ? response.provider ?? 'openrouter' : null, + responseId: response?.responseId ?? null, + configurationFingerprint: sha256(stableStringify(configuration)), + reason: degraded ? reason ?? 'LLM_UNAVAILABLE' : null, + }; +} diff --git a/src/summary/summarizer.ts b/src/summary/summarizer.ts index 0d7ee24..30259d3 100644 --- a/src/summary/summarizer.ts +++ b/src/summary/summarizer.ts @@ -2,7 +2,7 @@ import { promises as fs } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { T2CConfig } from '../config/env.js'; -import { createConclusionId, sha256, stableStringify } from '../core/id.js'; +import { createConclusionId } from '../core/id.js'; import { groundRecordIdsByDiagnostics } from '../core/grounding.js'; import { pathExists } from '../core/io.js'; import { assertConclusions } from '../core/schema.js'; @@ -16,12 +16,11 @@ import type { LlmResponseMetadata, LlmExtractionMode, } from '../core/types.js'; -import { openRouterAuditConfiguration } from '../llm/audit.js'; import { OpenRouterClient } from '../llm/openrouter.js'; import { StructuredResponseError, structuredSchema as s, type StructuredSchema } from '../llm/structured-schema.js'; -import { T2C_VERSION } from '../version.js'; import { compactSummaryPayload } from './payload.js'; import { compareConclusions, renderSummaryMarkdown } from './render.js'; +import { generationMetadata } from './generation-metadata.js'; export interface SummaryResult { conclusions: Conclusion[]; @@ -282,34 +281,6 @@ function deterministicConclusions( return conclusions.sort(compareConclusions); } -function generationMetadata( - config: T2CConfig, - mode: GroundedGenerationMetadata['requestedMode'], - response?: LlmResponseMetadata, - reason?: string, -): GroundedGenerationMetadata { - const effectiveMode = response ? 'llm' : 'deterministic'; - const degraded = mode === 'prefer-llm' && effectiveMode === 'deterministic'; - const configuration = openRouterAuditConfiguration( - config, - mode === 'deterministic' ? null : config.openRouter.summaryModel, - ); - return { - generator: 't2c/grounded-summary', - generatorVersion: '2', - runtimeVersion: T2C_VERSION, - generatedAt: new Date().toISOString(), - requestedMode: mode, - effectiveMode, - degraded, - model: response ? response.model ?? config.openRouter.summaryModel : null, - provider: response ? response.provider ?? 'openrouter' : null, - responseId: response?.responseId ?? null, - configurationFingerprint: sha256(stableStringify(configuration)), - reason: degraded ? reason ?? 'LLM_UNAVAILABLE' : null, - }; -} - function summaryMode(options: SummaryOptions): GroundedGenerationMetadata['requestedMode'] { if (options.mode !== undefined) { if (options.mode === 'deterministic' || options.mode === 'prefer-llm' || options.mode === 'require-llm') { diff --git a/src/synthesis/code-change-path.ts b/src/synthesis/code-change-path.ts index f5a3444..b0eb1ff 100644 --- a/src/synthesis/code-change-path.ts +++ b/src/synthesis/code-change-path.ts @@ -135,35 +135,70 @@ const EXTENSIONLESS_SOURCE_BASENAMES = new Set([ 'vagrantfile', ]); +/** Exported for unit tests and koru/ticket2dsl usefulness checks. */ +export function isUsefulCodeChangePath(value: string): boolean { + return isPlannablePath(value); +} + function isPlannablePath(value: string): boolean { - const normalized = value.trim().replace(/\\/g, '/'); - if ( - !normalized - || normalized.startsWith('/') - || normalized.endsWith('/') - || /^[a-z][a-z\d+.-]*:/i.test(normalized) - ) return false; - const segments = normalized.split('/').filter(Boolean); - if (!segments.length || segments.includes('.') || segments.includes('..')) return false; - // A home-relative or variable-expanded location is not in the repository. A - // release note describing runtime state at `~/.urirun-host/mesh.json` would - // otherwise plan a literal `~` directory inside the analysed tree. - if (/^[~$%]/.test(segments[0] ?? '') || segments.includes('~')) return false; + const normalized = normalizePlannablePath(value); + if (!isCandidatePathSyntax(normalized)) return false; + + const segments = splitPathSegments(normalized); + if (isInvalidSegmentShape(segments)) return false; const lowerSegments = segments.map((segment) => segment.toLowerCase()); - // Shell/glob wildcards are never concrete implementation targets. - if (/[*?[\]{}]/.test(normalized)) return false; + if (!isConcretePath(segments, lowerSegments)) return false; + if (hasShellPattern(normalized)) return false; + if (isDisallowedSegment(lowerSegments)) return false; + + const basename = segments[segments.length - 1] ?? ''; + return isPlannableBasename(lowerSegments, basename); +} - for (const segment of lowerSegments) { - if (NON_SOURCE_DIR_SEGMENTS.has(segment)) return false; - if (segment === '.intent' || segment.startsWith('.intent-')) return false; - if (segment.endsWith('.egg-info') || segment.endsWith('.dist-info')) return false; +function normalizePlannablePath(value: string): string { + return value.trim().replace(/\\/g, '/'); +} + +function isCandidatePathSyntax(normalized: string): boolean { + return Boolean(normalized) + && !normalized.startsWith('/') + && !normalized.endsWith('/') + && !/^[a-z][a-z\d+.-]*:/i.test(normalized); +} + +function splitPathSegments(normalized: string): string[] { + return normalized.split('/').filter(Boolean); +} + +function isInvalidSegmentShape(segments: string[]): boolean { + return !segments.length || segments.includes('.') || segments.includes('..'); +} + +function isConcretePath(segments: string[], lowerSegments: string[]): boolean { + if (segments.length === 0) return false; + if (/^[~$%]/.test(segments[0] ?? '')) return false; + if (segments.includes('~')) return false; + return lowerSegments.every((segment) => segment !== ''); +} + +function hasShellPattern(normalized: string): boolean { + return /[*?[\]{}]/.test(normalized); +} + +function isDisallowedSegment(segments: string[]): boolean { + for (const segment of segments) { + if (NON_SOURCE_DIR_SEGMENTS.has(segment)) return true; + if (segment === '.intent' || segment.startsWith('.intent-')) return true; + if (segment.endsWith('.egg-info') || segment.endsWith('.dist-info')) return true; } + return false; +} - const basename = segments[segments.length - 1] ?? ''; +function isPlannableBasename(lowerSegments: string[], basename: string): boolean { const lowerBasename = basename.toLowerCase(); if (!basename) return false; if (T2C_ARTIFACT_BASENAMES.has(lowerBasename)) return false; - if (segments.length === 1 && lowerBasename === 'prompt.txt') return false; + if (lowerSegments.length === 1 && lowerBasename === 'prompt.txt') return false; if (!basename.includes('.') && !EXTENSIONLESS_SOURCE_BASENAMES.has(lowerBasename)) return false; const dot = basename.lastIndexOf('.'); @@ -172,8 +207,13 @@ function isPlannablePath(value: string): boolean { if (BINARY_EXTENSIONS.has(ext)) return false; } - // Generated code2llm / analysis dumps under project/ (or nested batch dirs) - // that are not primary product source. + if (isGeneratedArtifactPath(lowerSegments, lowerBasename)) return false; + if (lowerBasename.includes('code2llm_incremental')) return false; + + return true; +} + +function isGeneratedArtifactPath(lowerSegments: string[], lowerBasename: string): boolean { if ( lowerSegments[0] === 'project' && (GENERATED_ANALYSIS_BASENAMES.has(lowerBasename) @@ -184,21 +224,9 @@ function isPlannablePath(value: string): boolean { || lowerBasename === 'prompt.txt' || lowerBasename === 'readme.md') ) { - return false; + return true; } - // Local tool state / cache under the project root. - if (lowerSegments[0] === '.koru' || lowerSegments[0] === '.code2llm_cache') { - return false; - } - if (lowerBasename.includes('code2llm_incremental')) { - return false; - } - - return true; -} - -/** Exported for unit tests and koru/ticket2dsl usefulness checks. */ -export function isUsefulCodeChangePath(value: string): boolean { - return isPlannablePath(value); + return lowerSegments[0] === '.koru' || lowerSegments[0] === '.code2llm_cache'; } + diff --git a/src/synthesis/code-change-plan.ts b/src/synthesis/code-change-plan.ts index f85f36c..eb82c02 100644 --- a/src/synthesis/code-change-plan.ts +++ b/src/synthesis/code-change-plan.ts @@ -1,1310 +1 @@ -import { randomUUID } from 'node:crypto'; -import { existsSync, promises as fs } from 'node:fs'; -import path from 'node:path'; -import { - createCodeChangePlanHash, - createCodeChangePlanId, - createCodeChangeSourcePatchHash, - createCodeChangeSourcePatchId, - sha256, - stableStringify, -} from '../core/id.js'; -import { ensureDir, pathExists, readJson, readText } from '../core/io.js'; -import { assertPathWithinRoot } from '../core/security.js'; -import { - assertCodeChangeAcceptance, - assertCodeChangePlanForAcceptance, - assertCodeChangePlans, - assertCodeChangePlansForReview, - assertConclusions, - assertGroundedGenerationMetadata, - assertIntentGraph, -} from '../core/schema.js'; -import type { - CodeChangeAcceptance, - CodeChangeCloseResult, - CodeChangeFile, - CodeChangeFileAction, - CodeChangePlan, - CodeChangeReviewPatch, - CodeChangeSourceApplyReceipt, - CodeChangeSourceEdit, - CodeChangeSourcePatch, - CodeChangeSourcePatchApproval, - CodeChangeSourcePatchSet, - Conclusion, - Diagnostic, - DiagnosticReport, - GroundedGenerationMetadata, - IntentGraph, - IntentRecord, - IntentTarget, - TodoPriority, - TodoProposal, -} from '../core/types.js'; -import { normalizeTarget } from '../core/target.js'; -import { diagnoseGraph } from '../graph/diagnostics.js'; -import { T2C_VERSION } from '../version.js'; -import { isUsefulCodeChangePath } from './code-change-path.js'; - -export { isUsefulCodeChangePath } from './code-change-path.js'; - -const IMPLEMENTATION_DIAGNOSTIC_CODES = new Set([ - 'PLANNED_NOT_IMPLEMENTED', - 'CHANGELOG_WITHOUT_IMPLEMENTATION', -]); - -export interface ProposeCodeChangePlansOptions { - graph: IntentGraph; - diagnostics: DiagnosticReport; - conclusions?: Conclusion[]; - proposals?: TodoProposal[]; - generatedAt?: string; - /** Limit how many plans are materialised from open diagnostics. Default 50. */ - maxPlans?: number; - /** - * Repository probe used to tell `create` from `modify`. Injected rather than - * read here so plan synthesis stays pure and deterministic; when omitted the - * plan cannot know and keeps the conservative `modify`. - * See {@link createRepositoryPathProbe}. - */ - pathExists?: (relativePath: string) => boolean; -} - -export interface ProposeCodeChangePlansResult { - schemaVersion: 't2c.code-change-plan-set/v1'; - plans: CodeChangePlan[]; - generatedAt: string; - graphFingerprint: string; - sourceDiagnosticCount: number; - generation: GroundedGenerationMetadata; -} - -export interface EvaluateCodeChangeAcceptanceOptions { - plan: CodeChangePlan; - /** Graph and diagnostics that the plan was grounded on. */ - before: { graph: IntentGraph; diagnostics: DiagnosticReport }; - /** Graph after an attempted implementation (re-extracted and re-linked). */ - afterGraph: IntentGraph; - /** Optional precomputed after diagnostics; derived when omitted. */ - afterDiagnostics?: DiagnosticReport; - evaluatedAt?: string; -} - -export interface CloseCodeChangesOptions { - plans: CodeChangePlan[]; - before: { graph: IntentGraph; diagnostics: DiagnosticReport }; - afterGraph: IntentGraph; - afterDiagnostics?: DiagnosticReport; - evaluatedAt?: string; -} - -/** - * Build grounded code-change plans from open implementation diagnostics. - * - * One plan is produced per diagnostic that can name at least one target path - * (from the diagnostic's records or a matching TODO proposal). The runtime - * never invents file paths and never marks work complete. - */ -export function proposeCodeChangePlans(options: ProposeCodeChangePlansOptions): ProposeCodeChangePlansResult { - assertIntentGraph(options.graph); - assertConclusions([], { graph: options.graph, diagnostics: options.diagnostics }); - const generatedAt = options.generatedAt ?? new Date().toISOString(); - if (Number.isNaN(Date.parse(generatedAt))) throw new Error('generatedAt must be an ISO date-time'); - const maxPlans = options.maxPlans ?? 50; - if (!Number.isInteger(maxPlans) || maxPlans < 1 || maxPlans > 500) { - throw new Error('maxPlans must be an integer between 1 and 500'); - } - const conclusions = options.conclusions ?? []; - const proposals = options.proposals ?? []; - const recordsById = new Map(options.graph.records.map((record) => [record.id, record])); - const proposalsByDiagnostic = indexProposalsByDiagnostic(proposals); - const conclusionsByDiagnostic = indexConclusionsByDiagnostic(conclusions); - - const candidates = options.diagnostics.diagnostics - .filter((diagnostic) => IMPLEMENTATION_DIAGNOSTIC_CODES.has(diagnostic.code)) - // A released CHANGELOG entry is an audit signal; an open TODO is an - // explicit request for work. With a bounded plan set, sorting only by - // content id allowed historical release notes to consume every slot and - // hide the repository's actual backlog from autonomous executors. - .sort((left, right) => implementationDiagnosticRank(left) - - implementationDiagnosticRank(right) || left.id.localeCompare(right.id)); - - const plans: CodeChangePlan[] = []; - for (const diagnostic of candidates) { - if (plans.length >= maxPlans) break; - const relatedRecords = diagnostic.recordIds - .map((id) => recordsById.get(id)) - .filter((record): record is IntentRecord => Boolean(record)); - if (!relatedRecords.length) continue; - - const matchingProposals = proposalsByDiagnostic.get(diagnostic.id) ?? []; - const matchingConclusions = conclusionsByDiagnostic.get(diagnostic.id) ?? []; - const target = collectTarget(relatedRecords, matchingProposals); - const changes = buildChanges(target, relatedRecords, diagnostic, options.pathExists); - if (!changes.length) continue; - - const generation = deterministicGeneration(generatedAt, 't2c/code-change-plan'); - const evidence = { - graphFingerprint: options.graph.fingerprint, - recordIds: uniqueSorted(relatedRecords.map((record) => record.id)), - diagnosticIds: [diagnostic.id], - conclusionIds: uniqueSorted(matchingConclusions.map((item) => item.id)), - proposalIds: uniqueSorted(matchingProposals.map((item) => item.id)), - }; - const semantic = { - title: titleFor(diagnostic, relatedRecords), - description: descriptionFor(diagnostic, relatedRecords, target), - priority: priorityFor(diagnostic), - target, - acceptanceCriteria: acceptanceCriteriaFor(diagnostic, target), - changes, - risk: riskFor(diagnostic, changes), - rollback: rollbackFor(changes), - evidence, - }; - const planHash = createCodeChangePlanHash(semantic); - const plan: CodeChangePlan = { - schemaVersion: 't2c.code-change-plan/v1', - id: createCodeChangePlanId(semantic), - planHash, - status: 'proposed', - createdAt: generatedAt, - ...semantic, - confidence: confidenceFor(diagnostic, matchingProposals), - generation, - }; - plans.push(plan); - } - - assertCodeChangePlans(plans, { - graph: options.graph, - diagnostics: options.diagnostics, - conclusions, - proposals, - }); - - return { - schemaVersion: 't2c.code-change-plan-set/v1', - plans, - generatedAt, - graphFingerprint: options.graph.fingerprint, - sourceDiagnosticCount: candidates.length, - generation: deterministicGeneration(generatedAt, 't2c/code-change-plan-set'), - }; -} - -/** - * Build the repository probe for {@link ProposeCodeChangePlansOptions.pathExists}. - * - * A path that escapes the analysed root is reported as existing, so an unusual - * value degrades to today's conservative `modify` instead of instructing an - * executor to create a file outside the repository. - */ -export function createRepositoryPathProbe(root: string): (relativePath: string) => boolean { - const base = path.resolve(root); - return (relativePath: string): boolean => { - const absolute = path.resolve(base, relativePath); - if (absolute !== base && !absolute.startsWith(base + path.sep)) return true; - return existsSync(absolute); - }; -} - -function implementationDiagnosticRank(diagnostic: Diagnostic): number { - return diagnostic.code === 'PLANNED_NOT_IMPLEMENTED' ? 0 : 1; -} - -/** - * Re-diagnose an after graph and decide whether the plan's targeted - * diagnostics cleared without introducing new blocking findings. - * - * Diagnostic IDs are content-bound, so a still-open finding on the same - * records keeps the same ID. Cleared findings simply disappear. - */ -export function evaluateCodeChangeAcceptance( - options: EvaluateCodeChangeAcceptanceOptions, -): CodeChangeAcceptance { - assertIntentGraph(options.before.graph); - assertIntentGraph(options.afterGraph); - assertConclusions([], options.before); - assertCodeChangePlanForAcceptance(options.plan, options.before); - - const afterDiagnostics = options.afterDiagnostics ?? diagnoseGraph( - options.afterGraph, - options.evaluatedAt ?? new Date().toISOString(), - ); - assertConclusions([], { graph: options.afterGraph, diagnostics: afterDiagnostics }); - - const beforeIds = new Set(options.before.diagnostics.diagnostics.map((item) => item.id)); - const afterById = new Map(afterDiagnostics.diagnostics.map((item) => [item.id, item])); - const afterIds = [...afterById.keys()].sort(); - const targeted = options.plan.evidence.diagnosticIds; - const clearedDiagnosticIds = targeted.filter((id) => !afterById.has(id)).sort(); - const remainingDiagnosticIds = targeted.filter((id) => afterById.has(id)).sort(); - const newBlockingDiagnosticIds = afterDiagnostics.diagnostics - .filter((item) => item.severity === 'blocking' && !beforeIds.has(item.id)) - .map((item) => item.id) - .sort(); - - const reasons: string[] = []; - if (remainingDiagnosticIds.length) { - reasons.push( - `Targeted diagnostics still open: ${remainingDiagnosticIds.join(', ')}.`, - ); - } else { - reasons.push('All targeted diagnostics cleared after re-analysis.'); - } - if (newBlockingDiagnosticIds.length) { - reasons.push( - `New blocking diagnostics appeared: ${newBlockingDiagnosticIds.join(', ')}.`, - ); - } else { - reasons.push('No new blocking diagnostics appeared.'); - } - - const accepted = remainingDiagnosticIds.length === 0 && newBlockingDiagnosticIds.length === 0; - if (accepted) { - reasons.push('Acceptance gate passed; human approval is still required before DONE.'); - } else { - reasons.push('Acceptance gate failed.'); - } - - const evaluatedAt = options.evaluatedAt ?? new Date().toISOString(); - const acceptance: CodeChangeAcceptance = { - schemaVersion: 't2c.code-change-acceptance/v1', - planId: options.plan.id, - planHash: options.plan.planHash, - beforeGraphFingerprint: options.before.graph.fingerprint, - afterGraphFingerprint: options.afterGraph.fingerprint, - beforeDiagnosticIds: [...beforeIds].sort(), - afterDiagnosticIds: afterIds, - clearedDiagnosticIds, - remainingDiagnosticIds, - newBlockingDiagnosticIds, - accepted, - reasons: uniqueSorted(reasons), - evaluatedAt, - generation: deterministicGeneration(evaluatedAt, 't2c/code-change-acceptance'), - }; - assertCodeChangeAcceptance(acceptance, { - plan: options.plan, - before: options.before, - after: { graph: options.afterGraph, diagnostics: afterDiagnostics }, - }); - return acceptance; -} - -/** Evaluate a plan set under one timestamp without applying changes or marking DONE. */ -export function closeCodeChanges(options: CloseCodeChangesOptions): CodeChangeCloseResult { - const evaluatedAt = options.evaluatedAt ?? new Date().toISOString(); - if (Number.isNaN(Date.parse(evaluatedAt))) throw new Error('evaluatedAt must be an ISO date-time'); - assertIntentGraph(options.before.graph); - assertIntentGraph(options.afterGraph); - assertConclusions([], options.before); - const afterDiagnostics = options.afterDiagnostics ?? diagnoseGraph(options.afterGraph, evaluatedAt); - assertConclusions([], { graph: options.afterGraph, diagnostics: afterDiagnostics }); - const planIds = options.plans.map((plan) => plan.id); - if (new Set(planIds).size !== planIds.length) throw new Error('Code change close plans must have unique ids'); - - const acceptances = options.plans.map((plan) => evaluateCodeChangeAcceptance({ - plan, - before: options.before, - afterGraph: options.afterGraph, - afterDiagnostics, - evaluatedAt, - })); - const acceptedCount = acceptances.filter((item) => item.accepted).length; - return { - schemaVersion: 't2c.code-change-close-result/v1', - evaluatedAt, - graphFingerprintBefore: options.before.graph.fingerprint, - graphFingerprintAfter: options.afterGraph.fingerprint, - planCount: options.plans.length, - acceptedCount, - rejectedCount: options.plans.length - acceptedCount, - allAccepted: options.plans.length > 0 && acceptedCount === options.plans.length, - acceptances, - generation: deterministicGeneration(evaluatedAt, 't2c/code-change-close-result'), - }; -} - -function indexProposalsByDiagnostic(proposals: TodoProposal[]): Map { - const index = new Map(); - for (const proposal of proposals) { - for (const diagnosticId of proposal.diagnosticIds) { - const list = index.get(diagnosticId) ?? []; - list.push(proposal); - index.set(diagnosticId, list); - } - } - return index; -} - -function indexConclusionsByDiagnostic(conclusions: Conclusion[]): Map { - const index = new Map(); - for (const conclusion of conclusions) { - for (const diagnosticId of conclusion.diagnosticIds) { - const list = index.get(diagnosticId) ?? []; - list.push(conclusion); - index.set(diagnosticId, list); - } - } - return index; -} - -function collectTarget(records: IntentRecord[], proposals: TodoProposal[]): IntentTarget { - const paths = new Set(); - const symbols = new Set(); - const tickets = new Set(); - const versions = new Set(); - for (const record of records) { - for (const path of record.statement.target.paths) paths.add(path); - for (const symbol of record.statement.target.symbols) symbols.add(symbol); - for (const ticket of record.statement.target.tickets) tickets.add(ticket); - for (const version of record.statement.target.versions) versions.add(version); - } - for (const proposal of proposals) { - for (const path of proposal.target.paths) paths.add(path); - for (const symbol of proposal.target.symbols) symbols.add(symbol); - for (const ticket of proposal.target.tickets) tickets.add(ticket); - for (const version of proposal.target.versions) versions.add(version); - } - return normalizeTarget({ - paths: [...paths].filter(isUsefulCodeChangePath), - symbols: [...symbols], - tickets: [...tickets], - versions: [...versions], - }); -} - -function buildChanges( - target: IntentTarget, - records: IntentRecord[], - diagnostic: Diagnostic, - pathExistsInRepository?: (relativePath: string) => boolean, -): CodeChangeFile[] { - const symbols = uniqueSorted(target.symbols); - // The diagnostic explains why evidence is missing; it is not necessarily an - // implementation instruction. Reusing its generic remediation here produced - // contradictory tickets such as β€œreplace magic number 50” followed by - // β€œprovide a missing function”. The lossless source declaration is the work - // to perform, while the diagnostic remains available in the plan evidence. - const sourceIntents = uniqueSorted(records.map((record) => record.statement.text)); - const rationale = sourceIntents.length - ? `Implement the source intent: ${sourceIntents.join(' | ')}` - : diagnostic.detail || `Address ${diagnostic.code}.`; - - if (target.paths.length) { - const changes: CodeChangeFile[] = []; - for (const declared of uniqueSorted(target.paths)) { - const normalized = declared.replace(/\\/g, '/'); - const exists = pathExistsInRepository?.(normalized); - // A path without a directory is shorthand that never said *where* the - // file belongs. Creating one at the repository root invents a location: - // measured across seven foreign repositories this proposed `__init__.py` - // beside 22 real ones, `pyproject.toml` beside 32, and files named after - // prose fragments such as `it.md`. The diagnostic still reports the gap; - // only the invented instruction is withheld. - if (exists === false && !normalized.includes('/')) continue; - // Documentation routinely plans files that do not exist yet (a target - // repository's `docs/ARCHITECTURE.md`). Telling an executor to modify - // them is an instruction it cannot follow, and `apply-source-patch` - // rejects a create edit whose target already exists, so the two actions - // must not be guessed. - const action: CodeChangeFileAction = exists === false ? 'create' : 'modify'; - changes.push({ path: normalized, action, symbols, rationale }); - } - return changes; - } - - // Without a path the plan cannot safely name a source file. Skip rather than invent. - return []; -} - -function titleFor(diagnostic: Diagnostic, records: IntentRecord[]): string { - const record = records[0]; - const object = record?.statement.object?.trim(); - // `inferObject` removes the verb selected by the action classifier. In a - // compound sentence a later high-precedence verb can win (`verify` before - // `implement`), leaving the original leading imperative inside `object` and - // a broken fragment after the removed verb. The source statement is the - // lossless title whenever that mismatch is visible. - if (object && startsWithImperative(object) && record?.statement.text.trim()) { - return record.statement.text.trim().replace(/[.!?]+$/, ''); - } - if (object) return `Implement ${object}`; - return diagnostic.title.trim() || `Resolve ${diagnostic.code}`; -} - -function startsWithImperative(value: string): boolean { - return /^(?:add|build|change|configure|create|delete|document|fix|implement|preserve|refactor|remove|test|update|validate|verify)\b/i.test(value) - || /^(?:dodaΔ‡|dodac|naprawiΔ‡|naprawic|przetestowaΔ‡|przetestowac|usunΔ…Δ‡|usunac|utworzyΔ‡|utworzyc|wdroΕΌyΔ‡|wdrozyc|zmieniΔ‡|zmienic|zweryfikowaΔ‡|zweryfikowac)\b/i.test(value); -} - -function descriptionFor( - diagnostic: Diagnostic, - records: IntentRecord[], - target: IntentTarget, -): string { - const parts = [ - diagnostic.detail.trim(), - records[0] ? `Source intent: ${records[0].statement.text.trim()}` : '', - target.paths.length ? `Paths: ${target.paths.join(', ')}.` : '', - target.symbols.length ? `Symbols: ${target.symbols.join(', ')}.` : '', - target.tickets.length ? `Tickets: ${target.tickets.join(', ')}.` : '', - ].filter(Boolean); - return parts.join(' '); -} - -function acceptanceCriteriaFor(diagnostic: Diagnostic, target: IntentTarget): string[] { - const criteria = [ - `Re-run todo2code link+diagnose and clear diagnostic ${diagnostic.id} (${diagnostic.code}).`, - 'Do not introduce new blocking diagnostics.', - ]; - if (target.paths.length) { - criteria.push(`Touch only the declared paths: ${uniqueSorted(target.paths).join(', ')}.`); - } - if (target.symbols.length) { - criteria.push(`Provide AST evidence for symbols: ${uniqueSorted(target.symbols).join(', ')}.`); - } - return uniqueSorted(criteria); -} - -function priorityFor(diagnostic: Diagnostic): TodoPriority { - if (diagnostic.severity === 'blocking') return 'P0'; - if (diagnostic.severity === 'review_required') return 'P1'; - if (diagnostic.severity === 'warning') return 'P2'; - return 'P3'; -} - -function confidenceFor(diagnostic: Diagnostic, proposals: TodoProposal[]): number { - if (proposals.length) { - return Math.min(0.92, Math.max(...proposals.map((item) => item.confidence))); - } - if (diagnostic.severity === 'blocking') return 0.88; - if (diagnostic.severity === 'review_required') return 0.8; - return 0.72; -} - -function riskFor(diagnostic: Diagnostic, changes: CodeChangeFile[]): CodeChangePlan['risk'] { - const level = diagnostic.severity === 'blocking' ? 'high' - : diagnostic.severity === 'review_required' ? 'medium' - : 'low'; - const reasons = [ - `Derived from ${diagnostic.severity} diagnostic ${diagnostic.id}.`, - `Touches ${changes.length} declared ${changes.length === 1 ? 'path' : 'paths'}.`, - ]; - return { level, reasons: uniqueSorted(reasons) }; -} - -function rollbackFor(changes: CodeChangeFile[]): string { - return `Revert the proposed changes to ${uniqueSorted(changes.map((item) => item.path)).join(', ')} and re-run todo2code diagnostics.`; -} - -function deterministicGeneration(generatedAt: string, generator: string): GroundedGenerationMetadata { - return { - generator, - generatorVersion: '1', - runtimeVersion: T2C_VERSION, - generatedAt, - requestedMode: 'deterministic', - effectiveMode: 'deterministic', - degraded: false, - model: null, - provider: null, - responseId: null, - configurationFingerprint: sha256(stableStringify({ - generator, - generatorVersion: '1', - codes: [...IMPLEMENTATION_DIAGNOSTIC_CODES].sort(), - })), - reason: null, - }; -} - -function uniqueSorted(values: string[]): string[] { - return [...new Set(values.map((item) => item.trim()).filter(Boolean))].sort(); -} - -export interface CreateCodeChangeReviewOptions { - plans: CodeChangePlan[]; - graphFingerprint: string; - createdAt?: string; -} - -export interface CreatedCodeChangeReview { - markdown: string; - artifact: CodeChangeReviewPatch; -} - -/** - * Render a stable, reviewable Markdown brief for grounded code-change plans. - * - * This is not a source patch and is never applied to the tree. It exists so - * humans and agents share one hash-bound artifact that lists exact paths, - * acceptance criteria, evidence IDs, risk and rollback instructions. - */ -export function createCodeChangeReviewPatch( - options: CreateCodeChangeReviewOptions, -): CreatedCodeChangeReview { - if (typeof options.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(options.graphFingerprint)) { - throw new Error('graphFingerprint must be a SHA-256 hex digest'); - } - assertCodeChangePlansForReview(options.plans, options.graphFingerprint); - const plans = [...options.plans].sort((left, right) => - priorityRank(left.priority) - priorityRank(right.priority) || left.id.localeCompare(right.id)); - const createdAt = options.createdAt ?? new Date().toISOString(); - if (Number.isNaN(Date.parse(createdAt))) throw new Error('createdAt must be an ISO date-time'); - const markdown = renderCodeChangeReviewMarkdown(plans, options.graphFingerprint); - const artifact: CodeChangeReviewPatch = { - schemaVersion: 't2c.code-change-review/v1', - createdAt, - graphFingerprint: options.graphFingerprint, - planIds: plans.map((plan) => plan.id), - planHashes: plans.map((plan) => plan.planHash), - renderedPatchHash: sha256(markdown), - generation: deterministicGeneration(createdAt, 't2c/code-change-review'), - }; - assertCodeChangeReviewPatch(artifact); - return { markdown, artifact }; -} - -export function renderCodeChangeReviewMarkdown( - plans: CodeChangePlan[], - graphFingerprint: string, -): string { - const lines = [ - '', - '# todo2code proposed code changes', - '', - 'This document is a grounded **review brief**, not an auto-applied source patch.', - 'Implement the listed paths in a normal branch, re-run the pipeline, then', - '`t2c evaluate-code-change`. Acceptance still requires human/CI approval before DONE.', - '', - `Graph fingerprint: \`${graphFingerprint}\``, - '', - ]; - if (!plans.length) { - lines.push('_No grounded code-change plans. Open diagnostics either cleared or lack repository paths._', ''); - return lines.join('\n'); - } - let currentPriority: CodeChangePlan['priority'] | null = null; - for (const plan of plans) { - if (plan.priority !== currentPriority) { - if (currentPriority !== null) lines.push(''); - currentPriority = plan.priority; - lines.push(`## ${plan.priority}`, ''); - } - lines.push(`### ${inline(plan.title)} (\`${plan.id}\`)`, ''); - lines.push(`- Plan hash: \`${plan.planHash}\``); - lines.push(`- Risk: **${plan.risk.level}** β€” ${plan.risk.reasons.map(inline).join('; ')}`); - lines.push(`- Confidence: ${plan.confidence.toFixed(2)}`); - lines.push(`- Description: ${inline(plan.description)}`); - lines.push('- Changes:'); - for (const change of plan.changes) { - const symbols = change.symbols.length ? ` symbols: ${change.symbols.map((item) => `\`${item}\``).join(', ')}` : ''; - lines.push(` - \`${change.action}\` \`${change.path}\`${symbols}`); - lines.push(` - ${inline(change.rationale)}`); - } - lines.push('- Acceptance criteria:'); - for (const criterion of plan.acceptanceCriteria) lines.push(` - [ ] ${inline(criterion)}`); - lines.push(`- Diagnostics: ${renderIds(plan.evidence.diagnosticIds)}`); - lines.push(`- Evidence records: ${renderIds(plan.evidence.recordIds)}`); - if (plan.evidence.proposalIds.length) lines.push(`- TODO proposals: ${renderIds(plan.evidence.proposalIds)}`); - if (plan.evidence.conclusionIds.length) lines.push(`- Conclusions: ${renderIds(plan.evidence.conclusionIds)}`); - lines.push(`- Rollback: ${inline(plan.rollback)}`); - lines.push(''); - } - lines.push('## After implementation', ''); - lines.push('1. Re-run `t2c pipeline` (or extract + link + diagnose) on the changed tree.'); - lines.push('2. `t2c evaluate-code-change --before-graph … --after-graph … --out acceptance.json`.'); - lines.push('3. Require `accepted=true` and human/CI review before marking work DONE.'); - lines.push(''); - return lines.join('\n'); -} - -export function assertCodeChangeReviewPatch(value: unknown): asserts value is CodeChangeReviewPatch { - if (!value || typeof value !== 'object' || Array.isArray(value)) { - throw new Error('Code change review patch must be an object'); - } - const artifact = value as Record; - const required = [ - 'schemaVersion', 'createdAt', 'graphFingerprint', 'planIds', 'planHashes', - 'renderedPatchHash', 'generation', - ]; - for (const key of required) { - if (!(key in artifact)) throw new Error(`Code change review patch is missing: ${key}`); - } - if (artifact.schemaVersion !== 't2c.code-change-review/v1') { - throw new Error('Unsupported code change review schemaVersion'); - } - if (typeof artifact.createdAt !== 'string' || Number.isNaN(Date.parse(artifact.createdAt))) { - throw new Error('Code change review createdAt must be an ISO date-time'); - } - if (typeof artifact.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(artifact.graphFingerprint)) { - throw new Error('Code change review graphFingerprint must be SHA-256'); - } - if (typeof artifact.renderedPatchHash !== 'string' || !/^[a-f0-9]{64}$/.test(artifact.renderedPatchHash)) { - throw new Error('Code change review renderedPatchHash must be SHA-256'); - } - if (!Array.isArray(artifact.planIds) || !artifact.planIds.every((id) => typeof id === 'string' && /^CPLAN-[a-f0-9]{20}$/.test(id))) { - throw new Error('Code change review planIds must be CPLAN ids'); - } - if (!Array.isArray(artifact.planHashes) || !artifact.planHashes.every((hash) => typeof hash === 'string' && /^[a-f0-9]{64}$/.test(hash))) { - throw new Error('Code change review planHashes must be SHA-256 digests'); - } - if (artifact.planIds.length !== artifact.planHashes.length) { - throw new Error('Code change review planIds and planHashes must have equal length'); - } - if (new Set(artifact.planIds as string[]).size !== (artifact.planIds as string[]).length) { - throw new Error('Code change review planIds must be unique'); - } - assertGroundedGenerationMetadata(artifact.generation, 'Code change review generation'); - const generation = artifact.generation as GroundedGenerationMetadata; - if (generation.generatedAt !== artifact.createdAt) { - throw new Error('Code change review generation.generatedAt must match createdAt'); - } - if (generation.generator !== 't2c/code-change-review') { - throw new Error('Code change review generation.generator must be t2c/code-change-review'); - } -} - -function priorityRank(priority: TodoPriority): number { - return ({ P0: 0, P1: 1, P2: 2, P3: 3 } as const)[priority]; -} - -function inline(value: string): string { - return value.replace(/\s+/g, ' ').trim(); -} - -function renderIds(ids: string[]): string { - return ids.length ? ids.map((id) => `\`${id}\``).join(', ') : '_none_'; -} - -export interface CreateCodeChangeSourcePatchOptions { - plan: CodeChangePlan; - /** Optional per-path unified diffs keyed by relative repository path. */ - unifiedDiffs?: Record; - createdAt?: string; -} - -/** - * Build a structured source-edit proposal from one grounded code-change plan. - * - * Deterministic by default: each planned file gets an imperative instruction. - * Callers may attach a unified diff per path; the runtime validates path headers - * and rejects traversal / host paths. Nothing is written to the working tree. - */ -export function createCodeChangeSourcePatch( - options: CreateCodeChangeSourcePatchOptions, -): CodeChangeSourcePatch { - const plan = options.plan; - const graphFingerprint = plan?.evidence?.graphFingerprint; - assertCodeChangePlansForReview( - [plan], - typeof graphFingerprint === 'string' ? graphFingerprint : '', - ); - const createdAt = options.createdAt ?? new Date().toISOString(); - if (Number.isNaN(Date.parse(createdAt))) throw new Error('createdAt must be an ISO date-time'); - const allowed = new Set(plan.target.paths.map((path) => path.replace(/\\/g, '/'))); - const diffs = options.unifiedDiffs ?? {}; - for (const path of Object.keys(diffs)) { - const normalized = path.replace(/\\/g, '/'); - if (!allowed.has(normalized)) { - throw new Error(`Unified diff path ${normalized} is not declared by plan ${plan.id}`); - } - } - const edits: CodeChangeSourceEdit[] = [...plan.changes] - .map((change) => { - const path = change.path.replace(/\\/g, '/'); - if (!allowed.has(path)) { - throw new Error(`Edit path ${path} is not present in plan target.paths`); - } - const rawDiff = diffs[path]; - const unifiedDiff = rawDiff === undefined ? null : normalizeUnifiedDiff(rawDiff, path); - return { - path, - action: change.action, - symbols: uniqueSorted(change.symbols), - instruction: instructionFor(change, plan), - unifiedDiff, - }; - }) - .sort((left, right) => left.path.localeCompare(right.path) || left.action.localeCompare(right.action)); - if (!edits.length) throw new Error(`Plan ${plan.id} has no editable paths`); - - const semantic = { - planId: plan.id, - planHash: plan.planHash, - graphFingerprint: plan.evidence.graphFingerprint, - diagnosticIds: uniqueSorted(plan.evidence.diagnosticIds), - recordIds: uniqueSorted(plan.evidence.recordIds), - edits, - acceptanceCriteria: uniqueSorted(plan.acceptanceCriteria), - }; - const patchHash = createCodeChangeSourcePatchHash(semantic); - const patch: CodeChangeSourcePatch = { - schemaVersion: 't2c.code-change-source-patch/v1', - id: createCodeChangeSourcePatchId(semantic), - patchHash, - status: 'proposed', - createdAt, - ...semantic, - generation: deterministicGeneration(createdAt, 't2c/code-change-source-patch'), - }; - assertCodeChangeSourcePatch(patch, plan); - return patch; -} - -export function createCodeChangeSourcePatchSet(options: { - plans: CodeChangePlan[]; - graphFingerprint: string; - unifiedDiffsByPlanId?: Record>; - generatedAt?: string; -}): CodeChangeSourcePatchSet { - if (typeof options.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(options.graphFingerprint)) { - throw new Error('graphFingerprint must be a SHA-256 hex digest'); - } - assertCodeChangePlansForReview(options.plans, options.graphFingerprint); - const generatedAt = options.generatedAt ?? new Date().toISOString(); - const patches = [...options.plans] - .sort((left, right) => left.id.localeCompare(right.id)) - .map((plan) => createCodeChangeSourcePatch({ - plan, - createdAt: generatedAt, - ...(options.unifiedDiffsByPlanId?.[plan.id] - ? { unifiedDiffs: options.unifiedDiffsByPlanId[plan.id] } - : {}), - })); - const result: CodeChangeSourcePatchSet = { - schemaVersion: 't2c.code-change-source-patch-set/v1', - generatedAt, - graphFingerprint: options.graphFingerprint, - patches, - generation: deterministicGeneration(generatedAt, 't2c/code-change-source-patch-set'), - }; - assertCodeChangeSourcePatchSet(result, options.plans); - return result; -} - -export function assertCodeChangeSourcePatch( - value: unknown, - plan?: CodeChangePlan, -): asserts value is CodeChangeSourcePatch { - if (!value || typeof value !== 'object' || Array.isArray(value)) { - throw new Error('Code change source patch must be an object'); - } - const patch = value as CodeChangeSourcePatch; - exactSourcePatchKeys(patch as unknown as Record, [ - 'schemaVersion', 'id', 'patchHash', 'status', 'createdAt', 'planId', 'planHash', - 'graphFingerprint', 'diagnosticIds', 'recordIds', 'edits', 'acceptanceCriteria', 'generation', - ], 'Source patch'); - if (patch.schemaVersion !== 't2c.code-change-source-patch/v1') { - throw new Error('Unsupported code change source patch schemaVersion'); - } - if (typeof patch.id !== 'string' || !/^SPATCH-[a-f0-9]{20}$/.test(patch.id)) { - throw new Error('Source patch id must match SPATCH-<20 hex>'); - } - if (typeof patch.patchHash !== 'string' || !/^[a-f0-9]{64}$/.test(patch.patchHash)) { - throw new Error('Source patch patchHash must be SHA-256'); - } - if (patch.status !== 'proposed') throw new Error('Source patch status must be proposed'); - if (typeof patch.createdAt !== 'string' || Number.isNaN(Date.parse(patch.createdAt))) { - throw new Error('Source patch createdAt must be an ISO date-time'); - } - if (typeof patch.planId !== 'string' || !/^CPLAN-[a-f0-9]{20}$/.test(patch.planId)) { - throw new Error('Source patch planId must match CPLAN-<20 hex>'); - } - if (typeof patch.planHash !== 'string' || !/^[a-f0-9]{64}$/.test(patch.planHash)) { - throw new Error('Source patch planHash must be SHA-256'); - } - if (typeof patch.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(patch.graphFingerprint)) { - throw new Error('Source patch graphFingerprint must be SHA-256'); - } - if (!Array.isArray(patch.edits) || patch.edits.length === 0) { - throw new Error('Source patch edits must be a non-empty array'); - } - assertSourcePatchIds(patch.diagnosticIds, /^DIAG-[a-f0-9]{20}$/, 'diagnosticIds'); - assertSourcePatchIds(patch.recordIds, /^INT-[A-Z]+-[a-f0-9]{20}$/, 'recordIds'); - assertSourcePatchStrings(patch.acceptanceCriteria, 'acceptanceCriteria', false); - const paths = new Set(); - for (const edit of patch.edits) { - if (!edit || typeof edit !== 'object') throw new Error('Source patch edit must be an object'); - exactSourcePatchKeys(edit as unknown as Record, [ - 'path', 'action', 'symbols', 'instruction', 'unifiedDiff', - ], 'Source patch edit'); - const path = edit.path?.trim().replace(/\\/g, '/') ?? ''; - if (!path || path.startsWith('/') || path.split('/').includes('..')) { - throw new Error(`Source patch edit path is not a relative repository path: ${path}`); - } - if (!['create', 'modify', 'delete'].includes(edit.action)) { - throw new Error(`Source patch edit action is unsupported: ${String(edit.action)}`); - } - if (typeof edit.instruction !== 'string' || !edit.instruction.trim()) { - throw new Error('Source patch edit instruction must be non-blank'); - } - assertSourcePatchStrings(edit.symbols, `edits[${path}].symbols`, true); - if (edit.unifiedDiff !== null) { - if (typeof edit.unifiedDiff !== 'string') throw new Error('Source patch unifiedDiff must be string or null'); - normalizeUnifiedDiff(edit.unifiedDiff, path); - } - const key = `${path}::${edit.action}`; - if (paths.has(key)) throw new Error(`Duplicate source patch edit for ${path}`); - paths.add(key); - } - const expectedHash = createCodeChangeSourcePatchHash(patch); - if (patch.patchHash !== expectedHash) { - throw new Error(`Source patch patchHash does not match semantic content: expected ${expectedHash}`); - } - if (patch.id !== createCodeChangeSourcePatchId(patch)) { - throw new Error('Source patch id does not match semantic content'); - } - assertGroundedGenerationMetadata(patch.generation, 'Source patch generation'); - if (patch.generation.generatedAt !== patch.createdAt) { - throw new Error('Source patch generation.generatedAt must match createdAt'); - } - if (patch.generation.generator !== 't2c/code-change-source-patch') { - throw new Error('Source patch generation.generator must be t2c/code-change-source-patch'); - } - if (plan) { - if (patch.planId !== plan.id || patch.planHash !== plan.planHash) { - throw new Error('Source patch is not bound to the supplied plan'); - } - if (patch.graphFingerprint !== plan.evidence.graphFingerprint) { - throw new Error('Source patch graphFingerprint does not match the plan'); - } - const allowed = new Set(plan.target.paths.map((item) => item.replace(/\\/g, '/'))); - const expectedChanges = new Map(plan.changes.map((item) => [ - item.path.replace(/\\/g, '/'), item.action, - ])); - for (const edit of patch.edits) { - const editPath = edit.path.replace(/\\/g, '/'); - if (!allowed.has(editPath)) { - throw new Error(`Source patch path ${edit.path} is outside plan target.paths`); - } - if (expectedChanges.get(editPath) !== edit.action) { - throw new Error(`Source patch action for ${edit.path} does not match the plan`); - } - } - exactSourcePatchSet(patch.edits.map((item) => item.path.replace(/\\/g, '/')), [...expectedChanges.keys()], 'edit paths'); - exactSourcePatchSet(patch.diagnosticIds, plan.evidence.diagnosticIds, 'diagnosticIds'); - exactSourcePatchSet(patch.recordIds, plan.evidence.recordIds, 'recordIds'); - exactSourcePatchSet(patch.acceptanceCriteria, plan.acceptanceCriteria, 'acceptanceCriteria'); - } -} - -export function assertCodeChangeSourcePatchSet( - value: unknown, - plans?: CodeChangePlan[], -): asserts value is CodeChangeSourcePatchSet { - if (!value || typeof value !== 'object' || Array.isArray(value)) { - throw new Error('Code change source patch set must be an object'); - } - const set = value as CodeChangeSourcePatchSet; - exactSourcePatchKeys(set as unknown as Record, [ - 'schemaVersion', 'generatedAt', 'graphFingerprint', 'patches', 'generation', - ], 'Source patch set'); - if (set.schemaVersion !== 't2c.code-change-source-patch-set/v1') { - throw new Error('Unsupported code change source patch set schemaVersion'); - } - if (typeof set.generatedAt !== 'string' || Number.isNaN(Date.parse(set.generatedAt))) { - throw new Error('Source patch set generatedAt must be an ISO date-time'); - } - if (typeof set.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(set.graphFingerprint)) { - throw new Error('Source patch set graphFingerprint must be SHA-256'); - } - if (!Array.isArray(set.patches)) throw new Error('Source patch set patches must be an array'); - const plansById = new Map((plans ?? []).map((plan) => [plan.id, plan])); - const patchIds = new Set(); - for (const patch of set.patches) { - assertCodeChangeSourcePatch(patch, plans ? plansById.get(patch.planId) : undefined); - if (patch.graphFingerprint !== set.graphFingerprint) { - throw new Error(`Source patch ${patch.id} graphFingerprint does not match its set`); - } - if (patchIds.has(patch.id)) throw new Error(`Duplicate source patch id: ${patch.id}`); - patchIds.add(patch.id); - } - if (plans) exactSourcePatchSet(set.patches.map((patch) => patch.planId), plans.map((plan) => plan.id), 'planIds'); - assertGroundedGenerationMetadata(set.generation, 'Source patch set generation'); - if (set.generation.generatedAt !== set.generatedAt) { - throw new Error('Source patch set generation.generatedAt must match generatedAt'); - } - if (set.generation.generator !== 't2c/code-change-source-patch-set') { - throw new Error('Source patch set generation.generator must be t2c/code-change-source-patch-set'); - } -} - -function exactSourcePatchKeys(value: Record, expected: string[], name: string): void { - const actual = Object.keys(value).sort(); - const wanted = [...expected].sort(); - if (actual.length !== wanted.length || actual.some((key, index) => key !== wanted[index])) { - throw new Error(`${name} keys must be exactly: ${wanted.join(', ')}`); - } -} - -function assertSourcePatchIds(value: unknown, pattern: RegExp, name: string): asserts value is string[] { - if (!Array.isArray(value) || value.length === 0 - || value.some((item) => typeof item !== 'string' || !pattern.test(item))) { - throw new Error(`Source patch ${name} must be a non-empty array of valid IDs`); - } - if (new Set(value).size !== value.length) throw new Error(`Source patch ${name} must be unique`); -} - -function assertSourcePatchStrings(value: unknown, name: string, emptyAllowed: boolean): asserts value is string[] { - if (!Array.isArray(value) || (!emptyAllowed && value.length === 0) - || value.some((item) => typeof item !== 'string' || !item.trim())) { - throw new Error(`Source patch ${name} must contain ${emptyAllowed ? 'only ' : ''}non-blank strings`); - } - if (new Set(value).size !== value.length) throw new Error(`Source patch ${name} must be unique`); -} - -function exactSourcePatchSet(actual: string[], expected: string[], name: string): void { - const left = [...new Set(actual)].sort(); - const right = [...new Set(expected)].sort(); - if (left.length !== right.length || left.some((item, index) => item !== right[index])) { - throw new Error(`Source patch ${name} do not match the plan`); - } -} - -function instructionFor(change: CodeChangeFile, plan: CodeChangePlan): string { - const symbols = change.symbols.length - ? ` Focus on symbols: ${change.symbols.join(', ')}.` - : ''; - const criteria = plan.acceptanceCriteria.length - ? ` Acceptance: ${plan.acceptanceCriteria.join(' ')}` - : ''; - return `${change.action} \`${change.path}\`. ${change.rationale.trim()}.${symbols}${criteria}`.replace(/\s+/g, ' ').trim(); -} - -/** - * Validate a single-file unified diff body. - * Accepts optional `--- a/path` / `+++ b/path` headers and rejects foreign paths. - */ -function normalizeUnifiedDiff(diff: string, expectedPath: string): string { - const normalized = diff.replace(/\r\n/g, '\n'); - if (!normalized.trim()) throw new Error(`Unified diff for ${expectedPath} is empty`); - if (normalized.includes('\0')) throw new Error(`Unified diff for ${expectedPath} contains NUL bytes`); - // Lightweight secret heuristic β€” refuse obvious credential dumps in proposed diffs. - if (/(?:api[_-]?key|secret|password|private[_-]?key)\s*[:=]\s*['"]?[^'"\s]{8,}/i.test(normalized)) { - throw new Error(`Unified diff for ${expectedPath} appears to contain a secret assignment`); - } - const headers = [...normalized.matchAll(/^(?:---|\+\+\+)\s+(?:[ab]\/)?(.+)$/gm)].map((match) => match[1]!.trim()); - for (const header of headers) { - if (header === '/dev/null') continue; - const path = header.replace(/\\/g, '/'); - if (path.startsWith('/') || path.split('/').includes('..')) { - throw new Error(`Unified diff for ${expectedPath} uses a non-repository path header: ${path}`); - } - if (path !== expectedPath && path !== `a/${expectedPath}` && path !== `b/${expectedPath}`) { - // Headers may include timestamps after a tab; strip them. - const bare = path.split('\t')[0] ?? path; - const stripped = bare.replace(/^[ab]\//, ''); - if (stripped !== expectedPath) { - throw new Error(`Unified diff for ${expectedPath} references foreign path: ${path}`); - } - } - } - return normalized; -} - -export interface ApplyCodeChangeSourcePatchOptions { - root: string; - patch: CodeChangeSourcePatch; - approval: CodeChangeSourcePatchApproval; - receiptPath: string; - now?: Date; -} - -export interface ApplyCodeChangeSourcePatchResult { - applied: boolean; - idempotent: boolean; - receipt: CodeChangeSourceApplyReceipt; -} - -/** - * Apply a fully-diffed source patch after explicit hash approval. - * - * Instruction-only edits (null unifiedDiff) are rejected. Paths must stay - * relative and inside `root`. Re-applying with an existing matching receipt is - * idempotent. - */ -export async function applyCodeChangeSourcePatch( - options: ApplyCodeChangeSourcePatchOptions, -): Promise { - assertCodeChangeSourcePatch(options.patch); - if (!options.approval?.actor?.trim()) throw new Error('Explicit source patch approval actor is required'); - if (options.approval.patchHash !== options.patch.patchHash) { - throw new Error('Source patch approval hash does not match the patch'); - } - for (const edit of options.patch.edits) { - if (edit.unifiedDiff === null) { - throw new Error(`Source patch edit ${edit.path} has no unifiedDiff and cannot be applied`); - } - } - - const root = path.resolve(options.root); - const receiptPath = await assertPathWithinRoot(root, path.resolve(options.receiptPath)); - const lockPath = `${receiptPath}.t2c-apply.lock`; - await ensureDir(path.dirname(receiptPath)); - let lock: Awaited> | null = null; - try { - lock = await fs.open(lockPath, 'wx'); - } catch (error) { - if ((error as NodeJS.ErrnoException).code === 'EEXIST') { - throw new Error('Another source patch apply operation is in progress'); - } - throw error; - } - - try { - if (await pathExists(receiptPath)) { - const existing = await readJson(receiptPath, 1024 * 1024); - await assertExistingSourceReceipt(existing, options.patch, root); - return { applied: false, idempotent: true, receipt: existing }; - } - - const prepared: PreparedSourceEdit[] = []; - for (const edit of options.patch.edits) { - const relative = edit.path.replace(/\\/g, '/'); - const absolute = await assertPathWithinRoot(root, path.resolve(root, relative)); - if (absolute === receiptPath) { - throw new Error(`Source patch target collides with its receipt path: ${relative}`); - } - const exists = await pathExists(absolute); - if (exists && (await fs.lstat(absolute)).isSymbolicLink()) { - throw new Error(`Refusing to apply through a symlink: ${relative}`); - } - if (edit.action === 'create' && exists) throw new Error(`Source patch create target already exists: ${relative}`); - if (edit.action === 'delete' && !exists) throw new Error(`Source patch delete target does not exist: ${relative}`); - if (edit.action === 'modify' && !exists) { - const fromEmpty = /(?:^|\n)---\s+\/dev\/null(?:\n|$)/.test(edit.unifiedDiff!) - || /(?:^|\n)@@\s+-0(?:,0)?\s+\+/.test(edit.unifiedDiff!); - if (!fromEmpty) throw new Error(`Source patch modify target does not exist: ${relative}`); - } - const before = exists ? await readText(absolute, 16 * 1024 * 1024) : ''; - const after = applyUnifiedDiffToText(before, edit.unifiedDiff!, relative); - if (edit.action === 'delete' && after !== '') { - throw new Error(`Source patch delete diff must remove the complete file: ${relative}`); - } - prepared.push({ relative, absolute, action: edit.action, before, after, existed: exists }); - } - - const changed: PreparedSourceEdit[] = []; - try { - for (const edit of prepared) { - if (edit.action === 'delete') await fs.unlink(edit.absolute); - else await atomicWriteRaw(edit.absolute, edit.after); - changed.push(edit); - } - const now = (options.now ?? new Date()).toISOString(); - const fileHashesAfter = Object.fromEntries(prepared - .map((edit): [string, string] => [edit.relative, sha256(edit.after)]) - .sort(([left], [right]) => left.localeCompare(right))); - const receipt: CodeChangeSourceApplyReceipt = { - schemaVersion: 't2c.code-change-source-apply-receipt/v1', - patchId: options.patch.id, - patchHash: options.patch.patchHash, - planId: options.patch.planId, - approvedBy: options.approval.actor.trim(), - approvedAt: now, - appliedAt: now, - appliedPaths: prepared.map((edit) => edit.relative).sort(), - fileHashesAfter, - generation: deterministicGeneration(now, 't2c/code-change-source-apply'), - }; - assertSourceApplyReceipt(receipt, options.patch); - // The receipt is part of the transaction: without it a retry could apply - // the same approved patch again. Roll files back if persisting it fails. - await atomicWriteRaw(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`); - return { applied: true, idempotent: false, receipt }; - } catch (error) { - const rollbackErrors: string[] = []; - for (const edit of [...changed].reverse()) { - try { - if (edit.existed) await atomicWriteRaw(edit.absolute, edit.before); - else await fs.unlink(edit.absolute).catch((failure: NodeJS.ErrnoException) => { - if (failure.code !== 'ENOENT') throw failure; - }); - } catch (rollbackError) { - rollbackErrors.push(`${edit.relative}: ${String(rollbackError)}`); - } - } - if (rollbackErrors.length) { - throw new Error(`Source patch apply failed (${String(error)}); rollback also failed: ${rollbackErrors.join('; ')}`); - } - throw error; - } - } finally { - await lock.close(); - await fs.unlink(lockPath).catch(() => undefined); - } -} - -interface PreparedSourceEdit { - relative: string; - absolute: string; - action: CodeChangeFileAction; - before: string; - after: string; - existed: boolean; -} - -async function assertExistingSourceReceipt( - receipt: CodeChangeSourceApplyReceipt, - patch: CodeChangeSourcePatch, - root: string, -): Promise { - try { - assertSourceApplyReceipt(receipt, patch); - } catch { - throw new Error('A different or invalid source patch receipt already exists at the receipt path'); - } - for (const edit of patch.edits) { - const relative = edit.path.replace(/\\/g, '/'); - const absolute = await assertPathWithinRoot(root, path.resolve(root, relative)); - const exists = await pathExists(absolute); - if (edit.action === 'delete') { - if (exists) throw new Error(`Applied source patch state changed after receipt: ${relative}`); - continue; - } - if (!exists || (await fs.lstat(absolute)).isSymbolicLink()) { - throw new Error(`Applied source patch state changed after receipt: ${relative}`); - } - const current = await readText(absolute, 16 * 1024 * 1024); - if (receipt.fileHashesAfter[relative] !== sha256(current)) { - throw new Error(`Applied source patch state changed after receipt: ${relative}`); - } - } -} - -function assertSourceApplyReceipt(receipt: CodeChangeSourceApplyReceipt, patch: CodeChangeSourcePatch): void { - exactSourcePatchKeys(receipt as unknown as Record, [ - 'schemaVersion', 'patchId', 'patchHash', 'planId', 'approvedBy', 'approvedAt', - 'appliedAt', 'appliedPaths', 'fileHashesAfter', 'generation', - ], 'Code change source apply receipt'); - if (receipt.schemaVersion !== 't2c.code-change-source-apply-receipt/v1' - || receipt.patchId !== patch.id || receipt.patchHash !== patch.patchHash || receipt.planId !== patch.planId) { - throw new Error('Code change source apply receipt does not match its patch'); - } - if (!receipt.approvedBy.trim()) throw new Error('Code change source apply receipt approvedBy is required'); - if (!Number.isFinite(Date.parse(receipt.approvedAt)) || !Number.isFinite(Date.parse(receipt.appliedAt))) { - throw new Error('Code change source apply receipt timestamps must be ISO date-times'); - } - const expectedPaths = patch.edits.map((edit) => edit.path).sort(); - exactSourcePatchSet(receipt.appliedPaths, expectedPaths, 'receipt appliedPaths'); - const hashPaths = Object.keys(receipt.fileHashesAfter).sort(); - exactSourcePatchSet(hashPaths, expectedPaths, 'receipt fileHashesAfter paths'); - if (Object.values(receipt.fileHashesAfter).some((value) => !/^[a-f0-9]{64}$/.test(value))) { - throw new Error('Code change source apply receipt file hashes must be SHA-256'); - } - assertGroundedGenerationMetadata(receipt.generation, 'Code change source apply receipt generation'); - if (receipt.generation.generatedAt !== receipt.appliedAt - || receipt.generation.generator !== 't2c/code-change-source-apply') { - throw new Error('Code change source apply receipt generation does not match the apply operation'); - } -} - -async function atomicWriteRaw(target: string, content: string): Promise { - await ensureDir(path.dirname(target)); - const temporary = `${target}.tmp-${process.pid}-${randomUUID()}`; - try { - await fs.writeFile(temporary, content, 'utf8'); - await fs.rename(temporary, target); - } finally { - await fs.unlink(temporary).catch(() => undefined); - } -} - -/** - * Apply a single-file unified diff to a text buffer. - * Supports standard hunks with space/+/βˆ’ prefixes. Throws on context mismatch. - */ -export function applyUnifiedDiffToText(base: string, diff: string, expectedPath: string): string { - const normalizedDiff = normalizeUnifiedDiff(diff, expectedPath); - const baseLines = splitKeep(base); - const diffLines = normalizedDiff.split('\n'); - // Drop trailing empty element only if the original split introduced it - // without a final newline β€” normalize by working on lines as split. - const hunks: Array<{ oldStart: number; oldCount: number; newCount: number; lines: string[] }> = []; - let current: { oldStart: number; oldCount: number; newCount: number; lines: string[] } | null = null; - for (const line of diffLines) { - if (line.startsWith('---') || line.startsWith('+++') || line.startsWith('diff ') || line.startsWith('index ')) { - continue; - } - const header = /^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(line); - if (header) { - if (current) hunks.push(current); - current = { - oldStart: Number(header[1]), - oldCount: header[2] === undefined ? 1 : Number(header[2]), - newCount: header[4] === undefined ? 1 : Number(header[4]), - lines: [], - }; - continue; - } - if (!current) { - if (line === '') continue; - throw new Error(`Unified diff for ${expectedPath} has content outside hunks`); - } - // Blank lines without a unified-diff prefix separate hunks in some emitters. - if (line === '') continue; - current.lines.push(line); - } - if (current) hunks.push(current); - if (!hunks.length) throw new Error(`Unified diff for ${expectedPath} contains no hunks`); - - let cursor = 0; - const output: string[] = []; - for (const hunk of hunks) { - const oldIndex = Math.max(0, hunk.oldStart - 1); - if (oldIndex < cursor) throw new Error(`Unified diff for ${expectedPath} has overlapping or unordered hunks`); - const oldCount = hunk.lines.filter((line) => line.startsWith(' ') || line.startsWith('-')).length; - const newCount = hunk.lines.filter((line) => line.startsWith(' ') || line.startsWith('+')).length; - if (oldCount !== hunk.oldCount || newCount !== hunk.newCount) { - throw new Error(`Unified diff hunk counts do not match its header for ${expectedPath}`); - } - while (cursor < oldIndex) { - if (cursor >= baseLines.length) throw new Error(`Unified diff for ${expectedPath} ran past end of file`); - output.push(baseLines[cursor]!); - cursor += 1; - } - for (const line of hunk.lines) { - if (line.startsWith('\\')) continue; // "\ No newline at end of file" - const mark = line[0]; - const body = line.slice(1); - if (mark === ' ') { - if (baseLines[cursor] !== body) { - throw new Error(`Unified diff context mismatch for ${expectedPath} at line ${cursor + 1}`); - } - output.push(baseLines[cursor]!); - cursor += 1; - } else if (mark === '-') { - if (baseLines[cursor] !== body) { - throw new Error(`Unified diff deletion mismatch for ${expectedPath} at line ${cursor + 1}`); - } - cursor += 1; - } else if (mark === '+') { - output.push(body); - } else if (line === '') { - // empty line inside hunk without prefix is invalid in strict unified diffs - throw new Error(`Unified diff for ${expectedPath} has an unprefixed hunk line`); - } else { - throw new Error(`Unified diff for ${expectedPath} has unsupported hunk line`); - } - } - } - while (cursor < baseLines.length) { - output.push(baseLines[cursor]!); - cursor += 1; - } - // Reconstruct text. Files without a trailing newline end without an empty last segment. - if (base.endsWith('\n') || output.length === 0) return `${output.join('\n')}${output.length ? '\n' : ''}`; - return output.join('\n'); -} - -function splitKeep(text: string): string[] { - if (text === '') return []; - const lines = text.split('\n'); - if (text.endsWith('\n')) lines.pop(); - return lines; -} +export * from './code-change-plan/index.js'; diff --git a/src/synthesis/code-change-plan/implementation-diagnostics.ts b/src/synthesis/code-change-plan/implementation-diagnostics.ts new file mode 100644 index 0000000..00fa417 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-diagnostics.ts @@ -0,0 +1,17 @@ +import type { Diagnostic, DiagnosticReport } from '../../core/types.js'; + +export const IMPLEMENTATION_DIAGNOSTIC_CODES: ReadonlySet = new Set([ + 'PLANNED_NOT_IMPLEMENTED', + 'CHANGELOG_WITHOUT_IMPLEMENTATION', +]); + +export function collectImplementationDiagnostics(report: DiagnosticReport): Diagnostic[] { + return report.diagnostics + .filter((diagnostic) => IMPLEMENTATION_DIAGNOSTIC_CODES.has(diagnostic.code)) + .sort((left, right) => implementationDiagnosticRank(left) + - implementationDiagnosticRank(right) || left.id.localeCompare(right.id)); +} + +function implementationDiagnosticRank(diagnostic: Diagnostic): number { + return diagnostic.code === 'PLANNED_NOT_IMPLEMENTED' ? 0 : 1; +} diff --git a/src/synthesis/code-change-plan/implementation-helpers-acceptance.ts b/src/synthesis/code-change-plan/implementation-helpers-acceptance.ts new file mode 100644 index 0000000..8e2c11e --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-helpers-acceptance.ts @@ -0,0 +1,141 @@ +import { assertCodeChangeAcceptance, assertConclusions, assertCodeChangePlanForAcceptance, assertIntentGraph } from '../../core/schema.js'; +import type { + CodeChangeAcceptance, + CodeChangePlan, + Diagnostic, + DiagnosticReport, + IntentGraph, +} from '../../core/types.js'; +import { diagnoseGraph } from '../../graph/diagnostics.js'; +import { + deterministicGeneration, + uniqueSorted, +} from './implementation-helpers-shared.js'; + +export interface EvaluateCodeChangeAcceptanceOptions { + plan: CodeChangePlan; + /** Graph and diagnostics that the plan was grounded on. */ + before: { graph: IntentGraph; diagnostics: DiagnosticReport }; + /** Graph after an attempted implementation (re-extracted and re-linked). */ + afterGraph: IntentGraph; + /** Optional precomputed after diagnostics; derived when omitted. */ + afterDiagnostics?: DiagnosticReport; + evaluatedAt?: string; +} + +/** + * Re-diagnose an after graph and decide whether the plan's targeted + * diagnostics cleared without introducing new blocking findings. + * + * Diagnostic IDs are content-bound, so a still-open finding on the same + * records keeps the same ID. Cleared findings simply disappear. + */ +export function evaluateCodeChangeAcceptance( + options: EvaluateCodeChangeAcceptanceOptions, +): CodeChangeAcceptance { + assertIntentGraph(options.before.graph); + assertIntentGraph(options.afterGraph); + assertConclusions([], options.before); + assertCodeChangePlanForAcceptance(options.plan, options.before); + + const context = buildAcceptanceContext(options); + const reasons = buildAcceptanceReasons(context.remainingDiagnosticIds, context.newBlockingDiagnosticIds); + const accepted = isAcceptancePassed(context); + appendAcceptanceGateReason(reasons, accepted); + + const acceptance = buildAcceptanceResult(options, context, reasons, accepted); + assertCodeChangeAcceptance(acceptance, { + plan: options.plan, + before: options.before, + after: { graph: options.afterGraph, diagnostics: context.afterDiagnostics }, + }); + return acceptance; +} + +interface AcceptanceContext { + afterDiagnostics: DiagnosticReport; + beforeDiagnosticIds: Set; + afterDiagnosticIds: string[]; + clearedDiagnosticIds: string[]; + remainingDiagnosticIds: string[]; + newBlockingDiagnosticIds: string[]; + evaluatedAt: string; +} + +function buildAcceptanceContext(options: EvaluateCodeChangeAcceptanceOptions): AcceptanceContext { + const evaluatedAt = options.evaluatedAt ?? new Date().toISOString(); + const afterDiagnostics = options.afterDiagnostics ?? diagnoseGraph(options.afterGraph, evaluatedAt); + assertConclusions([], { graph: options.afterGraph, diagnostics: afterDiagnostics }); + + const beforeDiagnosticIds = new Set(options.before.diagnostics.diagnostics.map((item) => item.id)); + const afterById = new Map(afterDiagnostics.diagnostics.map((item) => [item.id, item])); + const afterDiagnosticIds = [...afterById.keys()].sort(); + const targetedDiagnosticIds = options.plan.evidence.diagnosticIds; + + return { + afterDiagnostics, + beforeDiagnosticIds, + afterDiagnosticIds, + clearedDiagnosticIds: targetedDiagnosticIds.filter((id) => !afterById.has(id)).sort(), + remainingDiagnosticIds: targetedDiagnosticIds.filter((id) => afterById.has(id)).sort(), + newBlockingDiagnosticIds: afterDiagnostics.diagnostics + .filter((item) => item.severity === 'blocking' && !beforeDiagnosticIds.has(item.id)) + .map((item) => item.id) + .sort(), + evaluatedAt, + }; +} + +function buildAcceptanceReasons( + remainingDiagnosticIds: string[], + newBlockingDiagnosticIds: string[], +): string[] { + const reasons: string[] = []; + if (remainingDiagnosticIds.length) { + reasons.push(`Targeted diagnostics still open: ${remainingDiagnosticIds.join(', ')}.`); + } else { + reasons.push('All targeted diagnostics cleared after re-analysis.'); + } + if (newBlockingDiagnosticIds.length) { + reasons.push(`New blocking diagnostics appeared: ${newBlockingDiagnosticIds.join(', ')}.`); + } else { + reasons.push('No new blocking diagnostics appeared.'); + } + return reasons; +} + +function isAcceptancePassed(context: AcceptanceContext): boolean { + return context.remainingDiagnosticIds.length === 0 && context.newBlockingDiagnosticIds.length === 0; +} + +function appendAcceptanceGateReason(reasons: string[], accepted: boolean): void { + if (accepted) { + reasons.push('Acceptance gate passed; human approval is still required before DONE.'); + } else { + reasons.push('Acceptance gate failed.'); + } +} + +function buildAcceptanceResult( + options: EvaluateCodeChangeAcceptanceOptions, + context: AcceptanceContext, + reasons: string[], + accepted: boolean, +): CodeChangeAcceptance { + return { + schemaVersion: 't2c.code-change-acceptance/v1', + planId: options.plan.id, + planHash: options.plan.planHash, + beforeGraphFingerprint: options.before.graph.fingerprint, + afterGraphFingerprint: options.afterGraph.fingerprint, + beforeDiagnosticIds: [...context.beforeDiagnosticIds].sort(), + afterDiagnosticIds: context.afterDiagnosticIds, + clearedDiagnosticIds: context.clearedDiagnosticIds, + remainingDiagnosticIds: context.remainingDiagnosticIds, + newBlockingDiagnosticIds: context.newBlockingDiagnosticIds, + accepted, + reasons: uniqueSorted(reasons), + evaluatedAt: context.evaluatedAt, + generation: deterministicGeneration(context.evaluatedAt, 't2c/code-change-acceptance'), + }; +} diff --git a/src/synthesis/code-change-plan/implementation-helpers-close.ts b/src/synthesis/code-change-plan/implementation-helpers-close.ts new file mode 100644 index 0000000..3833f51 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-helpers-close.ts @@ -0,0 +1,75 @@ +import { assertCodeChangePlansForReview } from '../../core/schema.js'; +import { diagnoseGraph } from '../../graph/diagnostics.js'; +import type { + CodeChangeCloseResult, + CodeChangePlan, + DiagnosticReport, + IntentGraph, +} from '../../core/types.js'; +import { + evaluateCodeChangeAcceptance, +} from './implementation-helpers-acceptance.js'; +import { deterministicGeneration } from './implementation-helpers-shared.js'; + +export interface CloseCodeChangesOptions { + plans: CodeChangePlan[]; + before: { graph: IntentGraph; diagnostics: DiagnosticReport }; + afterGraph: IntentGraph; + afterDiagnostics?: DiagnosticReport; + evaluatedAt?: string; +} + +/** Evaluate a plan set under one timestamp without applying changes or marking DONE. */ +export function closeCodeChanges(options: CloseCodeChangesOptions): CodeChangeCloseResult { + const context = buildCloseCodeChangeContext(options); + const acceptances = options.plans.map((plan) => evaluateCodeChangeAcceptance({ + plan, + before: options.before, + afterGraph: options.afterGraph, + afterDiagnostics: context.afterDiagnostics, + evaluatedAt: context.evaluatedAt, + })); + const acceptedCount = acceptances.filter((item) => item.accepted).length; + return buildCloseResult(options, context.evaluatedAt, acceptances, acceptedCount); +} + +interface CloseCodeChangeContext { + evaluatedAt: string; + afterDiagnostics: DiagnosticReport; +} + +function buildCloseCodeChangeContext(options: CloseCodeChangesOptions): CloseCodeChangeContext { + const evaluatedAt = options.evaluatedAt ?? new Date().toISOString(); + if (Number.isNaN(Date.parse(evaluatedAt))) throw new Error('evaluatedAt must be an ISO date-time'); + assertCodeChangePlansForReview(options.plans, options.afterGraph.fingerprint); + const afterDiagnostics = options.afterDiagnostics ?? diagnoseGraph(options.afterGraph, evaluatedAt); + ensureClosePlanIdsAreUnique(options.plans); + return { evaluatedAt, afterDiagnostics }; +} + +function ensureClosePlanIdsAreUnique(plans: CodeChangePlan[]): void { + const planIds = plans.map((plan) => plan.id); + if (new Set(planIds).size !== planIds.length) { + throw new Error('Code change close plans must have unique ids'); + } +} + +function buildCloseResult( + options: CloseCodeChangesOptions, + evaluatedAt: string, + acceptances: ReturnType[], + acceptedCount: number, +): CodeChangeCloseResult { + return { + schemaVersion: 't2c.code-change-close-result/v1', + evaluatedAt, + graphFingerprintBefore: options.before.graph.fingerprint, + graphFingerprintAfter: options.afterGraph.fingerprint, + planCount: options.plans.length, + acceptedCount, + rejectedCount: options.plans.length - acceptedCount, + allAccepted: options.plans.length > 0 && acceptedCount === options.plans.length, + acceptances, + generation: deterministicGeneration(evaluatedAt, 't2c/code-change-close-result'), + }; +} diff --git a/src/synthesis/code-change-plan/implementation-helpers-plans.ts b/src/synthesis/code-change-plan/implementation-helpers-plans.ts new file mode 100644 index 0000000..113a9ca --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-helpers-plans.ts @@ -0,0 +1,269 @@ +import { existsSync } from 'node:fs'; +import path from 'node:path'; + +import { + createCodeChangePlanHash, + createCodeChangePlanId, +} from '../../core/id.js'; +import { + assertCodeChangePlans, + assertConclusions, + assertIntentGraph, +} from '../../core/schema.js'; +import type { + CodeChangePlan, + Diagnostic, + DiagnosticReport, + IntentGraph, + IntentRecord, + IntentTarget, + Conclusion, + TodoProposal, +} from '../../core/types.js'; +import { + collectImplementationDiagnostics, +} from './implementation-diagnostics.js'; +import { + indexConclusionsByDiagnostic, + indexProposalsByDiagnostic, +} from './implementation-indexing.js'; +import { collectTarget } from './implementation-targets.js'; +import { + buildPlanEvidence, + buildPlanSemantic, + type CodeChangePlanSemanticDraft, +} from './implementation-semantic.js'; +import { + deterministicGeneration, + uniqueSorted, +} from './implementation-helpers-shared.js'; + +export interface ProposeCodeChangePlansOptions { + graph: IntentGraph; + diagnostics: DiagnosticReport; + conclusions?: Conclusion[]; + proposals?: TodoProposal[]; + generatedAt?: string; + /** Limit how many plans are materialised from open diagnostics. Default 50. */ + maxPlans?: number; + /** + * Repository probe used to tell `create` from `modify`. Injected rather than + * read here so plan synthesis stays pure and deterministic; when omitted the + * plan cannot know and keeps the conservative `modify`. + * See {@link createRepositoryPathProbe}. + */ + pathExists?: (relativePath: string) => boolean; +} + +export interface ProposeCodeChangePlansResult { + schemaVersion: 't2c.code-change-plan-set/v1'; + plans: CodeChangePlan[]; + generatedAt: string; + graphFingerprint: string; + sourceDiagnosticCount: number; + generation: ReturnType; +} + +/** + * Build grounded code-change plans from open implementation diagnostics. + * + * One plan is produced per diagnostic that can name at least one target path + * (from the diagnostic's records or a matching TODO proposal). The runtime + * never invents file paths and never marks work complete. + */ +export function proposeCodeChangePlans(options: ProposeCodeChangePlansOptions): ProposeCodeChangePlansResult { + assertIntentGraph(options.graph); + assertConclusions([], { graph: options.graph, diagnostics: options.diagnostics }); + const generatedAt = parseIsoDateTime(options.generatedAt); + const maxPlans = parseMaxPlans(options.maxPlans); + const context = buildPlanContext(options); + const candidates = collectImplementationDiagnostics(options.diagnostics); + + const plans = buildPlansForCandidates(candidates, context, generatedAt, maxPlans); + assertCodeChangePlans(plans, { + graph: options.graph, + diagnostics: options.diagnostics, + conclusions: context.conclusions, + proposals: context.proposals, + }); + return buildPlanSetResult(options.graph.fingerprint, generatedAt, candidates.length, plans); +} + +function buildPlansForCandidates( + candidates: Diagnostic[], + context: PlanContext, + generatedAt: string, + maxPlans: number, +): CodeChangePlan[] { + const plans: CodeChangePlan[] = []; + for (const diagnostic of candidates) { + if (plans.length >= maxPlans) break; + const plan = createPlanForDiagnostic(diagnostic, context, generatedAt); + if (plan) plans.push(plan); + } + return plans; +} + +function buildPlanSetResult( + graphFingerprint: string, + generatedAt: string, + sourceDiagnosticCount: number, + plans: CodeChangePlan[], +): ProposeCodeChangePlansResult { + return { + schemaVersion: 't2c.code-change-plan-set/v1', + plans, + generatedAt, + graphFingerprint, + sourceDiagnosticCount, + generation: deterministicGeneration(generatedAt, 't2c/code-change-plan-set'), + }; +} + +function parseIsoDateTime(value?: string): string { + const generatedAt = value ?? new Date().toISOString(); + if (Number.isNaN(Date.parse(generatedAt))) { + throw new Error('generatedAt must be an ISO date-time'); + } + return generatedAt; +} + +function parseMaxPlans(value: number | undefined): number { + const maxPlans = value ?? 50; + if (!Number.isInteger(maxPlans) || maxPlans < 1 || maxPlans > 500) { + throw new Error('maxPlans must be an integer between 1 and 500'); + } + return maxPlans; +} + +interface PlanContext { + graph: IntentGraph; + recordsById: Map; + proposalsByDiagnostic: Map; + conclusionsByDiagnostic: Map; + conclusions: Conclusion[]; + proposals: TodoProposal[]; + pathExists?: (relativePath: string) => boolean; +} + +function buildPlanContext(options: ProposeCodeChangePlansOptions): PlanContext { + const conclusions = options.conclusions ?? []; + const proposals = options.proposals ?? []; + const context: PlanContext = { + graph: options.graph, + recordsById: new Map(options.graph.records.map((record) => [record.id, record])), + proposalsByDiagnostic: indexProposalsByDiagnostic(proposals), + conclusionsByDiagnostic: indexConclusionsByDiagnostic(conclusions), + conclusions, + proposals, + }; + if (options.pathExists) { + context.pathExists = options.pathExists; + } + return context; +} + +function findRelatedRecords( + diagnostic: Diagnostic, + recordsById: Map, +): IntentRecord[] { + return diagnostic.recordIds + .map((id) => recordsById.get(id)) + .filter((record): record is IntentRecord => Boolean(record)); +} + +function createPlanForDiagnostic( + diagnostic: Diagnostic, + context: PlanContext, + generatedAt: string, +): CodeChangePlan | null { + const relatedRecords = findRelatedRecords(diagnostic, context.recordsById); + if (!relatedRecords.length) return null; + + const matchingProposals = context.proposalsByDiagnostic.get(diagnostic.id) ?? []; + const matchingConclusions = context.conclusionsByDiagnostic.get(diagnostic.id) ?? []; + const target = collectTarget(relatedRecords, matchingProposals); + const changes = buildChanges(target, relatedRecords, diagnostic, context.pathExists); + if (!changes.length) return null; + + const evidence = buildPlanEvidence(context.graph.fingerprint, diagnostic.id, relatedRecords, matchingConclusions, matchingProposals); + const confidence = confidenceForDiagnostic(diagnostic, matchingProposals); + const semantic = buildPlanSemantic(diagnostic, relatedRecords, target, changes, evidence); + return buildPlanResult(generatedAt, confidence, semantic); +} + +function confidenceForDiagnostic( + diagnostic: Diagnostic, + matchingProposals: TodoProposal[], +): number { + return confidenceFor(diagnostic, matchingProposals); +} + +function buildPlanResult( + generatedAt: string, + confidence: number, + semantic: CodeChangePlanSemanticDraft, +): CodeChangePlan { + return { + schemaVersion: 't2c.code-change-plan/v1', + id: createCodeChangePlanId(semantic), + planHash: createCodeChangePlanHash(semantic), + status: 'proposed', + createdAt: generatedAt, + confidence, + generation: deterministicGeneration(generatedAt, 't2c/code-change-plan'), + ...semantic, + }; +} + +/** + * Build the repository probe for {@link ProposeCodeChangePlansOptions.pathExists}. + * + * A path that escapes the analysed root is reported as existing, so an unusual + * value degrades to today's conservative `modify` instead of instructing an + * executor to create a file outside the repository. + */ +export function createRepositoryPathProbe(root: string): (relativePath: string) => boolean { + const base = path.resolve(root); + return (relativePath: string): boolean => { + const absolute = path.resolve(base, relativePath); + if (absolute !== base && !absolute.startsWith(base + path.sep)) return true; + return existsSync(absolute); + }; +} + +function buildChanges( + target: IntentTarget, + records: IntentRecord[], + diagnostic: Diagnostic, + pathExistsInRepository?: (relativePath: string) => boolean, +): ReturnType['changes'] { + const symbols = uniqueSorted(target.symbols); + const sourceIntents = uniqueSorted(records.map((record) => record.statement.text)); + const rationale = sourceIntents.length + ? `Implement the source intent: ${sourceIntents.join(' | ')}` + : diagnostic.detail || `Address ${diagnostic.code}.`; + + if (target.paths.length) { + const changes: ReturnType['changes'] = []; + for (const declared of uniqueSorted(target.paths)) { + const normalized = declared.replace(/\\/g, '/'); + const exists = pathExistsInRepository?.(normalized); + if (exists === false && !normalized.includes('/')) continue; + const action: 'create' | 'modify' | 'delete' = exists === false ? 'create' : 'modify'; + changes.push({ path: normalized, action, symbols, rationale }); + } + return changes; + } + + return []; +} + +function confidenceFor(diagnostic: Diagnostic, proposals: TodoProposal[]): number { + if (proposals.length) { + return Math.min(0.92, Math.max(...proposals.map((item) => item.confidence))); + } + if (diagnostic.severity === 'blocking') return 0.88; + if (diagnostic.severity === 'review_required') return 0.8; + return 0.72; +} diff --git a/src/synthesis/code-change-plan/implementation-helpers-shared.ts b/src/synthesis/code-change-plan/implementation-helpers-shared.ts new file mode 100644 index 0000000..dccaf83 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-helpers-shared.ts @@ -0,0 +1,29 @@ +import { sha256, stableStringify } from '../../core/id.js'; +import { T2C_VERSION } from '../../version.js'; +import { IMPLEMENTATION_DIAGNOSTIC_CODES } from './implementation-diagnostics.js'; +import type { GroundedGenerationMetadata } from '../../core/types.js'; + +export function uniqueSorted(values: string[]): string[] { + return [...new Set(values.map((item) => item.trim()).filter(Boolean))].sort(); +} + +export function deterministicGeneration(generatedAt: string, generator: string): GroundedGenerationMetadata { + return { + generator, + generatorVersion: '1', + runtimeVersion: T2C_VERSION, + generatedAt, + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + model: null, + provider: null, + responseId: null, + configurationFingerprint: sha256(stableStringify({ + generator, + generatorVersion: '1', + codes: [...IMPLEMENTATION_DIAGNOSTIC_CODES].sort(), + })), + reason: null, + }; +} diff --git a/src/synthesis/code-change-plan/implementation-helpers.ts b/src/synthesis/code-change-plan/implementation-helpers.ts new file mode 100644 index 0000000..4a58668 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-helpers.ts @@ -0,0 +1,39 @@ +export { + proposeCodeChangePlans, + createRepositoryPathProbe, + type ProposeCodeChangePlansOptions, + type ProposeCodeChangePlansResult, +} from './implementation-helpers-plans.js'; + +export { + evaluateCodeChangeAcceptance, + type EvaluateCodeChangeAcceptanceOptions, +} from './implementation-helpers-acceptance.js'; + +export { + closeCodeChanges, + type CloseCodeChangesOptions, +} from './implementation-helpers-close.js'; + +export { + createCodeChangeSourcePatch, + assertCodeChangeSourcePatch, + createCodeChangeSourcePatchSet, + assertCodeChangeSourcePatchSet, + type CreateCodeChangeSourcePatchOptions, +} from './implementation-source-patch.js'; +export { + createCodeChangeReviewPatch, + assertCodeChangeReviewPatch, + renderCodeChangeReviewMarkdown, + type CreateCodeChangeReviewOptions, + type CreatedCodeChangeReview, +} from './implementation-review.js'; +export { + applyCodeChangeSourcePatch, + applyUnifiedDiffToText, + type ApplyCodeChangeSourcePatchOptions, + type ApplyCodeChangeSourcePatchResult, +} from './implementation-source-patch-apply.js'; + +export { isUsefulCodeChangePath } from '../code-change-path.js'; diff --git a/src/synthesis/code-change-plan/implementation-indexing.ts b/src/synthesis/code-change-plan/implementation-indexing.ts new file mode 100644 index 0000000..5fa94f4 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-indexing.ts @@ -0,0 +1,25 @@ +import type { Conclusion, TodoProposal } from '../../core/types.js'; + +export function indexProposalsByDiagnostic(proposals: TodoProposal[]): Map { + const index = new Map(); + for (const proposal of proposals) { + for (const diagnosticId of proposal.diagnosticIds) { + const list = index.get(diagnosticId) ?? []; + list.push(proposal); + index.set(diagnosticId, list); + } + } + return index; +} + +export function indexConclusionsByDiagnostic(conclusions: Conclusion[]): Map { + const index = new Map(); + for (const conclusion of conclusions) { + for (const diagnosticId of conclusion.diagnosticIds) { + const list = index.get(diagnosticId) ?? []; + list.push(conclusion); + index.set(diagnosticId, list); + } + } + return index; +} diff --git a/src/synthesis/code-change-plan/implementation-review.ts b/src/synthesis/code-change-plan/implementation-review.ts new file mode 100644 index 0000000..c974174 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-review.ts @@ -0,0 +1,274 @@ +import { assertCodeChangePlansForReview, assertGroundedGenerationMetadata } from '../../core/schema.js'; +import { sha256, stableStringify } from '../../core/id.js'; +import type { CodeChangePlan, CodeChangeReviewPatch, GroundedGenerationMetadata, TodoPriority } from '../../core/types.js'; +import { IMPLEMENTATION_DIAGNOSTIC_CODES } from './implementation-diagnostics.js'; +import { T2C_VERSION } from '../../version.js'; + +export interface CreateCodeChangeReviewOptions { + plans: CodeChangePlan[]; + graphFingerprint: string; + createdAt?: string; +} + +export interface CreatedCodeChangeReview { + markdown: string; + artifact: CodeChangeReviewPatch; +} + +/** + * Render a stable, reviewable Markdown brief for grounded code-change plans. + * + * This is not a source patch and is never applied to the tree. It exists so + * humans and agents share one hash-bound artifact that lists exact paths, + * acceptance criteria, evidence IDs, risk and rollback instructions. + */ +export function createCodeChangeReviewPatch( + options: CreateCodeChangeReviewOptions, +): CreatedCodeChangeReview { + const context = buildCodeChangeReviewContext(options); + const markdown = buildCodeChangeReviewMarkdown(context); + const artifact = buildCodeChangeReviewArtifact(context, markdown); + assertCodeChangeReviewPatch(artifact); + return { markdown, artifact }; +} + +interface CodeChangeReviewContext { + plans: CodeChangePlan[]; + graphFingerprint: string; + createdAt: string; +} + +function buildCodeChangeReviewContext(options: CreateCodeChangeReviewOptions): CodeChangeReviewContext { + if (typeof options.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(options.graphFingerprint)) { + throw new Error('graphFingerprint must be a SHA-256 hex digest'); + } + const createdAt = options.createdAt ?? new Date().toISOString(); + if (Number.isNaN(Date.parse(createdAt))) throw new Error('createdAt must be an ISO date-time'); + assertCodeChangePlansForReview(options.plans, options.graphFingerprint); + return { + plans: sortCodeChangeReviewPlans(options.plans), + graphFingerprint: options.graphFingerprint, + createdAt, + }; +} + +function sortCodeChangeReviewPlans(plans: CodeChangePlan[]): CodeChangePlan[] { + return [...plans].sort((left, right) => + priorityRank(left.priority) - priorityRank(right.priority) || left.id.localeCompare(right.id)); +} + +function buildCodeChangeReviewMarkdown(context: CodeChangeReviewContext): string { + return renderCodeChangeReviewMarkdown(context.plans, context.graphFingerprint); +} + +function buildCodeChangeReviewArtifact( + context: CodeChangeReviewContext, + markdown: string, +): CodeChangeReviewPatch { + return { + schemaVersion: 't2c.code-change-review/v1', + createdAt: context.createdAt, + graphFingerprint: context.graphFingerprint, + planIds: context.plans.map((plan) => plan.id), + planHashes: context.plans.map((plan) => plan.planHash), + renderedPatchHash: sha256(markdown), + generation: deterministicGeneration(context.createdAt, 't2c/code-change-review'), + }; +} + +export function renderCodeChangeReviewMarkdown( + plans: CodeChangePlan[], + graphFingerprint: string, +): string { + const lines = buildCodeChangeReviewMarkdownLines(plans, graphFingerprint); + return lines.join('\n'); +} + +function buildCodeChangeReviewMarkdownLines( + plans: CodeChangePlan[], + graphFingerprint: string, +): string[] { + const lines = [ + '', + '# todo2code proposed code changes', + '', + 'This document is a grounded **review brief**, not an auto-applied source patch.', + 'Implement the listed paths in a normal branch, re-run the pipeline, then', + '`t2c evaluate-code-change`. Acceptance still requires human/CI approval before DONE.', + '', + `Graph fingerprint: \`${graphFingerprint}\``, + '', + ]; + if (!plans.length) { + lines.push('_No grounded code-change plans. Open diagnostics either cleared or lack repository paths._', ''); + return lines; + } + let currentPriority: CodeChangePlan['priority'] | null = null; + for (const plan of plans) { + currentPriority = appendPriorityHeader(lines, currentPriority, plan); + appendPlanDetails(lines, plan); + } + appendAfterImplementationSection(lines); + return lines; +} + +function appendPriorityHeader( + lines: string[], + currentPriority: CodeChangePlan['priority'] | null, + plan: CodeChangePlan, +): CodeChangePlan['priority'] { + if (plan.priority === currentPriority) return currentPriority; + if (currentPriority !== null) lines.push(''); + lines.push(`## ${plan.priority}`, ''); + return plan.priority; +} + +function appendPlanDetails(lines: string[], plan: CodeChangePlan): void { + lines.push(`### ${inline(plan.title)} (\`${plan.id}\`)`, ''); + lines.push(`- Plan hash: \`${plan.planHash}\``); + lines.push(`- Risk: **${plan.risk.level}** β€” ${plan.risk.reasons.map(inline).join('; ')}`); + lines.push(`- Confidence: ${plan.confidence.toFixed(2)}`); + lines.push(`- Description: ${inline(plan.description)}`); + appendPlanChanges(lines, plan); + lines.push('- Acceptance criteria:'); + for (const criterion of plan.acceptanceCriteria) lines.push(` - [ ] ${inline(criterion)}`); + lines.push(`- Diagnostics: ${renderIds(plan.evidence.diagnosticIds)}`); + lines.push(`- Evidence records: ${renderIds(plan.evidence.recordIds)}`); + if (plan.evidence.proposalIds.length) lines.push(`- TODO proposals: ${renderIds(plan.evidence.proposalIds)}`); + if (plan.evidence.conclusionIds.length) lines.push(`- Conclusions: ${renderIds(plan.evidence.conclusionIds)}`); + lines.push(`- Rollback: ${inline(plan.rollback)}`); + lines.push(''); +} + +function appendPlanChanges(lines: string[], plan: CodeChangePlan): void { + lines.push('- Changes:'); + for (const change of plan.changes) { + const symbols = change.symbols.length ? ` symbols: ${change.symbols.map((item) => `\`${item}\``).join(', ')}` : ''; + lines.push(` - \`${change.action}\` \`${change.path}\`${symbols}`); + lines.push(` - ${inline(change.rationale)}`); + } +} + +function appendAfterImplementationSection(lines: string[]): void { + lines.push('## After implementation', ''); + lines.push('1. Re-run `t2c pipeline` (or extract + link + diagnose) on the changed tree.'); + lines.push('2. `t2c evaluate-code-change --before-graph … --after-graph … --out acceptance.json`.'); + lines.push('3. Require `accepted=true` and human/CI review before marking work DONE.'); + lines.push(''); +} + +export function assertCodeChangeReviewPatch(value: unknown): asserts value is CodeChangeReviewPatch { + const artifact = assertReviewPatchObject(value, 'Code change review patch must be an object'); + validateReviewPatchKeys(artifact); + assertCodeChangeReviewPatchSchema(artifact); + assertCodeChangeReviewPatchPlanCollections(artifact); + assertCodeChangeReviewPatchGeneration(artifact); +} + +function validateReviewPatchKeys(artifact: Record): void { + const required = [ + 'schemaVersion', 'createdAt', 'graphFingerprint', 'planIds', 'planHashes', + 'renderedPatchHash', 'generation', + ]; + for (const key of required) { + if (!(key in artifact)) throw new Error(`Code change review patch is missing: ${key}`); + } +} + +function assertCodeChangeReviewPatchSchema(artifact: Record): void { + assertReviewPatchSchemaVersion(artifact); + assertReviewPatchDateFields(artifact); + assertReviewPatchIds(artifact); +} + +function assertReviewPatchSchemaVersion(artifact: Record): void { + if (artifact.schemaVersion !== 't2c.code-change-review/v1') { + throw new Error('Unsupported code change review schemaVersion'); + } +} + +function assertReviewPatchDateFields(artifact: Record): void { + if (typeof artifact.createdAt !== 'string' || Number.isNaN(Date.parse(artifact.createdAt))) { + throw new Error('Code change review createdAt must be an ISO date-time'); + } + if (typeof artifact.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(artifact.graphFingerprint)) { + throw new Error('Code change review graphFingerprint must be SHA-256'); + } + if (typeof artifact.renderedPatchHash !== 'string' || !/^[a-f0-9]{64}$/.test(artifact.renderedPatchHash)) { + throw new Error('Code change review renderedPatchHash must be SHA-256'); + } +} + +function assertReviewPatchIds(artifact: Record): void { + if (!Array.isArray(artifact.planIds) || !artifact.planIds.every((id) => typeof id === 'string' && /^CPLAN-[a-f0-9]{20}$/.test(id))) { + throw new Error('Code change review planIds must be CPLAN ids'); + } + if (!Array.isArray(artifact.planHashes) || !artifact.planHashes.every((hash) => typeof hash === 'string' && /^[a-f0-9]{64}$/.test(hash))) { + throw new Error('Code change review planHashes must be SHA-256 digests'); + } +} + +function assertCodeChangeReviewPatchPlanCollections(artifact: Record): void { + if (!Array.isArray(artifact.planIds) || !Array.isArray(artifact.planHashes)) { + throw new Error('Code change review planIds and planHashes must be arrays'); + } + const planIds = artifact.planIds as string[]; + const planHashes = artifact.planHashes as string[]; + if (planIds.length !== planHashes.length) { + throw new Error('Code change review planIds and planHashes must have equal length'); + } + if (new Set(planIds).size !== planIds.length) { + throw new Error('Code change review planIds must be unique'); + } +} + +function assertCodeChangeReviewPatchGeneration(artifact: Record): void { + assertGroundedGenerationMetadata(artifact.generation, 'Code change review generation'); + const generation = artifact.generation as GroundedGenerationMetadata; + if (generation.generatedAt !== artifact.createdAt) { + throw new Error('Code change review generation.generatedAt must match createdAt'); + } + if (generation.generator !== 't2c/code-change-review') { + throw new Error('Code change review generation.generator must be t2c/code-change-review'); + } +} + +function deterministicGeneration(generatedAt: string, generator: string): GroundedGenerationMetadata { + return { + generator, + generatorVersion: '1', + runtimeVersion: T2C_VERSION, + generatedAt, + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + model: null, + provider: null, + responseId: null, + configurationFingerprint: sha256(stableStringify({ + generator, + generatorVersion: '1', + codes: [...IMPLEMENTATION_DIAGNOSTIC_CODES].sort(), + })), + reason: null, + }; +} + +function priorityRank(priority: TodoPriority): number { + return ({ P0: 0, P1: 1, P2: 2, P3: 3 } as const)[priority]; +} + +function inline(value: string): string { + return value.replace(/\s+/g, ' ').trim(); +} + +function renderIds(ids: string[]): string { + return ids.length ? ids.map((id) => `\`${id}\``).join(', ') : '_none_'; +} + +function assertReviewPatchObject(value: unknown, objectLabel: string): Record { + if (value === null || typeof value !== 'object' || Array.isArray(value)) { + throw new Error(objectLabel); + } + return value as Record; +} diff --git a/src/synthesis/code-change-plan/implementation-semantic.ts b/src/synthesis/code-change-plan/implementation-semantic.ts new file mode 100644 index 0000000..bbdf628 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-semantic.ts @@ -0,0 +1,125 @@ +import type { CodeChangeFile, CodeChangePlan, Conclusion, Diagnostic, IntentRecord, IntentTarget, TodoPriority, TodoProposal } from '../../core/types.js'; + +export interface CodeChangePlanSemanticDraft { + title: string; + description: string; + priority: TodoPriority; + target: IntentTarget; + acceptanceCriteria: string[]; + changes: CodeChangeFile[]; + risk: CodeChangePlan['risk']; + rollback: string; + evidence: { + graphFingerprint: string; + recordIds: string[]; + diagnosticIds: string[]; + conclusionIds: string[]; + proposalIds: string[]; + }; +} + +export function buildPlanEvidence( + graphFingerprint: string, + diagnosticId: string, + relatedRecords: IntentRecord[], + matchingConclusions: Conclusion[], + matchingProposals: TodoProposal[], +): CodeChangePlanSemanticDraft['evidence'] { + return { + graphFingerprint, + recordIds: uniqueSorted(relatedRecords.map((record) => record.id)), + diagnosticIds: [diagnosticId], + conclusionIds: uniqueSorted(matchingConclusions.map((item) => item.id)), + proposalIds: uniqueSorted(matchingProposals.map((item) => item.id)), + }; +} + +export function buildPlanSemantic( + diagnostic: Diagnostic, + relatedRecords: IntentRecord[], + target: IntentTarget, + changes: CodeChangeFile[], + evidence: CodeChangePlanSemanticDraft['evidence'], +): CodeChangePlanSemanticDraft { + return { + title: titleFor(diagnostic, relatedRecords), + description: descriptionFor(diagnostic, relatedRecords, target), + priority: priorityFor(diagnostic), + target, + acceptanceCriteria: acceptanceCriteriaFor(diagnostic, target), + changes, + risk: riskFor(diagnostic, changes), + rollback: rollbackFor(changes), + evidence, + }; +} + +function titleFor(diagnostic: Diagnostic, records: IntentRecord[]): string { + const record = records[0]; + const object = record?.statement.object?.trim(); + if (object && startsWithImperative(object) && record?.statement.text.trim()) { + return record.statement.text.trim().replace(/[.!?]+$/, ''); + } + if (object) return `Implement ${object}`; + return diagnostic.title.trim() || `Resolve ${diagnostic.code}`; +} + +function startsWithImperative(value: string): boolean { + return /^(?:add|build|change|configure|create|delete|document|fix|implement|preserve|refactor|remove|test|update|validate|verify)\b/i.test(value) + || /^(?:dodaΔ‡|dodac|naprawiΔ‡|naprawic|przetestowaΔ‡|przetestowac|usunΔ…Δ‡|usunac|utworzyΔ‡|utworzyc|wdroΕΌyΔ‡|wdrozyc|zmieniΔ‡|zmienic|zweryfikowaΔ‡|zweryfikowac)\b/i.test(value); +} + +function descriptionFor( + diagnostic: Diagnostic, + records: IntentRecord[], + target: IntentTarget, +): string { + const parts = [ + diagnostic.detail.trim(), + records[0] ? `Source intent: ${records[0].statement.text.trim()}` : '', + target.paths.length ? `Paths: ${target.paths.join(', ')}.` : '', + target.symbols.length ? `Symbols: ${target.symbols.join(', ')}.` : '', + target.tickets.length ? `Tickets: ${target.tickets.join(', ')}.` : '', + ].filter(Boolean); + return parts.join(' '); +} + +function acceptanceCriteriaFor(diagnostic: Diagnostic, target: IntentTarget): string[] { + const criteria = [ + `Re-run todo2code link+diagnose and clear diagnostic ${diagnostic.id} (${diagnostic.code}).`, + 'Do not introduce new blocking diagnostics.', + ]; + if (target.paths.length) { + criteria.push(`Touch only the declared paths: ${uniqueSorted(target.paths).join(', ')}.`); + } + if (target.symbols.length) { + criteria.push(`Provide AST evidence for symbols: ${uniqueSorted(target.symbols).join(', ')}.`); + } + return uniqueSorted(criteria); +} + +function priorityFor(diagnostic: Diagnostic): TodoPriority { + if (diagnostic.severity === 'blocking') return 'P0'; + if (diagnostic.severity === 'review_required') return 'P1'; + if (diagnostic.severity === 'warning') return 'P2'; + return 'P3'; +} + +function riskFor(diagnostic: Diagnostic, changes: CodeChangeFile[]): CodeChangePlan['risk'] { + const level = diagnostic.severity === 'blocking' ? 'high' + : diagnostic.severity === 'review_required' ? 'medium' + : 'low'; + const reasons = [ + `Derived from ${diagnostic.severity} diagnostic ${diagnostic.id}.`, + `Touches ${changes.length} declared ${changes.length === 1 ? 'path' : 'paths'}.`, + ]; + return { level, reasons: uniqueSorted(reasons) }; +} + +function rollbackFor(changes: CodeChangeFile[]): string { + return `Revert the proposed changes to ${uniqueSorted(changes.map((item) => item.path)).join(', ')} and re-run todo2code diagnostics.`; +} + +function uniqueSorted(values: string[]): string[] { + return [...new Set(values.map((item) => item.trim()).filter(Boolean))].sort(); +} diff --git a/src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts b/src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts new file mode 100644 index 0000000..88a3b1d --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch-apply-core.ts @@ -0,0 +1,434 @@ +import { randomUUID } from 'node:crypto'; +import { promises as fs } from 'node:fs'; +import path from 'node:path'; + +import { assertPathWithinRoot } from '../../core/security.js'; +import { assertGroundedGenerationMetadata } from '../../core/schema.js'; +import { + sha256, + stableStringify, +} from '../../core/id.js'; +import { ensureDir, pathExists, readJson, readText } from '../../core/io.js'; +import { IMPLEMENTATION_DIAGNOSTIC_CODES } from './implementation-diagnostics.js'; +import { T2C_VERSION } from '../../version.js'; +import { assertCodeChangeSourcePatch } from './implementation-source-patch-assert.js'; +import { applyUnifiedDiffToText } from './implementation-source-patch-apply-diff.js'; +import { + CodeChangeFileAction, + CodeChangeSourceApplyReceipt, + CodeChangeSourceEdit, + CodeChangeSourcePatch, + CodeChangeSourcePatchApproval, + GroundedGenerationMetadata, +} from '../../core/types.js'; + +export interface ApplyCodeChangeSourcePatchOptions { + root: string; + patch: CodeChangeSourcePatch; + approval: CodeChangeSourcePatchApproval; + receiptPath: string; + now?: Date; +} + +export interface ApplyCodeChangeSourcePatchResult { + applied: boolean; + idempotent: boolean; + receipt: CodeChangeSourceApplyReceipt; +} + +interface NormalizedApplyCodeChangeSourcePatchRequest { + root: string; + patch: CodeChangeSourcePatch; + approval: CodeChangeSourcePatchApproval; + receiptPath: string; + now?: Date; +} + +interface SourcePatchApplyLock { + path: string; + lock: Awaited>; +} + +/** + * Apply a fully-diffed source patch after explicit hash approval. + * + * Instruction-only edits (null unifiedDiff) are rejected. Paths must stay + * relative and inside `root`. Re-applying with an existing matching receipt is + * idempotent. + */ +export async function applyCodeChangeSourcePatch( + options: ApplyCodeChangeSourcePatchOptions, +): Promise { + const request = assertPatchApplicationRequest(options); + const root = path.resolve(request.root); + const receiptPath = await assertPathWithinRoot(root, path.resolve(request.receiptPath)); + await ensureDir(path.dirname(receiptPath)); + const lock = await acquireApplyLock(receiptPath); + try { + const idempotentResult = await readExistingReceipt(receiptPath, request.patch, root); + if (idempotentResult) return idempotentResult; + + const prepared = await prepareSourceEdits(request.patch, root, receiptPath); + const now = (request.now ?? new Date()).toISOString(); + const receipt = await applyPreparedEdits(prepared, request.patch, request.approval.actor.trim(), now, receiptPath); + return { applied: true, idempotent: false, receipt }; + } finally { + await lock.lock.close(); + await fs.unlink(lock.path).catch(() => undefined); + } +} + +async function readExistingReceipt( + receiptPath: string, + patch: CodeChangeSourcePatch, + root: string, +): Promise { + if (!(await pathExists(receiptPath))) return null; + const existing = await readJson(receiptPath, 1024 * 1024); + await assertExistingSourceReceipt(existing, patch, root); + return { applied: false, idempotent: true, receipt: existing }; +} + +function assertPatchApplicationRequest( + options: ApplyCodeChangeSourcePatchOptions, +): NormalizedApplyCodeChangeSourcePatchRequest { + const patch = options.patch; + assertCodeChangeSourcePatch(patch); + assertPatchApprovalActor(options.approval); + assertPatchApprovalHash(patch, options.approval); + assertPatchEditsContainDiffs(patch); + const request: NormalizedApplyCodeChangeSourcePatchRequest = { + root: options.root, + patch: options.patch, + approval: options.approval, + receiptPath: options.receiptPath, + }; + if (options.now !== undefined) request.now = options.now; + return request; +} + +function assertPatchApprovalActor(approval: CodeChangeSourcePatchApproval): string { + if (!approval) { + throw new Error('Source patch approval object is required'); + } + if (!approval.actor?.trim()) { + throw new Error('Explicit source patch approval actor is required'); + } + return approval.actor.trim(); +} + +function assertPatchApprovalHash( + patch: CodeChangeSourcePatch, + approval: CodeChangeSourcePatchApproval, +): void { + if (approval.patchHash !== patch.patchHash) { + throw new Error('Source patch approval hash does not match the patch'); + } +} + +function assertPatchEditsContainDiffs(patch: CodeChangeSourcePatch): void { + for (const edit of patch.edits) { + if (edit.unifiedDiff === null) { + throw new Error(`Source patch edit ${edit.path} has no unifiedDiff and cannot be applied`); + } + } +} + +async function acquireApplyLock(receiptPath: string): Promise { + const lockPath = `${receiptPath}.t2c-apply.lock`; + try { + const lock = await fs.open(lockPath, 'wx'); + return { path: lockPath, lock }; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'EEXIST') { + throw new Error('Another source patch apply operation is in progress'); + } + throw error; + } +} + +async function prepareSourceEdits( + patch: CodeChangeSourcePatch, + root: string, + receiptPath: string, +): Promise { + const prepared: PreparedSourceEdit[] = []; + for (const edit of patch.edits) { + const target = await prepareSourceEditTarget(edit, root, receiptPath); + const before = target.existed ? await readText(target.absolute, 16 * 1024 * 1024) : ''; + const after = applyUnifiedDiffToText(before, edit.unifiedDiff!, target.relative); + assertDeleteEditClearsAll(target.relative, edit.action, after); + prepared.push({ + ...target, + action: edit.action, + before, + after, + }); + } + return prepared; +} + +interface SourcePatchEditTarget { + relative: string; + absolute: string; + existed: boolean; +} + +async function prepareSourceEditTarget( + edit: CodeChangeSourceEdit, + root: string, + receiptPath: string, +): Promise { + const relative = edit.path.replace(/\\/g, '/'); + const absolute = await assertPathWithinRoot(root, path.resolve(root, relative)); + if (absolute === receiptPath) { + throw new Error(`Source patch target collides with its receipt path: ${relative}`); + } + const existed = await pathExists(absolute); + await assertSourcePatchTargetNotSymlink(absolute, existed, relative); + validatePatchTargetForEdit(edit.action, relative, existed, edit.unifiedDiff!); + return { relative, absolute, existed }; +} + +async function assertSourcePatchTargetNotSymlink( + absolute: string, + existed: boolean, + relative: string, +): Promise { + if (!existed) return; + if ((await fs.lstat(absolute)).isSymbolicLink()) { + throw new Error(`Refusing to apply through a symlink: ${relative}`); + } +} + +function assertDeleteEditClearsAll(relative: string, action: CodeChangeFileAction, after: string): void { + if (action === 'delete' && after !== '') { + throw new Error(`Source patch delete diff must remove the complete file: ${relative}`); + } +} + +function validatePatchTargetForEdit( + action: CodeChangeFileAction, + relative: string, + exists: boolean, + unifiedDiff: string, +): void { + if (action === 'create' && exists) throw new Error(`Source patch create target already exists: ${relative}`); + if (action === 'delete' && !exists) throw new Error(`Source patch delete target does not exist: ${relative}`); + if (action === 'modify' && !exists) { + const fromEmpty = /(?:^|\n)---\s+\/dev\/null(?:\n|$)/.test(unifiedDiff) + || /(?:^|\n)@@\s+-0(?:,0)?\s+\+/.test(unifiedDiff); + if (!fromEmpty) throw new Error(`Source patch modify target does not exist: ${relative}`); + } +} + +async function applyPreparedEdits( + prepared: PreparedSourceEdit[], + patch: CodeChangeSourcePatch, + approvedBy: string, + now: string, + receiptPath: string, +): Promise { + const changed: PreparedSourceEdit[] = []; + try { + await writePreparedEdits(prepared, changed); + const receipt = buildPatchApplyReceipt(prepared, patch, approvedBy, now); + assertSourceApplyReceipt(receipt, patch); + // The receipt is part of the transaction: without it a retry could apply + // the same approved patch again. Roll files back if persisting it fails. + await atomicWriteRaw(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`); + return receipt; + } catch (error) { + const rollbackErrors = await rollbackPreparedEdits(changed); + if (rollbackErrors.length) { + throw new Error(`Source patch apply failed (${String(error)}); rollback also failed: ${rollbackErrors.join('; ')}`); + } + throw error; + } +} + +async function writePreparedEdits(prepared: PreparedSourceEdit[], changed: PreparedSourceEdit[]): Promise { + for (const edit of prepared) { + if (edit.action === 'delete') await fs.unlink(edit.absolute); + else await atomicWriteRaw(edit.absolute, edit.after); + changed.push(edit); + } +} + +function buildPatchApplyReceipt( + prepared: PreparedSourceEdit[], + patch: CodeChangeSourcePatch, + approvedBy: string, + now: string, +): CodeChangeSourceApplyReceipt { + const fileHashesAfter = Object.fromEntries(prepared + .map((edit): [string, string] => [edit.relative, sha256(edit.after)]) + .sort(([left], [right]) => left.localeCompare(right))); + return { + schemaVersion: 't2c.code-change-source-apply-receipt/v1', + patchId: patch.id, + patchHash: patch.patchHash, + planId: patch.planId, + approvedBy, + approvedAt: now, + appliedAt: now, + appliedPaths: prepared.map((edit) => edit.relative).sort(), + fileHashesAfter, + generation: deterministicGeneration(now, 't2c/code-change-source-apply'), + }; +} + +async function rollbackPreparedEdits(changes: PreparedSourceEdit[]): Promise { + const rollbackErrors: string[] = []; + for (const edit of [...changes].reverse()) { + try { + if (edit.existed) await atomicWriteRaw(edit.absolute, edit.before); + else await fs.unlink(edit.absolute).catch((failure: NodeJS.ErrnoException) => { + if (failure.code !== 'ENOENT') throw failure; + }); + } catch (rollbackError) { + rollbackErrors.push(`${edit.relative}: ${String(rollbackError)}`); + } + } + return rollbackErrors; +} + +interface PreparedSourceEdit { + relative: string; + absolute: string; + action: CodeChangeFileAction; + before: string; + after: string; + existed: boolean; +} + +async function assertExistingSourceReceipt( + receipt: CodeChangeSourceApplyReceipt, + patch: CodeChangeSourcePatch, + root: string, +): Promise { + try { + assertSourceApplyReceipt(receipt, patch); + } catch { + throw new Error('A different or invalid source patch receipt already exists at the receipt path'); + } + for (const edit of patch.edits) { + const relative = edit.path.replace(/\\/g, '/'); + const absolute = await assertPathWithinRoot(root, path.resolve(root, relative)); + const exists = await pathExists(absolute); + if (edit.action === 'delete') { + if (exists) throw new Error(`Applied source patch state changed after receipt: ${relative}`); + continue; + } + if (!exists || (await fs.lstat(absolute)).isSymbolicLink()) { + throw new Error(`Applied source patch state changed after receipt: ${relative}`); + } + const current = await readText(absolute, 16 * 1024 * 1024); + if (receipt.fileHashesAfter[relative] !== sha256(current)) { + throw new Error(`Applied source patch state changed after receipt: ${relative}`); + } + } +} + +function assertSourceApplyReceipt(receipt: CodeChangeSourceApplyReceipt, patch: CodeChangeSourcePatch): void { + validateSourceApplyReceiptShape(receipt); + validateSourceApplyReceiptIdentity(receipt, patch); + validateSourceApplyReceiptTimestamps(receipt); + validateSourceApplyReceiptPathHashes(receipt, patch); + validateSourceApplyReceiptGeneration(receipt); +} + +function validateSourceApplyReceiptShape(receipt: CodeChangeSourceApplyReceipt): void { + exactSourcePatchKeys(receipt as unknown as Record, [ + 'schemaVersion', 'patchId', 'patchHash', 'planId', 'approvedBy', 'approvedAt', + 'appliedAt', 'appliedPaths', 'fileHashesAfter', 'generation', + ], 'Code change source apply receipt'); +} + +function validateSourceApplyReceiptIdentity( + receipt: CodeChangeSourceApplyReceipt, + patch: CodeChangeSourcePatch, +): void { + if (receipt.schemaVersion !== 't2c.code-change-source-apply-receipt/v1' + || receipt.patchId !== patch.id + || receipt.patchHash !== patch.patchHash + || receipt.planId !== patch.planId) { + throw new Error('Code change source apply receipt does not match its patch'); + } +} + +function validateSourceApplyReceiptTimestamps(receipt: CodeChangeSourceApplyReceipt): void { + if (!receipt.approvedBy.trim()) throw new Error('Code change source apply receipt approvedBy is required'); + if (!Number.isFinite(Date.parse(receipt.approvedAt)) || !Number.isFinite(Date.parse(receipt.appliedAt))) { + throw new Error('Code change source apply receipt timestamps must be ISO date-times'); + } +} + +function validateSourceApplyReceiptPathHashes( + receipt: CodeChangeSourceApplyReceipt, + patch: CodeChangeSourcePatch, +): void { + const expectedPaths = patch.edits.map((edit) => edit.path).sort(); + exactSourcePatchSet(receipt.appliedPaths, expectedPaths, 'receipt appliedPaths'); + const hashPaths = Object.keys(receipt.fileHashesAfter).sort(); + exactSourcePatchSet(hashPaths, expectedPaths, 'receipt fileHashesAfter paths'); + if (Object.values(receipt.fileHashesAfter).some((value) => !/^[a-f0-9]{64}$/.test(value))) { + throw new Error('Code change source apply receipt file hashes must be SHA-256'); + } +} + +function validateSourceApplyReceiptGeneration(receipt: CodeChangeSourceApplyReceipt): void { + assertGroundedGenerationMetadata(receipt.generation, 'Code change source apply receipt generation'); + if (receipt.generation.generatedAt !== receipt.appliedAt + || receipt.generation.generator !== 't2c/code-change-source-apply') { + throw new Error('Code change source apply receipt generation does not match the apply operation'); + } +} + +async function atomicWriteRaw(target: string, content: string): Promise { + await ensureDir(path.dirname(target)); + const temporary = `${target}.tmp-${process.pid}-${randomUUID()}`; + try { + await fs.writeFile(temporary, content, 'utf8'); + await fs.rename(temporary, target); + } finally { + await fs.unlink(temporary).catch(() => undefined); + } +} + +function exactSourcePatchKeys(value: Record, expected: string[], name: string): void { + const actual = Object.keys(value).sort(); + const wanted = [...expected].sort(); + if (actual.length !== wanted.length || actual.some((key, index) => key !== wanted[index])) { + throw new Error(`${name} keys must be exactly: ${wanted.join(', ')}`); + } +} + +function exactSourcePatchSet(actual: string[], expected: string[], name: string): void { + const left = [...new Set(actual)].sort(); + const right = [...new Set(expected)].sort(); + if (left.length !== right.length || left.some((item, index) => item !== right[index])) { + throw new Error(`Source patch ${name} do not match the plan`); + } +} + +function deterministicGeneration(generatedAt: string, generator: string): GroundedGenerationMetadata { + return { + generator, + generatorVersion: '1', + runtimeVersion: T2C_VERSION, + generatedAt, + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + model: null, + provider: null, + responseId: null, + configurationFingerprint: sha256(stableStringify({ + generator, + generatorVersion: '1', + codes: [...IMPLEMENTATION_DIAGNOSTIC_CODES].sort(), + })), + reason: null, + }; +} diff --git a/src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts b/src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts new file mode 100644 index 0000000..af776b3 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch-apply-diff.ts @@ -0,0 +1,233 @@ +import { normalizeUnifiedDiff } from './implementation-source-patch-diff.js'; + +/** + * Apply a single-file unified diff to a text buffer. + * Supports standard hunks with space/+/βˆ’ prefixes. Throws on context mismatch. + */ +export function applyUnifiedDiffToText(base: string, diff: string, expectedPath: string): string { + const baseLines = splitKeep(base); + const hunks = parseUnifiedDiffIntoHunks(diff, expectedPath); + const output = applyUnifiedDiffHunks(baseLines, expectedPath, hunks); + // Reconstruct text. Files without a trailing newline end without an empty last segment. + return joinAppliedText(base.endsWith('\n'), output); +} + +function joinAppliedText(baseEndsWithNewline: boolean, lines: string[]): string { + if (baseEndsWithNewline || lines.length === 0) return `${lines.join('\n')}${lines.length ? '\n' : ''}`; + return lines.join('\n'); +} + +interface ParsedUnifiedDiffHunk { + oldStart: number; + oldCount: number; + newCount: number; + lines: string[]; +} + +function parseUnifiedDiffIntoHunks(diff: string, expectedPath: string): ParsedUnifiedDiffHunk[] { + const normalizedDiff = normalizeUnifiedDiff(diff, expectedPath); + const context = createEmptyUnifiedDiffContext(); + for (const line of parseUnifiedDiffLines(normalizedDiff)) { + applyUnifiedDiffLineToContext(context, line, expectedPath); + } + return finalizeUnifiedDiffContext(context, expectedPath); +} + +interface UnifiedDiffParsingContext { + current: ParsedUnifiedDiffHunk | null; + hunks: ParsedUnifiedDiffHunk[]; +} + +function createEmptyUnifiedDiffContext(): UnifiedDiffParsingContext { + return { current: null, hunks: [] }; +} + +function parseUnifiedDiffLines(diff: string): string[] { + return diff.split('\n'); +} + +function finalizeUnifiedDiffContext( + context: UnifiedDiffParsingContext, + expectedPath: string, +): ParsedUnifiedDiffHunk[] { + if (context.current) { + context.hunks.push(context.current); + context.current = null; + } + if (!context.hunks.length) { + throw new Error(`Unified diff for ${expectedPath} contains no hunks`); + } + return context.hunks; +} + +function applyUnifiedDiffLineToContext( + context: UnifiedDiffParsingContext, + line: string, + expectedPath: string, +): void { + const header = parseUnifiedDiffHeader(line); + if (header) { + if (context.current) { + context.hunks.push(context.current); + } + context.current = header; + return; + } + if (line.startsWith('---') || line.startsWith('+++') || line.startsWith('diff ') || line.startsWith('index ')) { + return; + } + if (!context.current) { + if (line === '') return; + throw new Error(`Unified diff for ${expectedPath} has content outside hunks`); + } + // Blank lines without a unified-diff prefix separate hunks in some emitters. + if (line === '') return; + context.current.lines.push(line); +} + +function parseUnifiedDiffHeader(line: string): ParsedUnifiedDiffHunk | null { + const match = /^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(line); + if (!match) return null; + return buildParsedUnifiedDiffHunk(match); +} + +function buildParsedUnifiedDiffHunk(match: RegExpMatchArray): ParsedUnifiedDiffHunk { + return { + oldStart: Number(match[1]), + oldCount: match[2] === undefined ? 1 : Number(match[2]), + newCount: match[4] === undefined ? 1 : Number(match[4]), + lines: [], + }; +} + +interface UnifiedDiffCursor { + position: number; +} + +function applyUnifiedDiffHunks( + baseLines: string[], + expectedPath: string, + hunks: ParsedUnifiedDiffHunk[], +): string[] { + const cursor: UnifiedDiffCursor = { position: 0 }; + const output: string[] = []; + for (const hunk of hunks) { + applyUnifiedDiffHunk(baseLines, expectedPath, cursor, output, hunk); + } + appendRemainingBaseLines(baseLines, cursor, output); + return output; +} + +function applyUnifiedDiffHunk( + baseLines: string[], + expectedPath: string, + cursor: UnifiedDiffCursor, + output: string[], + hunk: ParsedUnifiedDiffHunk, +): void { + const oldIndex = Math.max(0, hunk.oldStart - 1); + if (oldIndex < cursor.position) throw new Error(`Unified diff for ${expectedPath} has overlapping or unordered hunks`); + validateHunkCounts(expectedPath, hunk); + copyBaseLinesToCursor(baseLines, expectedPath, cursor, output, oldIndex); + for (const line of hunk.lines) { + if (line.startsWith('\\')) continue; // "\\ No newline at end of file" + applyUnifiedDiffLine(expectedPath, line, cursor, baseLines, output); + } +} + +function copyBaseLinesToCursor( + baseLines: string[], + expectedPath: string, + cursor: UnifiedDiffCursor, + output: string[], + targetIndex: number, +): void { + while (cursor.position < targetIndex) { + if (cursor.position >= baseLines.length) throw new Error(`Unified diff for ${expectedPath} ran past end of file`); + output.push(baseLines[cursor.position]!); + cursor.position += 1; + } +} + +function appendRemainingBaseLines( + baseLines: string[], + cursor: UnifiedDiffCursor, + output: string[], +): void { + while (cursor.position < baseLines.length) { + output.push(baseLines[cursor.position]!); + cursor.position += 1; + } +} + +function validateHunkCounts(expectedPath: string, hunk: ParsedUnifiedDiffHunk): void { + const oldCount = hunk.lines.filter((line) => line.startsWith(' ') || line.startsWith('-')).length; + const newCount = hunk.lines.filter((line) => line.startsWith(' ') || line.startsWith('+')).length; + if (oldCount !== hunk.oldCount || newCount !== hunk.newCount) { + throw new Error(`Unified diff hunk counts do not match its header for ${expectedPath}`); + } +} + +function applyUnifiedDiffLine( + expectedPath: string, + line: string, + cursor: UnifiedDiffCursor, + baseLines: string[], + output: string[], +): void { + const mark = line[0]; + const body = line.slice(1); + if (line === '') { + throw new Error(`Unified diff for ${expectedPath} has an unprefixed hunk line`); + } + if (mark === ' ') { + applyUnifiedDiffContextLine(expectedPath, body, cursor, baseLines, output); + return; + } + if (mark === '-') { + applyUnifiedDiffDeletionLine(expectedPath, body, cursor, baseLines); + return; + } + if (mark === '+') { + applyUnifiedDiffAdditionLine(body, output); + return; + } + throw new Error(`Unified diff for ${expectedPath} has unsupported hunk line`); +} + +function applyUnifiedDiffContextLine( + expectedPath: string, + body: string, + cursor: UnifiedDiffCursor, + baseLines: string[], + output: string[], +): void { + if (baseLines[cursor.position] !== body) { + throw new Error(`Unified diff context mismatch for ${expectedPath} at line ${cursor.position + 1}`); + } + output.push(baseLines[cursor.position]!); + cursor.position += 1; +} + +function applyUnifiedDiffDeletionLine( + expectedPath: string, + body: string, + cursor: UnifiedDiffCursor, + baseLines: string[], +): void { + if (baseLines[cursor.position] !== body) { + throw new Error(`Unified diff deletion mismatch for ${expectedPath} at line ${cursor.position + 1}`); + } + cursor.position += 1; +} + +function applyUnifiedDiffAdditionLine(body: string, output: string[]): void { + output.push(body); +} + +function splitKeep(text: string): string[] { + if (text === '') return []; + const lines = text.split('\n'); + if (text.endsWith('\n')) lines.pop(); + return lines; +} diff --git a/src/synthesis/code-change-plan/implementation-source-patch-apply.ts b/src/synthesis/code-change-plan/implementation-source-patch-apply.ts new file mode 100644 index 0000000..b18a11a --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch-apply.ts @@ -0,0 +1,8 @@ +export { + applyCodeChangeSourcePatch, + type ApplyCodeChangeSourcePatchOptions, + type ApplyCodeChangeSourcePatchResult, +} from './implementation-source-patch-apply-core.js'; +export { + applyUnifiedDiffToText, +} from './implementation-source-patch-apply-diff.js'; diff --git a/src/synthesis/code-change-plan/implementation-source-patch-assert.ts b/src/synthesis/code-change-plan/implementation-source-patch-assert.ts new file mode 100644 index 0000000..9186578 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch-assert.ts @@ -0,0 +1,397 @@ +import { assertCodeChangePlansForReview, assertGroundedGenerationMetadata } from '../../core/schema.js'; +import { + createCodeChangeSourcePatchHash, + createCodeChangeSourcePatchId, +} from '../../core/id.js'; +import type { + CodeChangeFileAction, + CodeChangePlan, + CodeChangeSourceEdit, + CodeChangeSourcePatch, + CodeChangeSourcePatchSet, +} from '../../core/types.js'; +import { normalizeUnifiedDiff } from './implementation-source-patch-diff.js'; + +export function assertCodeChangeSourcePatch( + value: unknown, + plan?: CodeChangePlan, +): asserts value is CodeChangeSourcePatch { + const patch = assertCodeChangeSourcePatchObject(value, plan); + validateSourcePatchSchema(patch); + validateSourcePatchIdentifiers(patch); + const editPaths = validateSourcePatchEdits(patch); + validateSourcePatchHashAndId(patch); + validateSourcePatchGeneration(patch); + if (plan) { + validateSourcePatchAgainstPlan(patch, plan, editPaths); + } +} + +function assertCodeChangeSourcePatchObject(value: unknown, plan?: CodeChangePlan): CodeChangeSourcePatch { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + throw new Error('Code change source patch must be an object'); + } + const patch = value as CodeChangeSourcePatch; + exactSourcePatchKeys(patch as unknown as Record, [ + 'schemaVersion', 'id', 'patchHash', 'status', 'createdAt', 'planId', 'planHash', + 'graphFingerprint', 'diagnosticIds', 'recordIds', 'edits', 'acceptanceCriteria', 'generation', + ], 'Source patch'); + if (plan !== undefined && typeof patch.planId === 'string' && patch.id) { + if (patch.planId !== plan.id) { + throw new Error('Source patch is not bound to the supplied plan'); + } + } + return patch; +} + +function validateSourcePatchSchema(patch: CodeChangeSourcePatch): void { + if (patch.schemaVersion !== 't2c.code-change-source-patch/v1') { + throw new Error('Unsupported code change source patch schemaVersion'); + } + if (typeof patch.createdAt !== 'string' || Number.isNaN(Date.parse(patch.createdAt))) { + throw new Error('Source patch createdAt must be an ISO date-time'); + } + if (patch.status !== 'proposed') throw new Error('Source patch status must be proposed'); + if (!Array.isArray(patch.edits) || patch.edits.length === 0) { + throw new Error('Source patch edits must be a non-empty array'); + } +} + +function validateSourcePatchIdentifiers(patch: CodeChangeSourcePatch): void { + if (typeof patch.id !== 'string' || !/^SPATCH-[a-f0-9]{20}$/.test(patch.id)) { + throw new Error('Source patch id must match SPATCH-<20 hex>'); + } + if (typeof patch.patchHash !== 'string' || !/^[a-f0-9]{64}$/.test(patch.patchHash)) { + throw new Error('Source patch patchHash must be SHA-256'); + } + if (typeof patch.planId !== 'string' || !/^CPLAN-[a-f0-9]{20}$/.test(patch.planId)) { + throw new Error('Source patch planId must match CPLAN-<20 hex>'); + } + if (typeof patch.planHash !== 'string' || !/^[a-f0-9]{64}$/.test(patch.planHash)) { + throw new Error('Source patch planHash must be SHA-256'); + } + if (typeof patch.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(patch.graphFingerprint)) { + throw new Error('Source patch graphFingerprint must be SHA-256'); + } + assertSourcePatchIds(patch.diagnosticIds, /^DIAG-[a-f0-9]{20}$/, 'diagnosticIds'); + assertSourcePatchIds(patch.recordIds, /^INT-[A-Z]+-[a-f0-9]{20}$/, 'recordIds'); + assertSourcePatchStrings(patch.acceptanceCriteria, 'acceptanceCriteria', false); +} + +function validateSourcePatchEdits(patch: CodeChangeSourcePatch): Set { + return collectSourcePatchEditPathActions(patch.edits); +} + +function collectSourcePatchEditPathActions(edits: CodeChangeSourceEdit[]): Set { + const paths = new Set(); + for (const edit of edits) { + const editContext = validateSourcePatchEdit(edit, paths); + paths.add(editContext.pathActionKey); + } + return paths; +} + +interface SourcePatchEditValidationContext { + pathActionKey: string; +} + +function validateSourcePatchEdit( + edit: CodeChangeSourceEdit, + seen: Set, +): SourcePatchEditValidationContext { + const normalizedEdit = assertSourcePatchEditObject(edit); + const normalizedPath = normalizeSourcePatchEditPath(normalizedEdit.path); + validateSourcePatchEditBody(normalizedEdit, normalizedPath); + validateSourcePatchEditDiff(normalizedEdit.unifiedDiff, normalizedPath); + assertUniqueSourcePatchEditPathAction(seen, normalizedPath, normalizedEdit.action); + const pathActionKey = `${normalizedPath}::${normalizedEdit.action}`; + return { pathActionKey }; +} + +function assertSourcePatchEditObject(edit: CodeChangeSourceEdit | unknown): { + path: unknown; + action: unknown; + symbols: unknown; + instruction: unknown; + unifiedDiff: string | null; +} { + if (!edit || typeof edit !== 'object') throw new Error('Source patch edit must be an object'); + exactSourcePatchKeys(edit as unknown as Record, [ + 'path', 'action', 'symbols', 'instruction', 'unifiedDiff', + ], 'Source patch edit'); + return edit as { + path: unknown; + action: unknown; + symbols: unknown; + instruction: unknown; + unifiedDiff: string | null; + }; +} + +function validateSourcePatchEditBody( + edit: { + path: unknown; + action: unknown; + symbols: unknown; + instruction: unknown; + unifiedDiff: string | null; + }, + normalizedPath: string, +): void { + ensureSourcePatchEditAction(edit.action); + ensureSourcePatchEditInstruction(edit.instruction); + assertSourcePatchStrings(edit.symbols, `edits[${normalizedPath}].symbols`, true); +} + +function validateSourcePatchEditDiff(unifiedDiff: string | null, normalizedPath: string): void { + if (unifiedDiff === null) return; + if (typeof unifiedDiff !== 'string') { + throw new Error(`Source patch unifiedDiff for ${normalizedPath} must be string or null`); + } + normalizeUnifiedDiff(unifiedDiff, normalizedPath); +} + +function assertUniqueSourcePatchEditPathAction( + seen: Set, + normalizedPath: string, + action: unknown, +): void { + const pathActionKey = `${normalizedPath}::${action}`; + if (seen.has(pathActionKey)) throw new Error(`Duplicate source patch edit for ${normalizedPath}`); +} + +function normalizeSourcePatchEditPath(pathValue: unknown): string { + const normalizedPath = (typeof pathValue === 'string' ? pathValue.trim() : '').replace(/\\/g, '/'); + if (!normalizedPath || normalizedPath.startsWith('/') || normalizedPath.split('/').includes('..')) { + throw new Error(`Source patch edit path is not a relative repository path: ${normalizedPath}`); + } + return normalizedPath; +} + +function ensureSourcePatchEditAction(action: unknown): void { + if (!['create', 'modify', 'delete'].includes(action as string) || typeof action !== 'string') { + throw new Error(`Source patch edit action is unsupported: ${String(action)}`); + } +} + +function ensureSourcePatchEditInstruction(instruction: unknown): void { + if (typeof instruction !== 'string' || !instruction.trim()) { + throw new Error('Source patch edit instruction must be non-blank'); + } +} + +function validateSourcePatchHashAndId(patch: CodeChangeSourcePatch): void { + const expectedHash = createCodeChangeSourcePatchHash(patch); + if (patch.patchHash !== expectedHash) { + throw new Error(`Source patch patchHash does not match semantic content: expected ${expectedHash}`); + } + if (patch.id !== createCodeChangeSourcePatchId(patch)) { + throw new Error('Source patch id does not match semantic content'); + } +} + +function validateSourcePatchGeneration(patch: CodeChangeSourcePatch): void { + assertGroundedGenerationMetadata(patch.generation, 'Source patch generation'); + if (patch.generation.generatedAt !== patch.createdAt) { + throw new Error('Source patch generation.generatedAt must match createdAt'); + } + if (patch.generation.generator !== 't2c/code-change-source-patch') { + throw new Error('Source patch generation.generator must be t2c/code-change-source-patch'); + } +} + +function validateSourcePatchAgainstPlan( + patch: CodeChangeSourcePatch, + plan: CodeChangePlan, + editPaths: Set, +): void { + assertSourcePatchPlanBinding(patch, plan); + const expectedChanges = collectExpectedPlanChanges(plan); + validateSourcePatchEditsAgainstPlan(patch, plan, expectedChanges); + validateSourcePatchEvidence(patch, plan, expectedChanges, editPaths); +} + +function assertSourcePatchPlanBinding(patch: CodeChangeSourcePatch, plan: CodeChangePlan): void { + if (patch.planHash !== plan.planHash) throw new Error('Source patch is not bound to the supplied plan'); + if (patch.graphFingerprint !== plan.evidence.graphFingerprint) { + throw new Error('Source patch graphFingerprint does not match the plan'); + } +} + +function collectExpectedPlanChanges(plan: CodeChangePlan): Map { + return new Map(plan.changes.map((item) => [ + item.path.replace(/\\/g, '/'), item.action, + ])); +} + +function validateSourcePatchEditsAgainstPlan( + patch: CodeChangeSourcePatch, + plan: CodeChangePlan, + expectedChanges: Map, +): void { + const allowed = new Set(plan.target.paths.map((item) => item.replace(/\\/g, '/'))); + for (const edit of patch.edits) { + const editPath = edit.path.replace(/\\/g, '/'); + if (!allowed.has(editPath)) { + throw new Error(`Source patch path ${edit.path} is outside plan target.paths`); + } + if (expectedChanges.get(editPath) !== edit.action) { + throw new Error(`Source patch action for ${edit.path} does not match the plan`); + } + } +} + +function validateSourcePatchEvidence( + patch: CodeChangeSourcePatch, + plan: CodeChangePlan, + expectedChangePaths: Map, + editPaths: Set, +): void { + const actualEditPaths = [...editPaths].map((item) => { + const marker = item.indexOf('::'); + return marker === -1 ? item : item.slice(0, marker); + }); + const expectedPaths = [...expectedChangePaths.keys()]; + exactSourcePatchSet(actualEditPaths, expectedPaths, 'edit paths'); + exactSourcePatchSet(patch.diagnosticIds, plan.evidence.diagnosticIds, 'diagnosticIds'); + exactSourcePatchSet(patch.recordIds, plan.evidence.recordIds, 'recordIds'); + exactSourcePatchSet(patch.acceptanceCriteria, plan.acceptanceCriteria, 'acceptanceCriteria'); +} + +export function assertCodeChangeSourcePatchSet( + value: unknown, + plans?: CodeChangePlan[], +): asserts value is CodeChangeSourcePatchSet { + const set = assertSourcePatchSetObject(value); + const context = createSourcePatchSetValidationContext(plans); + validateSourcePatchSetSchema(set); + validateSourcePatchSetPatches(set, context); + validateSourcePatchSetGeneration(set); +} + +interface SourcePatchSetValidationContext { + plansById: Map; + expectedPlanIds: string[] | null; +} + +function createSourcePatchSetValidationContext(plans?: CodeChangePlan[]): SourcePatchSetValidationContext { + const expectedPlanIds = plans?.map((plan) => plan.id) ?? null; + return { + plansById: new Map((plans ?? []).map((plan) => [plan.id, plan])), + expectedPlanIds, + }; +} + +function assertSourcePatchSetObject(value: unknown): CodeChangeSourcePatchSet { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + throw new Error('Code change source patch set must be an object'); + } + const set = value as CodeChangeSourcePatchSet; + exactSourcePatchKeys(set as unknown as Record, [ + 'schemaVersion', 'generatedAt', 'graphFingerprint', 'patches', 'generation', + ], 'Source patch set'); + return set; +} + +function validateSourcePatchSetSchema(set: CodeChangeSourcePatchSet): void { + if (set.schemaVersion !== 't2c.code-change-source-patch-set/v1') { + throw new Error('Unsupported code change source patch set schemaVersion'); + } + if (typeof set.generatedAt !== 'string' || Number.isNaN(Date.parse(set.generatedAt))) { + throw new Error('Source patch set generatedAt must be an ISO date-time'); + } + if (typeof set.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(set.graphFingerprint)) { + throw new Error('Source patch set graphFingerprint must be SHA-256'); + } + if (!Array.isArray(set.patches)) throw new Error('Source patch set patches must be an array'); +} + +function validateSourcePatchSetPatches( + set: CodeChangeSourcePatchSet, + context: SourcePatchSetValidationContext, +): void { + const patchIds = new Set(); + for (const patch of set.patches) { + validateSetPatchAndTrackDuplicates(set, patch, context, patchIds); + } + validateSetPatchesPlanCoverage(set, context.expectedPlanIds); +} + +function validateSetPatchAndTrackDuplicates( + set: CodeChangeSourcePatchSet, + patch: CodeChangeSourcePatch, + context: SourcePatchSetValidationContext, + patchIds: Set, +): void { + const expectedPlan = context.plansById.get(patch.planId); + assertCodeChangeSourcePatch(patch, expectedPlan); + validateSetPatchGraphFingerprint(set, patch); + assertUniqueSetPatchId(patchIds, patch.id); + patchIds.add(patch.id); +} + +function validateSetPatchGraphFingerprint( + set: CodeChangeSourcePatchSet, + patch: CodeChangeSourcePatch, +): void { + if (patch.graphFingerprint !== set.graphFingerprint) { + throw new Error(`Source patch ${patch.id} graphFingerprint does not match its set`); + } +} + +function assertUniqueSetPatchId( + patchIds: Set, + patchId: string, +): void { + if (patchIds.has(patchId)) throw new Error(`Duplicate source patch id: ${patchId}`); +} + +function validateSetPatchesPlanCoverage( + set: CodeChangeSourcePatchSet, + expectedPlanIds: string[] | null, +): void { + if (!expectedPlanIds) return; + exactSourcePatchSet(set.patches.map((patch) => patch.planId), expectedPlanIds, 'planIds'); +} + +function validateSourcePatchSetGeneration(set: CodeChangeSourcePatchSet): void { + assertGroundedGenerationMetadata(set.generation, 'Source patch set generation'); + if (set.generation.generatedAt !== set.generatedAt) { + throw new Error('Source patch set generation.generatedAt must match generatedAt'); + } + if (set.generation.generator !== 't2c/code-change-source-patch-set') { + throw new Error('Source patch set generation.generator must be t2c/code-change-source-patch-set'); + } +} + +function exactSourcePatchKeys(value: Record, expected: string[], name: string): void { + const actual = Object.keys(value).sort(); + const wanted = [...expected].sort(); + if (actual.length !== wanted.length || actual.some((key, index) => key !== wanted[index])) { + throw new Error(`${name} keys must be exactly: ${wanted.join(', ')}`); + } +} + +function assertSourcePatchIds(value: unknown, pattern: RegExp, name: string): asserts value is string[] { + if (!Array.isArray(value) || value.length === 0 + || value.some((item) => typeof item !== 'string' || !pattern.test(item))) { + throw new Error(`Source patch ${name} must be a non-empty array of valid IDs`); + } + if (new Set(value).size !== value.length) throw new Error(`Source patch ${name} must be unique`); +} + +function assertSourcePatchStrings(value: unknown, name: string, emptyAllowed: boolean): asserts value is string[] { + if (!Array.isArray(value) || (!emptyAllowed && value.length === 0) + || value.some((item) => typeof item !== 'string' || !item.trim())) { + throw new Error(`Source patch ${name} must contain ${emptyAllowed ? 'only ' : ''}non-blank strings`); + } + if (new Set(value).size !== value.length) throw new Error(`Source patch ${name} must be unique`); +} + +function exactSourcePatchSet(actual: string[], expected: string[], name: string): void { + const left = [...new Set(actual)].sort(); + const right = [...new Set(expected)].sort(); + if (left.length !== right.length || left.some((item, index) => item !== right[index])) { + throw new Error(`Source patch ${name} do not match the plan`); + } +} diff --git a/src/synthesis/code-change-plan/implementation-source-patch-create.ts b/src/synthesis/code-change-plan/implementation-source-patch-create.ts new file mode 100644 index 0000000..98d7ce4 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch-create.ts @@ -0,0 +1,235 @@ +import { + createCodeChangeSourcePatchHash, + createCodeChangeSourcePatchId, + sha256, + stableStringify, +} from '../../core/id.js'; +import { assertCodeChangePlansForReview } from '../../core/schema.js'; +import { T2C_VERSION } from '../../version.js'; +import { IMPLEMENTATION_DIAGNOSTIC_CODES } from './implementation-diagnostics.js'; +import { normalizeUnifiedDiff } from './implementation-source-patch-diff.js'; +import type { + CodeChangeFile, + CodeChangePlan, + CodeChangeSourceEdit, + CodeChangeSourcePatch, + CodeChangeSourcePatchSet, + GroundedGenerationMetadata, +} from '../../core/types.js'; +import { + assertCodeChangeSourcePatch, + assertCodeChangeSourcePatchSet, +} from './implementation-source-patch-assert.js'; + +export interface CreateCodeChangeSourcePatchOptions { + plan: CodeChangePlan; + /** Optional per-path unified diffs keyed by relative repository path. */ + unifiedDiffs?: Record; + createdAt?: string; +} + +/** + * Build a structured source-edit proposal from one grounded code-change plan. + * + * Deterministic by default: each planned file gets an imperative instruction. + * Callers may attach a unified diff per path; the runtime validates path headers + * and rejects traversal / host paths. Nothing is written to the working tree. + */ +export function createCodeChangeSourcePatch( + options: CreateCodeChangeSourcePatchOptions, +): CodeChangeSourcePatch { + const context = buildSourcePatchContext(options); + const edits = buildSourcePatchEdits(context); + const semantic = buildSourcePatchSemantic(context, edits); + const patchHash = createCodeChangeSourcePatchHash(semantic); + const patch: CodeChangeSourcePatch = { + schemaVersion: 't2c.code-change-source-patch/v1', + id: createCodeChangeSourcePatchId(semantic), + patchHash, + status: 'proposed', + createdAt: context.createdAt, + ...semantic, + generation: deterministicGeneration(context.createdAt, 't2c/code-change-source-patch'), + }; + assertCodeChangeSourcePatch(patch, context.plan); + return patch; +} + +interface SourcePatchCreationContext { + plan: CodeChangePlan; + createdAt: string; + allowedPaths: Set; + diffs: Record; +} + +function buildSourcePatchContext(options: CreateCodeChangeSourcePatchOptions): SourcePatchCreationContext { + const { plan, unifiedDiffs = {} } = options; + const graphFingerprint = plan?.evidence?.graphFingerprint; + assertCodeChangePlansForReview( + [plan], + typeof graphFingerprint === 'string' ? graphFingerprint : '', + ); + const createdAt = options.createdAt ?? new Date().toISOString(); + if (Number.isNaN(Date.parse(createdAt))) throw new Error('createdAt must be an ISO date-time'); + const allowedPaths = collectPlanTargetPaths(plan.target.paths); + validateUnifiedDiffsBelongToPlan(plan.id, unifiedDiffs, allowedPaths); + return { plan, createdAt, allowedPaths, diffs: unifiedDiffs }; +} + +function collectPlanTargetPaths(paths: string[]): Set { + return new Set(paths.map((item) => item.replace(/\\/g, '/'))); +} + +function validateUnifiedDiffsBelongToPlan( + planId: string, + diffs: Record, + allowedPaths: Set, +): void { + for (const diffPath of Object.keys(diffs)) { + const normalizedPath = diffPath.replace(/\\/g, '/'); + if (!allowedPaths.has(normalizedPath)) { + throw new Error(`Unified diff path ${normalizedPath} is not declared by plan ${planId}`); + } + } +} + +function buildSourcePatchEdits(context: SourcePatchCreationContext): CodeChangeSourceEdit[] { + const edits: CodeChangeSourceEdit[] = context.plan.changes + .map((change) => buildSourcePatchEdit(context, change)) + .sort((left, right) => left.path.localeCompare(right.path) || left.action.localeCompare(right.action)); + if (!edits.length) throw new Error(`Plan ${context.plan.id} has no editable paths`); + return edits; +} + +function buildSourcePatchEdit( + context: SourcePatchCreationContext, + change: CodeChangeFile, +): CodeChangeSourceEdit { + const path = change.path.replace(/\\/g, '/'); + if (!context.allowedPaths.has(path)) { + throw new Error(`Edit path ${path} is not present in plan target.paths`); + } + const rawDiff = context.diffs[path]; + const unifiedDiff = rawDiff === undefined ? null : normalizeUnifiedDiff(rawDiff, path); + return { + path, + action: change.action, + symbols: uniqueSorted(change.symbols), + instruction: instructionFor(change, context.plan), + unifiedDiff, + }; +} + +function buildSourcePatchSemantic( + context: SourcePatchCreationContext, + edits: CodeChangeSourceEdit[], +): Omit { + return { + planId: context.plan.id, + planHash: context.plan.planHash, + graphFingerprint: context.plan.evidence.graphFingerprint, + diagnosticIds: uniqueSorted(context.plan.evidence.diagnosticIds), + recordIds: uniqueSorted(context.plan.evidence.recordIds), + edits, + acceptanceCriteria: uniqueSorted(context.plan.acceptanceCriteria), + }; +} + +export function createCodeChangeSourcePatchSet(options: { + plans: CodeChangePlan[]; + graphFingerprint: string; + unifiedDiffsByPlanId?: Record>; + generatedAt?: string; +}): CodeChangeSourcePatchSet { + const context = normalizePatchSetOptions(options); + const patches = buildPatchesForSet(context); + const result = buildSourcePatchSet(context, patches); + assertCodeChangeSourcePatchSet(result, options.plans); + return result; +} + +interface SourcePatchSetBuildContext { + plans: CodeChangePlan[]; + graphFingerprint: string; + generatedAt: string; + unifiedDiffsByPlanId: Record>; +} + +function normalizePatchSetOptions( + options: { + plans: CodeChangePlan[]; + graphFingerprint: string; + unifiedDiffsByPlanId?: Record>; + generatedAt?: string; + }, +): SourcePatchSetBuildContext { + if (typeof options.graphFingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(options.graphFingerprint)) { + throw new Error('graphFingerprint must be a SHA-256 hex digest'); + } + assertCodeChangePlansForReview(options.plans, options.graphFingerprint); + const generatedAt = options.generatedAt ?? new Date().toISOString(); + return { + plans: options.plans, + graphFingerprint: options.graphFingerprint, + generatedAt, + unifiedDiffsByPlanId: options.unifiedDiffsByPlanId ?? {}, + }; +} + +function buildPatchesForSet(context: SourcePatchSetBuildContext): CodeChangeSourcePatch[] { + return [...context.plans] + .sort((left, right) => left.id.localeCompare(right.id)) + .map((plan) => createCodeChangeSourcePatch({ + plan, + createdAt: context.generatedAt, + ...(context.unifiedDiffsByPlanId[plan.id] ? { unifiedDiffs: context.unifiedDiffsByPlanId[plan.id] } : {}), + })); +} + +function buildSourcePatchSet( + context: SourcePatchSetBuildContext, + patches: CodeChangeSourcePatch[], +): CodeChangeSourcePatchSet { + return { + schemaVersion: 't2c.code-change-source-patch-set/v1', + generatedAt: context.generatedAt, + graphFingerprint: context.graphFingerprint, + patches, + generation: deterministicGeneration(context.generatedAt, 't2c/code-change-source-patch-set'), + }; +} + +function instructionFor(change: CodeChangeFile, plan: CodeChangePlan): string { + const symbols = change.symbols.length + ? ` Focus on symbols: ${change.symbols.join(', ')}.` + : ''; + const criteria = plan.acceptanceCriteria.length + ? ` Acceptance: ${plan.acceptanceCriteria.join(' ')}` + : ''; + return `${change.action} \`${change.path}\`. ${change.rationale.trim()}.${symbols}${criteria}`.replace(/\s+/g, ' ').trim(); +} + +function deterministicGeneration(generatedAt: string, generator: string): GroundedGenerationMetadata { + return { + generator, + generatorVersion: '1', + runtimeVersion: T2C_VERSION, + generatedAt, + requestedMode: 'deterministic', + effectiveMode: 'deterministic', + degraded: false, + model: null, + provider: null, + responseId: null, + configurationFingerprint: sha256(stableStringify({ + generator, + generatorVersion: '1', + codes: [...IMPLEMENTATION_DIAGNOSTIC_CODES].sort(), + })), + reason: null, + }; +} + +function uniqueSorted(values: string[]): string[] { + return [...new Set(values.map((item) => item.trim()).filter(Boolean))].sort(); +} diff --git a/src/synthesis/code-change-plan/implementation-source-patch-diff.ts b/src/synthesis/code-change-plan/implementation-source-patch-diff.ts new file mode 100644 index 0000000..2dccf32 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch-diff.ts @@ -0,0 +1,74 @@ +/** + * Validate a single-file unified diff body. + * Accepts optional `--- a/path` / `+++ b/path` headers and rejects foreign paths. + */ +export function normalizeUnifiedDiff(diff: string, expectedPath: string): string { + const normalized = normalizeUnifiedDiffText(diff, expectedPath); + validateUnifiedDiffBody(normalized, expectedPath); + validateUnifiedDiffPathHeaders(normalized, expectedPath); + return normalized; +} + +function normalizeUnifiedDiffText(diff: string, expectedPath: string): string { + const normalized = diff.replace(/\r\n/g, '\n'); + if (!normalized.trim()) throw new Error(`Unified diff for ${expectedPath} is empty`); + if (normalized.includes('\0')) throw new Error(`Unified diff for ${expectedPath} contains NUL bytes`); + return normalized; +} + +function validateUnifiedDiffBody(diff: string, expectedPath: string): void { + if (/(?:api[_-]?key|secret|password|private[_-]?key)\s*[:=]\s*['"]?[^'"\s]{8,}/i.test(diff)) { + throw new Error(`Unified diff for ${expectedPath} appears to contain a secret assignment`); + } +} + +function validateUnifiedDiffPathHeaders(diff: string, expectedPath: string): void { + for (const header of extractUnifiedDiffHeaders(diff)) { + validateUnifiedDiffHeaderPath(header, expectedPath); + } +} + +function extractUnifiedDiffHeaders(diff: string): string[] { + return [...diff.matchAll(/^(?:---|\+\+\+)\s+(?:[ab]\/)?(.+)$/gm)].map((match) => match[1]!.trim()); +} + +function validateUnifiedDiffHeaderPath(header: string, expectedPath: string): void { + if (header === '/dev/null') return; + const normalizedPath = normalizeUnifiedDiffHeaderPath(header); + assertUnifiedDiffHeaderPathSafety(normalizedPath, expectedPath); +} + +function normalizeUnifiedDiffHeaderPath(header: string): string { + return header.replace(/\\/g, '/').trim(); +} + +function assertUnifiedDiffHeaderPathSafety(normalizedPath: string, expectedPath: string): void { + if (isUnifiedDiffTraversalHeader(normalizedPath)) { + throw new Error(`Unified diff for ${expectedPath} uses a non-repository path header: ${normalizedPath}`); + } + if (!matchesUnifiedDiffExpectedHeader(normalizedPath, expectedPath)) { + const bare = normalizedHeaderPathCandidate(normalizedPath); + const stripped = stripLeadingDiffPrefix(bare); + if (stripped !== expectedPath) { + throw new Error(`Unified diff for ${expectedPath} references foreign path: ${normalizedPath}`); + } + } +} + +function isUnifiedDiffTraversalHeader(normalizedPath: string): boolean { + return normalizedPath.startsWith('/') || normalizedPath.split('/').includes('..'); +} + +function matchesUnifiedDiffExpectedHeader(normalizedPath: string, expectedPath: string): boolean { + return normalizedPath === expectedPath + || normalizedPath === `a/${expectedPath}` + || normalizedPath === `b/${expectedPath}`; +} + +function normalizedHeaderPathCandidate(normalizedPath: string): string { + return normalizedPath.split('\t')[0] ?? normalizedPath; +} + +function stripLeadingDiffPrefix(pathValue: string): string { + return pathValue.replace(/^[ab]\//, ''); +} diff --git a/src/synthesis/code-change-plan/implementation-source-patch.ts b/src/synthesis/code-change-plan/implementation-source-patch.ts new file mode 100644 index 0000000..5df7078 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-source-patch.ts @@ -0,0 +1,9 @@ +export { + createCodeChangeSourcePatch, + type CreateCodeChangeSourcePatchOptions, + createCodeChangeSourcePatchSet, +} from './implementation-source-patch-create.js'; +export { + assertCodeChangeSourcePatch, + assertCodeChangeSourcePatchSet, +} from './implementation-source-patch-assert.js'; diff --git a/src/synthesis/code-change-plan/implementation-targets.ts b/src/synthesis/code-change-plan/implementation-targets.ts new file mode 100644 index 0000000..adfab80 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation-targets.ts @@ -0,0 +1,61 @@ +import { normalizeTarget } from '../../core/target.js'; +import { isUsefulCodeChangePath } from '../code-change-path.js'; +import type { IntentRecord, IntentTarget, TodoProposal } from '../../core/types.js'; + +export function collectTarget(records: IntentRecord[], proposals: TodoProposal[]): IntentTarget { + const target = collectTargetComponents(records, proposals); + return finalizeTarget(target); +} + +function collectTargetComponents( + records: IntentRecord[], + proposals: TodoProposal[], +): { + paths: Set; + symbols: Set; + tickets: Set; + versions: Set; +} { + const paths = new Set(); + const symbols = new Set(); + const tickets = new Set(); + const versions = new Set(); + for (const source of records) { + addTargetEntries(source.statement.target, paths, symbols, tickets, versions); + } + for (const proposal of proposals) { + addTargetEntries(proposal.target, paths, symbols, tickets, versions); + } + return { paths, symbols, tickets, versions }; +} + +function addTargetEntries( + target: IntentTarget, + paths: Set, + symbols: Set, + tickets: Set, + versions: Set, +): void { + for (const value of target.paths) paths.add(value); + for (const value of target.symbols) symbols.add(value); + for (const value of target.tickets) tickets.add(value); + for (const value of target.versions) versions.add(value); +} + +function finalizeTarget(target: { + paths: Set; + symbols: Set; + tickets: Set; + versions: Set; +}): IntentTarget { + const paths = [...target.paths].filter(isUsefulCodeChangePath); + const symbols = [...target.symbols]; + const tickets = [...target.tickets]; + const versions = [...target.versions]; + return normalizeTarget({ + paths, + symbols, + tickets, + versions, + }); +} diff --git a/src/synthesis/code-change-plan/implementation.ts b/src/synthesis/code-change-plan/implementation.ts new file mode 100644 index 0000000..583d8b1 --- /dev/null +++ b/src/synthesis/code-change-plan/implementation.ts @@ -0,0 +1 @@ +export * from './implementation-helpers.js'; diff --git a/src/synthesis/code-change-plan/index.ts b/src/synthesis/code-change-plan/index.ts new file mode 100644 index 0000000..2366584 --- /dev/null +++ b/src/synthesis/code-change-plan/index.ts @@ -0,0 +1 @@ +export * from './implementation.js'; diff --git a/src/tf/classifier.ts b/src/tf/classifier.ts index 46c5f31..8195dbe 100644 --- a/src/tf/classifier.ts +++ b/src/tf/classifier.ts @@ -69,28 +69,67 @@ function vectorize(text: string, vocabulary: Record): number[] { export async function classifyAction(text: string, config: T2CConfig): Promise<{ action: IntentAction; basis: string; confidence: number }> { const fallback = classifyActionHeuristically(text); if (!config.enableTensorFlow || !config.tensorflowModelPath) { - return { action: fallback, basis: 'heuristic_action_dictionary', confidence: fallback === 'unknown' ? 0.45 : 0.78 }; + return buildHeuristicActionResult(fallback); } try { const loaded = await loadClassifier(config); - if (!loaded) return { action: fallback, basis: 'heuristic_action_dictionary', confidence: 0.7 }; - const vector = vectorize(text, loaded.assets.vocabulary); - const input = loaded.tf.tensor2d([vector], [1, vector.length]); - const predictionValue = loaded.model.predict(input); - const prediction = Array.isArray(predictionValue) ? predictionValue[0] : predictionValue; - if (!prediction) throw new Error('TensorFlow model returned no prediction'); - const probabilities = Array.from(await prediction.data()); - prediction.dispose?.(); - let bestIndex = 0; - for (let index = 1; index < probabilities.length; index += 1) { - if ((probabilities[index] ?? 0) > (probabilities[bestIndex] ?? 0)) bestIndex = index; - } - const action = loaded.assets.labels[bestIndex] ?? fallback; - const confidence = Math.max(0, Math.min(1, probabilities[bestIndex] ?? 0)); - return confidence >= 0.55 - ? { action, basis: 'tensorflow_action_classifier', confidence } - : { action: fallback, basis: 'heuristic_fallback_after_tensorflow', confidence: Math.max(0.55, confidence) }; + if (!loaded) return buildHeuristicActionResult(fallback, 0.7); + const probabilities = await classifyWithTensorFlow(text, loaded); + return resolveActionFromTensorflow(probabilities, loaded, fallback); } catch (error) { return { action: fallback, basis: `heuristic_fallback:${error instanceof Error ? error.message : String(error)}`, confidence: 0.6 }; } } + +function buildHeuristicActionResult( + action: IntentAction, + confidence?: number, +): { action: IntentAction; basis: string; confidence: number } { + if (confidence === undefined) { + return { action, basis: 'heuristic_action_dictionary', confidence: action === 'unknown' ? 0.45 : 0.78 }; + } + return { action, basis: 'heuristic_action_dictionary', confidence }; +} + +async function classifyWithTensorFlow( + text: string, + loaded: NonNullable, +): Promise { + const vector = vectorize(text, loaded.assets.vocabulary); + const input = loaded.tf.tensor2d([vector], [1, vector.length]); + const predictionValue = loaded.model.predict(input); + const prediction = Array.isArray(predictionValue) ? predictionValue[0] : predictionValue; + if (!prediction) throw new Error('TensorFlow model returned no prediction'); + const probabilities = Array.from(await prediction.data()); + prediction.dispose?.(); + return probabilities; +} + +function resolveActionFromTensorflow( + probabilities: number[], + loaded: NonNullable, + fallback: IntentAction, +): { action: IntentAction; basis: string; confidence: number } { + const bestIndex = indexOfMaxValue(probabilities); + const action = loaded.assets.labels[bestIndex] ?? fallback; + const confidence = clampProbability(probabilities[bestIndex] ?? 0); + return confidence >= 0.55 + ? { action, basis: 'tensorflow_action_classifier', confidence } + : { + action: fallback, + basis: 'heuristic_fallback_after_tensorflow', + confidence: Math.max(0.55, confidence), + }; +} + +function indexOfMaxValue(values: number[]): number { + let bestIndex = 0; + for (let index = 1; index < values.length; index += 1) { + if ((values[index] ?? 0) > (values[bestIndex] ?? 0)) bestIndex = index; + } + return bestIndex; +} + +function clampProbability(value: number): number { + return Math.max(0, Math.min(1, value)); +} diff --git a/src/watch/watcher.ts b/src/watch/watcher.ts index d4fb493..83a4c96 100644 --- a/src/watch/watcher.ts +++ b/src/watch/watcher.ts @@ -145,82 +145,20 @@ const DEFAULT_MIN_INTERVAL_MS = 60_000; const DEFAULT_SCAN_INTERVAL_MS = 2_000; export async function watchRepository(options: WatchOptions, config: T2CConfig): Promise { - const root = path.resolve(options.root); - const minIntervalMs = Math.max(0, options.minIntervalMs ?? DEFAULT_MIN_INTERVAL_MS); - const scanIntervalMs = Math.max(50, options.scanIntervalMs ?? DEFAULT_SCAN_INTERVAL_MS); - const emit = options.onEvent ?? ((): void => {}); - const now = options.now ?? ((): number => Date.now()); - const sleep = options.sleep ?? defaultSleep; - const signal = options.signal; - - const matcher = await loadIgnoreMatcher(root); - const runReport = options.runReport ?? (async (): Promise => { - const result = await runPipeline(options.pipeline, config); - return { runId: result.manifest.runId, summaryPath: result.summaryPath }; - }); + const configuration = await createWatchConfiguration(options, config); + const runtime = await createWatchRuntime(configuration); - const scanOptions: ScanOptions = { matcher, ...(options.maxFiles === undefined ? {} : { maxFiles: options.maxFiles }) }; - let snapshot = await scanTree(root, scanOptions); - emit({ type: 'ready', root, files: snapshot.size, sources: matcher.sources }); - - // `lastReportStartedAt` anchors the floor to the start of a report, so a slow - // pipeline does not add its own duration to the wait before the next one. - let lastReportStartedAt = Number.NEGATIVE_INFINITY; - let pending = 0; - let pendingReason = ''; - - if (options.runOnStart ?? true) { - lastReportStartedAt = now(); - await generate('initial scan'); + if (configuration.runOnStart) { + await generateReportForReason('initial scan', runtime); } - while (!signal?.aborted) { - await sleep(scanIntervalMs, signal); - if (signal?.aborted) break; - - const current = await scanTree(root, scanOptions); - const delta = diffSnapshots(snapshot, current); - snapshot = current; - - if (delta.total > 0) { - pending += delta.total; - pendingReason = describeDelta(delta); - emit({ type: 'change', delta, description: pendingReason }); - } - if (pending === 0) continue; - - const waitMs = lastReportStartedAt + minIntervalMs - now(); - if (waitMs > 0) { - emit({ type: 'throttled', waitMs, pending }); - continue; - } - - const reason = `${pending} change(s): ${pendingReason}`; - pending = 0; - pendingReason = ''; - lastReportStartedAt = now(); - await generate(reason); + while (!runtime.signal?.aborted) { + await runtime.sleep(runtime.scanIntervalMs, runtime.signal); + if (runtime.signal?.aborted) break; + await evaluateChangeCycle(runtime); } - emit({ type: 'stopped' }); - - async function generate(reason: string): Promise { - emit({ type: 'report:start', reason }); - const startedAt = now(); - try { - const result = await runReport(reason); - emit({ - type: 'report:done', - runId: result.runId, - summaryPath: result.summaryPath, - durationMs: now() - startedAt, - }); - } catch (error) { - emit({ type: 'report:error', message: error instanceof Error ? error.message : String(error) }); - } - // Changes written by the report itself must not trigger the next one. - snapshot = await scanTree(root, scanOptions); - } + runtime.emit({ type: 'stopped' }); } function defaultSleep(ms: number, signal?: AbortSignal): Promise { @@ -241,3 +179,114 @@ function defaultSleep(ms: number, signal?: AbortSignal): Promise { } }); } + +interface WatchConfiguration { + root: string; + minIntervalMs: number; + scanIntervalMs: number; + matcher: IgnoreMatcher; + runReport: (reason: string) => Promise; + emit: (event: WatchEvent) => void; + now: () => number; + sleep: (ms: number, signal?: AbortSignal) => Promise; + signal: AbortSignal | undefined; + runOnStart: boolean; + scanOptions: ScanOptions; +} + +interface WatchRuntime { + configuration: WatchConfiguration; + snapshot: TreeSnapshot; + pending: number; + pendingReason: string; + lastReportStartedAt: number; +} + +async function createWatchConfiguration(options: WatchOptions, config: T2CConfig): Promise { + const root = path.resolve(options.root); + const minIntervalMs = Math.max(0, options.minIntervalMs ?? DEFAULT_MIN_INTERVAL_MS); + const scanIntervalMs = Math.max(50, options.scanIntervalMs ?? DEFAULT_SCAN_INTERVAL_MS); + const emit = options.onEvent ?? ((): void => {}); + const now = options.now ?? ((): number => Date.now()); + const sleep = options.sleep ?? defaultSleep; + const matcher = await loadIgnoreMatcher(root); + const runReport = options.runReport ?? (async (_reason: string): Promise => { + const result = await runPipeline(options.pipeline, config); + return { runId: result.manifest.runId, summaryPath: result.summaryPath }; + }); + return { + root, + minIntervalMs, + scanIntervalMs, + matcher, + emit, + now, + sleep, + signal: options.signal, + runOnStart: options.runOnStart ?? true, + runReport, + scanOptions: { matcher, ...(options.maxFiles === undefined ? {} : { maxFiles: options.maxFiles }) }, + }; +} + +async function createWatchRuntime(configuration: WatchConfiguration): Promise { + const initialSnapshot = await scanTreeCurrent(configuration); + configuration.emit({ type: 'ready', root: configuration.root, files: initialSnapshot.size, sources: configuration.matcher.sources }); + return { + configuration, + snapshot: initialSnapshot, + pending: 0, + pendingReason: '', + lastReportStartedAt: Number.NEGATIVE_INFINITY, + }; +} + +async function scanTreeCurrent(configuration: WatchConfiguration): Promise { + return scanTree(configuration.root, configuration.scanOptions); +} + +async function evaluateChangeCycle(runtime: WatchRuntime): Promise { + const current = await scanTree(runtime.configuration.root, runtime.configuration.scanOptions); + const delta = diffSnapshots(runtime.snapshot, current); + runtime.snapshot = current; + handleDelta(runtime, delta); + await maybeGenerateReport(runtime); +} + +function handleDelta(runtime: WatchRuntime, delta: SnapshotDelta): void { + if (delta.total === 0) return; + runtime.pending += delta.total; + runtime.pendingReason = describeDelta(delta); + runtime.configuration.emit({ type: 'change', delta, description: runtime.pendingReason }); +} + +async function maybeGenerateReport(runtime: WatchRuntime): Promise { + if (runtime.pending === 0) return; + const waitMs = runtime.lastReportStartedAt + runtime.configuration.minIntervalMs - runtime.configuration.now(); + if (waitMs > 0) { + runtime.configuration.emit({ type: 'throttled', waitMs, pending: runtime.pending }); + return; + } + const reason = `${runtime.pending} change(s): ${runtime.pendingReason}`; + runtime.pending = 0; + runtime.pendingReason = ''; + runtime.lastReportStartedAt = runtime.configuration.now(); + await generateReportForReason(reason, runtime); +} + +async function generateReportForReason(reason: string, runtime: WatchRuntime): Promise { + const startedAt = runtime.configuration.now(); + runtime.configuration.emit({ type: 'report:start', reason }); + try { + const result = await runtime.configuration.runReport(reason); + runtime.configuration.emit({ + type: 'report:done', + runId: result.runId, + summaryPath: result.summaryPath, + durationMs: runtime.configuration.now() - startedAt, + }); + } catch (error) { + runtime.configuration.emit({ type: 'report:error', message: error instanceof Error ? error.message : String(error) }); + } + runtime.snapshot = await scanTree(runtime.configuration.root, runtime.configuration.scanOptions); +} diff --git a/src/web/diff-ui-script.ts b/src/web/diff-ui-script.ts new file mode 100644 index 0000000..0ceec46 --- /dev/null +++ b/src/web/diff-ui-script.ts @@ -0,0 +1,17 @@ +export const DIFF_UI_SCRIPT = ``; diff --git a/src/web/diff-ui.ts b/src/web/diff-ui.ts index 4ef2c37..af33382 100644 --- a/src/web/diff-ui.ts +++ b/src/web/diff-ui.ts @@ -1,48 +1,152 @@ -export function diffUiHtml(): string { - return ` +import { DIFF_UI_SCRIPT } from './diff-ui-script.js'; + +function diffUiStyles(): string { + return ':root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,sans-serif;background:#020617;color:#e2e8f0}' + + '*{box-sizing:border-box}' + + 'body{margin:0;background:radial-gradient(circle at 20% 0,#172554 0,transparent 38%),#020617;min-height:100vh}' + + 'main{width:min(1480px,96vw);margin:auto;padding:34px 0 64px}' + + 'header{display:flex;align-items:end;justify-content:space-between;gap:24px;margin-bottom:24px}' + + 'h1{font-size:clamp(28px,4vw,52px);margin:0;letter-spacing:-.04em}' + + '.eyebrow{color:#38bdf8;text-transform:uppercase;letter-spacing:.18em;font-size:12px;font-weight:800}' + + '.sub{max-width:720px;color:#94a3b8;line-height:1.6}' + + '.grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}' + + '.panel{background:#0f172acc;border:1px solid #334155;border-radius:16px;padding:18px;box-shadow:0 20px 60px #0005}' + + '.panel h2{margin:0 0 12px;font-size:16px}' + + 'label{display:block;color:#94a3b8;font-size:12px;margin-bottom:7px}' + + 'select{width:100%;border:1px solid #475569;border-radius:10px;background:#020617;color:#e2e8f0;padding:12px;font:13px ui-monospace,monospace}' + + 'select:focus,input:focus,textarea:focus{outline:2px solid #38bdf8;outline-offset:1px}' + + '.run-meta{min-height:34px;margin-top:9px;color:#64748b;font:11px/1.5 ui-monospace,monospace;word-break:break-all}' + + 'details.manual{margin-top:12px;border-top:1px solid #1e293b;padding-top:10px}' + + 'summary{cursor:pointer;color:#94a3b8;font-size:13px}' + + 'textarea{width:100%;min-height:150px;resize:vertical;border:1px solid #334155;border-radius:10px;background:#020617;color:#cbd5e1;padding:12px;font:12px ui-monospace,monospace;margin-top:10px}' + + 'input[type=file],input[type=password],.panel input:not([type=file]){width:100%;margin-top:10px;color:#94a3b8}' + + 'input[type=password],.panel input:not([type=file]){background:#020617;border:1px solid #334155;border-radius:8px;padding:10px;color:#e2e8f0}' + + '.actions{display:flex;align-items:center;gap:12px;margin:18px 0;flex-wrap:wrap}' + + 'button{border:0;border-radius:10px;background:#38bdf8;color:#082f49;font-weight:800;padding:12px 20px;cursor:pointer}' + + '.secondary{background:#1e293b;color:#cbd5e1;border:1px solid #475569}' + + 'button:disabled{opacity:.55;cursor:wait}' + + '.status{color:#94a3b8;font:13px ui-monospace,monospace}' + + '.error{color:#fca5a5;white-space:pre-wrap}' + + '.result{display:none}' + + '.result.visible{display:block}' + + '.metrics{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:16px}' + + '.metric{min-width:130px;background:#111827;border:1px solid #334155;border-radius:10px;padding:12px}' + + '.metric b{display:block;font-size:24px}' + + '.metric span{color:#94a3b8;font-size:12px}' + + '#svg-host{overflow:auto;border-radius:14px;background:#0f172a}' + + '#svg-host svg{display:block;width:100%;height:auto}' + + '.fingerprint{word-break:break-all;color:#64748b;font:11px ui-monospace,monospace;margin-top:12px}' + + '@media(max-width:850px){header{display:block}.grid{grid-template-columns:1fr}}'; +} + +function diffUiRunPanel(side: 'before' | 'after', title: string): string { + return ` +
+

${title}

+ + +
+
+ RΔ™czne ΕΊrΓ³dΕ‚o JSON lub Ε›cieΕΌka + + + +
+
`; +} + +function diffUiFiltersPanel(): string { + return ` +
+

Filtry komunikacji

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
`; +} + +function diffUiBodyMarkup(): string { + return ` +
+
+
+
Intent Evidence Runtime
+

PorΓ³wnanie historii grafΓ³w.

+
+

Dwa najnowsze runy z .intent/runs sΔ… wybierane automatycznie. Zmiana wyboru od razu przelicza deterministyczny diff i dostΔ™pny widok SVG.

+
+
+ ${diffUiRunPanel('before', 'Poprzedni run')} + ${diffUiRunPanel('after', 'Najnowszy run')} +
+ ${diffUiFiltersPanel()} +
+ Bearer token (tylko gdy T2C_A2A_TOKEN jest wΕ‚Δ…czony) + +
+
+ + + Ładowanie historii… +
+

+
+
+
+
+
+
`; +} + +function diffUiScriptMarkup(): string { + return DIFF_UI_SCRIPT; +} + +function diffUiTemplate(): string { + return ` + todo2code Β· Intent Diff -
-
Intent Evidence Runtime

PorΓ³wnanie historii grafΓ³w.

Dwa najnowsze runy z .intent/runs sΔ… wybierane automatycznie. Zmiana wyboru od razu przelicza deterministyczny diff i dostΔ™pny widok SVG.

-
-

Poprzedni run

RΔ™czne ΕΊrΓ³dΕ‚o JSON lub Ε›cieΕΌka
-

Najnowszy run

RΔ™czne ΕΊrΓ³dΕ‚o JSON lub Ε›cieΕΌka
-
-

Filtry komunikacji

-
Bearer token (tylko gdy T2C_A2A_TOKEN jest wΕ‚Δ…czony)
-
Ładowanie historii…
-

-
-
`; +${diffUiBodyMarkup()} +${diffUiScriptMarkup()} +`; +} + +export function diffUiHtml(): string { + return diffUiTemplate(); } diff --git a/test/diff-git-umbrella.test.ts b/test/diff-git-umbrella.test.ts new file mode 100644 index 0000000..e6da0aa --- /dev/null +++ b/test/diff-git-umbrella.test.ts @@ -0,0 +1,112 @@ +import assert from 'node:assert/strict'; +import { execFile } from 'node:child_process'; +import { promises as fs } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; +import { promisify } from 'node:util'; +import { extractGitIntent } from '../src/extractors/git.js'; +import { makeConfig } from './helpers.js'; + +const exec = promisify(execFile); + +async function initializeRepository( + root: string, + relativePath?: string, + content = 'export const shared = true;\n', +): Promise { + await fs.mkdir(root, { recursive: true }); + await exec('git', ['init', '-q'], { cwd: root }); + await exec('git', ['config', 'user.email', 'umbrella@todo2code.local'], { cwd: root }); + await exec('git', ['config', 'user.name', 'umbrella test'], { cwd: root }); + if (!relativePath) return; + const absolute = path.join(root, relativePath); + await fs.mkdir(path.dirname(absolute), { recursive: true }); + await fs.writeFile(absolute, content); + await exec('git', ['add', relativePath], { cwd: root }); + await exec('git', ['commit', '-q', '-m', `feat: add ${relativePath}`], { cwd: root }); +} + +test('umbrella Git extraction namespaces nested repositories and prunes unsafe descendants', async () => { + const umbrella = await fs.mkdtemp(path.join(os.tmpdir(), 't2c-git-umbrella-')); + const alpha = path.join(umbrella, 'alpha'); + const beta = path.join(umbrella, 'group', 'beta'); + const empty = path.join(umbrella, 'empty'); + await initializeRepository(alpha, 'src/shared.ts'); + await initializeRepository(beta, 'src/shared.ts', 'export const shared = false;\n'); + await initializeRepository(empty); + + // A repository below an already discovered repository is owned by that + // checkout and must not be interpreted as another umbrella member. + await initializeRepository(path.join(alpha, 'vendor', 'nested'), 'src/hidden.ts'); + + // Directory discovery must use lstat/readdir semantics and never cross a + // symlink into a repository outside the supplied umbrella root. + const external = await fs.mkdtemp(path.join(os.tmpdir(), 't2c-git-external-')); + await initializeRepository(external, 'src/external.ts'); + await fs.symlink(external, path.join(umbrella, 'linked-external'), 'dir'); + + const first = await extractGitIntent({ root: umbrella, count: 1 }, makeConfig(umbrella)); + const second = await extractGitIntent({ root: umbrella, count: 1 }, makeConfig(umbrella)); + + assert.deepEqual(first, second); + assert.equal(first.records.length, 2); + assert.deepEqual( + first.records.map((record) => record.statement.target.paths), + [['alpha/src/shared.ts'], ['group/beta/src/shared.ts']], + ); + assert.deepEqual( + first.records.map((record) => record.metadata.repositoryRoot), + ['alpha', 'group/beta'], + ); + assert.ok(first.records.every((record) => record.source.extractor === 't2c/git@2')); + assert.ok(first.records.every((record) => record.metadata.generation.generatorVersion === '2')); + assert.equal(new Set(first.records.map((record) => record.id)).size, 2); + assert.ok(first.records.every((record) => { + const changed = record.metadata.changedFiles; + return Array.isArray(changed) + && changed.every((item) => typeof item === 'object' && item !== null + && String((item as { path?: unknown }).path).startsWith(String(record.metadata.repositoryRoot))); + })); + assert.equal(first.warnings.length, 1); + assert.match(first.warnings[0] ?? '', /empty.*no commits yet/i); + assert.ok(!first.records.some((record) => record.statement.target.paths.some((item) => ( + item.includes('vendor/nested') || item.includes('linked-external') || item.includes('external.ts') + )))); +}); + +test('a single repository keeps its existing unprefixed path and commit ordering contract', async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 't2c-git-single-v2-')); + await initializeRepository(root, 'src/first.ts'); + await fs.writeFile(path.join(root, 'src', 'second.ts'), 'export const second = true;\n'); + await exec('git', ['add', 'src/second.ts'], { cwd: root }); + await exec('git', ['commit', '-q', '-m', 'feat: add second'], { cwd: root }); + + const result = await extractGitIntent({ root, count: 2 }, makeConfig(root)); + + assert.equal(result.records.length, 2); + assert.deepEqual(result.records.map((record) => record.source.commitIndex), [1, 2]); + assert.deepEqual(result.records[0]?.statement.target.paths, ['src/second.ts']); + assert.deepEqual(result.records[1]?.statement.target.paths, ['src/first.ts']); + assert.equal(result.records[0]?.metadata.repositoryRoot, '.'); + assert.ok(result.records.every((record) => record.source.extractor === 't2c/git@2')); +}); + +test('umbrella extraction prefixes both sides of a renamed path', async () => { + const umbrella = await fs.mkdtemp(path.join(os.tmpdir(), 't2c-git-rename-')); + const repository = path.join(umbrella, 'service'); + await initializeRepository(repository, 'src/old.ts'); + await exec('git', ['mv', 'src/old.ts', 'src/new.ts'], { cwd: repository }); + await exec('git', ['commit', '-q', '-m', 'refactor: rename source'], { cwd: repository }); + + const result = await extractGitIntent({ root: umbrella, count: 1 }, makeConfig(umbrella)); + const changedFiles = result.records[0]?.metadata.changedFiles; + + assert.deepEqual(result.records[0]?.statement.target.paths, ['service/src/new.ts']); + assert.ok(Array.isArray(changedFiles)); + assert.deepEqual(changedFiles, [{ + status: 'R100', + previousPath: 'service/src/old.ts', + path: 'service/src/new.ts', + }]); +});