Skip to content
Demiton

Memory

Stable

The five diseases get caught late because the fact that would have flagged them sits in a different system from the one that pays for it. Memory is where those facts meet: the test result next to the pour, the notice window next to the instruction, the actual next to the tender. It is what each protection runs on.

Civil Memory is the heart of Demiton: one continuous, sourced record of a civil job from the public market through delivery. This page is the detailed model behind it. For the bigger picture - how the public market, the award seam, and your delivery join into one story - start with How your registers become one record.

Demiton’s memory layer turns every workflow run, operational form, and allocation record into queryable, access-controlled institutional knowledge - attached directly to the workers, projects, and assets the platform already tracks.

Memory accumulates: every workflow run, form submission, and allocation adds sourced facts bound to the entities they are about. That knowledge stays indexed and citable, and is surfaced back through the AI layer within the same security boundary that governs the rest of the platform.


What memory looks like on each tier
TierMemory sourceWhat you can query
PublicNone - queries run against public records directlyAusTender, ABR, BOM, and open government data
BaselineYour uploaded contracts and estimating data, plus every workflow run, allocation, and form submission across your live integrated systemsHistorical rates, cost code patterns, estimator performance, and workers, projects, assets, site diaries, financials - the full operational record
EnterpriseFull stack across all integrated systems with custom entity typesAs above, plus cross-system memory and custom entity types

Talk to us about Baseline when you need memory to compound across live operations.


Every time a workflow runs, a form is submitted, or an allocation is created, Demiton projects a structured memory record out of that event and attaches it to the relevant entities - the worker who submitted the form, the project the allocation was for, or the asset involved. Memory records accumulate over time and can be queried through the AI chat interface and MCP tools.

This is not a search index of raw documents. Memory facts are typed, temporally valid records with a confidence score and a citation back to their source. When the AI answers a question about a worker or project, it draws on this layer as ground truth - cited, not hallucinated.


Memory types
TypeWhat it holdsExample
episodicEvents - what happened and whenWorkflow run summaries, form submissions, site diary entries
semanticFacts with validity windows - what is knownA worker’s current competency, a project’s contract type
proceduralMethods and patterns - how things are doneRecurring workflow patterns, operational procedures

Each record carries a valid_from and optionally a valid_until. When a fact changes, the old record is superseded rather than deleted - preserving the full history. This temporal model means you can ask “what was true at this point in time” and get an accurate answer.


Memory attaches to canonical entities, not to system-specific records. A single memory record can carry multiple anchors simultaneously - for example, a docket submission links to both the worker and the project.

Entity anchors
AnchorWhat it represents
worker_idA canonical worker, identified across Assignar, Employment Hero Payroll, and HR systems
project_idA canonical project
asset_idA canonical asset or piece of plant

Where the register defines them, a fact can also carry other coordinate axes - vendor, customer, legal entity, cost code, financial period, currency, and work activity. The subject of the fact is the entity it is about; the workflow run that produced it is recorded in fact lineage rather than as an anchor.

Anchoring to canonical IDs means memory survives system migrations and connector changes - the fact stays attached to the right entity regardless of where the source data came from.


Each register declares a data scope that reflects the sensitivity of its facts. That scope governs who can read them, following the same domain model used across the rest of the platform.

Data domains
DomainScope
operationsProject activity, forms, allocations, plant movements
financialsCost codes, rates, budget variance, contract financials
payrollPay records, leave, timesheets - most restricted

Read access is enforced at query time through each register’s declared data scope: a caller must hold the matching data:read_<scope> permission to read that register’s facts. Payroll registers (pay runs, pay rates), for example, require data:read_payroll; operations registers require data:read_operations.


Read access to Civil Memory is enforced at query time through the register’s declared data scope. A caller must hold the matching data:read_<scope> permission - for example data:read_payroll for pay runs and rates, or data:read_operations for allocations and site records - to read that register’s facts. The gate fails closed: a register whose scope cannot be resolved is denied.

Memory facts are org-wide within a tenant. There is no per-record ACL filter on fact reads: the scope on the register, not the individual row, decides who can read it. Relationship edges also carry an access domain and, where configured, the Entra group IDs permitted to traverse them.

Confidence threshold: recall has two floors. Chat-stated memory recalled into a conversation must carry a confidence of at least 0.85; the general memory reader uses a floor of 0.70. Facts written through direct ingest carry confidence = 1.0.


Each canonical entity (Worker, Project, Asset) has an entity brief - an AI-generated summary synthesised from that entity’s current memory records. Briefs are cached for 24 hours and regenerated automatically by a background job.

Briefs appear on entity detail pages throughout the platform (worker profiles, project overviews, asset dashboards). They cite the memory records they draw from, so the source of every statement is traceable.


Alongside memory records, the platform maintains a relationship graph - a set of typed edges connecting entities to each other and to reference data.

Knowledge graph
Edge typeWhat it represents
worker_holds_competencyWorker holds a specific competency
worker_holds_inductionWorker has completed an induction
worker_has_skillWorker has a registered skill
worker_operates_assetWorker is a qualified operator for an asset
worker_lives_at_postcodeWorker’s home location
worker_paid_under_rateWorker’s active pay rate
asset_has_charge_out_rateAsset’s current charge-out rate
asset_located_at_geographic_areaAsset’s location
project_requires_inductionInductions required to work on a project
project_located_at_postcodeProject’s physical location
project_has_subcontractorProject’s subcontractor (a vendor flagged as a subcontractor)
project_has_estimateProject’s estimate document
project_has_varianceProject’s variance document
variance_affects_cost_codeVariance affects a cost code
contracting_process_administered_by_agencyGovernment agency administering a contracting process
contracting_process_awarded_to_civil_contractorContractor awarded a contracting process

Worker and asset allocation - who or what is on a project - is not stored as a graph edge. It is derived at read time from the co-occurrence of a worker (or asset) and a project on the same allocation facts.

Edges have temporal validity (valid_from, valid_until) and carry a JSONB properties payload for additional structured data. Active edges have valid_until = NULL.


The memory and graph layers are not exposed as a set of separate MCP tools. They are capabilities of the single ask_demiton tool: when a question needs memory, ask_demiton routes it to the internal query services and returns cited records. See MCP tools for the generated list of tools a connection advertises, and Ask Demiton for what the tool does.

Through ask_demiton, a caller with the relevant register permissions can ask for:

  • Memory facts about a worker, project, or asset, current and historical
  • The workers on a project, and the assets deployed to a project
  • A worker’s skills, competencies, and inductions
  • The workers who hold a specific competency
  • The workers based near a postcode
  • A worker’s active pay rate, and an asset’s charge-out rate
  • The workers qualified to operate an asset, and the assets a worker has operated
  • A project’s postcode, and the inductions a project requires

Every call - allowed or denied - generates an access decision audit record. See MCP tools for the generated tool list, or MCP Server for connection details.



Memory facts are written by the platform through two paths:

Workflow projections - when a workflow task completes, the PROJECT_MEMORY verb projects structured facts extracted from the adapter response into the partitioned memory_fact table through the fact write gate. Each fact is idempotent: re-running the same workflow on the same data supersedes the current row rather than creating a duplicate.

Backfill - historical Assignar forms and allocations are backfilled into the memory layer during initial onboarding. Backfill records carry source_type = "backfill" and confidence = 1.0 for direct data matches.

The write path enforces: at least one entity anchor must resolve, and the producing source system must be declared. No memory fact can exist without traceability to a canonical entity.


When a fact changes, the existing row is not deleted. Instead:

  1. The old row is closed with a valid_until timestamp.
  2. A new current row is written with an updated valid_from.
  3. The two rows share a stable identity key - the current-state coordinate key for state facts, or the source system plus source ID for episodic facts - so the newest row is the live one and the earlier rows remain as history.

This chain is preserved indefinitely. Queries filter to valid_until IS NULL by default (currently valid) while the full history stays queryable by identity key.

Frequently asked questions

What does Demiton's memory layer store?
Demiton's memory layer stores structured records from every workflow run, operational form and allocation record, attached to the canonical workers, projects and assets they relate to. Records are typed (episodic, semantic or procedural) and time-valid. Read access is scoped by the register's data scope rather than per row: a caller needs the matching data:read_<scope> permission, and the check fails closed.
What memory is available on each tier?
Free: the public half of Civil Memory - the public award record sourced from AusTender and state portals. Baseline: memory from every workflow run, allocation, and form submission across your live integrated systems. Enterprise: full stack with custom entity types.
How does Demiton's memory handle changes to facts over time?
When a fact changes, the existing record is not overwritten. The old record is closed with a valid_until timestamp and a new record is written with an updated valid_from, so the history is preserved and every read can be answered as at a point in time.

Talk to the team

Tell us what you run - your ERP, field, payroll and document systems - and we will show you the registers Demiton would fill from them, on your data, in a 30-minute call.

Book a 30-minute callStart free