550 lines
18 KiB
Markdown
550 lines
18 KiB
Markdown
# Design Document: Application Archiving
|
|||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This document captures the technical design decisions and architectural considerations for implementing the application archiving feature.
|
||
|
|
|
||
|
|
## Design Principles
|
||
|
|
|
||
|
|
### 1. Follow Existing Patterns
|
||
|
|
|
||
|
|
**Principle:** The archive command should follow established patterns from existing commands.
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Consistency in user experience
|
||
|
|
- Easier maintenance and understanding
|
||
|
|
- Leverages proven patterns from `write-cover-letter.md` and `write-application-email.md`
|
||
|
|
|
||
|
|
**Application:**
|
||
|
|
- Command file structure: Markdown with procedural instructions for Claude Code
|
||
|
|
- Argument parsing: Position-based with optional parameters and flags
|
||
|
|
- Error handling: Clear, actionable error messages with examples
|
||
|
|
- Validation: Check inputs before performing operations
|
||
|
|
|
||
|
|
### 2. Safety First
|
||
|
|
|
||
|
|
**Principle:** Protect user work by detecting and warning about generated documents.
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Users may invest significant time in cover letters and emails
|
||
|
|
- Accidental archiving of work-in-progress could be frustrating
|
||
|
|
- Better to err on the side of caution
|
||
|
|
|
||
|
|
**Application:**
|
||
|
|
- Detect: `cover-letter.md`, `application-email.md`, files in `attachments/`
|
||
|
|
- Warn: Show detailed message listing all detected work
|
||
|
|
- Require: Explicit `--force` flag to bypass warnings
|
||
|
|
- Preserve: All files during move (nothing is deleted)
|
||
|
|
|
||
|
|
### 3. Minimal Metadata Updates
|
||
|
|
|
||
|
|
**Principle:** Update only what's necessary, preserve everything else.
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Reduce risk of data corruption
|
||
|
|
- Simple updates are easier to verify and rollback
|
||
|
|
- Users may have customized other fields
|
||
|
|
|
||
|
|
**Application:**
|
||
|
|
- Only modify: Status field in Metadata section
|
||
|
|
- Format: `- **Status**: [State] (Archived: YYYY-MM-DD HH:MM)`
|
||
|
|
- Preserve: All other content in `application.md`
|
||
|
|
- Rollback: If move fails, don't update status
|
||
|
|
|
||
|
|
### 4. On-Demand Creation
|
||
|
|
|
||
|
|
**Principle:** Create archive folders only when needed.
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Avoid cluttering file system with empty folders
|
||
|
|
- Simpler initial setup (no migration needed)
|
||
|
|
- Users who don't use archiving don't see archive folders
|
||
|
|
|
||
|
|
**Application:**
|
||
|
|
- Check: Does `applications/rejected/` exist?
|
||
|
|
- Create: Only if first time archiving with "rejected"
|
||
|
|
- Same: For `applications/not-interested/`
|
||
|
|
- Track: In git with `.gitkeep` if desired
|
||
|
|
|
||
|
|
## Technical Architecture
|
||
|
|
|
||
|
|
### Command Flow
|
||
|
|
|
||
|
|
```
|
||
|
|
User Input: /archive-application [reason] [app-name] [--force]
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ 1. Parse Arguments │
|
||
|
|
│ - Extract reason │
|
||
|
|
│ - Extract app name │
|
||
|
|
│ - Check for --force │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ 2. Validate Inputs │
|
||
|
|
│ - Reason is valid? │
|
||
|
|
│ - App exists? │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ 3. Detect Location │
|
||
|
|
│ - Current dir? │
|
||
|
|
│ - Or resolve path │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ 4. Safety Checks │
|
||
|
|
│ - Cover letter? │
|
||
|
|
│ - Email? │
|
||
|
|
│ - Attachments? │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌────────┴────────┐
|
||
|
|
│ Documents found? │
|
||
|
|
└────────┬────────┘
|
||
|
|
│
|
||
|
|
Yes ┌─────┴─────┐ No
|
||
|
|
↓ ↓
|
||
|
|
┌──────────────┐ ┌──────────────┐
|
||
|
|
│ --force set? │ │ 5. Update │
|
||
|
|
└──────┬───────┘ │ Status │
|
||
|
|
│ └──────┬───────┘
|
||
|
|
Yes ┌──┴──┐ No ↓
|
||
|
|
↓ ↓ ┌──────────────┐
|
||
|
|
│ STOP │ 6. Create │
|
||
|
|
│ (warn) │ Archive │
|
||
|
|
↓ │ Folder │
|
||
|
|
┌──────────────┐ └──────┬───────┘
|
||
|
|
│ 5. Update │ ↓
|
||
|
|
│ Status │ ┌──────────────┐
|
||
|
|
└──────┬───────┘ │ 7. Move │
|
||
|
|
↓ │ Folder │
|
||
|
|
┌──────────────┐ └──────┬───────┘
|
||
|
|
│ 6. Create │ ↓
|
||
|
|
│ Archive │ ┌──────────────┐
|
||
|
|
│ Folder │ │ 8. Verify │
|
||
|
|
└──────┬───────┘ │ Success │
|
||
|
|
↓ └──────┬───────┘
|
||
|
|
┌──────────────┐ ↓
|
||
|
|
│ 7. Move │ ┌──────────────┐
|
||
|
|
│ Folder │ │ 9. Confirm │
|
||
|
|
└──────┬───────┘ │ Message │
|
||
|
|
↓ └──────────────┘
|
||
|
|
┌──────────────┐
|
||
|
|
│ 8. Verify │
|
||
|
|
│ Success │
|
||
|
|
└──────┬───────┘
|
||
|
|
↓
|
||
|
|
┌──────────────┐
|
||
|
|
│ 9. Confirm │
|
||
|
|
│ Message │
|
||
|
|
└──────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
### Data Flow
|
||
|
|
|
||
|
|
```
|
||
|
|
Input: applications/pending/2025-11-02-TechCorp-Developer/
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ Read application.md │
|
||
|
|
│ Current Status: Draft │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ Update in Memory │
|
||
|
|
│ New Status: Rejected │
|
||
|
|
│ Timestamp: 2025-12-18 │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ Write Back to File │
|
||
|
|
│ application.md updated │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
┌─────────────────────────┐
|
||
|
|
│ Move Entire Folder │
|
||
|
|
│ Including updated file │
|
||
|
|
└──────────┬──────────────┘
|
||
|
|
↓
|
||
|
|
Output: applications/rejected/2025-11-02-TechCorp-Developer/
|
||
|
|
```
|
||
|
|
|
||
|
|
### File System Operations
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. Status Update (before move)
|
||
|
|
cd applications/pending/[folder]/
|
||
|
|
cat application.md | sed 's/- \*\*Status\*\*:.*/- **Status**: Rejected (Archived: 2025-12-18 15:30)/' > application.md.tmp
|
||
|
|
mv application.md.tmp application.md
|
||
|
|
|
||
|
|
# 2. Create Archive Directory (if needed)
|
||
|
|
mkdir -p applications/rejected/
|
||
|
|
|
||
|
|
# 3. Move Application
|
||
|
|
mv applications/pending/[folder]/ applications/rejected/[folder]/
|
||
|
|
|
||
|
|
# 4. Verify
|
||
|
|
test -d applications/rejected/[folder]/ && echo "Success"
|
||
|
|
test ! -d applications/pending/[folder]/ && echo "Source removed"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Key Design Decisions
|
||
|
|
|
||
|
|
### Decision 1: Status Update Timing
|
||
|
|
|
||
|
|
**Options:**
|
||
|
|
- A) Update status BEFORE moving folder
|
||
|
|
- B) Update status AFTER moving folder
|
||
|
|
- C) Update status IN PLACE after moving
|
||
|
|
|
||
|
|
**Chosen:** Option A - Update status BEFORE moving
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Easier to rollback if move fails (just revert file)
|
||
|
|
- Status update is atomic operation (less likely to fail)
|
||
|
|
- If update fails, we stop early (don't move)
|
||
|
|
- Move operation is riskier, so do simpler operation first
|
||
|
|
|
||
|
|
**Trade-offs:**
|
||
|
|
- If move fails, status is updated but folder isn't moved
|
||
|
|
- User sees "Rejected" status in pending folder
|
||
|
|
- Mitigation: Show clear error, user can fix status or retry move
|
||
|
|
|
||
|
|
### Decision 2: Safety Check Scope
|
||
|
|
|
||
|
|
**Options:**
|
||
|
|
- A) Only check for generated documents (cover-letter.md, application-email.md)
|
||
|
|
- B) Check for any modifications to application.md
|
||
|
|
- C) Check for generated documents + attachments folder
|
||
|
|
- D) No safety checks, always allow archiving
|
||
|
|
|
||
|
|
**Chosen:** Option C - Generated documents + attachments
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Generated documents represent significant work
|
||
|
|
- Attachments likely contain CV and certificates
|
||
|
|
- Checking application.md changes is too broad (may be auto-populated)
|
||
|
|
- Some safety is better than none, but not overly restrictive
|
||
|
|
|
||
|
|
**Trade-offs:**
|
||
|
|
- Users can still accidentally archive applications with manual edits to application.md
|
||
|
|
- Acceptable: application.md is easier to recreate than generated documents
|
||
|
|
|
||
|
|
### Decision 3: Archive Folder Naming
|
||
|
|
|
||
|
|
**Options:**
|
||
|
|
- A) `rejected/` and `not-interested/`
|
||
|
|
- B) `archived-rejected/` and `archived-not-interested/`
|
||
|
|
- C) `archive/rejected/` and `archive/not-interested/`
|
||
|
|
- D) `rejected/` and `withdrawn/`
|
||
|
|
|
||
|
|
**Chosen:** Option A - `rejected/` and `not-interested/`
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Short, clear folder names
|
||
|
|
- "rejected" clearly indicates company rejected
|
||
|
|
- "not-interested" clearly indicates user withdrew
|
||
|
|
- No redundant "archived" prefix (location implies archived)
|
||
|
|
- Consistent with user's original request
|
||
|
|
|
||
|
|
**Trade-offs:**
|
||
|
|
- "not-interested" is verbose compared to "withdrawn"
|
||
|
|
- Acceptable: clarity over brevity
|
||
|
|
|
||
|
|
### Decision 4: Auto-Detection Scope
|
||
|
|
|
||
|
|
**Options:**
|
||
|
|
- A) Only detect if in exact application folder
|
||
|
|
- B) Detect from application folder or subfolders
|
||
|
|
- C) Detect from anywhere in pending folder tree
|
||
|
|
- D) No auto-detection, always require application name
|
||
|
|
|
||
|
|
**Chosen:** Option B - Application folder or subfolders
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Users may be in `input/` or `attachments/` when deciding to archive
|
||
|
|
- Detecting parent folder is user-friendly
|
||
|
|
- Not too broad (don't detect from root or pending folder itself)
|
||
|
|
- Matches pattern from other commands
|
||
|
|
|
||
|
|
**Trade-offs:**
|
||
|
|
- Slightly more complex path resolution logic
|
||
|
|
- Acceptable: improves user experience
|
||
|
|
|
||
|
|
### Decision 5: Error Handling Strategy
|
||
|
|
|
||
|
|
**Options:**
|
||
|
|
- A) Fail fast, stop on first error
|
||
|
|
- B) Try to proceed, show warnings
|
||
|
|
- C) Rollback on any error
|
||
|
|
- D) Partial success allowed (e.g., move but don't update status)
|
||
|
|
|
||
|
|
**Chosen:** Option A - Fail fast with Option C rollback on critical errors
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Validate all inputs BEFORE making changes
|
||
|
|
- Stop early if anything is wrong
|
||
|
|
- Rollback status update if move fails (critical path)
|
||
|
|
- Allow partial success only for non-critical operations (e.g., Timeline update)
|
||
|
|
|
||
|
|
**Trade-offs:**
|
||
|
|
- Less forgiving for edge cases
|
||
|
|
- Acceptable: better to stop and fix than proceed with errors
|
||
|
|
|
||
|
|
## Component Responsibilities
|
||
|
|
|
||
|
|
### Command File (`archive-application.md`)
|
||
|
|
|
||
|
|
**Responsibilities:**
|
||
|
|
- Parse and validate command arguments
|
||
|
|
- Detect application location
|
||
|
|
- Perform safety checks
|
||
|
|
- Update Status field
|
||
|
|
- Create archive directory
|
||
|
|
- Move application folder
|
||
|
|
- Verify success
|
||
|
|
- Show confirmation message
|
||
|
|
|
||
|
|
**NOT Responsible For:**
|
||
|
|
- Modifying other files besides application.md
|
||
|
|
- Validating application completeness (separate concern)
|
||
|
|
- Tracking archived applications (future enhancement)
|
||
|
|
- Providing archive search (future enhancement)
|
||
|
|
|
||
|
|
### Framework Documentation (`CLAUDE.md`)
|
||
|
|
|
||
|
|
**Responsibilities:**
|
||
|
|
- Explain when and how to use archiving
|
||
|
|
- Document command syntax
|
||
|
|
- Describe safety features
|
||
|
|
- Show integration with workflow
|
||
|
|
|
||
|
|
**NOT Responsible For:**
|
||
|
|
- Implementation details (that's in command file)
|
||
|
|
- Specification (that's in OpenSpec)
|
||
|
|
|
||
|
|
### Specifications (`application-archiving/spec.md`)
|
||
|
|
|
||
|
|
**Responsibilities:**
|
||
|
|
- Define requirements with scenarios
|
||
|
|
- Document expected behaviors
|
||
|
|
- Specify error handling
|
||
|
|
- Define integration points
|
||
|
|
|
||
|
|
**NOT Responsible For:**
|
||
|
|
- Implementation approach (that's in command file)
|
||
|
|
- User-facing documentation (that's in CLAUDE.md)
|
||
|
|
|
||
|
|
## Integration Points
|
||
|
|
|
||
|
|
### With Existing Commands
|
||
|
|
|
||
|
|
```
|
||
|
|
/new-application
|
||
|
|
↓ creates
|
||
|
|
application.md (with Status: Draft)
|
||
|
|
↓ populated by
|
||
|
|
/populate-application
|
||
|
|
↓ validated by
|
||
|
|
/validate-application
|
||
|
|
↓ generates
|
||
|
|
/write-cover-letter → cover-letter.md
|
||
|
|
↓ generates
|
||
|
|
/write-application-email → application-email.md
|
||
|
|
↓ user sends
|
||
|
|
(Application submitted)
|
||
|
|
↓ archives
|
||
|
|
/archive-application → moves to rejected/ or not-interested/
|
||
|
|
```
|
||
|
|
|
||
|
|
### With File System
|
||
|
|
|
||
|
|
```
|
||
|
|
File System Operations:
|
||
|
|
- Read: application.md (for current status)
|
||
|
|
- Write: application.md (to update status)
|
||
|
|
- Check: cover-letter.md, application-email.md, attachments/*
|
||
|
|
- Create: applications/rejected/, applications/not-interested/
|
||
|
|
- Move: applications/pending/[folder]/ → applications/[reason]/[folder]/
|
||
|
|
- Verify: Destination exists, source removed
|
||
|
|
```
|
||
|
|
|
||
|
|
### With User Workflow
|
||
|
|
|
||
|
|
```
|
||
|
|
User Decision Points:
|
||
|
|
1. Should I archive? → User decides based on application outcome
|
||
|
|
2. Which reason? → rejected (company) or not-interested (user)
|
||
|
|
3. Force or not? → If documents exist, user decides to proceed or cancel
|
||
|
|
4. Where is it? → User can check archive folders if needed
|
||
|
|
```
|
||
|
|
|
||
|
|
## Performance Considerations
|
||
|
|
|
||
|
|
### Operation Speed
|
||
|
|
|
||
|
|
**Status update:**
|
||
|
|
- Fast: Read/write single text file
|
||
|
|
- ~10-50ms typical
|
||
|
|
|
||
|
|
**Safety checks:**
|
||
|
|
- Fast: Check file existence (no content reading)
|
||
|
|
- ~5-20ms per file
|
||
|
|
|
||
|
|
**Folder move:**
|
||
|
|
- Fast: On same filesystem, just updates directory entries
|
||
|
|
- ~10-100ms typical
|
||
|
|
- Slow: On different filesystems, copies all files
|
||
|
|
- ~1-10s depending on file count and size
|
||
|
|
|
||
|
|
**Total typical time:** < 1 second
|
||
|
|
|
||
|
|
### Resource Usage
|
||
|
|
|
||
|
|
**Memory:**
|
||
|
|
- Minimal: Read/write application.md (~5-20KB)
|
||
|
|
- No large file operations or in-memory copies
|
||
|
|
|
||
|
|
**Disk I/O:**
|
||
|
|
- Light: Status update (one file write)
|
||
|
|
- Moderate: Folder move (directory metadata updates)
|
||
|
|
- Heavy: Only if moving across filesystems (full copy)
|
||
|
|
|
||
|
|
**Optimization:**
|
||
|
|
- Not needed for typical use case
|
||
|
|
- Could add progress indicator for large attachments folders
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
### File System Access
|
||
|
|
|
||
|
|
**Concerns:**
|
||
|
|
- User must have write permissions on pending/ and archive folders
|
||
|
|
- Must be able to modify application.md
|
||
|
|
- Must be able to move folders
|
||
|
|
|
||
|
|
**Mitigations:**
|
||
|
|
- Check permissions before attempting operations
|
||
|
|
- Clear error messages if permissions denied
|
||
|
|
- No privilege escalation or dangerous operations
|
||
|
|
|
||
|
|
### Data Preservation
|
||
|
|
|
||
|
|
**Concerns:**
|
||
|
|
- Accidental data loss if move fails partway
|
||
|
|
- Status update without successful move
|
||
|
|
|
||
|
|
**Mitigations:**
|
||
|
|
- Verify move succeeded before confirming
|
||
|
|
- Rollback status if move fails
|
||
|
|
- Never delete source until verified at destination
|
||
|
|
- Safety warnings for generated documents
|
||
|
|
|
||
|
|
### Path Traversal
|
||
|
|
|
||
|
|
**Concerns:**
|
||
|
|
- User could provide application name like "../../../etc"
|
||
|
|
- Could try to move folders outside applications/
|
||
|
|
|
||
|
|
**Mitigations:**
|
||
|
|
- Validate application name is valid folder in pending/
|
||
|
|
- Resolve full paths and check they're within applications/
|
||
|
|
- No user-provided target paths (only reason parameter)
|
||
|
|
|
||
|
|
## Testing Strategy
|
||
|
|
|
||
|
|
### Unit-Level Testing
|
||
|
|
|
||
|
|
**Test each component:**
|
||
|
|
- Argument parsing (valid/invalid inputs)
|
||
|
|
- Location detection (current dir vs. explicit name)
|
||
|
|
- Safety checks (detect documents correctly)
|
||
|
|
- Status update (find and replace correctly)
|
||
|
|
- Folder move (succeed and rollback)
|
||
|
|
|
||
|
|
### Integration Testing
|
||
|
|
|
||
|
|
**Test command flow:**
|
||
|
|
- End-to-end archiving (from pending to rejected)
|
||
|
|
- End-to-end with safety checks
|
||
|
|
- Error scenarios (not found, invalid reason, etc.)
|
||
|
|
|
||
|
|
### Edge Case Testing
|
||
|
|
|
||
|
|
**Test unusual scenarios:**
|
||
|
|
- Missing Status field (add it)
|
||
|
|
- Empty attachments folder (don't warn)
|
||
|
|
- Re-archiving (error appropriately)
|
||
|
|
- Concurrent access (handle gracefully)
|
||
|
|
|
||
|
|
### Manual Testing
|
||
|
|
|
||
|
|
**User acceptance:**
|
||
|
|
- Run through complete workflow
|
||
|
|
- Verify intuitive behavior
|
||
|
|
- Check error messages are clear
|
||
|
|
- Confirm success messages are helpful
|
||
|
|
|
||
|
|
## Future Considerations
|
||
|
|
|
||
|
|
### Extensibility
|
||
|
|
|
||
|
|
**Easy to add later:**
|
||
|
|
- Additional archive reasons (accepted, on-hold, etc.)
|
||
|
|
- Archive search and listing commands
|
||
|
|
- Bulk archiving operations
|
||
|
|
- Archive statistics and reporting
|
||
|
|
|
||
|
|
**Design supports:**
|
||
|
|
- Parameterized reason (easy to add new values)
|
||
|
|
- Consistent folder structure (easy to extend)
|
||
|
|
- Status field format (can add more states)
|
||
|
|
|
||
|
|
### Scalability
|
||
|
|
|
||
|
|
**Current design:**
|
||
|
|
- Handles dozens to hundreds of applications fine
|
||
|
|
- Linear search in pending folder (acceptable scale)
|
||
|
|
- File system operations are efficient
|
||
|
|
|
||
|
|
**If needed later:**
|
||
|
|
- Index of archived applications
|
||
|
|
- Database for faster searches
|
||
|
|
- Bulk operations for managing many archives
|
||
|
|
|
||
|
|
### Maintenance
|
||
|
|
|
||
|
|
**Design for maintainability:**
|
||
|
|
- Follows existing command patterns
|
||
|
|
- Clear separation of concerns
|
||
|
|
- Well-documented in code and specs
|
||
|
|
- Testable components
|
||
|
|
|
||
|
|
**Future updates:**
|
||
|
|
- Easy to modify error messages
|
||
|
|
- Easy to add new safety checks
|
||
|
|
- Easy to extend with new features
|
||
|
|
- Easy to update status field format
|
||
|
|
|
||
|
|
## Summary
|
||
|
|
|
||
|
|
The archiving feature is designed to:
|
||
|
|
- ✅ Follow established patterns for consistency
|
||
|
|
- ✅ Protect user work with safety checks
|
||
|
|
- ✅ Minimize changes to existing files
|
||
|
|
- ✅ Create resources on-demand
|
||
|
|
- ✅ Integrate naturally with existing workflow
|
||
|
|
- ✅ Handle errors gracefully with clear messages
|
||
|
|
- ✅ Support future enhancements
|
||
|
|
|
||
|
|
**Complexity:** Low to moderate
|
||
|
|
**Risk:** Low (additive feature, no breaking changes)
|
||
|
|
**Maintenance:** Low (follows patterns, well-documented)
|
||
|
|
**User Impact:** High (solves real organizational need)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Design Status:** Complete and ready for implementation
|
||
|
|
**Next Steps:** Review proposal, implement according to tasks.md
|