David
Blumenau
Menu
All demonstrations

Curation Lab / Names, sources and a way back

A name can change.
Its sources stay attached.

A small correction can touch more than one relationship. See exactly what changed, where each fact came from, and what an immediate inverse restores.

Follow the recorded edit

Actual Laravel endpoint execution · fictional data · recorded replay

Recorded endpoint proof / synthetic fixtures

A small edit.
An inspectable trail.

These controls replay a completed Laravel test. They are a portfolio exhibit, not shipped curator UI.

Exact name match · type: product

One product, two spellings.

Mira calls her tablet “Slate Pad”. Normalize that exact product name to “Slate Tablet”, while keeping the place called Slate Pad.

Four original relationships. Each has its own source conversation.

2identity fields changed

4source links retained

2full control rows unchanged

Read the forward and inverse audits

Follow the product name

Before the merge
Mira’s studio notesProduct
mirauses slate pad

Original object spelling

Read source: Mira chooses a tablet

Fictional source conversation 1

Fictional fixture: Mira uses Slate Pad for studio notes.

This relationship keeps the same source before merge, after merge and after inverse.

Inspect the source and row hashes
conversation_id in all three states
1
Unchanged conversation SHA-256
4e2f6d702d858c988b0bf743c67b547de7bb3c8c2ed098ea70d1ce613c83f7b8
Unchanged message SHA-256
1437d776c0b83d1caba3210e308daead12e26dcc00ae3a0a321d46efcd48afa0
Triple row SHA-256 in the selected state
684ef22340dea2dc43778b4691adefa0d4f34216d94f21a70ae3f06ccd7bfe76

Edited triple rows also record new review metadata. Their full-row hashes change even when the identity spelling is restored.

The keyboard relationshipProduct
slate padhas feature detachable keyboard

Original subject spelling

Read source: Tablet keyboard notes

Fictional source conversation 2

Fictional fixture: Slate Pad has a detachable keyboard.

This relationship keeps the same source before merge, after merge and after inverse.

Inspect the source and row hashes
conversation_id in all three states
2
Unchanged conversation SHA-256
19846904224c32c4a7607ccfade1bec8502deb7e773bb2d41fc8dd72e38bc605
Unchanged message SHA-256
19b13f95f7a2f6743722164661770e34744f6156525c916d8db33ecfa967402b
Triple row SHA-256 in the selected state
31ea39d1d735d3d4f7f3bb1718675e5451ac29edd9313f99b669254b33c5d2c6

Edited triple rows also record new review metadata. Their full-row hashes change even when the identity spelling is restored.

Two controls stayed unchanged
Different type: place

The place with the same name

slate pad near lily pond

Full row identical in all three states

Read source and unchanged hash

Fictional conversation 3: A place beside the pond

Fictional fixture: the place called Slate Pad is near Lily Pond.
7a7ce736492e176fe7d6f994103b1f5c42bc68d2d3a9a19fee688f4d246a413e

Same conversation_id and full row hash before merge, after merge and after inverse.

Unrelated object: product

An unrelated product

mira uses graph paper

Full row identical in all three states

Read source and unchanged hash

Fictional conversation 4: Paper for sketches

Fictional fixture: Mira uses Graph Paper for sketches.
8bae34e551359ac9aa82820b5e3dcfdfe5c747aaa77d001bbba9991d65beca98

Same conversation_id and full row hash before merge, after merge and after inverse.

The actual edit ledger

Read either receipt.
Keep both in view.

Both reads came from the existing audit endpoint. Batch labels below stand for the synthetic IDs preserved in the downloadable receipt.

Read the forward audit

Merge batch · 2 fields normalized

Recorded run: source=mcp · canonicalize=2

Triple 1 · object

Snapshot before this editslate padNew value recordedslate tablet

Triple 2 · subject

Snapshot before this editslate padNew value recordedslate tablet

The actual response reports affected=2. Each audit action carries the pre-edit identity and a map containing just its changed field.

Read request and correlation detailsGET /api/mcp/knowledge/edits?batch_id=[merge batch]

HTTP 200. Full synthetic batch/action IDs and exact response bodies are preserved in the JSON receipt.

Read the inverse audit

Inverse batch · 2 fields restored

Recorded run: source=mcp · canonicalize=2

Triple 2 · subject

Snapshot before this editslate tabletNew value recordedslate pad

Triple 1 · object

Snapshot before this editslate tabletNew value recordedslate pad

The actual response reports reverted=2 and not_invertible=0. Its original action IDs plus triple IDs correlate this new batch with the forward edits.

Read request and correlation detailsGET /api/mcp/knowledge/edits?batch_id=[inverse batch]

HTTP 200. Full synthetic batch/action IDs and exact response bodies are preserved in the JSON receipt.

  • Forward action 2 connects to inverse action 3 on triple 2.
  • Forward action 1 connects to inverse action 4 on triple 1.
What the execution proves, and where it stops

Actual path: the Laravel HTTP test kernel authenticated a fictional owner and executed the tagged validation, routes, controllers, curation service and disposable MySQL writes. The ledger’s source=mcp value is a recorded field; no live MCP transport or gateway authorization was exercised.

Manual exact-string selection: the request supplies from=Slate Pad, to=Slate Tablet, entity_type=product and a reason. Names normalize to lowercase. The triples were seeded, so this does not demonstrate automatic extraction or semantic discovery.

Immediate inverse: there is no compare-and-swap check. Reverting an older batch could overwrite a later change to the same identity field. This test applies the inverse immediately, with no intervening identity edit.

Identity restored, review metadata retained: the target rows’ prune_batch, reviewed_at and updated_at record the inverse. Full target rows do not return to their original bytes. Both controls and all source conversation/message rows remain byte-for-byte unchanged.

Profile boundary: the graph’s source profile groups exact labels without separating types. The typed mutation was verified; type-separated profile identities are outside this proof.

Verification: 18 feature tests / 189 assertions passed, with 1,600 additional mechanical checks of source files, responses and row hashes. No source patch, model inference, queue worker or production connection was needed. The owned runtime was removed.

PanelForge source
93881d2eca613fde498e0933405cee3a07220a4c · web-v10.20.97
Application changes
None
Download the curated execution receipt
View a captured merge state
Curation Lab portfolio replay showing two normalized product fields, four retained sources and two unchanged control rows
A capture of this portfolio replay. It displays synthetic results recorded by the actual Laravel endpoint test; it is not a shipped PanelForge screen. Open the full-size replay capture

Two different ways to explore memory

Understand the sample.
Inspect the edit.

Memory Lab explains the shape of a reviewed knowledge-graph sample. This Curation Lab follows a separately executed write-and-inverse proof with synthetic fixtures.

A name is useful for finding things. A retained source is what lets someone inspect why a relationship exists.

Explore the Memory Lab illustration
Read the knowledge-graph story