|
275 | 275 | "priority": 15, |
276 | 276 | "passes": true, |
277 | 277 | "notes": "Completed. Added 'More examples' section with CardGroup linking to S3 and SQLite examples on GitHub, plus a list of other VFS use cases." |
| 278 | + }, |
| 279 | + { |
| 280 | + "id": "US-016", |
| 281 | + "title": "Add SSH key-based authentication e2e-docker fixture", |
| 282 | + "description": "As a developer, I need an SSH fixture that tests pubkey authentication through the sandbox so we validate the crypto bridge handles key parsing, sign(), and createSign() for RSA/Ed25519.", |
| 283 | + "acceptanceCriteria": [ |
| 284 | + "Add authorized_keys setup to sshd.Dockerfile (generate a test keypair at build time or embed one)", |
| 285 | + "New fixture ssh2-key-auth in tests/e2e-docker/ that connects using privateKey option instead of password", |
| 286 | + "Fixture runs conn.exec() and verifies stdout/stderr/exit code parity with host", |
| 287 | + "fixture.json expectation is 'pass'", |
| 288 | + "Host and sandbox produce identical normalized output", |
| 289 | + "Typecheck passes", |
| 290 | + "Tests pass" |
| 291 | + ], |
| 292 | + "priority": 16, |
| 293 | + "passes": false, |
| 294 | + "notes": "Key-based auth exercises completely different crypto paths than password auth (key parsing, signature generation). If the sandbox's crypto bridge has gaps in sign()/createSign() for RSA/Ed25519, the password-only test would not catch it." |
| 295 | + }, |
| 296 | + { |
| 297 | + "id": "US-017", |
| 298 | + "title": "Add SSH port forwarding / tunneling e2e-docker fixture", |
| 299 | + "description": "As a developer, I need an SSH fixture that tests TCP port forwarding through the sandbox so we validate that conn.forwardOut() works for database tunneling scenarios.", |
| 300 | + "acceptanceCriteria": [ |
| 301 | + "New fixture ssh2-tunnel in tests/e2e-docker/ that opens an SSH connection and uses forwardOut to tunnel to a service", |
| 302 | + "Can tunnel to the existing Postgres or Redis container through the SSH container as a jump host", |
| 303 | + "Fixture connects via tunnel, runs a simple query/command through the tunnel, verifies response", |
| 304 | + "fixture.json expectation is 'pass'", |
| 305 | + "Host and sandbox produce identical normalized output", |
| 306 | + "Typecheck passes", |
| 307 | + "Tests pass" |
| 308 | + ], |
| 309 | + "priority": 17, |
| 310 | + "passes": false, |
| 311 | + "notes": "SSH tunneling (forwardOut/forwardIn) is commonly used for database access through bastion hosts. This exercises nested TCP streams through the sandbox's net bridge — a very different path than direct connections." |
| 312 | + }, |
| 313 | + { |
| 314 | + "id": "US-018", |
| 315 | + "title": "Add SFTP directory operations e2e-docker fixture", |
| 316 | + "description": "As a developer, I need an SFTP fixture that tests directory operations (mkdir, rmdir, readdir) through the sandbox so we validate the full SFTP subsystem works.", |
| 317 | + "acceptanceCriteria": [ |
| 318 | + "New fixture ssh2-sftp-dirs in tests/e2e-docker/ that connects via SSH, opens SFTP, and tests directory ops", |
| 319 | + "Fixture creates directory, lists it with readdir, creates a file inside, reads directory again, removes file, removes directory", |
| 320 | + "fixture.json expectation is 'pass'", |
| 321 | + "Host and sandbox produce identical normalized output", |
| 322 | + "Typecheck passes", |
| 323 | + "Tests pass" |
| 324 | + ], |
| 325 | + "priority": 18, |
| 326 | + "passes": false, |
| 327 | + "notes": "The existing ssh2-sftp-transfer fixture only tests file CRUD (createWriteStream, readFile, stat, unlink). Directory listing via SFTP is a core operation for file management tools and is completely untested." |
| 328 | + }, |
| 329 | + { |
| 330 | + "id": "US-019", |
| 331 | + "title": "Add SSH/SFTP error path e2e-docker fixtures", |
| 332 | + "description": "As a developer, I need fixtures that test SSH error paths (connection refused, auth failure) through the sandbox so we validate error reporting matches host behavior.", |
| 333 | + "acceptanceCriteria": [ |
| 334 | + "New fixture ssh2-auth-fail that connects with wrong password and verifies the error matches host behavior", |
| 335 | + "New fixture ssh2-connect-refused that connects to a non-listening port and verifies the error matches host behavior", |
| 336 | + "Both fixtures have fixture.json expectation 'pass' (they should produce the same error output on host and sandbox)", |
| 337 | + "Host and sandbox produce identical normalized stdout/stderr/exit code", |
| 338 | + "Typecheck passes", |
| 339 | + "Tests pass" |
| 340 | + ], |
| 341 | + "priority": 19, |
| 342 | + "passes": false, |
| 343 | + "notes": "Zero error paths are currently tested for SSH/SFTP. Connection refused and auth failure are the two most common error cases. The sandbox could swallow or reshape these errors differently from host Node.js without detection." |
| 344 | + }, |
| 345 | + { |
| 346 | + "id": "US-020", |
| 347 | + "title": "Add SFTP large file transfer and rename e2e-docker fixture", |
| 348 | + "description": "As a developer, I need an SFTP fixture that tests larger file transfers and rename operations through the sandbox so we validate TCP buffer management and stream backpressure.", |
| 349 | + "acceptanceCriteria": [ |
| 350 | + "New fixture ssh2-sftp-large in tests/e2e-docker/ that transfers a file of at least 1MB via SFTP through the sandbox", |
| 351 | + "Fixture uses createWriteStream for upload and createReadStream for download (not just readFile)", |
| 352 | + "Fixture tests sftp.rename() on the remote file", |
| 353 | + "Verifies data integrity via hash comparison after round-trip", |
| 354 | + "fixture.json expectation is 'pass'", |
| 355 | + "Host and sandbox produce identical normalized output", |
| 356 | + "Typecheck passes", |
| 357 | + "Tests pass" |
| 358 | + ], |
| 359 | + "priority": 20, |
| 360 | + "passes": false, |
| 361 | + "notes": "The current SFTP fixture only transfers 18 bytes. Larger transfers stress the sandbox's TCP buffer management, stream backpressure handling, and memory limits. Also tests createReadStream (streaming) which exercises different buffer management than readFile (buffered)." |
278 | 362 | } |
279 | 363 | ] |
280 | 364 | } |
0 commit comments