About
Applied Physics
AI Solutions
Team Contact
PHASE 0 · SKELETON OF TRUTH · 2–3 WEEKS

Two clocks, one append-only truth.

Everything GlassBox ever says is a view over this layer, and it cannot be retrofitted later, so it is built first. Every fact arrives with both a valid time and a transaction time, is never updated or deleted, and projects deterministically into the knowledge graph. Nothing here involves an LLM.

GlassBox Event Inspector project OILSIM · 14,206 events
as-of clock date 2026-05-03
evententitychangevalid timetransaction timesource

✓ append-only · 0 updates · 0 deletes graph rebuilt from events in 3.1s checksum-deduplicated no LLM in this layer
End-of-phase demo Ask "show me this project as of any past date" and get a correct answer in SPARQL, rebuilt from the event log alone, with both clocks honored independently.
01 · Where phase 0 fits

The stack after this phase

Three layers go in: connectors, the bitemporal store, and the graph projection. Nothing above them exists yet, and that is deliberate. Truth first, language last.

L7Presentation

Gantt, as-of slider, proof explorer arrive in Phase 1. React

phase 1
L6Local LLM

No language layer yet. Phase 0 is entirely deterministic. LM Studio

phase 1
L5Business-logic canvas

Rules need something real to act on first. React Flow

phase 2
L4Symbolic core

Rules and CP-SAT scheduling arrive in Phases 1 and 2. OR-Tools

phase 1
L3GraphRAG

Retrieval arrives once the graph exists. pgvector

phase 1
L2Knowledge graph

RDF projection, ~15-class ontology, PROV-O links from every triple back to its event. Oxigraph · SHACL

new
L1Dual-clock EventDB

Append-only bitemporal store with as-of query helpers. The foundation. PostgreSQL 16

new
L0Connectors · Jira

Webhooks plus REST backfill, emitting one canonical envelope. Idempotent by checksum. Python · FastAPI

new
What this first phase actually deliversexecutive briefing

Phase 0 produces no screens a user would enjoy. It builds the ledger. Every change in your project tools is copied into a permanent, append-only record that nobody, including us, can quietly edit afterwards. Think of it as moving from a whiteboard that gets wiped to a bound accounting book.

It is first because it cannot be added later. Every capability in the later phases is a view over this record, so if it is missing or incomplete, nothing above it can be trusted.

Duration and costTwo to three weeks. The smallest phase, and the one with the least visible output.
Impact on your toolsNone. We read from Jira; we never write to it. Your teams change nothing about how they work.
What you can judgeAt the end you can ask for the state of a project on any past date and get a correct answer. That is the test.
02 · Phase 0 architecture

Ingest, store, project

Three services and two stores, with the schema written out so an engineer on the client side can audit the design before a line of it runs. The numbered path is one Jira change becoming a queryable triple.

CLIENT SIDE · READ ONLY Jira / Jira Data Center issues · changelog · sprints CSV / SFTP drop vendor plan, finance actuals service account, least privilege no write path back into client tools in v1 GLASSBOX APPLIANCE · PHASE 0 SCOPE 1 webhook push, plus REST backfill of history on first run Connector services poll + webhook · retry with backoff · rate-limit aware changelog parsing recovers the true valid time of each change Identity map priya.k = pkumar = P. Kumar human resolved once, versioned SHACL validator shapes run, findings stored panel UI lands in phase 4 2 canonical envelope, one schema for every source Ingest API · envelope validation { source, source_id, entity_type, payload, valid_from, observed_at, actor, checksum } reject on schema violation · dedupe on checksum · stamp transaction time at arrival · never mutate 3 INSERT only Event store · PostgreSQL 16 events ( valid_from, valid_to, observed_at ) source, entity_type, payload jsonb, actor checksum unique · seq bigserial as-of helpers: as_of_tx(date), as_of_valid(date) Graph projector pure function of the log event → triples + PROV-O re-runnable from zero no model, no randomness Knowledge graph · Oxigraph gbx: Project Epic Task Sprint Milestone Person Team Dependency Risk Decision Blocker Artifact every triple: prov:wasDerivedFrom gbx:eventNNNN named graph per source and per snapshot 4 5 6 as-of query surface SPARQL on either clock, reproducible for any past date
phase 0 service persistent store valid time columns transaction time column partial in this phase
Reading this architecture diagramexecutive briefing

Follow the numbers. Information leaves your Jira, is normalised into one standard shape regardless of which tool it came from, is written once into a database that only ever adds rows, and is then projected into a map of how everything connects. The database is the truth; the map can be rebuilt from it at any time.

The two coloured columns in the store are the important detail: every record carries both the date something became true and the date you learned it. That single decision is what makes later audit questions answerable.

Why "append only" mattersHistory cannot be rewritten, accidentally or deliberately. This is the same principle as a general ledger.
Why identity mapping appears hereThe same person appears differently in different tools. Resolving that once, with a human confirming, prevents years of quiet errors.
RebuildabilityIf we improve how information is organised, we rebuild the map from the record. No migration project, no data loss.
03 · What gets built

Four components, zero cleverness

This phase is intentionally boring engineering. Its value is that everything downstream inherits replayability for free.

Event envelope

One canonical schema every connector emits: source, entity, payload, both timestamps, actor, checksum. Freeze it early; everything hangs off it.

schema v0

Bitemporal store

Append-only Postgres table plus as-of query helpers. No updates, no deletes, ever. Duplicates are harmless because inserts are checksum-idempotent.

PostgreSQL · SQL:2011 patterns

Jira connector

Webhook listener for live changes, REST backfill for history, changelog parsing that recovers true valid times from Jira's own history.

~300 lines of Python

Graph projector

Deterministic code, not an LLM, that turns events into RDF triples with PROV-O provenance. Re-runnable, so the graph is a rebuildable view.

Oxigraph · named graphs
Four pieces, deliberately unexcitingexecutive briefing

These are small, well-understood components: a standard record format, a database that only adds, a connector that reads Jira, and a routine that turns records into a connected map. There is no AI anywhere in this phase, and no novel technology.

That is intentional. The engineering risk in this programme belongs in later phases; here we want boring components that will still be running in five years.

Team requirementStandard backend engineering. No specialist AI or graph expertise needed to build or maintain this layer.
Failure modesWell known and well handled: duplicate messages, tool outages, rate limits. All are recoverable by replaying the record.
Extending laterAdding GitLab, Azure DevOps or a spreadsheet feed reuses the same record format. New sources cost days, not weeks.
04 · Under the hood

From a Jira webhook to a replayable fact

The projection is one-way and deterministic. If the ontology changes later, we drop the graph and rebuild it from the events. That escape hatch is why an early modeling mistake is survivable.

capture

Jira webhook

Live change events plus a REST backfill of project history.

normalize

Event envelope

Both clocks resolved: valid time from the changelog, transaction time from arrival.

store

Append-only insert

Checksum-deduplicated. Nothing is ever mutated, so history stays intact.

project

RDF triples

Deterministic mapping into the ontology, each triple carrying PROV-O back-links.

query

As-of SPARQL

Any past state reconstructed on demand, on either clock.

-- the whole point of phase 0, in one query SELECT entity, payload FROM events WHERE project = 'OILSIM' -- what the system had been told by then AND transaction_time <= '2026-05-03' -- swap the clock to ask what was actually true instead AND valid_from <= '2026-05-03' ORDER BY valid_from;
What happens when a ticket changesexecutive briefing

Someone updates a ticket. Within seconds we receive the change, work out when it truly took effect by reading the tool's own history, stamp when we received it, check we have not seen it before, and store it permanently. Then we update the connected map of the project.

The query at the bottom is the entire value of the phase in one statement: change one date in that query and you see the project as it was, on either clock, at any point in the past.

LatencySeconds for live changes. A full historical backfill of a large project takes minutes, once.
Duplicate safetyIf a tool sends the same change twice, or we replay a week of history, the result is identical. Nothing double-counts.
StorageProject events are small. A large programme over several years is measured in gigabytes, not terabytes.
05 · Acceptance

Exit criteria and the client demo

The 5-minute client demo

  1. Point the connector at their own Jira project and backfill a quarter of history.
  2. Set the as-of date to a day of their choosing on the transaction clock.
  3. Show the project state exactly as their team knew it that morning.
  4. Flip to the valid clock at the same date: different picture, because of late-arriving facts.
  5. Open one row and trace it to the original Jira payload.
How you will know this phase is finishedexecutive briefing

Completion is not a status report. It is a five-minute demonstration on your own data: pick any date, see the project as your team understood it that morning, then switch clocks and see what was actually true, including things that only surfaced later.

If that demonstration works on your real Jira export, the foundation is sound and the programme can continue. If it does not, nothing later would have been trustworthy anyway.

What we need from youRead-only access to one Jira project and about an hour of a project manager's time to sanity-check the history.
Objective testRebuilding everything from the record produces an identical result. This is verified by an automated test, not by eye.
Exit decisionLow cost to stop here. You would still own a complete, portable, permanent record of your project history.