Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
4e44456
docs: add ADR-016 undo and recovery design + Phase 12 implementation …
mfreed Apr 9, 2026
5f7ada1
feat: add UUIDv7 timestamp+base36 display format (Task 12.1)
mfreed Apr 9, 2026
9075fbc
feat: add symlink support to shared ops layer + adapters (Task 12.2)
mfreed Apr 9, 2026
78ff5f9
feat: add log and savepoint table DDL to history setup (Task 12.3)
mfreed Apr 9, 2026
eaac7c6
feat: add operation log entries on synth write/delete/rename (Task 12.4)
mfreed Apr 9, 2026
f3fd9fd
docs: add ADR-017 relational directory structure + Phase 13 tasks
mfreed Apr 10, 2026
628ddab
feat: relational directory schema and DDL changes (Task 13.1)
mfreed Apr 10, 2026
0800073
feat: add path resolution with cache for parent-pointer model (Task 1…
mfreed Apr 10, 2026
949a100
feat: implement parent-pointer model for all synth operations (Tasks …
mfreed Apr 11, 2026
6a6d519
test: comprehensive unit and integration tests for parent-pointer model
mfreed Apr 11, 2026
1d1d7f0
test: verify log entries for nested files and single-entry dir rename…
mfreed Apr 11, 2026
c6ab65e
feat: add relational-directories migration to tigerfs migrate (Task 1…
mfreed Apr 11, 2026
58e86f9
feat: warn on mount when synth app needs relational-directories migra…
mfreed Apr 11, 2026
dbd4119
test: audit ADR-017 verification scenarios, add #40 history after mov…
mfreed Apr 11, 2026
d7ceb1b
docs: update ADR-016 and Phase 12 tasks for ADR-017 schema (Task 13.11)
mfreed Apr 11, 2026
8d8849e
docs: update spec.md for parent-pointer model and new column names (T…
mfreed Apr 11, 2026
ad4ad21
feat: ReadFile leaf optimization + ADR-017 finalization
mfreed Apr 11, 2026
b0a132f
feat: switch source table id to UUIDv7, history operation types to ed…
mfreed Apr 11, 2026
d0f7e54
fix: improve user-facing messages for migration warning and migrate c…
mfreed Apr 11, 2026
b077479
fix: recommend uuidv7() instead of gen_random_uuid() in CREATE TABLE …
mfreed Apr 11, 2026
de27af1
feat: add mount-level user identity via .info/user (Task 12.5)
mfreed Apr 11, 2026
7d92e9a
fix: stable mtime for .info/user, silently ignore editor temp files
mfreed Apr 11, 2026
9b2eeba
feat: add path parsing for .log/, .savepoint/, .undo/ (Task 12.6)
mfreed Apr 11, 2026
7837009
docs: align ADR-016 terminology with ADR-017
mfreed Apr 11, 2026
b3c5eb0
feat: .log/ interface with data-first pipeline and diff symlinks (Tas…
mfreed Apr 11, 2026
e00a008
test: comprehensive unit and integration tests for .log/ interface
mfreed Apr 11, 2026
e442eb2
feat: .savepoint/ interface with name-based display and CRUD (Task 12.8)
mfreed Apr 12, 2026
92efa28
test+fix: savepoint unit tests, NFS cache cleanup, demo improvements
mfreed Apr 12, 2026
8cd5faf
fix: writeRowFile does not include filename PK in INSERT and allows b…
mfreed Apr 12, 2026
94dcaf7
feat: simplify savepoint model with name as PK, remove custom CRUD
mfreed Apr 13, 2026
38ed78a
fix: empty body writes, format file support, and early NFS error repo…
mfreed Apr 13, 2026
e4722f7
fix: remove NFS Create-time bare-path rejection that blocked synth files
mfreed Apr 13, 2026
37a1cb8
test: comprehensive savepoint unit and integration test coverage
mfreed Apr 13, 2026
b70640e
feat: auto-savepoints on inactivity gap (ADR-016 Section 4.4)
mfreed Apr 13, 2026
adfc9e2
feat: undo execution engine (ADR-016 task 12.10)
mfreed Apr 13, 2026
59e5bca
feat: undo execution engine with integration tests (ADR-016 task 12.10)
mfreed Apr 13, 2026
23b6e5f
feat: .undo/ directory navigation and stat (ADR-016 task 12.11, part 1)
mfreed Apr 13, 2026
c16a594
feat: .undo/ preview and summary reading (ADR-016 task 12.11, part 2)
mfreed Apr 13, 2026
cdd5d58
feat: .undo/ apply trigger and integration tests (ADR-016 task 12.11,…
mfreed Apr 13, 2026
26edb55
fix: validate .undo/ targets before returning directory entries
mfreed Apr 13, 2026
87a0ab6
fix: support subdirectory navigation in .undo/ preview tree
mfreed Apr 13, 2026
239bfc5
fix: .info/summary visibility and preview file sizes in .undo/
mfreed Apr 13, 2026
232e68e
fix: correct schema references in log, undo, and preview code
mfreed Apr 13, 2026
89ca7bd
docs: add 12.12 (caching), renumber skills (12.13) and docs (12.14)
mfreed Apr 13, 2026
b22a241
feat: enrich .undo/ summary with metadata and operation details
mfreed Apr 13, 2026
7ebe924
feat: simplify .undo/id/ to summary + apply only (no preview tree)
mfreed Apr 14, 2026
ce4cbbe
fix: history symlink paths, touch .apply, shared constants in adapters
mfreed Apr 14, 2026
e95c4d0
feat: short-lived caching for undo preview queries (task 12.12)
mfreed Apr 14, 2026
e3a4e14
feat: skills updates for undo and recovery (task 12.13)
mfreed Apr 14, 2026
6ba49e6
refactor: replace slash commands with Common Workflows, tighten skills
mfreed Apr 14, 2026
9a9edab
docs: add undo/recovery to spec.md and update history.md (task 12.14)
mfreed Apr 14, 2026
8141332
docs: rename to file-first/data-first, remove unbuilt tasks-app
mfreed Apr 14, 2026
6ffc1f7
docs: rename "app" to "workspace" in user-facing documentation
mfreed Apr 14, 2026
efb97b1
docs: add undo/recovery framing to README, file-first, and history
mfreed Apr 15, 2026
b10fa73
docs: update README to v0.7, add Agent Skills and filesystem API sect…
mfreed Apr 16, 2026
c65d610
docs: audit fixes, shorten README history, clean up use cases
mfreed Apr 16, 2026
ca55c75
fix: prevent infinite recursion and reduce agent-hostile directory li…
mfreed Apr 16, 2026
e2cbc6d
docs: add directory scanning safety guidance to tigerfs skill
mfreed Apr 16, 2026
c5f7aff
feat: support real dotfiles in file-first workspaces
mfreed Apr 16, 2026
05d99e9
fix: implement POSIX rename-as-replace for file-first workspaces
mfreed Apr 16, 2026
7e42877
fix: prevent rm -rf infinite recursion in virtual directories
mfreed Apr 18, 2026
fc98ef9
fix: reject bare-path row creates at OPEN time, not at CLOSE
mfreed Apr 18, 2026
4bc2446
feat: add tigerfs-stress scaffolding + infrastructure (Phase 14.1)
mfreed Apr 18, 2026
8e716d4
feat: add state tracking + validation for tigerfs-stress (Phase 14.2)
mfreed Apr 18, 2026
66020dc
feat: add filesystem operations + content generation (Phase 14.3)
mfreed Apr 18, 2026
36fafa4
feat: add runner + undo + end-to-end wiring (Phase 14.4)
mfreed Apr 18, 2026
4f7c53b
docs: finalize tigerfs-stress README (Phase 14.5)
mfreed Apr 18, 2026
2ca41c3
fix: resolve 6 bugs in tigerfs-stress undo and validation logic
mfreed Apr 19, 2026
b16c0ae
fix: read directory mtime from database, add noac mount option
mfreed Apr 21, 2026
ffb8919
feat: add parent directory mtime trigger and migration
mfreed Apr 21, 2026
597389a
test: add integration tests for parent directory mtime trigger
mfreed Apr 21, 2026
4bcaef9
test: add unit test for directory stat and mount-level mtime tests
mfreed Apr 21, 2026
f5c6999
docs: add noac, parent dir mtime trigger, and migrate to spec.md
mfreed Apr 23, 2026
31c4f18
test: add operation stats and file size histogram to stress test
mfreed Apr 24, 2026
2caaf58
test: add move_dir and delete_dir operations to stress test
mfreed Apr 25, 2026
7f00c05
fix(undo): defer FK and UNIQUE constraints in undo transaction
mfreed Apr 25, 2026
d103c89
fix(undo): bump modified_at on restored rows and parents
mfreed Apr 25, 2026
a64758b
test(undo): cover UNIQUE deferral, multi-level FK, mtime edge cases
mfreed Apr 26, 2026
5538815
fix(undo): resolve display-name log_id in ExecuteUndoToLogID
mfreed Apr 26, 2026
4a9ea71
fix(undo): invalidate caches under user schema after undo
mfreed Apr 26, 2026
a17fba6
test(stress): fix rename_dir self-rename and RenameDir map-iteration UB
mfreed Apr 26, 2026
de59a70
test(stress): split delete_dir into per-row stack entries
mfreed Apr 26, 2026
f9da85c
test(stress): enumerate move_file destinations instead of random retry
mfreed Apr 26, 2026
ccf74f7
fix(undo): drop dead synth.TigerFSSchema fallback in writeUndoApply
mfreed Apr 26, 2026
7174ad2
feat(fs): log mkdirSynth and add WriteFileEnsureDirs helper
mfreed Apr 26, 2026
36ffaf4
refactor(fs): make WriteFile/Mkdir strict; replace silent auto-create
mfreed Apr 26, 2026
3f8dd24
docs(stress): re-rationalize collectDeletionOrder's FS walk
mfreed Apr 26, 2026
622f280
test(stress): add directory validation to ValidateWorkspace
mfreed Apr 26, 2026
ff8253a
docs: document acceptable staleness in undoCache.invalidate
mfreed Apr 26, 2026
a83c523
fix(fs): use user schema for pathCache key in readDirHistory
mfreed Apr 26, 2026
3654e06
test(undo): savepoint deferral integration + unrestorable-FK unit test
mfreed Apr 26, 2026
85a2495
fix(stress): gate undo_single on atomic log entries
mfreed Apr 27, 2026
06379e0
fix(stress): include all workload flags in failure replay message
mfreed Apr 27, 2026
00b98dc
feat(stress): diagnostic dumps with anomaly analyzer and --dump-at
mfreed Apr 27, 2026
4e7610f
test(stress): defensive readLatestLogID monotonicity check after undo
mfreed Apr 27, 2026
001a894
test(stress): widen monotonic-helper coverage to all readLatestLogID …
mfreed Apr 27, 2026
f59cfcf
feat(stress): auto-dump on operational errors, not just validation fa…
mfreed Apr 27, 2026
c422701
feat(stress): end-of-run monotonicity-warning summary + CLAUDE.md note
mfreed Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Capability directories (`.filter`, `.order`, `.first`, `.last`, `.export`, `.col

### Synth Apps

Tables whose names start with `_` (e.g., `_blog`, `_docs`) can be exposed as synthesized views -- markdown files, task lists, or plain text snippets. The synth layer (`fs/synth/`) maps filesystem operations to table rows using format-specific conventions. See `docs/markdown-app.md` and `docs/tasks-app.md`.
Tables whose names start with `_` (e.g., `_blog`, `_docs`) can be exposed as synthesized views -- markdown files, task lists, or plain text snippets. The synth layer (`fs/synth/`) maps filesystem operations to table rows using format-specific conventions. See `docs/file-first.md`.

### SQL Identifier Quoting

Expand Down Expand Up @@ -109,6 +109,7 @@ Multiple TigerFS mounts may connect to the same database concurrently. This mean
- **Cache metadata only:** Sizes, permissions, directory entries, column names/types, primary keys, table lists. These change rarely and have short TTLs.
- **Stat cache keys must be unique per path:** Different pipeline paths (e.g., `.export/json` vs `.filter/active/true/.export/json`) must not share cache entries, even on the same table.
- **Pattern:** `Stat` may use caches. `ReadFile` must always hit the DB.
- **Audit invalidation on every new write path:** any write must call `statCache.invalidate(schema, table)` and `pathCache.invalidate(schema, table)` with the *user* schema (not `synth.TigerFSSchema`); a schema-key mismatch silently leaves stale entries cached for up to 2 seconds and surfaces as cross-mount read inconsistencies.

## Logging

Expand Down Expand Up @@ -154,6 +155,10 @@ For each implementation task:

Integration tests use testcontainers-go for PostgreSQL. See `test/integration/` for examples.

### Stress-test monotonicity warnings

Stress runs (`bin/tigerfs-stress start`) may emit `[warn iter ...] readLatestLogID regressed after ...` lines. These are **expected** — they indicate the macOS NFS layer (go-nfs library or kernel client, ruled out at every TigerFS layer) returned a stale `.log/.last/N/.export/json` snapshot after a heavy commit. The runner's monotonic helper retries up to 2.5s and falls back to the prior known-good `lastLogID`; the run continues correctly. The end-of-run "Monotonicity Warnings" section summarizes rate, recovery distribution, and op kinds preceding regressions. Do not treat these as bugs to fix in TigerFS; see the iter-107 investigation arc on `feat/undo` (commits `85a2495` → `f59cfcf`) for context.

### Test Naming Convention

Integration tests that mount the filesystem work with **both** FUSE (Linux) and NFS (macOS) — the mount method is auto-detected. Name tests by what they test, not the mount method:
Expand Down
219 changes: 99 additions & 120 deletions README.md

Large diffs are not rendered by default.

11 changes: 4 additions & 7 deletions docs/adr/005-capability-directory-taxonomy.md
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,9 @@ Considered alternatives:
├── .columns/ # capability: column projection (pipeline query)
│ └── id,name,price/
│ └── .export/
├── .first/ # capability: first N rows
│ └── 100/
├── .last/ # capability: last N rows
│ └── 100/
├── .sample/ # capability: random sample
│ └── 100/
├── .first/N/ # capability: first N rows (navigate directly, e.g. .first/100/)
├── .last/N/ # capability: last N rows (navigate directly, e.g. .last/100/)
├── .sample/N/ # capability: random sample (navigate directly, e.g. .sample/100/)
├── .order/ # capability: specify row ordering (see ADR-006)
│ └── price/ # (dynamic: any column name)
├── .export/ # capability: bulk read (see ADR-006)
Expand All @@ -190,7 +187,7 @@ Considered alternatives:
│ │ └── csv, tsv, json, yaml
│ └── .append/
│ └── csv, tsv, json, yaml
├── .all/ # capability: all rows iterator
├── .all/ # capability: all rows (hidden from ls to prevent infinite recursion)
├── .indexes/ # capability: index DDL management
│ └── .create/
├── .delete/ # capability: table delete staging
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/006-bulk-export-capability.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ email: bob@example.com
### Read Semantics (Export)

**Size limits:**
- Limited to `DirListingLimit` rows (default 10,000)
- Limited to `DirListingLimit` rows (default 1,000)
- For larger exports, use explicit pagination: `.first/10000/.export/csv`
- Error message suggests pagination if limit exceeded

Expand Down
2 changes: 1 addition & 1 deletion docs/adr/011-directory-hierarchies.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ADR-011: Directory Hierarchies in Synthesized Apps

**Status:** Accepted
**Status:** Superseded by [ADR-017](017-relational-directory-structure.md)
**Date:** 2026-02-12
**Author:** Mike Freedman

Expand Down
Loading
Loading