Hacker DirectoryHacker Directory

WEB / WEB-21.S04

Audit evidence, detection and incident scope

Separate HTTP status, business audit, correlation and incident scope in a Tea note event chain.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mechanism

Read every scenario without motion

Expected denial

  1. Audit source selected

    The application knows fixed event objects for Atlas/op-demo/tea. The audit writer has not produced allowlisted JSON lines and correlation is not computed; every step is a local record operation.

    Application
    Fixed event source
    Audit writer
    No output yet
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  2. Allowlist output produced

    The structured serializer copies only schema fields; fake session values and note bodies remain excluded.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  3. Compute tuple relation

    Tenant, operation and object are compared together; Nova’s reused request alias does not join Atlas.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    expected-denial
    Reviewer
    Scope unknown
  4. Evidence scope recorded

    Missing records remain unknown; outcomes for objects or tenants beyond the known tea operation are not invented.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    expected-denial
    Reviewer
    tea / Atlas; others unknown
  5. Review checkpoint boundary

    New state validation leaves historical audit intact; this fixture does not start production recovery.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    expected-denial
    Reviewer
    Bounded checkpoint validated

Event discrepancy

  1. Audit source selected

    The application knows fixed event objects for Atlas/op-demo/tea. The audit writer has not produced allowlisted JSON lines and correlation is not computed; every step is a local record operation.

    Application
    Fixed event source
    Audit writer
    No output yet
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  2. Allowlist output produced

    The structured serializer copies only schema fields; fake session values and note bodies remain excluded.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  3. Compute tuple relation

    Tenant, operation and object are compared together; Nova’s reused request alias does not join Atlas.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    review-required
    Reviewer
    Scope unknown
  4. Evidence scope recorded

    Missing records remain unknown; outcomes for objects or tenants beyond the known tea operation are not invented.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    review-required
    Reviewer
    tea / Atlas; others unknown
  5. Review checkpoint boundary

    New state validation leaves historical audit intact; this fixture does not start production recovery.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    review-required
    Reviewer
    Review-required

Missing record

  1. Audit source selected

    The application knows fixed event objects for Atlas/op-demo/tea. The audit writer has not produced allowlisted JSON lines and correlation is not computed; every step is a local record operation.

    Application
    Fixed event source
    Audit writer
    No output yet
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  2. Allowlist output produced

    The structured serializer copies only schema fields; fake session values and note bodies remain excluded.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  3. Compute tuple relation

    Tenant, operation and object are compared together; Nova’s reused request alias does not join Atlas.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    unknown
    Reviewer
    Scope unknown
  4. Evidence scope recorded

    Missing records remain unknown; outcomes for objects or tenants beyond the known tea operation are not invented.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    unknown
    Reviewer
    tea / Atlas; others unknown

Clock uncertain

  1. Audit source selected

    The application knows fixed event objects for Atlas/op-demo/tea. The audit writer has not produced allowlisted JSON lines and correlation is not computed; every step is a local record operation.

    Application
    Fixed event source
    Audit writer
    No output yet
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  2. Allowlist output produced

    The structured serializer copies only schema fields; fake session values and note bodies remain excluded.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    No correlation yet
    Reviewer
    Scope unknown
  3. Compute tuple relation

    Tenant, operation and object are compared together; Nova’s reused request alias does not join Atlas.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    Clock order unknown
    Reviewer
    Scope unknown
  4. Evidence scope recorded

    Missing records remain unknown; outcomes for objects or tenants beyond the known tea operation are not invented.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    Clock order unknown
    Reviewer
    tea / Atlas; others unknown
  5. Review checkpoint boundary

    New state validation leaves historical audit intact; this fixture does not start production recovery.

    Application
    Fixed event source
    Audit writer
    Selected JSON lines
    Correlation
    Clock order unknown
    Reviewer
    Bounded checkpoint validated

ACTORS · STATE · DATA FLOW

HTTP records and business decisions

A Tea note HTTP access record describes the server observing a request and its response status. Business audit describes actor Duru, action rename-note, object tea, tenant Atlas, decision deny and reason owner-policy. These events serve different purposes. A public explanatory response can be 200 while rename-note remains denied; the status alone is not a business commit receipt. An event generated near the application’s policy decision has different evidential authority from an actor label inferred from an external request header.

Here operationAlias op-demo and requestAlias req-demo are correlation labels, not credentials, principals or permissions. The session correlation alias is an inert group label instead of a real session identifier. User and tenant relationships come from application context; jobAlias associates a later worker activity with the same operation. One HTTP request can contain several business actions, and an async action can create several job attempts. Event IDs, parent IDs, action/object and producer therefore express relationships more precisely than joining every record on one request string.

Baselines, missing evidence and incident bounds

The finite detector searches for deny plus committed=true within a tenant, operationAlias and object tuple. Normal deny/committed=false yields zero and a deliberately synthetic contradiction yields one. This fixture does not establish a real policy violation; it identifies inconsistent records requiring review. If tenant Nova reuses req-demo, its record is not joined to Atlas. A missing commit record is not defaulted to committed=false: the result is unknown. Expected denial, contradictory evidence and missing evidence remain distinct outcomes. When a tuple contains several records, all are evaluated; ordering or an identical event repeat cannot change the outcome. Conflicting completed decisions remain ambiguous and missing fields unknown; neither is an automatic incident judgment.

Wall-clock ordering across different producers does not establish causality. The artifact may show app time 10:00:02 and worker time 09:59:59; an explicit parent-event relationship and same-producer sequence provide narrower ordering evidence. Bound incident statements accordingly: tea and the selected operation are known in this ledger, while other objects and tenants are unmeasured. Recovery is not merely closing an alert; it requires validation of the selected owner state and a new checkpoint. Deleting or changing old records cannot strengthen history; preserve provenance, access boundaries and retention.

2. Red · Trust & Impact

Read every scenario without motion

Alias scope

  1. HTTP200 is another fact

    http-demo has status 200 while decision-demo denies with committed false. Transport status establishes neither business acceptance nor Duru’s object authority.

    Audit event ledger
    HTTP200 / business deny/false
    Tuple/producer comparison
    Not yet evaluated
    Scope outcome
    Not yet evaluated
  2. Composite tuple

    Nova reuses req-demo and op-demo but has a different tenant. Omitting tenant/operation/object scoping can misattribute unrelated allow/true to Atlas.

    Audit event ledger
    HTTP200 / business deny/false
    Tuple/producer comparison
    Atlas tuple ≠ Nova tuple
    Scope outcome
    Not yet evaluated
  3. Normal expected denial

    The normal Atlas/op-demo/tea business row is deny/false and yields expected-denial. This ordinary policy result proves neither a successful attack nor malicious Duru.

    Audit event ledger
    HTTP200 / business deny/false
    Tuple/producer comparison
    Atlas tuple ≠ Nova tuple
    Scope outcome
    Expected denial / no incident verdict
  4. Producer-clock difference

    The job can show 09:59:59 before decision 10:00:02, with a separate declared parent relation. Cross-producer wall-clock order is unknown; timestamps do not establish global causality.

    Audit event ledger
    Declared parent relation / clock order unknown
    Tuple/producer comparison
    Atlas tuple ≠ Nova tuple
    Scope outcome
    Expected denial / no incident verdict
  5. Parent-relation trust

    parentEventId is a producer-declared relation, not cryptographic authenticity. Source context and completeness are separate; matching event IDs grant no user authority.

    Audit event ledger
    Declared parent relation / clock order unknown
    Tuple/producer comparison
    Declared relation ≠ authentic authorization
    Scope outcome
    Expected denial / no incident verdict
  6. Keep impact scope narrow

    Known scope is only Atlas and tea. Other tenants/objects remain unknown; similar aliases do not justify extending incident scope to every tenant.

    Audit event ledger
    Declared parent relation / clock order unknown
    Tuple/producer comparison
    Declared relation ≠ authentic authorization
    Scope outcome
    Known Atlas/tea / other scope unknown

All matching rows

  1. First matching row

    The comparator does not stop at the first business row. lateContradiction has two unique rows and a later deny/true contradiction; row order should not change the result.

    Audit event ledger
    Inspect all matching business rows
    Tuple/producer comparison
    Not yet evaluated
    Scope outcome
    Not yet evaluated
  2. Explicit contradiction

    Any unique deny/true requires review, while ambiguity stays visible. This synthetic contradiction is not presented as an actual policy violation or actor-intent proof.

    Audit event ledger
    Inspect all matching business rows
    Tuple/producer comparison
    Deny/true → review-required / ambiguity retained
    Scope outcome
    Not yet evaluated
  3. Duplicate semantics

    An identical duplicate has two matching rows but only one unique row. Counting a complete repeated record as two business effects invents incident magnitude.

    Audit event ledger
    Inspect all matching business rows
    Tuple/producer comparison
    Deny/true → review-required / ambiguity retained
    Scope outcome
    Matching2 / unique1 / expected-denial
  4. Conflicting complete records

    Different complete outcomes and changed fields under the same event ID are ambiguous. Changed fields are not an identical repeat, and the detector retains that difference.

    Audit event ledger
    Complete conflict / changed ID fields ambiguous
    Tuple/producer comparison
    Deny/true → review-required / ambiguity retained
    Scope outcome
    Matching2 / unique1 / expected-denial
  5. Incomplete priority

    laterIncomplete has one incomplete row and unknown result. Without explicit contradiction, defaulting missing commit to false weakens evidence completeness.

    Audit event ledger
    Complete conflict / changed ID fields ambiguous
    Tuple/producer comparison
    Incomplete evidence → unknown
    Scope outcome
    Matching2 / unique1 / expected-denial
  6. Review-verdict boundary

    The comparator selects attention and uncertainty in a finite supplied ledger. It runs no SIEM, identity verification or production recovery; review-required is not automatic user blocking or attack declaration.

    Audit event ledger
    Complete conflict / changed ID fields ambiguous
    Tuple/producer comparison
    Incomplete evidence → unknown
    Scope outcome
    Finite review classification / no incident verdict

ASSUMPTION · BOUNDARY · CONTROL

When correlation is mistaken for authority

Normal logging makes an application decision understandable later. Its trust assumption binds an event to the correct source, identity context and operation. Reused request labels or a missing tenant can make unrelated work appear to be one chain. The impact may be incorrect attribution or an unnecessarily broad incident scope; matching a label never proves a user’s authority over an object. Composite correlation, source context and unknown handling for missing fields block that mistaken inference. The branch is tested with fixed Atlas/Nova rows and generates no live requests.

A denial/commit disagreement matters when authoritative records describe the same operation. An unverified client report, an older projection or a different retry attempt does not carry the same evidential weight. ParentEventId is a producer-declared relationship; it does not independently provide cryptographic authenticity or non-repudiation. The fixture explicitly supplies its source model. Calling a discrepancy a successful attack before reviewing context and provenance adds assumptions instead of explaining the actual impact.

Logs are also data requiring protection

Copying an entire request into logs can include session values, tokens, personal information or note bodies alongside the few fields needed for correlation. The ordinary purpose is to explain an action’s result; that broad copy is unnecessary for this purpose. An allowlist and minimization provide the control. The source fixture contains fake Authorization, a fake sessionIdentifier and ordinary noteText, but audit output contains none of them. Review access is limited to needed event fields; using hashes or aliases does not automatically remove linkability risk.

A log viewer or export format is itself an interpreter. Use structured serialization for the chosen schema rather than concatenating free text into record boundaries; delimiters and newlines remain encoded data. This example processes JSON lines and constructs no malicious log input. Mandatory business audit and optional diagnostics require distinct failure policies; silently writing no records is not evidence of a clean system. Protect the ledger with separately authorized read/write access, recognition of a missing collector and controlled disposal at the end of retention.

3. Blue · Secure development & defense

Read every scenario without motion

Audit controls

  1. Allowlisted field set

    The schema selects necessary event/tenant/operation/object and decision/commit fields. Fake Authorization, session identifier and note text stay out of output; whole-request logging is unnecessary.

    Allowlisted audit records
    Allowed metadata / excluded fake sensitive fields
    Correlation/completeness review
    Not yet evaluated
    Scope and checkpoint
    Not yet evaluated
  2. Tuple-correlation control

    Atlas/op-demo/tea business rows are separated from Nova. Job alias extends the relation only when a job record exists; missing records do not imply execution.

    Allowlisted audit records
    Allowed metadata / excluded fake sensitive fields
    Correlation/completeness review
    Composite tuple / observed job relationship
    Scope and checkpoint
    Not yet evaluated
  3. All-row outcome control

    Normal denial, deny/true review, identical repeats and missing-commit unknown are compared. Reordering inputs must not introduce first-row bias.

    Allowlisted audit records
    Allowed metadata / excluded fake sensitive fields
    Correlation/completeness review
    Composite tuple / observed job relationship
    Scope and checkpoint
    All-row priority / repeat/order controls
  4. Source and time coverage

    Same-producer sequence can establish order while cross-producer clock order stays unknown. Declared parent relations do not automatically establish root-cause certainty.

    Allowlisted audit records
    Producer sequence / clock trust separate
    Correlation/completeness review
    Composite tuple / observed job relationship
    Scope and checkpoint
    All-row priority / repeat/order controls
  5. Recovery is a new checkpoint

    Restored owner Duru and validated true describe a new supplied state while historical events remain. Recovery does not erase past records, and productionRestore is false.

    Allowlisted audit records
    Producer sequence / clock trust separate
    Correlation/completeness review
    New validated state / historical ledger retained
    Scope and checkpoint
    All-row priority / repeat/order controls
  6. Bounded review receipt

    Review retains Atlas/tea scope with confidence and unknowns. Minimized structured records need no private body; finite comparison is not expanded into actual incident detection.

    Allowlisted audit records
    Producer sequence / clock trust separate
    Correlation/completeness review
    New validated state / historical ledger retained
    Scope and checkpoint
    Known scope + uncertainty / no production claim

Audit gap

  1. Missing business event

    No matching business row exists; missing result is unknown with null commit. HTTP200 or empty detector output cannot establish healthy policy enforcement.

    Allowlisted audit records
    Business observation absent / committed unknown
    Correlation/completeness review
    Not yet evaluated
    Scope and checkpoint
    Not yet evaluated
  2. Collector-coverage gap

    Absence could reflect no event, lost fields or collector failure. The normal deny/false row is not copied as an authoritative decision for an incomplete event.

    Allowlisted audit records
    Business observation absent / committed unknown
    Correlation/completeness review
    Absent evidence ≠ verified negative event
    Scope and checkpoint
    Not yet evaluated
  3. Impact uncertainty

    Actor intent, commit and other tenant/object impact remain UNKNOWN. Extending known scope requires separate context; a user alias alone does not complete attribution.

    Allowlisted audit records
    Business observation absent / committed unknown
    Correlation/completeness review
    Absent evidence ≠ verified negative event
    Scope and checkpoint
    Commit/intent/other-scope impact UNKNOWN
  4. Required source bindings

    Required schema, producer context, composite tuple and collector coverage are needed. Every matching row needs completeness checks; first-match shortcuts cannot answer this.

    Allowlisted audit records
    Needed: source/schema/tuple/coverage/all rows
    Correlation/completeness review
    Absent evidence ≠ verified negative event
    Scope and checkpoint
    Commit/intent/other-scope impact UNKNOWN
  5. Narrow selector knowledge

    XPath selects deny/true in one XML document; missing documents may yield zero. That zero proves neither real SIEM event absence, complete retention nor pipeline reliability.

    Allowlisted audit records
    Needed: source/schema/tuple/coverage/all rows
    Correlation/completeness review
    Zero matches ≠ adequate evidence coverage
    Scope and checkpoint
    Commit/intent/other-scope impact UNKNOWN
  6. Boundary for new review

    New evidence must complete known-tuple and collector context separately. This missing record remains unknown and triggers no automatic incident verdict, user disabling or recovery.

    Allowlisted audit records
    Needed: source/schema/tuple/coverage/all rows
    Correlation/completeness review
    Zero matches ≠ adequate evidence coverage
    Scope and checkpoint
    Retain unknown / scoped human review evidence

IMPLEMENTATION · SECURITY CONTROL · VERIFICATION

Selector results and evidence sufficiency

The detector schema requires eventId, tenant, operationAlias, object, decision and committed. The comparator inspects every business row in the same tuple rather than stopping at the first match. An identical repeated eventId with identical fields counts as one piece of evidence. Any unique deny/true row yields review-required. Differing completed outcomes in the tuple, or differing fields under the same eventId, also retain an ambiguity flag; without explicit deny/true the result is ambiguous. Missing commitment remains unknown. This finite Python comparison proves neither a real policy violation nor SIEM deployment. XPath separately selects deny/true business rows within one XML document: negative yields zero, positive one, and missing data zero; the last result is not a healthy baseline.

Reduce false conclusions by considering older revisions, different tenants, explained retries and ordinary policy denial. Job correlation extends the chain only when a worker event exists; its absence cannot establish job execution. Record clock confidence and producer identity separately. Same-producer sequence may establish order while order across clocks remains unknown. The key question is both how many rows were selected and whether the required evidence set actually exists; missing-field and collector-health evidence therefore remain separate.

Bounding incident and recovery decisions

A review note first states the observation: the selected decision and commit records disagree for Atlas/op-demo/tea. It then adds confidence and provenance: fixed fixture, supplied producer context and clock uncertainty. Bound impact to that evidence; neither all tenants being affected nor Duru being malicious follows. NIST incident guidance emphasizes analysis, magnitude assessment and evidence provenance. This example neither blocks users automatically nor starts recovery operations; it presents the known and unknown fields to the decision owner.

Recovery evidence uses a new checkpoint to validate owner state and the expected business invariant; the historical contradiction remains. In the finite example restoredOwner Duru and validated=true describe a selected state check, not restoration of an external application, backup or production service. Durable hardening preserves the source schema, unknown behavior on field loss, audit-pipeline failure checks and purpose-limited reviewer access. The next regression review can compare this known tuple again, but cannot silently pass systems outside its scope.

NOW APPLY IT TO THE CASE

Do 200, parent relation or equal aliases prove an incident?

Atlas/op-demo/tea has HTTP200, business denial with committed false and a worker job record. Nova reuses the request alias but belongs to another tenant. The job clock looks earlier than its parent; producer clocks do not establish global order. The comparator inspects every business row in the tuple.

Separate decisions for verified actor, tenant relation and requested action in the case. Do not substitute authentication or proof success for object permission.

Open the related case file ↗

READ THE EXAMPLE TOGETHER

Tea note audit and scope ledger

Select a field and examine what it supports and where the evidence ends.

Read the raw artifact and field explanations
{
  "schemaFields": [
    "eventId",
    "parentEventId",
    "kind",
    "tenant",
    "requestAlias",
    "operationAlias",
    "sessionCorrelationAlias",
    "userAlias",
    "jobAlias",
    "actor",
    "action",
    "object",
    "decision",
    "reason",
    "committed",
    "producer",
    "sequence",
    "time",
    "status"
  ],
  "ledger": [
    {
      "eventId": "http-demo",
      "kind": "http",
      "tenant": "Atlas",
      "requestAlias": "req-demo",
      "operationAlias": "op-demo",
      "object": "tea",
      "status": 200,
      "producer": "app",
      "sequence": 1
    },
    {
      "eventId": "decision-demo",
      "parentEventId": "http-demo",
      "kind": "business",
      "tenant": "Atlas",
      "requestAlias": "req-demo",
      "operationAlias": "op-demo",
      "sessionCorrelationAlias": "session-group-demo",
      "userAlias": "Duru",
      "actor": "Duru",
      "action": "rename-note",
      "object": "tea",
      "decision": "deny",
      "reason": "owner-policy",
      "committed": false,
      "producer": "app",
      "sequence": 2,
      "time": "10:00:02"
    },
    {
      "eventId": "job-demo",
      "parentEventId": "decision-demo",
      "kind": "job",
      "tenant": "Atlas",
      "operationAlias": "op-demo",
      "jobAlias": "job-demo",
      "object": "tea",
      "producer": "worker",
      "sequence": 1,
      "time": "09:59:59"
    },
    {
      "eventId": "nova-demo",
      "kind": "business",
      "tenant": "Nova",
      "requestAlias": "req-demo",
      "operationAlias": "op-demo",
      "object": "tea",
      "decision": "allow",
      "committed": true,
      "producer": "app",
      "sequence": 3
    }
  ],
  "excludedSeed": {
    "Authorization": "FAKE-AUTH-ALIAS",
    "sessionIdentifier": "FAKE-SESSION-ALIAS",
    "noteText": "Tea note\nSecond line"
  },
  "correlationKeys": [
    "tenant",
    "operationAlias",
    "object"
  ],
  "normal": {
    "result": "expected-denial",
    "contradictions": 0
  },
  "contradiction": {
    "decision": "deny",
    "committed": true,
    "result": "review-required",
    "contradictions": 1,
    "syntheticNotActualPolicyViolation": true
  },
  "missing": {
    "result": "unknown",
    "committed": null
  },
  "clock": {
    "parentRelation": "decision-demo → job-demo",
    "crossProducerWallClockOrder": "unknown"
  },
  "scope": {
    "knownObjects": [
      "tea"
    ],
    "knownTenants": [
      "Atlas"
    ],
    "otherObjects": "unknown",
    "otherTenants": "unknown"
  },
  "recovery": {
    "restoredOwner": "Duru",
    "validated": true,
    "historicalEventsRetained": true,
    "productionRestore": false
  },
  "selector": {
    "xml": "<audit><business decision=\"deny\" committed=\"false\"/></audit>",
    "xpath": "count(/audit/business[@decision=\"deny\" and @committed=\"true\"])",
    "expected": 0,
    "positiveFixtureXml": "<audit><business decision=\"deny\" committed=\"true\"/></audit>",
    "positiveExpected": 1
  },
  "comparatorPolicy": {
    "scopeKeys": [
      "tenant",
      "operationAlias",
      "object"
    ],
    "inspect": "all matching business rows",
    "identicalRepeat": "deduplicate complete identical event record",
    "changedEventIdentityFields": "ambiguous",
    "resultPriority": [
      "explicit deny/true → review-required",
      "missing/incomplete evidence → unknown",
      "conflicting complete records → ambiguous",
      "only deny/false → expected-denial",
      "other complete observations → other-observed"
    ],
    "notActualIncidentVerdict": true
  },
  "multipleRows": {
    "lateContradiction": {
      "result": "review-required",
      "matchingRows": 2,
      "uniqueRows": 2,
      "duplicateRows": 0,
      "contradictions": 1,
      "incompleteRows": 0,
      "ambiguous": true
    },
    "identicalDuplicate": {
      "result": "expected-denial",
      "matchingRows": 2,
      "uniqueRows": 1,
      "duplicateRows": 1,
      "contradictions": 0,
      "incompleteRows": 0,
      "ambiguous": false
    },
    "differentCompleteOutcomes": {
      "result": "ambiguous",
      "matchingRows": 2,
      "uniqueRows": 2,
      "duplicateRows": 0,
      "contradictions": 0,
      "incompleteRows": 0,
      "ambiguous": true
    },
    "sameIdDifferentFields": {
      "result": "ambiguous",
      "matchingRows": 2,
      "uniqueRows": 2,
      "duplicateRows": 0,
      "contradictions": 0,
      "incompleteRows": 0,
      "ambiguous": true
    },
    "laterIncomplete": {
      "result": "unknown",
      "matchingRows": 2,
      "uniqueRows": 2,
      "duplicateRows": 0,
      "contradictions": 0,
      "incompleteRows": 1,
      "ambiguous": false
    }
  }
}
ledger
Fixed source-context fields, not live logs.
correlationKeys
Tenant/operation/object relationship, not a credential.
excludedSeed
Fake sensitive fields are not copied to output.
scope/recovery
Known scope and a new checkpoint; no production restoration.
selector
Denial/commit disagreement within one XML document; missing is unknown.

Synthetic event ledger and finite local comparator. No real log collector, identity verifier, SIEM, global clock or production recovery is executed.

Two reality checks

HTTP 200 proves the business action committed.

Status describes response semantics; action decisions and persistence evidence are separate.

Zero selected rows establish that no incident exists.

Missing fields, a collector or scope can produce the same zero; without adequate evidence the conclusion is unknown.

YOUR TURN

Work through this story.

Predict the outcome, find the evidence boundary, and explain it in your own words.

For the same tenant/operation/object, the first business row is deny/false and a later row deny/true. What does the comparator return?

  1. expected-denial; the first row overrides every later record.
  2. review-required; the explicit contradiction takes priority.
Read the explained answer

review-required; the explicit contradiction takes priority. — lateContradiction contains a deny/true row. An expected first row does not erase the later contradiction; the result requires review, not a real incident verdict.

HTTP 200 and Atlas business deny/false appear in one trace. A Nova allow/true row shares the aliases. Can we conclude Atlas committed?

Selected lesson artifact fields; teaching example

ledger[0]
{"eventId":"http-demo","kind":"http","tenant":"Atlas","requestAlias":"req-demo","operationAlias":"op-demo","object":"tea","status":200,"producer":"app","sequence":1}
ledger[1]
{"eventId":"decision-demo","parentEventId":"http-demo","kind":"business","tenant":"Atlas","requestAlias":"req-demo","operationAlias":"op-demo","sessionCorrelationAlias":"session-group-demo","userAlias":"Duru","actor":"Duru","action":"rename-note","object":"tea","decision":"deny","reason":"owner-policy","committed":false,"producer":"app","sequence":2,"time":"10:00:02"}
ledger[3]
{"eventId":"nova-demo","kind":"business","tenant":"Nova","requestAlias":"req-demo","operationAlias":"op-demo","object":"tea","decision":"allow","committed":true,"producer":"app","sequence":3}
correlationKeys
["tenant","operationAlias","object"]
  1. No. Atlas has committed=false; Nova is a different scope.
  2. Yes. A shared alias or 200 combines commit outcomes across tenants.
Read the explained answer

No. Atlas has committed=false; Nova is a different scope. — HTTP 200 is not a business commit. With tenant, operationAlias and object in the correlation key, Nova is not merged into Atlas’s decision.

Why do identical duplicates, changed fields under one ID and a later incomplete row differ? What does causal order say when the job wall clock appears earlier than its parent?

Read the explained answer

A completely identical event record is deduplicated. Changed fields under one event ID can be ambiguous; a missing required row preserves unknown. ParentEventId provides a causal relation but does not establish cross-producer wall-clock order. The review scope is limited to Atlas/tea, with other tenants/objects unknown. Recovery validation retains historical events and is not proof of production restoration.

□ I separated duplicate, conflicting and incomplete evidence.

□ I did not treat a causal parent relation as cross-producer clock order or wider incident scope.

Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples

Sources and scope

  • OWASP — Logging Cheat SheetEvent data sources · Event attributes · Data to exclude · Event collection · Verification · Operation · Protection · Which events to log
  • NIST SP 800-61 Rev. 3, April 2025RS.AN-03, printed p.28 / PDF p.36 · RS.AN-06 and RS.AN-07, printed p.29 / PDF p.37 · RS.AN-08, printed p.29 / PDF p.37 · RC.RP-02 through RC.RP-05, printed p.34 / PDF p.42