Scan complete
observation_complete
All source files under shop were read and parsed; no source file beside them was read.
observation_complete
All source files under shop were read and parsed; no source file beside them was read.
declared_rules
At least one declared rule was violated.
expectation_fulfilled
Report mode does not evaluate a published expectation.
One repository snapshot. This report checks declared rules, not change against an earlier revision or runtime behavior. 4 recorded analysis limits; 7 of 59 calls unresolved. These counts are not declared-rule violations.
None.
In the component diagram, connections show observed imports and which components depend on each other. Select a component or connection for details; double-click, press Enter, or use Open selected to explore one level. A circle marks a provided interface; a socket marks a declared dependency. Arrows point from importer to provider. Teal means the displayed imports were checked with no violation or relevant UNKNOWN; red means a rule fails, amber means a decision is needed, and grey shows imports within a component. Unassigned modules and physical folders are navigation only; they do not create component boundaries or owners. UNKNOWN findings remain in the report's evidence sections; Details shows evidence for the selected item. The Actual view lists observed modules. Target connections show declarations, not observed imports or execution order. Diff keeps violations, UNKNOWN evidence, unmapped modules, and absent targets distinct. The import evidence below works without JavaScript.
| ID | Kind | Rule | Finding | Subjects | Evidence / baseline |
|---|---|---|---|---|---|
| Rules: store:STORE-REQUIRES-COMPLETE · 1 findings | |||||
VIO-2f1332f55134b2c2 FAIL | complete_requires | store:STORE-REQUIRES-COMPLETE | backend imports repository without requiring it | shop.store.backend.probe · shop.store.repository | shop/store/backend/probe.py:1 |
PASS requires evidence that this rule was checked. Permissions define allowed paths; they are not checks. FAIL may also include undecided evidence.
| Rule | Kind | Status | Violations / undecided | Details |
|---|---|---|---|---|
APP-TYPES-NOT-DICT | boundary_types | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
ASSIGNMENT-COMPLETE | complete_assignment | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
COMPONENT-NO-CYCLES | no_component_cycles | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
CONSTRUCT-NO-ANY | forbidden_construct | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
CONSTRUCT-NO-ASSERT | forbidden_construct | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
CONSTRUCT-NO-BROAD-EXCEPT | forbidden_construct | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
CONSTRUCT-NO-DYNAMIC | forbidden_construct | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
CONSTRUCT-NO-PLACEHOLDER | forbidden_construct | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
CONSTRUCT-NO-STRING-LITERAL-COMPARE | forbidden_construct | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-APP-ALLOWS-MODEL | allowed_dependency | DECLARATION | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-APP-ALLOWS-STORE | allowed_dependency | DECLARATION | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-APP-NO-CLI | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-APP-NO-RENDER | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-APP-NO-STORE-BACKEND | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-APP-NO-STORE-SQLITE | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-CLI-ALLOWS-APP | allowed_dependency | DECLARATION | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-CLI-ALLOWS-RENDER | allowed_dependency | DECLARATION | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-CLI-NO-MODEL | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-CLI-NO-STORE | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-MODEL-NO-APP | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-MODEL-NO-CLI | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-MODEL-NO-RENDER | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-MODEL-NO-STORE | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-RENDER-ALLOWS-MODEL | allowed_dependency | DECLARATION | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-RENDER-NO-APP | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-RENDER-NO-CLI | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-RENDER-NO-STORE | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-STORE-ALLOWS-MODEL | allowed_dependency | DECLARATION | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-STORE-NO-APP | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-STORE-NO-CLI | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-STORE-NO-MONEY | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
DEP-STORE-NO-RENDER | forbidden_dependency | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
EXTERNAL-COMPLETE | complete_external_scope | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
EXTERNAL-JSON-STORE | external_dependency_scope | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
INTERFACE-BOUNDARY | interface_boundary | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
MODEL-TYPES-IN-ENTITIES | symbol_placement | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
ROOT-LAYOUT | root_layout | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
STORE-PEERS-ISOLATED | sibling_isolation | PASS | 0 violations · 0 undecided | Scope, decision and evidence
|
store:STORE-REQUIRES-COMPLETE | complete_requires | FAIL | 1 violations · 0 undecided | Scope, decision and evidence
|
Observed imports, not runtime calls or proof of a declared public interface.
app → model3 imported namesshop.model.entities:Line dataclassshop.model.entities:Money dataclassshop.model.entities:Order dataclassapp → store3 imported namesshop.store.sqlite:Connection dataclassshop.store.sqlite:vacuum function (connection: Connection) → Noneshop.store:OrderRepository classcli → app1 imported namesshop.app.orders:place_order function (store_dir: Path, order_id: str, description: str, quantity: int, unit_price_cents: int) → Ordercli → render1 imported namesshop.render.text:render_order function (order: Order) → strrender → model1 imported namesshop.model.entities:Order dataclassstore → model2 imported namesshop.model.entities:Order dataclassshop.model.entities:OrderPayload classObserved from declared facades and imports: exported-name count, re-exports, names
defined in the facade, unused re-exports, consumers per exported name and coupling width.
They do not claim a barrel is complete (AD-88); validate holds declared
facade and coupling budgets to them (AD-99).
| Component | Module | Exports | Re-exports | Defined | Unused re-exports |
|---|---|---|---|---|---|
app | shop.app.orders | 1 | 0 | place_order | — |
model | shop.model.entities | 5 | 0 | Line, LinePayload, Money, Order, OrderPayload | — |
render | shop.render.text | 1 | 0 | render_order | — |
store | shop.store.repository | 1 | 0 | OrderRepository | — |
store | shop.store.sqlite | 2 | 0 | Connection, vacuum | — |
| Component | Export | Consumers | Components |
|---|---|---|---|
app | shop.app.orders:place_order | 1 | cli |
model | shop.model.entities:Line | 1 | app |
model | shop.model.entities:LinePayload | 0 | — |
model | shop.model.entities:Money | 1 | app |
model | shop.model.entities:Order | 3 | app, render, store |
model | shop.model.entities:OrderPayload | 1 | store |
render | shop.render.text:render_order | 1 | cli |
store | shop.store.repository:OrderRepository | 1 | app |
store | shop.store.sqlite:Connection | 1 | app |
store | shop.store.sqlite:vacuum | 1 | app |
| Component pair | Distinct names | Names |
|---|---|---|
app → model | 3 | shop.model.entities:Line, shop.model.entities:Money, shop.model.entities:Order |
app → store | 3 | shop.store.repository:OrderRepository, shop.store.sqlite:Connection, shop.store.sqlite:vacuum |
cli → app | 1 | shop.app.orders:place_order |
cli → render | 1 | shop.render.text:render_order |
render → model | 1 | shop.model.entities:Order |
store → model | 2 | shop.model.entities:Order, shop.model.entities:OrderPayload |
Recorded analysis limits, not declared-rule violations.
| Fingerprint | Finding | Subjects | Evidence |
|---|---|---|---|
UNKNOWN-BOUNDARY-TYPE-POSITION-6f4acc9ca5130f7b | shop.app.orders.place_order store_dir: external_type | shop.app · shop.app.orders · shop.app.orders.place_order | shop/app/orders.py:18 |
UNKNOWN-BOUNDARY-TYPES-d4c18ad1fb20590a | APP-TYPES-NOT-DICT decided 5 of 6 declared facade type positions | shop.app | |
UNKNOWN-CONTEXT-DATAFLOW | Context read/write topology excludes unproven dynamic aliases | shop | |
UNKNOWN-PYTHON-DYNAMIC-CALLS | Python dynamic behavior prevents a complete call graph | shop | |
| Measurement | Value |
|---|---|
violations | 1 |
cycle_edges | 0 |
private_crossings | 0 |
typing_positions | 0 |
calls_unresolved | 7 |
coverage_failures | 0 |
untyped_private_accesses | 0 |
unknown_positions | 0 |
calls_total | 59 |
unresolved_ratio | 7/59 |
| Coverage dimension | Evidence |
|---|---|
| Status | PASS |
| Rules coverage | PASS |
| Files discovered | 13 |
| Files read | 13 |
| Files parsed | 13 |
| AST coverage | 13/13 |
| Calls resolved | 42/59 (71.19%) |
| Calls partially resolved | 10 |
| Calls unresolved | 7 |
Measured per component and per package: how many modules a scope holds, how many imports stay inside it, how many cross its edge, and how many of its calls the analyzer could not resolve. These numbers are shown, never gated on.
| Scope | Level | Modules | Inside | Incoming | Outgoing | Unresolved calls |
|---|---|---|---|---|---|---|
app | component | 2 | 0 | 1 | 4 | 3 of 9 |
cli | component | 1 | 0 | 0 | 2 | 0 of 6 |
model | component | 1 | 0 | 4 | 0 | 2 of 15 |
render | component | 1 | 0 | 1 | 1 | 0 of 6 |
store | component | 8 | 7 | 3 | 2 | 2 of 23 |
shop | package | 1 | 0 | 1 | 1 | no calls |
shop.app | package | 2 | 0 | 1 | 4 | 3 of 9 |
shop.cli | package | 1 | 0 | 0 | 2 | 0 of 6 |
shop.model | package | 1 | 0 | 4 | 0 | 2 of 15 |
shop.render | package | 1 | 0 | 1 | 1 | 0 of 6 |
shop.store | package | 4 | 3 | 4 | 4 | 1 of 15 |
shop.store.backend | package | 3 | 0 | 2 | 1 | 1 of 8 |
9 of 41 symbols are named by no call, reference or import inside the scan scope; 4 were set aside as runtime dispatch or declared interface. A consumer outside the scan scope, such as a test, is invisible here, and 7 of 59 calls stay unresolved, so these are candidates for review, never a verdict.
| Symbol | Kind | Visibility |
|---|---|---|
shop.app.maintenance.run_maintenance | function | public_name |
shop.app.orders.describe_connection | function | public_name |
shop.app.orders.summarize | function | public_name |
shop.cli.main.main | function | public_name |
shop.model.entities.Discount | class | public_name |
shop.model.entities.Discount.apply | method | public_name |
shop.store.backend.probe.REPOSITORY_TYPE | type_alias | public_name |
shop.store.repository.OrderRepository.load | method | public_name |
shop.store.repository.OrderRepository.save | method | public_name |
1 components hold more modules than the contract has components, or more edges among their modules than it has component edges. The top level holds 5 components and 6 edges between them. Naming a size is evidence; giving one of them a level of its own is a decision (AD-20, AD-33).
| Component | Modules | Edges inside |
|---|---|---|
| store | 8 | 7 |
None recorded: no unread-binding candidates across 28 functions and methods. This does not establish that every unlisted binding is read; removal safety is not assessed.
None: across 28 functions and methods, nothing outside the 1 declared owners repeats the structure of anything inside them.
2 of 10 annotated positions on functions and methods crossing a component boundary name a type passed across 2 or more distinct component pairs. A broad context or a service locator shows up as a wide count here; what it means is the architect's to decide, never a verdict.
| Type | Component pairs |
|---|---|
Order | 2 |
str | 2 |
Open canonical architecture.json. The JSON remains the source for complete records and evidence.
| Scan section | Records |
|---|---|
metrics | 18 |
declarations | 58 |
scope_observations | 39 |
packages | 5 |
modules | 13 |
symbols | 41 |
imports | 51 |
dependency_edges | 22 |
transitive_paths | 2 |
path_observations | 3 |
cycles | 0 |
calls | 59 |
references | 36 |
bindings | 0 |
typing_signals | 0 |
constructs | 1 |
contexts | 1 |
context_evidence | 0 |
violations | 1 |
unknowns | 4 |
shopappmaintenanceordersclimainmodelentitiesrendertextstorebackendfilespathsprobecodecrepositorysqlite| Command | report |
|---|---|
| Exit code | 0 |
| Analyzer | archkeel-python-analyzer 0.63.0 |
| Analyzer digest | c2e05f4ac71d3bb4c5e4ada3f5f225f0f7080762fda5695c94589ad8f474cc18 |
| Python | 3.11.12 |
| Contract | architecture-contract.json |
| Contract digest | 1d60193ae8e2aa143c01255b1d08d81dd7e7708a85cbc1878a878a6bbf1b9521 |