Core (System, layerId 0)
Updated
Purpose#
Core is the platform's system model: isSystem: true, layerId: 0, modelId: 00000000-0000-0000-0000-000000000000. Unlike the business modules on the Base/Solution/Customization layers, Core does not describe a business domain — it carries base services and extension points that the business layer uses, but it almost never fills them with its own content.
Actual contents#
The folders are declared (reserved for future content), but almost none of them have real contents at the moment. There are only two exceptions:
| Folder | State |
|---|---|
Dictionaries/, Documents/, Registers/, LinkTables/, Analytics/, EDTs/, TableParts/, NumberSequences/, Reports/Views/, Scripts/, VirtualTotals/, WidgetAssignments/, Widgets/, OutboundChannels/ |
Empty — reserved for system objects of future platform versions |
Services/NumberSequences/ |
Real contents — the only real Core service |
TotalDrivers/{DefaultTotalDriver, FifoTotalDriver, MoneyTotalDriver, StockBaseTotalDriver, VirtualTotalDriver}/ |
Real contents — 5 system totals drivers |
Services/NumberSequences#
Service NumberSequences, namespace: "Core", description: "Number sequences: next/preview/raw by sequence name". The pair is NumberSequences.json + NumberSequencesService.script.json/.cs. The contract INumberSequences is what any model reads after declaring numberSequenceMetaId on its object (NumberSequence).
TotalDrivers/*#
Five system totals drivers are the base calculation algorithms for Register.totalDriverMetaId:
| Driver | Algorithm |
|---|---|
DefaultTotalDriver |
Standard accumulation calculation (single-entry register) |
FifoTotalDriver |
Lot-based FIFO calculation (cost) |
MoneyTotalDriver |
Money totals calculation (not about isDoubleEntry; that is a register flag and is independent of the driver) |
StockBaseTotalDriver |
Base balance algorithm (inherited by store registers) |
VirtualTotalDriver |
Calculation for VirtualTotal — a declarative union of several registers |
Each driver carries *.engine.cs — a read-only copy of the platform engine (root CLAUDE.md, "What is forbidden", §2). You can and should read it to understand the algorithm, but you cannot edit it: export rejects changes.
Empty folders — why this is normal#
An object module (Events/<Name>EventHandler.* and so on; see the root CLAUDE.md, "Object modules always exist") is created by the platform in advance for future system entities. Until such an entity exists, the folder is empty. That is not a sync error and not a reason to create files in it by hand: Core changes only from the platform source side.
Events / Chain of Command#
It does not accumulate business events. Core provides EXTENSION POINTS (service contracts, base drivers), not its own use of them; extension comes from Base/Solution layer models through [ExtensionOf]/driver overrides, not the other way around.