added #1 fp=e8233d5288c52e75
added #2 fp=e521e14eceda4e2f
added #3 fp=793e35a2acd5a40f
added #4 fp=28a709599b3986a8
--- read
1  |  2026-10-05T09:00:00Z  |  alice  |  login  |  from desk 4  |  0000000000000000
2  |  2026-10-05T09:05:00Z  |  bob  |  edit file  |  budget.xlsx  |  e8233d5288c52e75
3  |  2026-10-05T09:10:00Z  |  alice  |  approve  |  invoice 17  |  e521e14eceda4e2f
4  |  2026-10-05T17:00:00Z  |  carol  |  logout  |  end of day  |  793e35a2acd5a40f
--- check original
INTACT: 4 lines, chain and head verified
exit=0
--- change line 2 in a copy
BROKEN:
  line 3: stored fingerprint of previous line does not match -> line 2 was changed (or this line's own fingerprint field was edited)
exit=1
--- remove line 2 in a copy
BROKEN:
  line 2: carries sequence number 3 -> a line was removed, inserted or reordered here
  line 3: carries sequence number 4 -> a line was removed, inserted or reordered here
  tail: head file expects 4 lines ending 28a709599b3986a8, log has 3 ending 28a709599b3986a8 -> last line(s) changed or removed
exit=1
--- change last line in a copy
BROKEN:
  tail: head file expects 4 lines ending 28a709599b3986a8, log has 4 ending 13c03bea4abc12b1 -> last line(s) changed or removed
exit=1
--- drop last line in a copy
BROKEN:
  tail: head file expects 4 lines ending 28a709599b3986a8, log has 3 ending 793e35a2acd5a40f -> last line(s) changed or removed
exit=1
--- tamper with line 1 AND recompute everything (the known gap)
INTACT: 4 lines, chain and head verified
exit=0 (forged consistently: NOT detected)
--- original still intact
INTACT: 4 lines, chain and head verified
