Sub-scope 06 (fileserver) payload operations · CSV export · testkit contracts · crash matrix revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T01:30:13+00:00 === OWNED FILES (3 main + 12 test) === d0566494c6024e6c068e980b7537200a0cf3844d main/LocalPersistentPayloadOperations.java 1101 140dca95e213bdc36c6a45a08a254904f9138c1d main/StreamingCsvEncoder.java 190 cb53573f65ec919834088b40343ad71352a8c754 main/FilesystemCsvExportAdapter.java 188 699b6db92aa73404f7319c5de7d1244354887286 test/LocalPersistentPayloadOperationsTest.java 757 2721049858a6857b49d089b87cd01677720d00ab test/FilesystemCsvExportAdapterTest.java 134 b8e0e713d8d87e39462ba229514e92c1c8195e6c test/FileserverCrashScenarioMain.java 473 819746893a4bc76be6b447a0ac9e19ad678ac24c test/testkit/ContentStoreContract.java 193 a0b7bac9cf0d04addfbe8b1700b2245509be6d8e test/testkit/CrashPoint.java 30 f7b14c62a7b19957859b23409991e8429916ca78 test/testkit/CrashRecoveryMatrixTest.java 173 c990e690ba089148cfcdc0dadeda05a6ca8617f9 test/testkit/LargeFileBoundedMemoryTest.java 152 1ad295c83d3cca34822b612e6cebb3857314f629 test/testkit/LocalContentStoreContractTest.java 42 2b44236a451ecc5f50f43badb8294787b58a95e6 test/testkit/MetadataPointerContentStoreContractTest.java 43 31f303c64278168dadc3fca71a51f38a51847cdb test/testkit/NfsAmbiguityIntegrationTest.java 42 3f1f7baf85d365968563052b6f1818b480ed678e test/testkit/NfsTestEnvironment.java 26 fdf5d1b0a0584dcc6eca86ada6be3298de15d462 test/testkit/PvcCertificationDescriptor.java 42 === 8.1 reachability === $ git grep -rln 'LocalPersistentPayloadOperations\|StreamingCsvEncoder\|FilesystemCsvExportAdapter' -- . | grep -v "^adapter/outbound/fileserver/" exit=1 $ grep -n 'class FilesystemCsvExportAdapter\|final class StreamingCsvEncoder\|final class LocalPersistentPayloadOperations' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FilesystemCsvExportAdapter.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/StreamingCsvEncoder.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentPayloadOperations.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FilesystemCsvExportAdapter.java:25:public class FilesystemCsvExportAdapter implements FileExportPort { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/StreamingCsvEncoder.java:22:final class StreamingCsvEncoder { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentPayloadOperations.java:42:final class LocalPersistentPayloadOperations { exit=0 === 8.2 payload operations: the residual pathname primitives, declared === $ grep -n 'the JDK.s missing relative' -B 3 -A 3 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentPayloadOperations.java 35- * Secure payload boundary for the qualified local-persistent Fileserver R2 provider. 36- * 37- *

Caller values are converted to bounded generated segments before filesystem access. Reads, 38: * writes, and exact deletes use {@link SecureDirectoryStream}; the JDK's missing relative 39- * hard-link, directory-create, and directory-force primitives are bracketed by attested identity 40- * checks in this class. 41- */ exit=0 $ grep -n 'Files.createLink\|Files.createDirectory\|Files.newDirectoryStream\|Files.getFileStore\|Files.readAttributes\|Files.setPosixFilePermissions' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentPayloadOperations.java 414: Files.readAttributes(directory, PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS); 789: Files.readAttributes(shardPath, PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS); 802: Files.createDirectory( 805: Files.setPosixFilePermissions(shardPath, PRIVATE_DIRECTORY_PERMISSIONS); 807: Files.readAttributes(shardPath, PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS); 813: return Files.getFileStore(path).name(); 818: return Files.getFileStore(path).type(); 934: Files.getFileStore(artifactPath).name(), 935: Files.getFileStore(artifactPath).type()); 941: Files.createLink(link, existing); 1003: Files.getFileStore(path).name(), 1004: Files.getFileStore(path).type()); 1013: DirectoryStream top = Files.newDirectoryStream(topDirectory); exit=0 === 8.2b CSV formula mitigation: which leading characters count === $ grep -n 'isFormulaCandidate' -A 10 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/StreamingCsvEncoder.java 120: if (!isFormulaCandidate(value)) { 121- return value; 122- } 123- return switch (column.formulaPolicy()) { 124- case ALLOW -> value; 125- case MITIGATE -> { 126- formulaMitigated++; 127- yield "'" + value; 128- } 129- case REJECT -> 130- throw failure( -- 174: private static boolean isFormulaCandidate(String value) { 175- if (value.isEmpty()) { 176- return false; 177- } 178- return switch (value.charAt(0)) { 179- case '=', '+', '-', '@', '\t', '\r' -> true; 180- default -> false; 181- }; 182- } 183- 184- private static FilePublicationException failure( exit=0 $ grep -n 'formulaPolicy' -A 12 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/StreamingCsvEncoder.java | head -18 123: return switch (column.formulaPolicy()) { 124- case ALLOW -> value; 125- case MITIGATE -> { 126- formulaMitigated++; 127- yield "'" + value; 128- } 129- case REJECT -> 130- throw failure( 131- FilePublicationException.Reason.INVALID_REQUEST, 132- "spreadsheet formula text rejected for column " + column.name()); 133- }; 134- } 135- exit=0 === 8.3 R1 legacy adapter vs R2 encoder: same job, declared difference === $ grep -n 'CREATE_NEW\|Files.write\|StringBuilder' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FilesystemCsvExportAdapter.java | head 51: * to be assembled in one {@code StringBuilder} and then converted to a byte array, so peak memory 53: * And {@code Files.write} truncates, so exporting a name that already existed silently replaced 54: * whatever was there; {@code CREATE_NEW} makes a name collision an error the caller can see. 70: StandardOpenOption.CREATE_NEW, exit=0 $ grep -n 'stand-in for NFS/SFTP' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FilesystemCsvExportAdapter.java adapter/outbound/fileserver/README.md adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/FilesystemCsvExportAdapter.java:21: * (the "file server" boundary, a stand-in for NFS/SFTP). Fields are escaped per RFC-4180 and the exit=0 === 8.4 testkit: what the contracts and the crash matrix cover === $ grep -nE 'class |@Test| void |CrashPoint\.' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashPoint.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java | head -40 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:45:class CrashRecoveryMatrixTest { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:54: @EnumSource(CrashPoint.class) adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:55: void aPublishedObjectIsAlwaysCompleteAndDigestMatched(CrashPoint crashPoint) throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:63: assertThat(crashPoint).isNotEqualTo(CrashPoint.AFTER_METADATA_BEFORE_QUOTA); adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:75: @EnumSource(CrashPoint.class) adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:76: void aCrashNeverLeavesAPartialObjectUnderThePublishedKey(CrashPoint crashPoint) throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:100: if (crashPoint == CrashPoint.AFTER_CREATE) { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:105: if (crashPoint == CrashPoint.DURING_APPEND) { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/CrashRecoveryMatrixTest.java:110: if (crashPoint == CrashPoint.AFTER_APPEND_COMMIT || crashPoint == CrashPoint.BEFORE_PUBLISH) { exit=0 $ grep -nE 'class |@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LocalContentStoreContractTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/MetadataPointerContentStoreContractTest.java | head -30 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:39:public abstract class ContentStoreContract { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:50: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:51: void createAppendFinalizeStatReadDeleteRoundTrip() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:61: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:62: void appendsAccumulateAndTheDigestCoversEveryByte() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:73: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:74: void aMismatchedOffsetIsRefusedWithoutMutatingTheObject() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:86: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:87: void aRangedReadReturnsExactlyTheRequestedBytes() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:95: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:96: void aDeclaredDigestThatDoesNotMatchIsRefusedAtFinalize() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:113: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:114: void aDeclaredLengthThatDoesNotMatchIsRefusedAtFinalize() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:128: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:129: void deletingAnAbsentObjectIsAnIdempotentSuccessThatReportsTheDivergence() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:137: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:138: void theStoreReportsCapabilitiesItActuallyProved() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:143: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/ContentStoreContract.java:144: void twoUploadsNeverShareAPhysicalKey() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LocalContentStoreContractTest.java:18:class LocalContentStoreContractTest extends ContentStoreContract { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LocalContentStoreContractTest.java:25: void createStore() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/MetadataPointerContentStoreContractTest.java:19:class MetadataPointerContentStoreContractTest extends ContentStoreContract { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/MetadataPointerContentStoreContractTest.java:26: void createStore() { exit=0 $ grep -nE 'class |@Test| void |@EnabledIf|@Tag|Assumptions' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsTestEnvironment.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/PvcCertificationDescriptor.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java | head -30 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:19:@EnabledIfEnvironmentVariable(named = NfsTestEnvironment.ENABLE_FLAG, matches = "true") adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:20:class NfsAmbiguityIntegrationTest { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:25: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:26: void aRenameWhoseAcknowledgementWasLostIsAmbiguousRatherThanRetryable() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:31: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:32: void aStaleHandleAfterAServerRestartSendsTheFileToReconciliation() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:37: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsAmbiguityIntegrationTest.java:38: void theEnvironmentGateIsExplicitAboutWhyItWouldSkip() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/NfsTestEnvironment.java:11:public final class NfsTestEnvironment { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:34:class LargeFileBoundedMemoryTest { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:43: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:44: void uploadingALargeObjectNeverRequestsMoreThanOneBufferAtATime() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:71: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:72: void readingALargeObjectIsAlsoBounded() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:116: private static final class CountingSource implements ReadableByteChannel { exit=0 $ git grep -n 'FileserverCrashScenarioMain' -- 'adapter/outbound/fileserver/src' | head adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FileserverCrashScenarioMain.java:50:final class FileserverCrashScenarioMain { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/FileserverCrashScenarioMain.java:65: private FileserverCrashScenarioMain() {} adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:31: private static final String CHILD_MAIN = FileserverCrashScenarioMain.class.getName(); adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:36: @EnumSource(FileserverCrashScenarioMain.CrashBoundary.class) adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:38: FileserverCrashScenarioMain.CrashBoundary boundary) throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:43: assertThat(crashed.exitCode()).isEqualTo(FileserverCrashScenarioMain.CRASH_EXIT_CODE); adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:49: ? FileserverCrashScenarioMain.RECOVERY_INDETERMINATE_QUARANTINED adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:50: : FileserverCrashScenarioMain.RECOVERY_SUCCESS; adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:69: awaitMarker(holder, FileserverCrashScenarioMain.LOCK_ACQUIRED); adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/LocalPersistentCrashRecoveryTest.java:74: assertThat(excluded.output()).isEqualTo(FileserverCrashScenarioMain.LOCK_BUSY); exit=0