Redaction
Redaction irreversibly erases one thing’s canonical content and former name while preserving its durable identity, version history topology, and existing inbound references. Use it when content must be destroyed — for example, to honor a privacy or erasure request — but other things still point at the record.
It sits between the other ways to withdraw a thing:
| Operation | Content and name | Identity and history | Reversible? |
|---|---|---|---|
| Retract | Kept; readable with --include-retracted | Kept | Yes — restore it |
| Redact | Erased | Kept, with empty bodies and an opaque name | No |
| Remove | Deleted | Deleted; existing references read back marked as removed | No |
What redaction changes
Section titled “What redaction changes”Redaction does not add a version. Instead it changes every version the thing already has:
- Every version’s body becomes
{}. Version numbers, IDs, timestamps, and active or retracted state stay as they were. - Every current and former name becomes
hub/redacted/<durableId>. The former name no longer resolves; address the thing by its durable ID. - Every version is certified only by the system
RedactedThingshape. - References and field values from the thing are removed. Existing references to it from other things keep resolving to the redacted identity.
wh thing historystill lists every version with its original operation label, but shows only the opaque name and empty bodies.- A redacted assertion becomes an ordinary redacted thing.
After redaction
Section titled “After redaction”After redaction, the thing accepts only a few operations:
revise,rewrite, andrenameare refused withTARGET_REDACTED.retractwithout a reason andrestorewithout a new name are allowed; they change only whether the thing is active.removeis allowed.- A second
redactdoes nothing.
New references to a redacted thing are refused, from any write, unless the referring field is typed exactly wref<RedactedThing> — declared as { "type": "wref", "shape": "RedactedThing" } — which is how a shape deliberately accepts redacted things. See What Wrefs Can Target for typed wref fields.
For what happens to each kind of existing reference — former-name wrefs, durable IDs, assertions, collections, and subscriptions — see Retract, Rename & Schema Changes.
Who can redact, and how
Section titled “Who can redact, and how”Redaction is as hard to reach as removal:
- It needs an unrestricted
things:redactgrant, which repository admin access provides. A token limited withallowedMatchesto particular names cannot redact. See Access reference. - Name the thing by its durable ID, not a wref —
wh thing resolve <wref>prints it on thedurableId:line. Shapes cannot be redacted, and neither can a removed thing. wh thing redactprompts for confirmation unless you pass--yes. Pass--expected-versionto redact only if the thing is still at the version you read; a stale version fails withCONFLICT. There is no--dry-run.
wh thing redact <durableId> --expected-version <n> --yesThe same operation is available as client.thing.redact in the SDKs and as warmhub_thing_redact over MCP. The SDKs require expectedVersion; the CLI and MCP use the current version when you omit it. See also wh thing redact in the CLI reference.