Architecture evidence report
Repository observation

F-architecture

Candidate 6c2989a12dd35cdc29b0ccafa8ec6166d43a3560 Source 107dff0e0ba5f55cf68dd2897d438088894433877fedce095d58c30dd3ceaac3 Dirty True

PASS

All requested deterministic checks completed.

Independent verdicts

PASS

Scan complete

observation_complete

All source files under shop were read and parsed; no source file beside them was read.

PASS

Rules followed

declared_rules

No declared-rule violation was found.

NOT APPLICABLE

Change as declared

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.

Check evidence

Failures

Diagnostics

None.

Component dependencies

How to read this report

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.

Declared-rule violations

None.

Declared rules · 39

PASS requires evidence that this rule was checked. Permissions define allowed paths; they are not checks. FAIL may also include undecided evidence.

RuleKindStatus Violations / undecidedDetails
APP-TYPES-NOT-DICTboundary_typesPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
shop.app's functions take and return typed models, never a bare dict standing in for one.
Provenance
docs/architecture/shop.md
Scope
root
Components
app
Assessment
The evaluator completed this rule's observed scope without violations.
ASSIGNMENT-COMPLETEcomplete_assignmentPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
A module without one owning component escapes every boundary rule.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
COMPONENT-NO-CYCLESno_component_cyclesPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Components stay layered so each one can be reviewed and replaced in dependency order.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
CONSTRUCT-NO-ANYforbidden_constructPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
A value that crosses a module boundary carries a type the reader can follow; Any hides exactly what the boundary exists to state.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
CONSTRUCT-NO-ASSERTforbidden_constructPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Invariants are checked where values are built, because assert statements vanish under python -O.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
CONSTRUCT-NO-BROAD-EXCEPTforbidden_constructPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Failures stay typed and visible; only the CLI error boundary, main's own body, turns any failure into an exit code.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
CONSTRUCT-NO-DYNAMICforbidden_constructPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Static architecture evidence remains explicit and mechanically traceable.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
CONSTRUCT-NO-PLACEHOLDERforbidden_constructPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
A function whose body is pass, ellipsis or a lone NotImplementedError reports capability it does not have, and its callers are written against that promise.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
CONSTRUCT-NO-STRING-LITERAL-COMPAREforbidden_constructPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
A closed vocabulary is an enum or Literal the type checker follows; a value compared with a string literal is a vocabulary nobody declared.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-APP-ALLOWS-MODELallowed_dependencyDECLARATION0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Use cases construct orders from domain values.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, model
Assessment
Permission declaration; it does not evaluate conformance.
DEP-APP-ALLOWS-STOREallowed_dependencyDECLARATION0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Use cases persist and load orders through the repository.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, store
Assessment
Permission declaration; it does not evaluate conformance.
DEP-APP-NO-CLIforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Use cases remain callable without command-line orchestration.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, cli
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-APP-NO-RENDERforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Use cases return typed values; only the composition root decides how to project them.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, render
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-APP-NO-STORE-BACKENDforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
The file layout behind the repository is the store's own business; use cases reach persistence through OrderRepository, never through its backend.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, backend, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-APP-NO-STORE-SQLITEforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Only the maintenance use case may run store housekeeping; ordinary order use cases stay on the repository.
Provenance
docs/architecture/shop.md
Scope
root
Components
api, app, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-CLI-ALLOWS-APPallowed_dependencyDECLARATION0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
The composition root invokes the order use cases.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, cli
Assessment
Permission declaration; it does not evaluate conformance.
DEP-CLI-ALLOWS-RENDERallowed_dependencyDECLARATION0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
The composition root prints the rendered order.
Provenance
docs/architecture/shop.md
Scope
root
Components
cli, render
Assessment
Permission declaration; it does not evaluate conformance.
DEP-CLI-NO-MODELforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
The composition root reaches domain values only through the use cases it calls.
Provenance
docs/architecture/shop.md
Scope
root
Components
cli, model
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-CLI-NO-STOREforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
The composition root reaches persistence only through the use cases it calls.
Provenance
docs/architecture/shop.md
Scope
root
Components
cli, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-MODEL-NO-APPforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Value types remain reusable without depending on the use cases that construct them.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, model
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-MODEL-NO-CLIforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Value types remain independent of command-line composition.
Provenance
docs/architecture/shop.md
Scope
root
Components
cli, model
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-MODEL-NO-RENDERforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Value types remain independent of how orders are projected as text.
Provenance
docs/architecture/shop.md
Scope
root
Components
model, render
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-MODEL-NO-STOREforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Order and Line value types stay independent of any persistence mechanism.
Provenance
docs/architecture/shop.md
Scope
root
Components
model, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-RENDER-ALLOWS-MODELallowed_dependencyDECLARATION0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Text projection reads the values it renders.
Provenance
docs/architecture/shop.md
Scope
root
Components
model, render
Assessment
Permission declaration; it does not evaluate conformance.
DEP-RENDER-NO-APPforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Text projection stays a pure view over values, not a caller of use cases.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, render
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-RENDER-NO-CLIforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Text projection remains reusable without command-line composition.
Provenance
docs/architecture/shop.md
Scope
root
Components
cli, render
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-RENDER-NO-STOREforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Text projection consumes typed values without touching persistence.
Provenance
docs/architecture/shop.md
Scope
root
Components
render, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-STORE-ALLOWS-MODELallowed_dependencyDECLARATION0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Persistence serialises the domain values it is given.
Provenance
docs/architecture/shop.md
Scope
root
Components
model, store
Assessment
Permission declaration; it does not evaluate conformance.
DEP-STORE-NO-APPforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Persistence stays a leaf dependency and never calls back into use cases.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-STORE-NO-CLIforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Persistence stays callable without command-line orchestration.
Provenance
docs/architecture/shop.md
Scope
root
Components
cli, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-STORE-NO-MONEYforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Persistence serialises whole orders and must not compute or interpret money amounts itself.
Provenance
docs/architecture/shop.md
Scope
root
Components
model, store
Assessment
The evaluator completed this rule's observed scope without violations.
DEP-STORE-NO-RENDERforbidden_dependencyPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Persistence remains independent of how orders are displayed.
Provenance
docs/architecture/shop.md
Scope
root
Components
render, store
Assessment
The evaluator completed this rule's observed scope without violations.
EXTERNAL-COMPLETEcomplete_external_scopePASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
A dependency no rule names is a dependency nobody chose, and a package that does not exist looks exactly the same from inside the code.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
EXTERNAL-JSON-STOREexternal_dependency_scopePASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Only the store component chooses the JSON file format; other components stay format-agnostic.
Provenance
docs/architecture/shop.md
Scope
root
Components
store
Assessment
The evaluator completed this rule's observed scope without violations.
INTERFACE-BOUNDARYinterface_boundaryPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Components communicate only through declared interfaces, so reaching into another component's internals requires a visible contract change.
Provenance
docs/architecture/shop.md
Scope
root
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.
MODEL-TYPES-IN-ENTITIESsymbol_placementPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Every order, line and money type shop.model owns lives in one module, not scattered across the package.
Provenance
docs/architecture/shop.md
Scope
root
Components
model
Assessment
The evaluator completed this rule's observed scope without violations.
ROOT-LAYOUTroot_layoutPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
The shop root exposes only its declared top-level components.
Provenance
docs/architecture/shop.md
Scope
root
Components
app, cli, model, render, store
Assessment
The evaluator completed this rule's observed scope without violations.
STORE-PEERS-ISOLATEDsibling_isolationPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Persistence and maintenance are peers behind the store's entry point, so neither reaches into the other.
Provenance
docs/architecture/shop.md
Scope
root
Components
api, repository, store
Assessment
The evaluator completed this rule's observed scope without violations.
store:STORE-REQUIRES-COMPLETEcomplete_requiresPASS0 violations · 0 undecided
Scope, decision and evidence
Decider
architect
Rationale
Inside the store the same principle holds as above it: an import nobody asked for is an accident, so each part names what it needs and absence refuses the rest.
Provenance
docs/architecture/shop.md
Scope
store
Components
—
Assessment
The evaluator completed this rule's observed scope without violations.

Cross-component imports

Observed imports, not runtime calls or proof of a declared public interface.

All 6 component pairs · 11 imported names
app → model3 imported names
  • shop.model.entities:Line dataclass
  • shop.model.entities:Money dataclass
  • shop.model.entities:Order dataclass
app → store3 imported names
  • shop.store.sqlite:Connection dataclass
  • shop.store.sqlite:vacuum function (connection: Connection) → None
  • shop.store:OrderRepository class
cli → app1 imported names
  • shop.app.orders:place_order function (store_dir: Path, order_id: str, description: str, quantity: int, unit_price_cents: int) → Order
cli → render1 imported names
  • shop.render.text:render_order function (order: Order) → str
render → model1 imported names
  • shop.model.entities:Order dataclass
store → model2 imported names
  • shop.model.entities:Order dataclass
  • shop.model.entities:OrderPayload class

Public API measurements

Observed 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).

Facades · 5
ComponentModule ExportsRe-exportsDefined Unused re-exports
appshop.app.orders10place_order—
modelshop.model.entities50Line, LinePayload, Money, Order, OrderPayload—
rendershop.render.text10render_order—
storeshop.store.repository10OrderRepository—
storeshop.store.sqlite20Connection, vacuum—
Export consumers · 10
ComponentExport ConsumersComponents
appshop.app.orders:place_order1cli
modelshop.model.entities:Line1app
modelshop.model.entities:LinePayload0—
modelshop.model.entities:Money1app
modelshop.model.entities:Order3app, render, store
modelshop.model.entities:OrderPayload1store
rendershop.render.text:render_order1cli
storeshop.store.repository:OrderRepository1app
storeshop.store.sqlite:Connection1app
storeshop.store.sqlite:vacuum1app
Coupling width · 6 pairs
Component pair Distinct namesNames
app → model3shop.model.entities:Line, shop.model.entities:Money, shop.model.entities:Order
app → store3shop.store.repository:OrderRepository, shop.store.sqlite:Connection, shop.store.sqlite:vacuum
cli → app1shop.app.orders:place_order
cli → render1shop.render.text:render_order
render → model1shop.model.entities:Order
store → model2shop.model.entities:Order, shop.model.entities:OrderPayload

Known unknowns · 4

Recorded analysis limits, not declared-rule violations.

Inspect all 4 records
FingerprintFindingSubjectsEvidence
UNKNOWN-BOUNDARY-TYPE-POSITION-6f4acc9ca5130f7bshop.app.orders.place_order store_dir: external_typeshop.app · shop.app.orders · shop.app.orders.place_ordershop/app/orders.py:18
UNKNOWN-BOUNDARY-TYPES-d4c18ad1fb20590aAPP-TYPES-NOT-DICT decided 5 of 6 declared facade type positionsshop.app
UNKNOWN-CONTEXT-DATAFLOWContext read/write topology excludes unproven dynamic aliasesshop
UNKNOWN-PYTHON-DYNAMIC-CALLSPython dynamic behavior prevents a complete call graphshop
More measurements and review claims

Measurements

MeasurementValue
violations0
cycle_edges0
private_crossings0
typing_positions0
calls_unresolved7
coverage_failures0
untyped_private_accesses0
unknown_positions0
calls_total59
unresolved_ratio7/59

Coverage

Coverage dimensionEvidence
StatusPASS
Rules coveragePASS
Files discovered12
Files read12
Files parsed12
AST coverage12/12
Calls resolved42/59 (71.19%)
Calls partially resolved10
Calls unresolved7

Size and coupling

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.

ScopeLevelModules InsideIncomingOutgoingUnresolved calls
appcomponent20143 of 9
clicomponent10020 of 6
modelcomponent10402 of 15
rendercomponent10110 of 6
storecomponent76322 of 23
shoppackage1011no calls
shop.apppackage20143 of 9
shop.clipackage10020 of 6
shop.modelpackage10402 of 15
shop.renderpackage10110 of 6
shop.storepackage43341 of 15
shop.store.backendpackage20201 of 8

Review claim: symbols nobody references

8 of 40 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.

SymbolKindVisibility
shop.app.maintenance.run_maintenancefunctionpublic_name
shop.app.orders.describe_connectionfunctionpublic_name
shop.app.orders.summarizefunctionpublic_name
shop.cli.main.mainfunctionpublic_name
shop.model.entities.Discountclasspublic_name
shop.model.entities.Discount.applymethodpublic_name
shop.store.repository.OrderRepository.loadmethodpublic_name
shop.store.repository.OrderRepository.savemethodpublic_name

Review claim: components larger than their level

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).

ComponentModules Edges inside
store76

Review candidates: unread parameters and locals

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.

Review claim: logic repeated outside its owner

None: across 28 functions and methods, nothing outside the 1 declared owners repeats the structure of anything inside them.

Review claim: types crossing the most component boundaries

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
Order2
str2

Complete scan inventory

Open canonical architecture.json. The JSON remains the source for complete records and evidence.

Scan sectionRecords
metrics18
declarations58
scope_observations39
packages5
modules12
symbols40
imports50
dependency_edges21
transitive_paths2
path_observations3
cycles0
calls59
references35
bindings0
typing_signals0
constructs1
contexts1
context_evidence0
violations0
unknowns4
Observed module tree · 12 modules
  • shop
    • app
      • maintenance
      • orders
    • cli
      • main
    • model
      • entities
    • render
      • text
    • store
      • backend
        • files
        • paths
      • codec
      • repository
      • sqlite

Reproduction metadata

Commandreport
Exit code0
Analyzerarchkeel-python-analyzer 0.63.0
Analyzer digestc2e05f4ac71d3bb4c5e4ada3f5f225f0f7080762fda5695c94589ad8f474cc18
Python3.11.12
Contractarchitecture-contract.json
Contract digest1d60193ae8e2aa143c01255b1d08d81dd7e7708a85cbc1878a878a6bbf1b9521