You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Is your feature request related to a problem? Please describe.
A new codeanalyzer-python release (v1.3.0) is published. Update the codeanalyzer-python pin in this repo and adapt the integration to the changes below (see PyCodeanalyzer._run_analyzer).
Describe the solution you'd like
Not stated in the original issue.
Describe alternatives you've considered
Not stated in the original issue.
Additional context
[1.3.0] - 2026-08-29
Added
Schema v2 now captures non-code artifacts (application.artifacts), declared dependencies with provenance (application.dependencies), and undeclared imports (application.unresolved_imports) at every analysis level (feat: add per-variable field initializers from codeanalyzer 2.3.8 #157). Neo4j gains language-neutral :Artifact/:Package nodes (purl ids) joined to the existing :PyExternal ghosts. New flag: --resolve-installed. Lockfile-only (transitive) pins are emitted as direct: false dependency records attributed to the lock artifact (Python analysis parity with Java (codeanalyzer-python backend) #152 reconciliation).
Artifact discovery never drops a file: every non-.py file is now inventoried, matched or not (unmatched decodable files as text/unknown, anything not UTF-8 decodable as binary with empty source). New PyArtifact.text_truncated field plus --artifact-text/--no-artifact-text and --artifact-text-max-bytes flags control verbatim source capture; sha256/size_bytes always reflect the full file regardless (feat: add per-variable field initializers from codeanalyzer 2.3.8 #157).
The release workflow now also stages schema.cypher (the same Neo4j schema contract as runnable, ;-terminated Cypher DDL -- uniqueness constraints plus indexes) as a GitHub Release asset alongside schema.json.
Configuration keys extracted as first-class ConfigKey nodes from six v1 formats (.env, yaml, json, toml, ini, properties), with reference recognition and DEFINES_CONFIG Neo4j projection; namespace discriminators per format (Python analysis parity with Java (codeanalyzer-python backend) #152).
PY_USES_CONFIG edges from call sites to the ConfigKey they read, resolved in three deterministic tiers: literal keys at -a 2, single-literal def-use chains at -a 3, interprocedural parameter-passing chains at -a 4. Unresolved reads (non-literal keys, undefined keys) emitted in application.config_reads_unresolved with reasons; PY_READS_CONFIG_UNRESOLVED Neo4j projection (Source all codeanalyzer-* from PyPI; kill bundled bin/jar dirs #162).
Deployment-env config-key namespaces: Dockerfile ENV/ARG directives (multi-key, legacy space form, backslash continuations, quoted values) and compose/k8s environment/env shapes are now extracted too. ENV and compose/k8s environment/env entries mint namespace env, so os.environ/os.getenv reads resolve against deployment-declared variables; Dockerfile ARG mints its own dockerfile namespace (build-time only, not env-detector-bindable). Compose/k8s recognition dual-mints alongside the plain yaml dotted-path keys, by design (Read-only Python Neo4j backend, per-language factory facade & typed backend configs (#160–#164) #165).
The release workflow also ships the analyzing-canpy-graphs skill as versioned assets: analyzing-canpy-graphs-skill.tar.gz (SKILL.md plus the vocabulary and analyses references, Cypher-only) and the standalone SKILL.md, staged next to schema.json/schema.cypher.
Call arguments carry literal evidence: PyCallArgument.value (JSON-encoded constants) and PyCallArgument.name (bare identifiers) at every level.
Fixed
The SDG builder resolves callsites from L2-backfilled body callees (the deterministic linker-backed path) instead of Jedi's cache-sensitive callee_signature side channel, and the shared dataflow test fixtures build at level 2 -- removing a full-suite-only order dependence.
Is your feature request related to a problem? Please describe.
A new
codeanalyzer-pythonrelease (v1.3.0) is published. Update thecodeanalyzer-pythonpin in this repo and adapt the integration to the changes below (seePyCodeanalyzer._run_analyzer).Describe the solution you'd like
Not stated in the original issue.
Describe alternatives you've considered
Not stated in the original issue.
Additional context
[1.3.0] - 2026-08-29
Added
application.artifacts), declared dependencies with provenance (application.dependencies), and undeclared imports (application.unresolved_imports) at every analysis level (feat: add per-variable field initializers from codeanalyzer 2.3.8 #157). Neo4j gains language-neutral:Artifact/:Packagenodes (purl ids) joined to the existing:PyExternalghosts. New flag:--resolve-installed. Lockfile-only (transitive) pins are emitted asdirect: falsedependency records attributed to the lock artifact (Python analysis parity with Java (codeanalyzer-python backend) #152 reconciliation)..pyfile is now inventoried, matched or not (unmatched decodable files astext/unknown, anything not UTF-8 decodable asbinarywith emptysource). NewPyArtifact.text_truncatedfield plus--artifact-text/--no-artifact-textand--artifact-text-max-bytesflags control verbatimsourcecapture;sha256/size_bytesalways reflect the full file regardless (feat: add per-variable field initializers from codeanalyzer 2.3.8 #157).schema.cypher(the same Neo4j schema contract as runnable,;-terminated Cypher DDL -- uniqueness constraints plus indexes) as a GitHub Release asset alongsideschema.json.ConfigKeynodes from six v1 formats (.env,yaml,json,toml,ini,properties), with reference recognition andDEFINES_CONFIGNeo4j projection; namespace discriminators per format (Python analysis parity with Java (codeanalyzer-python backend) #152).PY_USES_CONFIGedges from call sites to theConfigKeythey read, resolved in three deterministic tiers: literal keys at-a 2, single-literal def-use chains at-a 3, interprocedural parameter-passing chains at-a 4. Unresolved reads (non-literal keys, undefined keys) emitted inapplication.config_reads_unresolvedwith reasons;PY_READS_CONFIG_UNRESOLVEDNeo4j projection (Source all codeanalyzer-* from PyPI; kill bundled bin/jar dirs #162).ENV/ARGdirectives (multi-key, legacy space form, backslash continuations, quoted values) and compose/k8senvironment/envshapes are now extracted too.ENVand compose/k8senvironment/enventries mint namespaceenv, soos.environ/os.getenvreads resolve against deployment-declared variables; DockerfileARGmints its owndockerfilenamespace (build-time only, not env-detector-bindable). Compose/k8s recognition dual-mints alongside the plainyamldotted-path keys, by design (Read-only Python Neo4j backend, per-language factory facade & typed backend configs (#160–#164) #165).analyzing-canpy-graphsskill as versioned assets:analyzing-canpy-graphs-skill.tar.gz(SKILL.md plus the vocabulary and analyses references, Cypher-only) and the standaloneSKILL.md, staged next toschema.json/schema.cypher.PyCallArgument.value(JSON-encoded constants) andPyCallArgument.name(bare identifiers) at every level.Fixed
callee_signatureside channel, and the shared dataflow test fixtures build at level 2 -- removing a full-suite-only order dependence.