Skip to content

Route filesystem and Git mounts through logical-v1 - #874

Merged
diptanu merged 15 commits into
mainfrom
agent/logical-v1-dependencies
Jul 29, 2026
Merged

Route filesystem and Git mounts through logical-v1#874
diptanu merged 15 commits into
mainfrom
agent/logical-v1-dependencies

Conversation

@diptanu

@diptanu diptanu commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What changed

  • routes both tl fs mount and tl git mount through the strict logical-v1/Fjall engine supplied by the private source-swap build
  • preserves the Git mount product surface, including mount, unmount, status, snapshot, sync, rebase, promote, and workspace selection
  • removes old Git log/smartlog and filesystem convergence CLI routes that depended on the deleted mount implementation
  • teaches tl sbx exec <sandbox> -- tl fs mount ... and tl sbx exec <sandbox> -- tl git mount ... to promote the foreground mount daemon into a sandbox-owned process unit, avoiding cgroup reaping
  • mirrors the logical-v1 Fjall, hashing, property-test, and Linux FUSE dependency resolution in the public placeholder
  • updates status scope and CLI parsing tests for the new surface-centric commands
  • bumps the CLI, Rust SDK, Python SDK, and TypeScript SDK to 0.5.91

Dependency and rollout

Depends on tensorlakeai/artifact_storage#173 and pins the private source swap to artifact commit c77631e7247159516e99bbaf3e68900b2ea86eae.

Deploy the Artifact Storage server from #173 first. The new client requires generation-one checkpoint object-index sidecars, logical-v1 publication endpoints, and the exact repository-scoped Git blob route for fresh Git workspace reattachment.

This intentionally does not migrate or interpret old local mount state. The private engine rejects unmarked and legacy state because the old implementation has been deleted.

Validation

  • rebased onto current main (5ec242e0de471826c189a01ffb10a80f86bcaeb0)
  • authoritative full private just test-cli-full: 229/229 private filesystem-client tests, 174/174 SDK unit tests (plus integration targets), 223/223 CLI library tests, 223/223 CLI binary tests, offline status integration test, and doctests
  • artifact-storage make test-server-check, make test-macos-fskit-check, make test-macos-fskit-regressions, make test-linux-fuse-check, logical-v1 phase-0, property, crash, concurrent-crash, publication, scheduler, remote Git, activation, and deletion suites
  • live macOS FSKit POSIX coverage: hardlinks, xattrs, symlinks, executable bits, open-unlink, rename-over-open, shared writers, append atomicity, mmap, sparse/truncate, SQLite WAL, and concurrent namespace-cache churn
  • exact Linux sandbox Git mount: writable FUSE passthrough, 1,040.47 MiB/s versus 1,078.28 MiB/s rootfs (96.5%), zero FUSE WRITE requests, create p95 0.513 ms, rename p95 0.187 ms, and 4,238 mutations/s
  • exact macOS FSKit Xcode gate: first-compile median 2.018 s versus 1.766 s native (1.143x), passing the accepted 1.20x release criterion

The mandatory Envoy history was not refreshed for this mount-only stack at the user's explicit direction.

@diptanu

diptanu commented Jul 28, 2026

Copy link
Copy Markdown
Contributor Author

Final stacked qualification is complete for Tensorlake 0.5.89 at cc9d17c.

Both tl fs mount and tl git mount now route through the shared private logical-v1/Fjall engine. Git mount remains supported; only the former mount implementation is removed. The Git-specific boundary is limited to immutable base resolution and checkpoint/commit publication.

All current CI is green: sandbox integration, Rust full-feature workspace, private filesystem engine, macOS FSKit source contract, Windows smoke, lint, TypeScript integration/unit, CodeQL, and Linux/macOS/Windows package builds.

Exact live qualification passed on macOS FSKit and a fresh root-owned Tensorlake Linux FUSE sandbox. Linux writable passthrough achieved 1,018.68 MiB/s versus 1,083.24 MiB/s rootfs with zero payload WRITE requests through userspace FUSE. macOS background Git mount survived its invoking shell and converged accepted/durable/published to 65/65/65 in one publication attempt.

Dependency and rollout: tensorlakeai/artifact_storage#173 must merge and its server routes must deploy first. Merge and distribute this client only after that deployment fence is satisfied.

@diptanu

diptanu commented Jul 28, 2026

Copy link
Copy Markdown
Contributor Author

Stacked source update: both private-source CI jobs now pin Artifact Storage 8f8a9e1a8350ad6812ab7abc00fe4b8ef70c00ae exactly. tl git mount is retained as a product surface and routes only to the logical-v1/Fjall engine; no legacy mount fallback remains. Exact local source-swap builds produced tl 0.5.89 for macOS arm64 (d2a1f251eabe6bff17c0fd04270ecb638b67fddf2357f176b8aa270fd7520682) and Linux x86_64 (bc459283f1c4e38aa50074f3d3b3be73cded9e87b13b3afcd3be136f2a8a8014). The server PR must deploy before this client because current production does not expose the new exact checkpoint/blob data plane. CI from head 3a669c9737d772e4a5681b4ca422742e4b599bc1 is running.

@diptanu

diptanu commented Jul 28, 2026

Copy link
Copy Markdown
Contributor Author

CI follow-up: the first Rust full-feature run exposed one load-sensitive timing assertion (logical_scheduler_mutation_notification_bypasses_the_safety_poll completed but exceeded 200ms on the shared runner). Artifact Storage 34d7c988ded586f7217684f071290358da1f41fb now proves the actual contract with a five-second safety poll and a two-second notification deadline. The focused scheduler target passed 18/18 locally, and the fresh GitHub Rust full-feature workspace tests job now passes. macOS private FSKit, lint, CodeQL, and sandbox integration also pass.

@diptanu
diptanu force-pushed the agent/logical-v1-dependencies branch from b74775c to d631845 Compare July 29, 2026 04:36
@diptanu
diptanu merged commit e35f178 into main Jul 29, 2026
17 of 18 checks passed
@diptanu
diptanu deleted the agent/logical-v1-dependencies branch July 29, 2026 04:43
diptanu added a commit that referenced this pull request Aug 11, 2026
These were removed in #874 as collateral of the logical-v1 migration, whose message
records them as depending on the deleted mount implementation. The server endpoints
and the cloud-sdk client methods survived intact, so this is client wiring only —
and the published docs never stopped describing all three.

`--ro` conflicts with `--publish` and `--workspace`, since a read-only view owns no
workspace to select or publish.

`tl git log <repo>` and `tl git smartlog <repo>` take either a mount path or a bare
repository name. A repository name very often also names a directory in the cwd — a
clone of that same repository is the usual case — so a path that resolves but is not
an attached mount now falls back to the repository-name form instead of telling the
user to mount their clone. That ambiguity broke the documented invocation before.

Needs artifact_storage#227: `gsvc_fs_client::mount_repo` takes a new argument.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
diptanu added a commit that referenced this pull request Aug 12, 2026
Client half of **artifact_storage#227**. Merge that first —
`gsvc_fs_client::mount_repo` takes a new argument.

## What and why

`tl git mount --ro`, `tl git log`, and `tl git smartlog` were removed in
#874 as collateral of the logical-v1 migration; that PR's own message
records them as "removes old Git log/smartlog … routes that depended on
the deleted mount implementation." It wasn't a product decision — the
server endpoints (`/workspaces/{id}/log`, `/smartlog`, project smartlog)
and the cloud-sdk client methods survived untouched, and the published
docs never stopped describing all three. Only the client wiring was
gone.

Found by running `docs.tensorlake.ai/git/*` against the shipped CLI:
every documented invocation of these three failed.

## Notes for review

- `--ro` conflicts with `--publish` and `--workspace` — a read-only view
owns no workspace to select or publish. Enforced in clap and again
server-side.
- `tl git log <repo>` / `tl git smartlog <repo>` accept a mount path
**or** a bare repository name. A repository name very often also names a
directory in the cwd — a clone of that same repo is the usual case — and
the old code treated any existing directory as a mount path, so the
documented `tl git log <repo>` form failed with "is not an attached tl
mount" whenever you ran it next to your clone. A path that resolves but
is not an attached mount now falls back to the repository-name form.
- The parse test asserting these three no longer exist is replaced with
tests asserting they do, plus the `--ro` conflict cases. The `tl fs
mount --ro` rejection stays: read-only views are a repository concept,
and `tl fs` is the shared writable surface.

## Verification

`just test-cli-full` green (17 suites, 0 failures) against
artifact_storage#227.

Live against prod: all three `--ro` forms (branch tip, pinned commit,
subtree) mount; reads work; `create`/`unlink`/`mkdir`/`rename` all
return `Read-only file system`; `tl git workspaces` confirms no
workspace is created; snapshot/promote/rebase refuse with a message
naming the verb actually run. `tl git log` and `smartlog` verified in
mount-path, repo-name, `--project`, and `--json` forms.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant