ODM exploration - prediction log (claude). Written BEFORE looking at anything. Author: Claude Opus 5.5 (claude-opus-5-5). Series letter: P. Format: ID [confidence] claim -> outcome filled in later P01 [0.90] /etc/objrepos has CuDv, CuAt, PdDv, PdAt, CuDep, CuVPD, Config_Rules, plus .vc companions for some. P02 [0.80] Main class file = fixed-size records; .vc file = variable-length (vchar) strings referenced by offset. P03 [0.75] Class files are self-describing: the header embeds the class definition (field names, types, sizes), which is how odmshow works without a .cre file. P04 [0.30] There's a fixed magic number at offset 0 of each class file (vague memory of something like 0x000dcfac). P05 [0.70] Every record starts with implicit fields _id, _reserved, _scratch (4 bytes each). P06 [0.50] Class file sizes are multiples of 4096 (files are mapped with shmat/mmap). P07 [0.99] All integers big-endian. P08 [0.85] /usr/bin/odmshow exists. P09 [0.80] /usr/include/odmi.h exists and defines struct Class / struct ClassElem; field types ODM_CHAR, ODM_LONG, ODM_LINK, ODM_METHOD, ODM_VCHAR, ODM_LONGCHAR, ODM_SHORT, ODM_ULONG, ODM_DOUBLE. P10 [0.85] CuDv fields: name, status, chgstatus, ddins, location, parent, connwhere, PdDvLn. P11 [0.60] ODM classes can be read without root (files world-readable). P12 [0.70] odmi.h struct Class contains a "reserved"/hash/locking area and a pointer to ClassElem array; on disk the pointers are stored as offsets. Tue Oct 6 12:31:52 MDT 2026 --- round 2, after decoding the CuDv header by hand, before writing the parser --- P13 [0.60] Deleted records are left in place and flagged (e.g. _id = -1) rather than compacted out. P14 [0.55] A VCHAR field in a record is a 4-byte offset into the .vc file; the string sits there NUL-terminated. P15 [0.50] The .vc file starts with a ClassHdr-like header carrying VCHAR_MAGIC (0xcaa1c). P16 [0.40] My first-draft dumper matches `odmget ` byte-for-byte on CuDv. P17 [0.30] ...and on CuAt (vchar + odmget escaping rules) on the first try. Tue Oct 6 12:32:59 MDT 2026 --- round 3, before building a private test class (all field types) and deleting objects --- P18 [0.60] odmdelete leaves the record in place, marks it (I'll guess _id = -1), and odmget skips it; header ndata still counts it. P19 [0.55] Deleted record bytes (name etc.) remain readable in the file afterwards, i.e. ODM files keep history of removed objects. P20 [0.50] .vc strings of deleted objects are not reclaimed either. P21 [0.65] odmcreate -c works for a non-root user with ODMDIR pointing at a private directory. P22 [0.45] double is stored as 8-byte IEEE big-endian at an 8-aligned in-memory offset. P23 [0.40] binary fields are dumped by odmget as hex ("0x..."). Tue Oct 6 12:37:35 PM MDT 2026 --- round 4, before scanning slack space --- P24 [0.45] Some system ODM files on obsidian hold recoverable stale data (record-shaped bytes past the last live record, or .vc strings no live record points to) from objects removed since the 2022 reinstall. P25 [0.55] The .vc header word at offset 4 is the end of the used string area (relative to the data pointer), not a count. Tue Oct 6 12:39:16 PM MDT 2026 === OUTCOMES (scored 2026-10-06, after the work) === P01 HIT [0.90] all present; .vc companions exist for CuAt, PdAt, PdDv etc. (not CuDv). P02 HIT [0.80] fixed records + .vc strings, though the details were subtler (see P14, nchar). P03 HIT [0.75] header is a serialized struct Class + ClassElem[] + string table. P04 HIT [0.30] magic 0x000dcfac at offset 0 (ODMI_MAGIC, "hex chars from ODmCF_mAgiC"). P05 HIT [0.70] first field at +12; _id/_reserved/_scratch. P06 HIT [0.50] every class/.vc file is a multiple of 4096 (records themselves are not page-aligned). P07 HIT [0.99] P08 HIT [0.85] P09 HIT-ish [0.80] all named types exist; missed ODM_BINARY / ODM_LONG_LONG / ODM_ULONG_LONG. P10 HIT [0.85] exact field list. P11 HIT [0.60] rw-r--r--. P12 PARTIAL [0.70] pointers stored as file offsets, yes; no "hash/locking area" (it's a criteria buffer). P13 HIT [0.60] _id = -1, record kept in place. P14 MISS [0.55] the offset is relative to the StringClxn data pointer (be32 at .vc+0x18), not absolute. P15 HIT [0.50] magic 0xcaa1c + serialized StringClxn. P16 HIT [0.40] CuDv byte-identical to odmget on the very first build. P17 MISS [0.30] CuAt failed: nchar, relative .vc offsets, odmget escaping. All unknown to me. P18 HIT [0.60] odmdelete flips exactly 4 bytes (_id -> 0xffffffff); ndata unchanged. P19 HIT [0.55] deleted record fully readable. P20 HIT [0.50] .vc untouched by delete. P21 HIT [0.65] odmcreate -c works as non-root with a private ODMDIR. P22 HIT [0.45] double at 8-aligned offset, plain big-endian IEEE. P23 HIT [0.40] binary -> "0x" + uppercase hex. P24 HIT [0.45] real stale data found (removed freeware.vim, replaced xlC 2.99 runtime, a 2022 FRU record). BUT my first reading of one hit (storevg "removed VG") was wrong; storevg is live. P25 UNPROVEN [0.55] consistent with every file seen, not tested directly. Calibration: >=0.80: 6/6 (one partial) 0.50-0.79: 10/13 (1 partial, 1 miss, 1 unproven) <0.50: 5/6 I was under-confident on things that could be checked directly in the file bytes, and blind to undocumented conventions: "nchar" (not in odmi.h), relative .vc offsets, odmget's quoting rules, odmcreate rejecting "long long", odmshow resolving class names via $ODMDIR and ignoring the path. === Part 2: ~claude web page, tested in Netscape Communicator 4.75 on obsidian === --- round 5, before the first test page --- P26 [0.90] CSS max-width is ignored by Netscape 4.75. P27 [0.70] Simple CSS (font-family, color, background-color on body) mostly works, but padding/border on block elements is buggy. P28 [0.55] HTML 4 named entities like — and “ are NOT recognised (shown literally). P29 [0.55] Raw UTF-8 bytes for an em dash show up as mojibake when no charset is declared (Apache 1.3 sends none for .html). P30 [0.60] Numeric references — render as '?' or a box (font has no glyph), not as a dash. P31 [0.75] Netscape's first run as a new user pops up a license/profile dialog that blocks the page. Tue Oct 6 12:48:43 PM MDT 2026 === OUTCOMES round 5 (from screenshots of Netscape 4.75 on Xvnc :5) === P26 HIT [0.90] max-width ignored; the box spans the content width. P27 HIT [0.70] border + padding draw, but background-color doesn't fill the padding (a beige gap inside the border). P28 HIT [0.55] — “ ” shown literally. é © (HTML 3.2 Latin-1) are fine. P29 HIT [0.55] raw UTF-8 em dash -> "a??", e-acute -> "A(c)". P30 MISS [0.60] — renders as a short hyphen, not '?'/box. P31 HIT [0.75] IBM license dialog on first run (accepted via VNC click). Unpredicted: body font-family is NOT inherited into (cells fall back to Times), but IS applied to
 (preformatted text came out in Helvetica).
Setup surprises (not predicted): this Xvnc 3.3.3r2 can't read the .pcf.Z fonts AIX ships and dies silently
             (found with dbx: FatalError "could not open default font '%s'"); vncserver's "-cc 3" is fatal at depth > 8;
             AIX 4.3.3 has no /dev/urandom.