1
0
Fork 0
Code Issues Pull requests Projects Releases 2 Packages Wiki Activity Actions Pages

Close Milestone 4 with adapter adoption evidence

This commit is contained in:
Andraxion 2026-07-29 15:34:25 -04:00
parent 95271dcf2e
commit 6d06195950
27 changed files with 2870 additions and 325 deletions

View file

@ -42,6 +42,14 @@ make benchmark-m3
make benchmark-m3-full
```
Run the Milestone 4 adapter SDK smoke, maintained full, and fresh-wheel adoption gates:
```bash
make benchmark-m4-smoke
make benchmark-m4-full
make adoption-m4
```
The benchmark creates canonical sources, derived state, changesets, rendered output, and caches
only in a disposable temporary directory. It does not read another project, self-host DocForge, or
mutate repository content.
@ -71,6 +79,13 @@ sweeps, add/change/delete/reorder equivalence, portable publication, receipt-onl
memory, detached worker peak memory, and response size. Its interpretation is in
[`docs/MILESTONE_3_BASELINE.md`](../docs/MILESTONE_3_BASELINE.md).
`milestone4-2026-07-29.json` is the clean-tree adapter SDK and reference-Python baseline captured
from commit `95271dcf2e48045b9d3aed9b9ea09c7fc155692c`. It measures cold and warm
incremental builds, complete/incremental graph-plus-Logic equivalence, corrupt extraction-cache
recovery, corrupt-index recovery, parser and extraction counters, traced and process memory, and
bounded response size. Its interpretation is in
[`docs/MILESTONE_4_BASELINE.md`](../docs/MILESTONE_4_BASELINE.md).
The generic fixtures expose whole-source and projection scaling. They do not replace incremental
adapter equivalence tests. Milestone 3's portable fixture contains 1,000 Nodes/Flow/Web nodes and
999 edges; portable version 1 deliberately excludes Logic.
@ -89,4 +104,5 @@ backlinks, both traversal directions, paged context, render receipt states, and
freshness. The reported p95 uses the nearest-rank method; with ten samples it is the maximum.
`process_peak_rss_kib` is the cumulative main-process `RUSAGE_SELF` high-water mark and excludes the
detached viewer worker. It is diagnostic and not operation-local. Milestone 3 memory gates use
per-operation `tracemalloc` peaks and detached worker receipt peaks instead.
per-operation `tracemalloc` peaks and detached worker receipt peaks instead. Milestone 4 uses
per-operation `tracemalloc` peaks and a cumulative benchmark-process high-water gate.

View file

@ -0,0 +1,205 @@
{
"benchmark": "docforge2_milestone4",
"environment": {
"implementation": "CPython",
"machine": "x86_64",
"platform": "Linux-7.1.3-200.nobara.fc44.x86_64-x86_64-with-glibc2.43",
"python": "3.14.6"
},
"evidence": {
"cache_recovery_exact": true,
"complete_assembly_hash": "2888182ab765fbffe3ba873c1613345640e8e6d89be74ddfca7452c0a5056345",
"edge_count": 1001,
"edge_hash": "00cc90998b6783afc8c9d1fd900409e5e3ba352868c4ba30e9bb2cbd59c52d35",
"full_incremental_graph_and_logic_exact": true,
"index_recovery_exact": true,
"logic_edge_count": 2338,
"logic_hash": "c86a3ae74777c2cec3a82c83e6e5bcca0196772ccea63cb13340fa9141593b0c",
"logic_node_count": 2338,
"logic_projection_count": 334,
"node_count": 1002,
"node_hash": "f7705dedf8dd388857a20d11f459dc74de797bcd12d3ed36e7f3aa75d67c328f",
"source_count": 334,
"source_hash": "30ef23aa41061de2d4a7c995fe109d7a41518d9ee5493d805dd256581b47dae2",
"warm_zero_ast_parse": true,
"warm_zero_source_extraction": true
},
"evidence_sha256": "4a8db461a311b5df4abd5aa00063e9a347d8b9dba19b30e35684f561d5271549",
"fixture": {
"expected_node_count": 1002,
"kind": "synthetic_python_reference_adapter",
"nodes_per_source": 3,
"source_count": 334
},
"memory": {
"process_peak_bytes": 78798848,
"process_peak_limit_bytes": 536870912
},
"method": {
"ast_instrumentation": "temporary counter around stdlib ast.parse",
"clock": "time.perf_counter_ns",
"extraction_instrumentation": "reference adapter extract_source entry counter",
"full_mode_source_requirement": 334,
"in_process_peak_memory": "tracemalloc per measured invocation",
"process_peak_memory": "resource.getrusage(RUSAGE_SELF).ru_maxrss",
"response_size": "UTF-8 bytes of compact sorted JSON",
"samples": 3,
"threshold_basis": "Regression tripwires leave several times the Milestone 3 1,000-node allowances for AST, Logic, extraction-cache, and SQLite work."
},
"mode": "full",
"operations": {
"cold_incremental_build": {
"max_ms": 1599.76,
"maximum_response_bytes": 14580,
"maximum_traced_peak_bytes": 68573540,
"median_ms": 1599.76,
"min_ms": 1599.76,
"p95_limit_ms": 30000.0,
"p95_ms": 1599.76,
"response_limit_bytes": 262144,
"samples": 1,
"stable_result": {
"ast_parse_calls": 668,
"cache_hits": 0,
"deleted_sources": 0,
"edge_count": 1001,
"edge_hash": "00cc90998b6783afc8c9d1fd900409e5e3ba352868c4ba30e9bb2cbd59c52d35",
"extraction_calls": 334,
"invalidated_sources": 334,
"logic_edge_count": 2338,
"logic_hash": "c86a3ae74777c2cec3a82c83e6e5bcca0196772ccea63cb13340fa9141593b0c",
"logic_node_count": 2338,
"logic_projection_count": 334,
"node_count": 1002,
"node_hash": "f7705dedf8dd388857a20d11f459dc74de797bcd12d3ed36e7f3aa75d67c328f",
"reparsed_sources": 334,
"revision": "30ef23aa4106",
"source_hash": "30ef23aa41061de2d4a7c995fe109d7a41518d9ee5493d805dd256581b47dae2",
"status": "ok",
"total_sources": 334
},
"traced_peak_limit_bytes": 268435456
},
"corrupt_extraction_cache_recovery": {
"max_ms": 1695.406,
"maximum_response_bytes": 14580,
"maximum_traced_peak_bytes": 69776923,
"median_ms": 1695.406,
"min_ms": 1695.406,
"p95_limit_ms": 30000.0,
"p95_ms": 1695.406,
"response_limit_bytes": 262144,
"samples": 1,
"stable_result": {
"ast_parse_calls": 668,
"cache_hits": 0,
"deleted_sources": 0,
"edge_count": 1001,
"edge_hash": "00cc90998b6783afc8c9d1fd900409e5e3ba352868c4ba30e9bb2cbd59c52d35",
"extraction_calls": 334,
"invalidated_sources": 334,
"logic_edge_count": 2338,
"logic_hash": "c86a3ae74777c2cec3a82c83e6e5bcca0196772ccea63cb13340fa9141593b0c",
"logic_node_count": 2338,
"logic_projection_count": 334,
"node_count": 1002,
"node_hash": "f7705dedf8dd388857a20d11f459dc74de797bcd12d3ed36e7f3aa75d67c328f",
"reparsed_sources": 334,
"revision": "30ef23aa4106",
"source_hash": "30ef23aa41061de2d4a7c995fe109d7a41518d9ee5493d805dd256581b47dae2",
"status": "ok",
"total_sources": 334
},
"traced_peak_limit_bytes": 268435456
},
"corrupt_index_recovery": {
"max_ms": 1707.879,
"maximum_response_bytes": 14779,
"maximum_traced_peak_bytes": 68561924,
"median_ms": 1707.879,
"min_ms": 1707.879,
"p95_limit_ms": 30000.0,
"p95_ms": 1707.879,
"response_limit_bytes": 262144,
"samples": 1,
"stable_result": {
"action": "rebuilt",
"ast_parse_calls": 0,
"cache_hits": 334,
"edge_count": 1001,
"edge_hash": "00cc90998b6783afc8c9d1fd900409e5e3ba352868c4ba30e9bb2cbd59c52d35",
"extraction_calls": 0,
"initial_error_code": "invalid_index",
"logic_hash": "c86a3ae74777c2cec3a82c83e6e5bcca0196772ccea63cb13340fa9141593b0c",
"logic_projection_count": 334,
"node_count": 1002,
"node_hash": "f7705dedf8dd388857a20d11f459dc74de797bcd12d3ed36e7f3aa75d67c328f",
"reparsed_sources": 0,
"revision": "30ef23aa4106",
"source_hash": "30ef23aa41061de2d4a7c995fe109d7a41518d9ee5493d805dd256581b47dae2",
"status": "ok"
},
"traced_peak_limit_bytes": 268435456
},
"full_incremental_equivalence": {
"max_ms": 1897.919,
"maximum_response_bytes": 230,
"maximum_traced_peak_bytes": 64305919,
"median_ms": 1897.919,
"min_ms": 1897.919,
"p95_limit_ms": 30000.0,
"p95_ms": 1897.919,
"response_limit_bytes": 262144,
"samples": 1,
"stable_result": {
"ast_parse_calls": 1336,
"edge_count": 1001,
"extraction_calls": 668,
"logic_projection_count": 334,
"node_count": 1002,
"project_id": "milestone4-python-benchmark",
"revision": "30ef23aa4106",
"source_hash": "30ef23aa41061de2d4a7c995fe109d7a41518d9ee5493d805dd256581b47dae2",
"status": "ok"
},
"traced_peak_limit_bytes": 268435456
},
"warm_incremental_build": {
"max_ms": 1265.387,
"maximum_response_bytes": 14578,
"maximum_traced_peak_bytes": 69997166,
"median_ms": 1244.427,
"min_ms": 1239.941,
"p95_limit_ms": 20000.0,
"p95_ms": 1265.387,
"response_limit_bytes": 262144,
"samples": 3,
"stable_result": {
"ast_parse_calls": 0,
"cache_hits": 334,
"deleted_sources": 0,
"edge_count": 1001,
"edge_hash": "00cc90998b6783afc8c9d1fd900409e5e3ba352868c4ba30e9bb2cbd59c52d35",
"extraction_calls": 0,
"invalidated_sources": 0,
"logic_edge_count": 2338,
"logic_hash": "c86a3ae74777c2cec3a82c83e6e5bcca0196772ccea63cb13340fa9141593b0c",
"logic_node_count": 2338,
"logic_projection_count": 334,
"node_count": 1002,
"node_hash": "f7705dedf8dd388857a20d11f459dc74de797bcd12d3ed36e7f3aa75d67c328f",
"reparsed_sources": 0,
"revision": "30ef23aa4106",
"source_hash": "30ef23aa41061de2d4a7c995fe109d7a41518d9ee5493d805dd256581b47dae2",
"status": "ok",
"total_sources": 334
},
"traced_peak_limit_bytes": 268435456
}
},
"schema_version": 1,
"source": {
"dirty": false,
"revision": "95271dcf2e48045b9d3aed9b9ea09c7fc155692c"
}
}