About
Applied Physics
AI Solutions
Team Contact
PHASE 3 · GRAPHRAG DEPTH · 3–4 WEEKS

Now it can answer "why", not just "what".

Phases 0 to 2 made structured facts provable. The remaining truth about a project lives in prose: ticket comments, meeting notes, risk write-ups. Phase 3 makes that text retrievable through the graph rather than beside it, so an answer about a risk can only draw on chunks that are actually linked to that project's entities.

GlassBox Console programme OILSIM · 18 workstreams · as-of today
What are the three biggest risks across the programme right now, and why?
VEvector candidates · top 5
1"vendor keeps missing dates".891
2vendor risk note · project ATLAS.874
3retro: integration slipped again.848
4generic risk policy template.833
5QA capacity concern, sprint 14.817
semantic similarity alone pulls in text about the wrong project. Two of these five are off-target.
GRgraph neighbourhood · 2 hops
·gbx:vendorDeliverable7M3
·gbx:PROJ-142 · blocked 9dM3
·gbx:qaCapacity · sprint 14M4
·gbx:budgetBurn · 82%prog
·gbx:PROJ-88 · resolvedM2
entities reachable from the question's scope, each carrying its own provenance and both clocks.
RRFfused result · k=60
1vendor slip → M3 critical path.0323
2QA capacity → M4 at risk.0298
3budget burn 82% at 61% elapsed.0270
project ATLAS chunkscut
policy boilerplatecut
reciprocal rank fusion keeps only what both the text and the graph agree is in scope.
Workstream: Vendor integrationcommunity 3 · 214 events · summary refreshed 2h ago
Workstream: QA and releasecommunity 7 · 168 events · summary refreshed 2h ago
Workstream: Commercialscommunity 11 · 96 events · summary refreshed 2h ago

Three risks dominate the programme:

  1. Vendor deliverable 7 is on the M3 critical path and nine days late, which no resequencing recovers gbx:event9981 solve:cpsat-4471.
  2. QA capacity in sprint 14 is oversubscribed, first raised in a retro comment and now visible in assignment counts gbx:chunk3312 gbx:event10201.
  3. Budget burn is at 82% with 61% of the timeline elapsed, crossing the threshold your own rule set defines rule:financeRisk v3.
✓ 6 of 6 claims cited · 2 candidate chunks dropped as out of scope
✓ retrieval trace recorded as an event 1,204 chunks · 18 communities · RRF k=60 embeddings local · bge-m3 no chunk without a graph link is ever retrievable
End-of-phase demo Ask an open programme-level question, watch the retrieval trace drop the plausible-but-wrong chunks, and confirm every sentence of the answer survives citation verification.
01 · Where phase 3 fits

The stack after this phase

Only one layer really changes. Retrieval graduates from a fixed template library to genuine hybrid search, and the LLM picks up its third bounded job: extraction from prose, confidence gated and human confirmed.

L7Presentation

Console gains the retrieval trace view and community summaries. React

running
L6Local LLM · extraction

Third job added: propose triples from prose, confidence gated, human confirmed. bge-m3 embeddings

extended
L5Business-logic canvas

Unchanged. Rules can now fire on facts extracted from notes. React Flow

running
L4Symbolic core

Unchanged, still the only source of numbers. SPARQL · OR-Tools

running
L3GraphRAG · full hybrid

Chunking, entity linking, pgvector search, RRF fusion, Leiden community summaries. pgvector · igraph

new
L2Knowledge graph

Now also stores chunk-to-entity links and community memberships. Oxigraph

running
L1Dual-clock EventDB

Same database now holds the vector index, so there is no extra service. PostgreSQL + pgvector

running
L0Connectors

Comment and description text starts flowing as first-class events. Jira

running
Reaching the knowledge that lives in writingexecutive briefing

Structured data tells you a ticket is late. It rarely tells you why. The reason usually sits in a comment, a retro note or a risk write-up, in someone's own words. Phase 3 makes that written material searchable, but only through the project structure, so an answer about your programme cannot quietly quote a document about a different one.

This is the phase that lets the system answer "why", and open questions no one wrote a report for.

DurationThree to four weeks. Additive: nothing built earlier changes.
What becomes possibleProgramme-wide questions such as "what are our three biggest risks and why", answered with citations.
Privacy positionComments and notes are indexed on your own hardware. No text is sent to an external service at any point.
02 · Phase 3 architecture

Index once, retrieve twice, fuse

The upper band runs when text arrives. The lower band runs when a question is asked. The important structural decision is that a chunk is only retrievable through entities it is linked to, which is what stops the classic RAG failure of confidently quoting the wrong project.

INDEX PLANE · RUNS WHEN TEXT ARRIVES · NOTHING HERE ANSWERS QUESTIONS Ticket comments already events since phase 0 Meeting notes markdown drop or paste Design docs · wiki file connector Risk write-ups structured where possible 1 Chunker semantic windows · keeps author, ts, source event Entity linker mentions to gbx IRIs · the step that makes it GraphRAG Leiden clustering workstream communities over the task graph 2 embed locally, then store beside the events, never outside the appliance pgvector index same PostgreSQL as the event store Chunk ↔ entity links triples in the knowledge graph Community summaries refreshed on change · answers global questions QUERY PLANE · RUNS PER QUESTION · EVERY RETRIEVAL TRACE STORED AS AN EVENT Question + as-of scope from the console Query embedder same local model as indexing Entity detector resolves scope to graph IRIs 3 Vector top-k cosine over pgvector Graph neighbourhood 2-hop SPARQL from the entities Community lookup for global questions Reciprocal rank fusion · intersect vector hits with the graph neighbourhood, drop anything unlinked score = Σ 1 / (k + rank), k = 60 · the fused list plus its dropped candidates is written to the event store as the retrieval trace 4 Narrator · writes only from the fused pack Citation verifier · unsupported sentences dropped before display 5
phase 3 retrieval service existing symbolic service neural, language only persistent store text sources
Why two searches are better than oneexecutive briefing

Ordinary AI search finds text that sounds similar to your question. That is exactly how these systems end up confidently quoting the wrong project, because a note about a different programme can sound extremely relevant.

We run two searches and keep only what both agree on: text that reads relevant, and records the project map confirms are actually connected to what you asked. A note with no verified connection to your project is never used in an answer, however well it matches.

The failure this preventsThe single most common and most damaging AI error in business use: a fluent answer about the wrong thing.
Cost advantageMost systems pay heavily to have AI extract structure from text. Ours already has it from the connectors, so we skip that expense.
AuditabilityEvery search records what was found, what was kept and what was discarded. You can inspect why a note did or did not count.
03 · What gets built

Six components, one hard rule

The hard rule: a chunk with no link into the graph is not retrievable. It can sit in the index forever, but it will never reach an answer, because scope is decided by the graph and not by cosine distance.

Semantic chunker

Splits prose into windows that keep their author, timestamp, and source event, so a chunk inherits both clocks like every other fact.

deterministic · no model

Entity linker

Maps mentions to ontology IRIs using the identity map plus exact and fuzzy matching, with the LLM only proposing uncertain links for confirmation.

the step that earns the "Graph" in GraphRAG

Local embeddings

bge-m3 or nomic-embed served through the same OpenAI-compatible endpoint, written into pgvector inside the existing database.

pgvector · one less service

Hybrid retrieval with RRF

Vector candidates fused with the graph neighbourhood by reciprocal rank fusion, the approach that outperformed both alone in published enterprise evaluations.

k = 60

Community summaries

Leiden clustering over the task and dependency graph produces workstream-level summaries, which is what makes whole-programme questions answerable at all.

igraph · refreshed on change

Retrieval trace

Every query records what was retrieved, what was fused, and what was dropped. A client can audit why a chunk did or did not influence an answer.

stored as events
The one rule that governs this phaseexecutive briefing

Of these six components, one policy matters more than the rest: a piece of text with no verified link into the project map is not retrievable. It can sit in the index indefinitely and will never reach an answer.

The workstream summaries are the other notable item. By grouping related work automatically, the system can answer questions about the programme as a whole, not just questions about individual tickets someone already knew to ask about.

On extractionWhere a note implies a fact worth acting on, the system proposes it and waits for a person. It never asserts it silently.
Numbers stay safeFigures still come from records and the scheduler. Written text supplies reasons and context, never quantities.
Ongoing effortSummaries refresh automatically as work changes. There is no library for anyone to curate.
04 · Under the hood

How prose becomes an auditable citation

Extraction stays deliberately timid. Where a note implies a fact worth acting on, the system proposes it and waits for a human, because a small local model reading meeting notes is the least reliable component in the building.

chunk

Windows with lineage

Each chunk keeps its author, timestamp, and originating event.

link

Mentions to IRIs

The chunk is attached to the entities it actually talks about.

embed

Local vectors

Stored in pgvector next to the events, never leaving the appliance.

fuse

Vector ∩ graph

RRF ranks what both signals agree on, and drops the rest.

cite

Verified sentences

Chunk IDs are citations like any fact ID, clickable to the original text.

guardrail no graph link, no retrieval guardrail extraction is proposal only, confidence gated guardrail numbers still come from SPARQL and CP-SAT, never from prose guardrail retrieval traces are events, so answers stay reproducible
How a comment becomes usable evidenceexecutive briefing

Written material is split into passages that keep their author and date, linked to the projects and people they genuinely mention, and indexed locally. When a question arrives, the two searches run and are merged, and the surviving passages are cited in the answer exactly like any other record.

Click a citation and you land in the original comment, with the person who wrote it and when. The system quotes your organisation's own words back to you, with attribution, rather than paraphrasing them into something unverifiable.

AttributionEvery passage keeps its author and timestamp, so context and seniority are visible when you read the evidence.
Deliberate cautionSmall local models misread prose more often than large cloud ones. That is why extraction only ever proposes.
ReproducibilitySearch results are recorded, so the same question on the same date returns the same evidence and the same answer.
05 · Acceptance

Exit criteria and the client demo

The 8-minute client demo

  1. Ask an open question no template could have anticipated.
  2. Open the retrieval trace: five vector candidates, two of them about another project.
  3. Show the fusion step cutting those two because the graph says they are out of scope.
  4. Read the answer: three risks, each citing a mix of structured facts and human prose.
  5. Click a citation and land in the actual retro comment, with author and date.
  6. Point out that the numbers in the answer still came from the solver, not the text.
The test that proves the guardrail worksexecutive briefing

The acceptance test plants a convincing but irrelevant note from another project, then demonstrates the system retrieving it by text similarity and visibly discarding it because the project map says it does not belong. That is the guardrail proving itself in public.

Any AI vendor can show you a good answer. This shows you the bad answer being caught.

Best audienceAnyone already sceptical of AI, particularly if they have seen a chatbot confidently invent something.
Quality measureEvery sentence must survive automated citation checking. Unsupported sentences never reach the screen.
Optional scopeIf your written material is thin, this phase can be deferred without affecting anything already built.