Skip to content

Commit 7111374

Browse files
fix(docs): update docs
Statistics: 12 files changed, 116 insertions, 67 deletions Summary: - Dirs: .=6, tests=3, src=2, docs=1 - Exts: .py=5, .md=3, .less=1, .yaml=1, .toml=1, .lock=1 - A/M/D: 0/12/0 - Symbols: class FakeRequest, test_testql_mcp_tools, _private_dependency_imports, test_testql_autorepair_uses_public_runner_release_floor, test_koru_src_has_no_private_env2llm_imports Modified files: - CHANGELOG.md (+4/-0) - README.md (+4/-4) - TODO.md (+11/-0) - app.doql.less (+4/-4) - docs/architecture/dependency-boundary-inventory.yaml (+3/-2) - pyproject.toml (+4/-4) - src/koru/deps_autorepair.py (+2/-2) - src/koruapi/testql_bridge.py (+14/-40) - tests/test_deps_autorepair.py (+7/-0) - tests/test_package_deduplication.py (+15/-4) - tests/test_testql_bridge.py (+41/-0) - uv.lock (+7/-7) Implementation notes (heuristics): - Type inferred from file paths + diff keywords + add/delete ratio - Scope prefers 'goal' when goal/* is touched; otherwise based on top-level dirs - For <=6 files: generate short per-file notes from added lines (defs/classes/click options/headings) - A/M/D derived from git name-status; per-file +X/-X from git numstat Co-authored-by: Koru Agent <agent@coru.dev>
1 parent 5d00dd2 commit 7111374

15 files changed

Lines changed: 140 additions & 74 deletions

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## [Unreleased]
99

1010
### Added
11+
- The TestQL bridge now delegates scenario resolution and batch execution to
12+
the public `testql.verification` contract from TestQL 1.2.62. Successful
13+
responses include the versioned result schema plus canonical request/result
14+
hashes, and Koru no longer imports private TestQL runner symbols.
1115
- The env2llm registry bridge now consumes the public, typed service factory
1216
from env2llm 0.1.14 and includes its canonical service descriptor plus
1317
request/descriptor hashes in every successful response. Service construction
@@ -30,6 +34,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3034
- Queue patch tickets may set `inputs.max_patch_attempts` (overrides
3135
`KORU_QUEUE_PATCH_RETRIES` for mechanical diff retries).
3236

37+
## [0.1.435] - 2026-07-20
38+
39+
### Docs
40+
- Update CHANGELOG.md
41+
- Update README.md
42+
- Update TODO.md
43+
- Update docs/architecture/dependency-boundary-inventory.yaml
44+
45+
### Test
46+
- Update tests/test_deps_autorepair.py
47+
- Update tests/test_package_deduplication.py
48+
- Update tests/test_testql_bridge.py
49+
50+
### Other
51+
- Update app.doql.less
52+
- Update uv.lock
53+
3354
## [0.1.434] - 2026-07-19
3455

3556
### Docs

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
## AI Cost Tracking
99

10-
![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.434-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
11-
![AI Cost](https://img.shields.io/badge/AI%20Cost-$6.23-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-259.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fdeep%2Fdeep--v4--pro-lightgrey)
10+
![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.435-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
11+
![AI Cost](https://img.shields.io/badge/AI%20Cost-$5.64-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-260.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fdeep%2Fdeep--v4--pro-lightgrey)
1212

13-
- 🤖 **LLM usage:** $6.2320 (723 commits)
14-
- 👤 **Human dev:** ~$25966 (259.7h @ $100/h, 30min dedup)
13+
- 🤖 **LLM usage:** $5.6374 (724 commits)
14+
- 👤 **Human dev:** ~$26029 (260.3h @ $100/h, 30min dedup)
1515

16-
Generated on 2026-07-19 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
16+
Generated on 2026-07-20 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
1717

1818
---
1919

TODO.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,12 @@ cudzych namespace'ów w produkcyjnym `src/`. Kolejność jest następująca:
330330
rejestrowanymi przez hosta. Koru wymaga tej wersji, dołącza typed result
331331
do odpowiedzi IDE i usunęło behavioral fallbacki drivera/recovery:
332332
kolejne 445 linii produkcyjnych netto, łącznie 2087 linii i 10 modułów.
333+
- [x] TestQL 1.2.62 przejął rozwiązywanie ścieżek/globów, batch execution i
334+
serializację wyniku przez `testql.verification-request.v1` oraz
335+
`testql.verification-result.v1`. Most Koru nie importuje już prywatnych
336+
symboli ani nie przepakowuje wyniku; zmalał o 26 linii netto. Po
337+
uwzględnieniu jawnej provenance z env2llm łączna redukcja wynosi 2110
338+
linii i 10 modułów produkcyjnych.
333339
- [ ] Alias `VisionFrame` pozostawić do osobnej decyzji kompatybilnościowej.
334340
Transporty OBS/browser przenosić tylko po pojawieniu się drugiego
335341
konsumenta lub neutralnego transportu.
@@ -444,6 +450,11 @@ execution DSL-em i sam nie nadaje żadnych uprawnień.
444450
odpowiedź niesie kanoniczny request/descriptor hash do audytu.
445451
Minimalna wersja runtime i DSL zależności to 0.1.14; guard AST blokuje
446452
powrót prywatnych importów env2llm.
453+
- [x] **TestQL slice:** TestQL 1.2.62 udostępnia publiczny, wersjonowany
454+
`VerificationRequest`/`VerificationResult`, pakowane JSON Schema oraz
455+
kanoniczne `request_hash` i `result_hash`. Koru deleguje resolution i
456+
batch execution jednym wywołaniem, zachowując wybór acceptance
457+
criteria; guard AST blokuje powrót prywatnych importów TestQL.
447458
- [ ] **DEP-5 — cienki most tillm (kolejność 90, P2).** Po podbiciu minimalnej
448459
wersji usunąć lokalny provider registry i path injection; konsumować
449460
typowany completion/provenance. `ProposalEnvelope`, retry budget,

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.434
1+
0.1.435

app.doql.less

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ dependencies {
1111
vision: "mss>=9.0,<11.0";
1212
mesh: "websockets>=12.0,<17.0";
1313
observe: "mss>=9.0,<11.0, websockets>=12.0,<17.0";
14-
desktop: "nlp2uri[envmap]>=0.4.7, env2llm[mqtt]>=0.1.14, planfile>=0.1.100, testql>=1.2.55";
14+
desktop: "nlp2uri[envmap]>=0.4.7, env2llm[mqtt]>=0.1.14, planfile>=0.1.100, testql>=1.2.62";
1515
imgl: "httpx>=0.27,<1.0";
1616
envmap: "nlp2uri[envmap]>=0.4.7, env2llm[mqtt]>=0.1.14";
17-
testql: testql>=1.2.55;
17+
testql: testql>=1.2.62;
1818
planfile: planfile>=0.1.100;
1919
curllm: curllm[mcp]>=1.0.0;
20-
browser: "nlp2uri[envmap]>=0.4.7, env2llm[mqtt]>=0.1.14, testql>=1.2.55, curllm[mcp]>=1.0.0, playwright>=1.40,<2.0";
20+
browser: "nlp2uri[envmap]>=0.4.7, env2llm[mqtt]>=0.1.14, testql>=1.2.62, curllm[mcp]>=1.0.0, playwright>=1.40,<2.0";
2121
vdisplay: vdisplay>=0.1.44;
2222
dev: "gillm>=0.1.24, pytest>=8.0,<10.0, pytest-cov>=5.0,<8.0, pytest-rerunfailures>=14.0,<17.0, pytest-timeout>=2.3,<3.0, pytest-xdist>=3.0,<4.0, ruff>=0.11,<0.16, mypy>=1.11,<3.0, pyright>=1.1.390,<2.0, hypothesis>=6.112,<7.0, pre-commit>=3.8,<5.0, types-PyYAML>=6.0,<7.0, goal>=2.1.264, costs>=0.1.53, pfix>=0.1.60, tagi>=0.49.0";
2323
api: "fastapi>=0.115,<1.0, uvicorn[standard]>=0.30,<1.0, httpx>=0.27,<1.0, prometheus-client>=0.21,<1.0";
@@ -27,7 +27,7 @@ dependencies {
2727
obs: "nfo>=0.2.22,<1.0, opentelemetry-exporter-otlp>=1.28,<2.0, opentelemetry-instrumentation-fastapi>=0.49b0,<1.0, opentelemetry-instrumentation-httpx>=0.49b0,<1.0, opentelemetry-sdk>=1.28,<2.0, sentry-sdk>=2.18,<3.0, structlog>=24.4,<26.0";
2828
queue: "apscheduler>=3.10,<4.0, arq>=0.26,<1.0, redis>=5.1,<8.0";
2929
quality: "import-linter>=2.0,<3.0, mutmut>=3.2,<4.0, pyupgrade>=3.17,<4.0, refurb>=2.0,<3.0";
30-
all: "apscheduler>=3.10,<4.0, arq>=0.26,<1.0, fastapi>=0.115,<1.0, gillm>=0.1.24, hypothesis>=6.112,<7.0, httpx>=0.27,<1.0, import-linter>=2.0,<3.0, instructor>=1.6,<2.0, litellm>=1.51,<2.0, mss>=9.0,<11.0, mutmut>=3.2,<4.0, mypy>=1.11,<3.0, mss>=9.0,<11.0, nfo>=0.2.22,<1.0, openai>=1.54,<3.0, opentelemetry-exporter-otlp>=1.28,<2.0, opentelemetry-instrumentation-fastapi>=0.49b0,<1.0, opentelemetry-instrumentation-httpx>=0.49b0,<1.0, opentelemetry-sdk>=1.28,<2.0, pre-commit>=3.8,<5.0, prometheus-client>=0.21,<1.0, pyright>=1.1.390,<2.0, pytest>=8.0,<10.0, pytest-cov>=5.0,<8.0, pytest-rerunfailures>=14.0,<17.0, pytest-timeout>=2.3,<3.0, pytest-xdist>=3.0,<4.0, pyupgrade>=3.17,<4.0, redis>=5.1,<8.0, refurb>=2.0,<3.0, ruff>=0.11,<0.16, tillm>=0.1.35, sentry-sdk>=2.18,<3.0, structlog>=24.4,<26.0, tiktoken>=0.8,<1.0, types-PyYAML>=6.0,<7.0, uvicorn[standard]>=0.30,<1.0, websockets>=12.0,<17.0, goal>=2.1.264, costs>=0.1.53, pfix>=0.1.60, tagi>=0.49.0, curllm[mcp]>=1.0.0, env2llm[mqtt]>=0.1.14, fullm>=0.1.22, nlp2uri[envmap]>=0.4.7, planfile>=0.1.100, playwright>=1.40,<2.0, testql>=1.2.55, vdisplay>=0.1.44";
30+
all: "apscheduler>=3.10,<4.0, arq>=0.26,<1.0, fastapi>=0.115,<1.0, gillm>=0.1.24, hypothesis>=6.112,<7.0, httpx>=0.27,<1.0, import-linter>=2.0,<3.0, instructor>=1.6,<2.0, litellm>=1.51,<2.0, mss>=9.0,<11.0, mutmut>=3.2,<4.0, mypy>=1.11,<3.0, mss>=9.0,<11.0, nfo>=0.2.22,<1.0, openai>=1.54,<3.0, opentelemetry-exporter-otlp>=1.28,<2.0, opentelemetry-instrumentation-fastapi>=0.49b0,<1.0, opentelemetry-instrumentation-httpx>=0.49b0,<1.0, opentelemetry-sdk>=1.28,<2.0, pre-commit>=3.8,<5.0, prometheus-client>=0.21,<1.0, pyright>=1.1.390,<2.0, pytest>=8.0,<10.0, pytest-cov>=5.0,<8.0, pytest-rerunfailures>=14.0,<17.0, pytest-timeout>=2.3,<3.0, pytest-xdist>=3.0,<4.0, pyupgrade>=3.17,<4.0, redis>=5.1,<8.0, refurb>=2.0,<3.0, ruff>=0.11,<0.16, tillm>=0.1.35, sentry-sdk>=2.18,<3.0, structlog>=24.4,<26.0, tiktoken>=0.8,<1.0, types-PyYAML>=6.0,<7.0, uvicorn[standard]>=0.30,<1.0, websockets>=12.0,<17.0, goal>=2.1.264, costs>=0.1.53, pfix>=0.1.60, tagi>=0.49.0, curllm[mcp]>=1.0.0, env2llm[mqtt]>=0.1.14, fullm>=0.1.22, nlp2uri[envmap]>=0.4.7, planfile>=0.1.100, playwright>=1.40,<2.0, testql>=1.2.62, vdisplay>=0.1.44";
3131
}
3232

3333
entity[name="TextContent"] {

docs/architecture/dependency-boundary-inventory.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ extractions:
353353
- id: testql.public_runner
354354
order: 60
355355
priority: P0
356-
status: proposed
356+
status: complete
357357
kind: move
358358
source_modules:
359359
- src/koruapi/testql_bridge.py
@@ -366,9 +366,10 @@ extractions:
366366
keep_in_koru:
367367
- Selection of acceptance criteria and the completed versus applied_unverified decision.
368368
current_smells:
369-
- Koru imports private TestQL runner symbols _resolve_input_paths and _run_single.
369+
- Resolved in TestQL 1.2.62 and Koru 0.1.435+; TestQL owns path resolution, batch execution and canonical result serialization.
370370
acceptance:
371371
- Koru uses only a public TestQL API and records canonical verification result hashes.
372+
- Malformed requests fail through the typed public contract before scenario execution.
372373
blocked_by: []
373374
- id: tillm.bridge_cleanup
374375
order: 90

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "koru-autopilot-plugins-workspace",
3-
"version": "0.1.434",
3+
"version": "0.1.435",
44
"private": true,
55
"description": "Monorepo root for all koru autopilot IDE plugins. Each IDE has its own VSIX so a regression in one cannot leak into another. Shared code (protocol, socket, host-click-submit) lives in plugins/koru-autopilot-shared and is copied into per-IDE plugins at prebuild time.",
66
"workspaces": [

pyproject.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "koru"
7-
version = "0.1.434"
7+
version = "0.1.435"
88
description = "Closed-loop automation across semcod/* repositories."
99
readme = "README.md"
1010
requires-python = ">=3.12,<3.14"
@@ -52,7 +52,7 @@ desktop = [
5252
"nlp2uri[envmap]>=0.4.7",
5353
"env2llm[mqtt]>=0.1.14",
5454
"planfile>=0.1.116",
55-
"testql>=1.2.55",
55+
"testql>=1.2.62",
5656
]
5757
imgl = [
5858
"httpx>=0.27,<1.0",
@@ -62,7 +62,7 @@ envmap = [
6262
"env2llm[mqtt]>=0.1.14",
6363
]
6464
testql = [
65-
"testql>=1.2.55",
65+
"testql>=1.2.62",
6666
]
6767
# The queue loop shells out to `planfile`; without this extra the resolver
6868
# can end up with no usable planfile anywhere and every cycle dies with
@@ -76,7 +76,7 @@ curllm = [
7676
browser = [
7777
"nlp2uri[envmap]>=0.4.7",
7878
"env2llm[mqtt]>=0.1.14",
79-
"testql>=1.2.55",
79+
"testql>=1.2.62",
8080
"curllm[mcp]>=1.0.0",
8181
"playwright>=1.40,<2.0",
8282
]
@@ -191,7 +191,7 @@ all = [
191191
"nlp2uri[envmap]>=0.4.7",
192192
"planfile>=0.1.116",
193193
"playwright>=1.40,<2.0",
194-
"testql>=1.2.55",
194+
"testql>=1.2.62",
195195
"vdisplay>=0.1.58",
196196
]
197197

src/koru/deps_autorepair.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"env2llm": "env2llm[mqtt]>=0.1.14",
1414
"vdisplay": "vdisplay>=0.1.58",
1515
"nlp2uri": "nlp2uri[envmap]>=0.4.7",
16-
"testql": "testql>=1.2.55",
16+
"testql": "testql>=1.2.62",
1717
"gillm": "gillm>=0.1.24",
1818
"yaml": "pyyaml>=6.0,<7.0",
1919
"pytesseract": "pytesseract>=0.3.10",
@@ -25,7 +25,7 @@
2525
"desktop": [
2626
"nlp2uri[envmap]>=0.4.7",
2727
"env2llm[mqtt]>=0.1.14",
28-
"testql>=1.2.55",
28+
"testql>=1.2.62",
2929
],
3030
"vdisplay": ["vdisplay>=0.1.58"],
3131
"vision": ["Pillow>=10.0", "pytesseract>=0.3.10"],

0 commit comments

Comments
 (0)