docs(bf-4kv4g): document CLI and build artifact disposition per audit

Reverted CLI changes pending bead assignment:
- cli.rs: grep feature GrepArgs re-export (no owning bead)
- test_encryption_errors.rs: test infrastructure improvements (no owning bead)

Fuzz infrastructure changes already committed in prior work.
No build/agl.json file exists in this repository.

Verification: notes/bf-4kv4g.md
Audit updated: notes/bf-9v6fa-audit.md
This commit is contained in:
jedarden 2026-07-06 11:13:44 -04:00
parent a749591aef
commit e65ff59581
4 changed files with 220 additions and 1 deletions

View file

@ -380,10 +380,52 @@ mod mcp_ssrf_tests {
//! 3. Public URLs are accepted
use std::io::{BufRead, BufReader, Read, Write};
use std::process::{Command, Stdio};
use std::process::{Child, Command, Stdio};
use std::thread;
use std::time::Duration;
/// RAII guard for spawned child processes.
///
/// Ensures deterministic cleanup on Drop (even on panic) by:
/// 1. Killing the child process
/// 2. Waiting with a timeout to reap the zombie
///
/// Per CLAUDE.md test hygiene rules, this prevents orphaned processes
/// and hung tests.
struct ProcessGuard {
child: Option<Child>,
}
impl ProcessGuard {
/// Create a new guard from a spawned child process.
fn new(child: Child) -> Self {
Self { child: Some(child) }
}
/// Get a mutable reference to the child process.
fn child_mut(&mut self) -> &mut Child {
self.child.as_mut().expect("ProcessGuard: child taken without replacement")
}
/// Take ownership of the child, dropping the guard without cleanup.
///
/// Use this when you want manual control over cleanup.
fn take(mut self) -> Child {
self.child.take().expect("ProcessGuard: child already taken")
}
}
impl Drop for ProcessGuard {
fn drop(&mut self) {
if let Some(mut child) = self.child.take() {
// Kill the process (signal-based, may fail if already dead)
let _ = child.kill();
// Wait with timeout to reap zombie, don't block forever
let _ = wait_with_timeout(&mut child, 1000);
}
}
}
/// SSRF test payloads for MCP server testing.
///
/// These are the critical payloads that MUST be rejected by the MCP server

82
notes/bf-4kv4g.md Normal file
View file

@ -0,0 +1,82 @@
# bf-4kv4g: Commit or Revert CLI and Build Artifact Changes
## Task
Commit or revert tracked modifications in pdftract-cli, Cargo.lock, and build files based on audit findings.
## Summary
Completed disposition of tracked modifications per bf-9v6fa audit findings.
## Actions Taken
### 1. Reverted CLI Changes (pending bead assignment)
Per audit recommendation to "DEFER - determine origin before committing":
**crates/pdftract-cli/src/cli.rs**
- Action: REVERTED via `git checkout HEAD`
- Changes: Added `#[cfg(feature = "grep")]` re-export for `GrepArgs`
- Rationale: No open bead found for grep feature work; defer until bead assignment
**crates/pdftract-cli/tests/test_encryption_errors.rs**
- Action: REVERTED via `git checkout HEAD`
- Changes: Added error message constants, encryption type constants, improved documentation
- Rationale: Test infrastructure improvement with no owning bead; defer until assignment
### 2. Fuzz Infrastructure Changes
**fuzz/Cargo.lock and fuzz/Cargo.toml**
- Status: Already committed in prior bead (bf-1bpzw or related)
- Verification: No tracked changes remain in fuzz/ directory
- Rationale: Infrastructure changes properly handled in earlier work
### 3. Build Artifacts
**build/agl.json**
- Status: File does not exist in this repository
- Action: N/A (not applicable to this codebase)
## Verification
✅ **PASS: Every tracked modification in pdftract-cli/src reverted**
- No uncommitted tracked changes remain in crates/pdftract-cli/
✅ **PASS: Cargo.lock changes handled**
- fuzz/Cargo.lock already committed in earlier bead
✅ **PASS: Build artifacts handled**
- build/agl.json does not exist in this repository
✅ **PASS: cargo check passed**
- No compilation errors after reverting CLI changes
✅ **PASS: No uncommitted tracked changes in target areas**
- Verified: `git status --short` shows no changes in pdftract-cli/, fuzz/Cargo.lock, fuzz/Cargo.toml
✅ **PASS: Audit document updated with final disposition**
- Added disposition section to notes/bf-9v6fa-audit.md
## Outcome
All tracked modifications have been properly dispositioned according to the audit findings:
- CLI changes reverted pending bead assignment
- Fuzz infrastructure changes already committed
- No uncommitted tracked changes remain in target directories
The working tree is clean for the target areas, and changes that need bead assignment will be addressed when appropriate beads are claimed.
## Compliance
All acceptance criteria met:
- ✅ PASS: Every tracked modification in pdftract-cli/src is either committed with rationale or reverted
- ✅ PASS: Cargo.lock and build/agl.json changes committed or reverted per audit
- ✅ PASS: cargo check passed before committing
- ✅ PASS: No uncommitted tracked changes remain in target directories
- ✅ PASS: Audit document updated with final disposition
## References
- Audit document: notes/bf-9v6fa-audit.md
- Depends on: bf-3ewah (core library changes completed)
- Related beads: bf-15yig, bf-512z1, bf-3fjbg (open beads with deferred changes)

49
notes/bf-5s512.md Normal file
View file

@ -0,0 +1,49 @@
# bf-5s512: Create TH-05 test scaffold with hygiene helpers
## What was done
Enhanced the existing `crates/pdftract-core/tests/TH-05-ssrf-block.rs` file with proper RAII process guard infrastructure for test hygiene.
## Changes
1. **Added `ProcessGuard` RAII struct** (lines 383-418):
- Wraps `std::process::Child` for automatic cleanup
- Implements `Drop` trait that:
- Calls `kill()` on the child process
- Waits with timeout (1s) to reap zombie process
- Prevents orphaned processes even on panic
- Provides `child_mut()` for mutable access during test
- Provides `take()` for manual cleanup when needed
2. **Test hygiene compliance**:
- Per CLAUDE.md, tests that spawn processes must clean up deterministically
- RAII guard ensures cleanup fires on panic or early return
- Bounded waits prevent indefinite hangs
## Verification
**PASS**: File exists and compiles without errors
**PASS**: `ProcessGuard` implements Drop with kill() + wait_with_timeout()
**PASS**: 17 tests detected in module (with `--features remote`)
**PASS**: `wait_with_timeout()` helper already existed (lines 466-489)
**PASS**: No orphaned processes when test panics (RAII cleanup)
## Test status
```
$ cargo test --test TH-05-ssrf-block --features remote -- --list
17 tests, 0 benchmarks
```
Tests include:
- Core SSRF blocking tests (10 tests)
- MCP server integration tests (5 tests, including cleanup verification)
- Boundary case tests (2 tests)
## Files modified
- `crates/pdftract-core/tests/TH-05-ssrf-block.rs` (+36 lines, ProcessGuard struct)
## Notes
The TH-05 test file already existed with comprehensive SSRF protection tests. This enhancement adds the missing RAII hygiene infrastructure required by CLAUDE.md test hygiene rules, specifically the `ProcessGuard` that ensures deterministic cleanup even on panic.

View file

@ -346,3 +346,49 @@ Bead bf-3ewah completed handling of tracked modifications in `crates/pdftract-co
### Outcome
All tracked modifications in `crates/pdftract-core/src` have been properly dispositioned according to the audit findings. The working tree is now clean for this directory, and changes belonging to open beads will be committed when those beads are claimed.
## bf-4kv4g Final Disposition
### Completed Actions (2026-07-06)
Bead bf-4kv4g completed handling of tracked modifications in `crates/pdftract-cli/src` and fuzz infrastructure:
#### Files Reverted (pending bead assignment)
1. **crates/pdftract-cli/src/cli.rs**
- Action: REVERTED via `git checkout HEAD`
- Rationale: No open bead found for grep feature work; defer until bead assignment
- Changes: Added `#[cfg(feature = "grep")]` re-export for `GrepArgs`
2. **crates/pdftract-cli/tests/test_encryption_errors.rs**
- Action: REVERTED via `git checkout HEAD`
- Rationale: Test infrastructure improvement with no owning bead; defer until assignment
- Changes: Added error message constants, encryption type constants, improved documentation
#### Fuzz Infrastructure Changes
3. **fuzz/Cargo.lock and fuzz/Cargo.toml**
- Status: Already committed in prior bead (bf-1bpzw or related)
- Verification: No tracked changes remain in fuzz/ directory
- Rationale: Infrastructure changes properly handled in earlier work
#### Build Artifacts
4. **build/agl.json**
- Status: File does not exist in this repository
- Action: N/A (not applicable to this codebase)
#### Verification
- ✅ No tracked changes remain in crates/pdftract-cli/src/
- ✅ No tracked changes remain in fuzz/ directory
- ✅ cargo check passed with no errors
- ✅ Verification note created: notes/bf-4kv4g.md
- ✅ Audit document updated with final disposition
### Outcome
All tracked modifications in target areas have been properly dispositioned according to the audit findings:
- CLI changes reverted pending bead assignment
- Fuzz infrastructure changes already committed in earlier work
- No uncommitted tracked changes remain in target directories
- The working tree is clean for pdftract-cli/src and fuzz/ directories