When source text changes, every derived claim that depends on the changed span needs a deliberate status. Keep the dependency graph inspectable.
Revision impact: invalidate derived claims, indexes and answers
Record dependencies at creation time
A runbook passage can feed an extracted claim, search index entry, generated answer and incident summary. Store each artifact ID, source passage revision and direct parent IDs when it is created. Without lineage, a correction leaves old statements circulating in caches and exports. Passage revision auditing finds stale index entries; this dependency graph carries the effect into derived claims and answers.
Invalidate by reachability
When a source passage changes, traverse downstream edges and mark affected artifacts stale. Do not delete them immediately: keep their prior version for audit and rollback. Recompute only affected descendants after the new source has passed editorial review. A changed access classification may require immediate withdrawal of public descendants even before content reprocessing. Semantic diffs tell reviewers which source claims changed, but dependency traversal identifies what those claims influenced.
Keep the graph scoped and typed
An answer that quotes a passage directly depends on that passage; a dashboard count may depend on several parsed claims. Record the dependency type and source revision so the rebuild knows which path to run. Avoid treating mere lexical similarity as a dependency. If an artifact has multiple parents, a change to one parent may invalidate only one sentence, yet the full answer may still require review for coherence. Retain unaffected evidence rather than rebuilding every runbook.
Verify no stale public outputs remain
Test caches, search snippets, API responses and saved handoffs after reindexing. Measure time to withdraw stale output, missed descendants and unnecessary rebuilds. A successful database update does not prove the CDN or generated summary changed. The revision impact project releases a new runbook only after its dependent public claims pass checks.
Implementation
def affected_artifacts(children_by_parent, changed_source):
affected = set()
seen = {changed_source}
frontier = [changed_source]
while frontier:
parent_id = frontier.pop()
for child_id in children_by_parent.get(parent_id, ()):
if child_id not in seen:
seen.add(child_id)
affected.add(child_id)
frontier.append(child_id)
return affected
dependencies = {"passage-47": {"claim-82", "index-91"},
"claim-82": {"answer-120"}, "index-91": set()}
assert affected_artifacts(dependencies, "passage-47") == {
"claim-82", "index-91", "answer-120"}
Performance and operating cost
Graph traversal takes O(v + e) time and O(v) space for v reachable artifacts and e traversed dependency edges. A versioned dependency index avoids scanning the full corpus for every edit. Withdraw sensitive or false public descendants before asynchronous rebuild finishes; fast recomputation is not a substitute for timely invalidation.
Common Mistakes
- Reindexing a passage while leaving its generated answer cached.
- Deleting old artifacts before an audit or rollback can inspect them.
- Rebuilding the entire corpus when lineage identifies a small affected set.
- Failing to withdraw public outputs after an access-policy change.
Read next
- Semantic document diffs: changed facts versus wording edits
- Project: release a runbook revision without stale answers
- Passage revisions: chunk migrations, deletion and audit
- Verify summary claims, corrections and human-review triggers
- Generated answers: claim evidence and unanswered state
Continue the workflow: Operational policy decisions: precedence and unknown conditions.
