Separate concrete finding from the #579/#603 review; not included in the symlink-referent fix.
Minimal in-memory reproduction through withFileSystemQuota(raw, {maxBytes:128}):
await quota.writeFile("/a", new Uint8Array(1));
await quota.link("/a", "/b");
await quota.writeFile("/a", new Uint8Array(100));
Both entries now report size100 (same inode), so the wrappers existing namespace-based usedBytes census reports200 while the configured ceiling is128. The admission delta only accounts for one entry. This is a logical namespace-accounting inconsistency, NOT evidence of200 physical bytes or duplicated backing storage. Define and preserve the intended hard-link accounting domain, then validate writes/appends/truncation and provider identity/unknown-identity behavior before changing code. The current small reproduction was executed without external filesystem writes.
Separate concrete finding from the #579/#603 review; not included in the symlink-referent fix.
Minimal in-memory reproduction through withFileSystemQuota(raw, {maxBytes:128}):
Both entries now report size100 (same inode), so the wrappers existing namespace-based usedBytes census reports200 while the configured ceiling is128. The admission delta only accounts for one entry. This is a logical namespace-accounting inconsistency, NOT evidence of200 physical bytes or duplicated backing storage. Define and preserve the intended hard-link accounting domain, then validate writes/appends/truncation and provider identity/unknown-identity behavior before changing code. The current small reproduction was executed without external filesystem writes.