Skip to content

Commit 16e765a

Browse files
committed
chore(release): 1.0.1
Deterministic-output batch (#101) released as a patch. Handoff goldens regenerated against the shipping emitter — the 1.0.0 bundle predated the v0.3.1 reconciliation merge, so it lacked the envelope analyzer.config, structured call-site arguments, and the callee-anchoring improvements the released binary actually emits; the bundle now round-trips 1.0.1 exactly (and reproducibly, courtesy of #101 itself).
1 parent 6fea370 commit 16e765a

8 files changed

Lines changed: 177 additions & 78 deletions

File tree

CHANGELOG.md

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

88
## [Unreleased]
99

10+
## [1.0.1] - 2026-07-15
11+
1012
### Fixed
1113
- **Deterministic output** (#99): the same flags on the same input now emit byte-identical
1214
`analysis.json`. Four independent nondeterminism sources were closed:

docs/handoff/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ the contract lives in the spec, the decision log, and `schema.neo4j.json`.
1313
Pin the analyzer that produced these samples:
1414

1515
```
16-
pip install "codeanalyzer-python==1.0.0"
16+
pip install "codeanalyzer-python==1.0.1"
1717
```
1818

1919
For L4 alias analysis (the Scalpel points-to oracle), install the optional extra —
2020
without it, L4 degrades to the type-based fallback oracle (still sound, coarser):
2121

2222
```
23-
pip install "codeanalyzer-python[scalpel]==1.0.0"
23+
pip install "codeanalyzer-python[scalpel]==1.0.1"
2424
```
2525

2626
## Schema contract

docs/handoff/analysis.l1.json

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
"max_level": 1,
55
"analyzer": {
66
"name": "codeanalyzer-python",
7-
"version": "1.0.0"
7+
"version": "1.0.1",
8+
"config": {
9+
"analysis_level": 1
10+
}
811
},
912
"application": {
1013
"symbol_table": {
@@ -162,7 +165,11 @@
162165
"argument_types": [
163166
"Name"
164167
],
165-
"return_type": "build",
168+
"arguments": [
169+
{
170+
"ast_kind": "Name"
171+
}
172+
],
166173
"callee_signature": "service.build",
167174
"is_constructor_call": false,
168175
"start_line": 6,
@@ -368,6 +375,7 @@
368375
{
369376
"method_name": "Service",
370377
"argument_types": [],
378+
"arguments": [],
371379
"return_type": "Service",
372380
"callee_signature": "service.Service.__init__",
373381
"is_constructor_call": true,
@@ -383,8 +391,13 @@
383391
"argument_types": [
384392
"Name"
385393
],
386-
"return_type": "Service",
387-
"callee_signature": "service.Service",
394+
"arguments": [
395+
{
396+
"ast_kind": "Name"
397+
}
398+
],
399+
"return_type": "str",
400+
"callee_signature": "service.Service.announce",
388401
"is_constructor_call": false,
389402
"start_line": 17,
390403
"start_column": 11,
@@ -459,24 +472,24 @@
459472
"kind": "application",
460473
"call_graph": [
461474
{
462-
"src": "can://python/sample_proj/service.py/run(flag)",
463-
"dst": "can://python/sample_proj/@external/service.Service/__init__",
475+
"src": "can://python/sample_proj/service.py/Service/announce(self,flag)",
476+
"dst": "can://python/sample_proj/service.py/build(x)",
464477
"weight": 1,
465478
"prov": [
466479
"jedi"
467480
]
468481
},
469482
{
470483
"src": "can://python/sample_proj/service.py/run(flag)",
471-
"dst": "can://python/sample_proj/service.py/Service",
484+
"dst": "can://python/sample_proj/@external/service.Service/__init__",
472485
"weight": 1,
473486
"prov": [
474487
"jedi"
475488
]
476489
},
477490
{
478-
"src": "can://python/sample_proj/service.py/Service/announce(self,flag)",
479-
"dst": "can://python/sample_proj/service.py/build(x)",
491+
"src": "can://python/sample_proj/service.py/run(flag)",
492+
"dst": "can://python/sample_proj/service.py/Service/announce(self,flag)",
480493
"weight": 1,
481494
"prov": [
482495
"jedi"

docs/handoff/analysis.l2.json

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
"max_level": 2,
55
"analyzer": {
66
"name": "codeanalyzer-python",
7-
"version": "1.0.0"
7+
"version": "1.0.1",
8+
"config": {
9+
"analysis_level": 2
10+
}
811
},
912
"application": {
1013
"symbol_table": {
@@ -162,7 +165,11 @@
162165
"argument_types": [
163166
"Name"
164167
],
165-
"return_type": "build",
168+
"arguments": [
169+
{
170+
"ast_kind": "Name"
171+
}
172+
],
166173
"callee_signature": "service.build",
167174
"is_constructor_call": false,
168175
"start_line": 6,
@@ -369,6 +376,7 @@
369376
{
370377
"method_name": "Service",
371378
"argument_types": [],
379+
"arguments": [],
372380
"return_type": "Service",
373381
"callee_signature": "service.Service.__init__",
374382
"is_constructor_call": true,
@@ -384,8 +392,13 @@
384392
"argument_types": [
385393
"Name"
386394
],
387-
"return_type": "Service",
388-
"callee_signature": "service.Service",
395+
"arguments": [
396+
{
397+
"ast_kind": "Name"
398+
}
399+
],
400+
"return_type": "str",
401+
"callee_signature": "service.Service.announce",
389402
"is_constructor_call": false,
390403
"start_line": 17,
391404
"start_column": 11,
@@ -443,7 +456,7 @@
443456
296
444457
]
445458
},
446-
"callee": "can://python/sample_proj/service.py/Service"
459+
"callee": "can://python/sample_proj/service.py/Service/announce(self,flag)"
447460
}
448461
},
449462
"cfg": [],
@@ -462,35 +475,28 @@
462475
"kind": "application",
463476
"call_graph": [
464477
{
465-
"src": "can://python/sample_proj/service.py/run(flag)",
466-
"dst": "can://python/sample_proj/@external/service.Service/__init__",
467-
"weight": 1,
478+
"src": "can://python/sample_proj/service.py/Service/announce(self,flag)",
479+
"dst": "can://python/sample_proj/service.py/build(x)",
480+
"weight": 2,
468481
"prov": [
469-
"jedi"
482+
"jedi",
483+
"pycg"
470484
]
471485
},
472486
{
473487
"src": "can://python/sample_proj/service.py/run(flag)",
474-
"dst": "can://python/sample_proj/service.py/Service",
488+
"dst": "can://python/sample_proj/@external/service.Service/__init__",
475489
"weight": 1,
476490
"prov": [
477491
"jedi"
478492
]
479493
},
480-
{
481-
"src": "can://python/sample_proj/service.py/Service/announce(self,flag)",
482-
"dst": "can://python/sample_proj/service.py/build(x)",
483-
"weight": 2,
484-
"prov": [
485-
"jedi",
486-
"pycg"
487-
]
488-
},
489494
{
490495
"src": "can://python/sample_proj/service.py/run(flag)",
491496
"dst": "can://python/sample_proj/service.py/Service/announce(self,flag)",
492-
"weight": 1,
497+
"weight": 2,
493498
"prov": [
499+
"jedi",
494500
"pycg"
495501
]
496502
}

docs/handoff/analysis.l3.json

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
"k_limit": 3,
66
"analyzer": {
77
"name": "codeanalyzer-python",
8-
"version": "1.0.0"
8+
"version": "1.0.1",
9+
"config": {
10+
"analysis_level": 3
11+
}
912
},
1013
"application": {
1114
"symbol_table": {
@@ -163,7 +166,11 @@
163166
"argument_types": [
164167
"Name"
165168
],
166-
"return_type": "build",
169+
"arguments": [
170+
{
171+
"ast_kind": "Name"
172+
}
173+
],
167174
"callee_signature": "service.build",
168175
"is_constructor_call": false,
169176
"start_line": 6,
@@ -637,6 +644,7 @@
637644
{
638645
"method_name": "Service",
639646
"argument_types": [],
647+
"arguments": [],
640648
"return_type": "Service",
641649
"callee_signature": "service.Service.__init__",
642650
"is_constructor_call": true,
@@ -652,8 +660,13 @@
652660
"argument_types": [
653661
"Name"
654662
],
655-
"return_type": "Service",
656-
"callee_signature": "service.Service",
663+
"arguments": [
664+
{
665+
"ast_kind": "Name"
666+
}
667+
],
668+
"return_type": "str",
669+
"callee_signature": "service.Service.announce",
657670
"is_constructor_call": false,
658671
"start_line": 17,
659672
"start_column": 11,
@@ -711,7 +724,7 @@
711724
296
712725
]
713726
},
714-
"callee": "can://python/sample_proj/service.py/Service"
727+
"callee": "can://python/sample_proj/service.py/Service/announce(self,flag)"
715728
},
716729
"@entry": {
717730
"kind": "entry"
@@ -838,35 +851,28 @@
838851
"kind": "application",
839852
"call_graph": [
840853
{
841-
"src": "can://python/sample_proj/service.py/run(flag)",
842-
"dst": "can://python/sample_proj/@external/service.Service/__init__",
843-
"weight": 1,
854+
"src": "can://python/sample_proj/service.py/Service/announce(self,flag)",
855+
"dst": "can://python/sample_proj/service.py/build(x)",
856+
"weight": 2,
844857
"prov": [
845-
"jedi"
858+
"jedi",
859+
"pycg"
846860
]
847861
},
848862
{
849863
"src": "can://python/sample_proj/service.py/run(flag)",
850-
"dst": "can://python/sample_proj/service.py/Service",
864+
"dst": "can://python/sample_proj/@external/service.Service/__init__",
851865
"weight": 1,
852866
"prov": [
853867
"jedi"
854868
]
855869
},
856-
{
857-
"src": "can://python/sample_proj/service.py/Service/announce(self,flag)",
858-
"dst": "can://python/sample_proj/service.py/build(x)",
859-
"weight": 2,
860-
"prov": [
861-
"jedi",
862-
"pycg"
863-
]
864-
},
865870
{
866871
"src": "can://python/sample_proj/service.py/run(flag)",
867872
"dst": "can://python/sample_proj/service.py/Service/announce(self,flag)",
868-
"weight": 1,
873+
"weight": 2,
869874
"prov": [
875+
"jedi",
870876
"pycg"
871877
]
872878
}

0 commit comments

Comments
 (0)