Skip to content

vms-0044: directory-logical resolution over the ACP (SYS$SYSTEM:/rooted logicals → ODS-2 directory FID, flip-blocker, epic vms-208) - #654

Merged
baron-3dl merged 2 commits into
mainfrom
work/vms-0044-dirlogical-acp
Aug 17, 2026
Merged

vms-0044: directory-logical resolution over the ACP (SYS$SYSTEM:/rooted logicals → ODS-2 directory FID, flip-blocker, epic vms-208)#654
baron-3dl merged 2 commits into
mainfrom
work/vms-0044-dirlogical-acp

Conversation

@baron-3dl

Copy link
Copy Markdown
Contributor

What

Flip-blocker for epic vms-208 (Files-11 ODS-2 ACP in the executive). The boot-to-Username path (LOGINOUT reading SYS$SYSTEM:SYSUAF.DAT) could not resolve rooted/concealed directory logicals to a concrete on-volume ODS-2 directory the ACP can walk to a FID — the reroute proofs sidestepped it with a concrete DKA0:[DIR] spec. This lands the two genuinely-missing pieces and proves the full chain on a real /dev/vms.

1. Composition (product code, pure) — vmsfs_compose_ods2_candidates()

src/vmsfs/vmsfs_translate.c. The VMS-spec sibling of vmsfs_to_linux_path(): same concealed-rooted machinery (vmsfs_device_concealed_rooted / merge_rooted_root, honouring LNM$M_CONCEALED and the trailing-dot rooted rule), but it stops at the resolved VMS spec instead of a host path:

SYS$SYSTEM:SYSUAF.DAT
  → DKA0:[SYS0.SYSEXE]SYSUAF.DAT            (node-specific member, first)
  → DKA0:[SYS0.SYSCOMMON.SYSEXE]SYSUAF.DAT  (common member, second)

in search-list order. Fail-honest (INV-6): an unresolvable chain composes nothing.

2. ACP directory walk

The composed [SYSn.SYSCOMMON.SYSEXE] path is walked MFD → [SYS0] → [SYSCOMMON] → [SYSEXE] via IO$_ACCESS-by-name (each level's <comp>.DIR entry gives the next directory FID), then the file within → the file FID. A search-list candidate that misses falls through to the next.

Proof (Rule 9 / INV-6)

  • tests/vmsrms/test_dirlogical_compose.c (host): composition to the ordered candidates + live relocation + fail-honest — 11/11.
  • tests/qemu/test_syssvc_dirlogical_acp.c (real /dev/vms): SYS$SYSTEM:SYSUAF.DAT resolves through lnm+$PARSE+ACP to the file FID (falling through the empty node member to the common member), $GET/IO$_READVBLK reads it byte-exact (no vmsfs_to_linux_path), fail-honest RMS$_FNF (file absent) / RMS$_DNF (missing directory level) — 9/9.
  • Fixture tests/qemu/mkimage_ods2_sysvol.c masters a genuine ODS-2 system-disk tree on a new DKA300: (vdd); harness + Dockerfile wire the fourth disk.
  • Negctl anchor dirlogical-compose-drops-common-member added (floor unchanged). test_kmod_disk / test_kmod_vmsfs_mountvis updated for the fourth unit.

Full QEMU kernel-executive harness run locally: 90 suites passed, 0 suites failed.

Mergeability

Incrementally mergeable — NOT a red-by-design flip-group. Purely additive; host ctest stays green because resolve_filename's default is not flipped. Wiring the ACP walk as RMS $OPEN's default (which forces the rms → libvmssys native-link --use LIBVMSSYS$SHR edge, and is red-by-design without /dev/vms) is the held capstone flip — this PR delivers the composition + walk that flip consumes.

Note: the item referenced rms_acp_spec_from_fab (#649) as on main; that PR was unrelated and no RMS-over-ACP $OPEN path exists on main yet — hence the composition ships as reusable vmsfs product code and the walk is proven in the harness (the footing every ACP-QIO rung sits on today).

🤖 Generated with Claude Code

…ed logicals -> ODS-2 directory FID)

Flip-blocker for epic vms-208 (Files-11 ODS-2 ACP in the executive): the
boot-to-Username path could not resolve SYS$SYSTEM:SYSUAF.DAT etc. even with the
ACP mounted, because nothing composed a rooted/concealed directory logical into
a concrete on-volume ODS-2 directory the ACP can walk to a FID.

This lands the two genuinely-missing pieces and proves the full chain against a
real /dev/vms:

1. Composition (product code, pure): vmsfs_compose_ods2_candidates()
   (src/vmsfs/vmsfs_translate.c) runs the existing concealed-rooted machinery
   (vmsfs_device_concealed_rooted / merge_rooted_root, honouring LNM$M_CONCEALED
   and the trailing-dot rooted rule) but STOPS at the resolved VMS spec instead
   of a Linux path:
     SYS$SYSTEM:SYSUAF.DAT
       -> DKA0:[SYS0.SYSEXE]SYSUAF.DAT            (node member, first)
       -> DKA0:[SYS0.SYSCOMMON.SYSEXE]SYSUAF.DAT  (common member, second)
   in search-list order. Fail-honest: an unresolvable chain composes nothing.

2. ACP directory walk: the composed [SYSn.SYSCOMMON.SYSEXE] path is walked MFD
   -> [SYS0] -> [SYSCOMMON] -> [SYSEXE] via IO$_ACCESS-by-name (each level's
   <comp>.DIR entry gives the next FID), then the file within -> the file FID;
   a search-list candidate that misses falls through to the next.

Proof:
- tests/vmsrms/test_dirlogical_compose.c (host): composition to the ordered
  candidates + live relocation + fail-honest (ctest: 11/11).
- tests/qemu/test_syssvc_dirlogical_acp.c (real /dev/vms): SYS$SYSTEM:SYSUAF.DAT
  resolves through lnm+$PARSE+ACP to the file FID (falling through the empty node
  member to the common member), $GET/IO$_READVBLK reads it BYTE-EXACT (no
  vmsfs_to_linux_path), and fail-honest RMS$_FNF (file absent) / RMS$_DNF
  (missing directory level). 9/9 against real /dev/vms.
- Fixture: tests/qemu/mkimage_ods2_sysvol.c masters a genuine ODS-2 system-disk
  tree on a new DKA300: (vdd); harness + Dockerfile wire the fourth disk.
- Negctl anchor dirlogical-compose-drops-common-member (facility_defects.sh),
  floor unchanged. test_kmod_disk / test_kmod_vmsfs_mountvis updated for the
  fourth unit.

Full QEMU kernel-executive harness: 90 suites passed, 0 failed.

INCREMENTALLY MERGEABLE (not a red-by-design flip-group): additive; ctest stays
green because resolve_filename's default is NOT flipped. Wiring the ACP walk as
RMS $OPEN's default (the rms->libvmssys native-link --use edge) is the held
capstone flip -- this delivers the composition + walk that flip consumes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@baron-3dl
baron-3dl force-pushed the work/vms-0044-dirlogical-acp branch from d15b003 to b8bc4b8 Compare August 17, 2026 06:23
… vector (append-only)

The concealed-rooted composer is a non-static vmsfs universal; append it to the
append-only .vms$sv symbol vector (GSMATCH LEQUAL-compatible) so the native
LINK.EXE build exports it alongside the other vmsfs filesystem universals. No
cross-image consumer binds it yet (the RMS $OPEN flip will); appending never
shifts an existing universal's index.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant