Migrate llf-schema release git calls to OsGit #1602

Closed
opened 2026-11-06 16:53:38 +00:00 by jared · 1 comment
Owner

Problem

llf-schema/lib/llf/release_build_steps.rb runs tag -l, add, commit, and tag through HostTransport. release_publisher.rb runs a shallow clone, then add, commit, and push origin main. Its tests assert the recorded argv through a recording transport. These files are in the llf-schema repository.

Design: docs/os-git/use-cases-and-domain.md (design) and docs/os-git/call-site-checklist.md (call sites). Settled decisions are in design section 1 (docs/os-git/use-cases-and-domain.md): the gem lives in plugins/os-git with a path: source; git-context and os:worktree merge into os-git; old wrappers go only after all references are updated; design order is use-cases, objects, interfaces; os-context and os-vault become Ruby; ticket tracking stays out of os-git.

Reproduce

n/a: migration of existing call sites; behavior stays the same unless a criterion says otherwise.

Approach

Group A-17. Use Repository#tag?, #commit(Commit::Plan), #tag, Repository.clone(url, into:, depth: 1, timeout:), and Remote#push(branch, timeout:). HostTransport runs git on the host with Open3, without a docker wrap: keep that by giving Backend::Cli the same run seam, or by a backend adapter that routes through the transport. The recording-transport tests then assert messages sent to a Backend::Fake or the recorded argv of the adapter; pick one and say which in the ticket close comment. The release pushes straight to main today: keep that behavior. Commit in the llf-schema repository with explicit paths.

Mark every row in the checklist from the Done column as it is replaced. Mark the matching test rows in the same change. Run bin/refresh-plugins after changes to SKILL.md, hooks, or CLIs.

Required work: none beyond the acceptance criteria.

Acceptance criteria

  1. Given a release version whose tag exists, when the preflight runs, then it fails as before.
  2. Given a new release, when the build steps run, then they commit only the header and zip paths and create one lightweight tag.
  3. Given the publisher, when it runs, then it clones shallow into a temporary directory, commits the zip, and pushes to origin main with a timeout.
  4. Given the llf-schema test suite (row G-192 included), when it runs, then it passes.
  5. Given rows G-083 and G-084 and the test row G-192, when the ticket closes, then each row is marked - [x] with Replaced by filled in, or marked out of scope with a reason, in docs/os-git/call-site-checklist.md.
  6. Given the touched code, when it is searched for Open3, system(, %x, backticks, and git argv, then no git call remains outside OsGit adapters, except sites marked out of scope with a reason.

Blocking edges

Blocked by the core ticket (#1588).

Origin

  • Trigger: User request in session 1a5b2630-09c9-46cb-aee4-a5a98e2e7d24 on 2026-11-06: one os-git gem for all local git work in cc-os and the user's projects.
  • Improvised this session: none
  • Chain: release flow builds its own git argv ← no shared commit and clone objects ← DESIGN (docs/os-git/call-site-checklist.md group A-17)
  • Root candidate: none found; searched open issues for git, worktree, octokit, ruby port, python, statusline, reset --hard. Related but not a match: #845, #853, #857, #1527, #1554.
  • Where: llf-schema/lib/llf/release_build_steps.rb, llf-schema/lib/llf/release_publisher.rb
  • Session: 1a5b2630-09c9-46cb-aee4-a5a98e2e7d24
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/1a5b2630-09c9-46cb-aee4-a5a98e2e7d24.jsonl
## Problem `llf-schema/lib/llf/release_build_steps.rb` runs `tag -l`, `add`, `commit`, and `tag` through `HostTransport`. `release_publisher.rb` runs a shallow clone, then add, commit, and `push origin main`. Its tests assert the recorded argv through a recording transport. These files are in the `llf-schema` repository. Design: `docs/os-git/use-cases-and-domain.md` (design) and `docs/os-git/call-site-checklist.md` (call sites). Settled decisions are in design section 1 (`docs/os-git/use-cases-and-domain.md`): the gem lives in `plugins/os-git` with a `path:` source; `git-context` and `os:worktree` merge into `os-git`; old wrappers go only after all references are updated; design order is use-cases, objects, interfaces; `os-context` and `os-vault` become Ruby; ticket tracking stays out of `os-git`. ## Reproduce n/a: migration of existing call sites; behavior stays the same unless a criterion says otherwise. ## Approach Group A-17. Use `Repository#tag?`, `#commit(Commit::Plan)`, `#tag`, `Repository.clone(url, into:, depth: 1, timeout:)`, and `Remote#push(branch, timeout:)`. `HostTransport` runs git on the host with `Open3`, without a docker wrap: keep that by giving `Backend::Cli` the same run seam, or by a backend adapter that routes through the transport. The recording-transport tests then assert messages sent to a `Backend::Fake` or the recorded argv of the adapter; pick one and say which in the ticket close comment. The release pushes straight to `main` today: keep that behavior. Commit in the `llf-schema` repository with explicit paths. Mark every row in the checklist from the `Done` column as it is replaced. Mark the matching test rows in the same change. Run `bin/refresh-plugins` after changes to `SKILL.md`, hooks, or CLIs. Required work: none beyond the acceptance criteria. ## Acceptance criteria 1. Given a release version whose tag exists, when the preflight runs, then it fails as before. 2. Given a new release, when the build steps run, then they commit only the header and zip paths and create one lightweight tag. 3. Given the publisher, when it runs, then it clones shallow into a temporary directory, commits the zip, and pushes to `origin main` with a timeout. 4. Given the llf-schema test suite (row G-192 included), when it runs, then it passes. 5. Given rows G-083 and G-084 and the test row G-192, when the ticket closes, then each row is marked `- [x]` with `Replaced by` filled in, or marked out of scope with a reason, in `docs/os-git/call-site-checklist.md`. 6. Given the touched code, when it is searched for `Open3`, `system(`, `%x`, backticks, and `git` argv, then no git call remains outside `OsGit` adapters, except sites marked out of scope with a reason. ## Blocking edges Blocked by the core ticket (#1588). ## Origin - Trigger: User request in session 1a5b2630-09c9-46cb-aee4-a5a98e2e7d24 on 2026-11-06: one os-git gem for all local git work in cc-os and the user's projects. - Improvised this session: none - Chain: release flow builds its own git argv ← no shared commit and clone objects ← DESIGN (docs/os-git/call-site-checklist.md group A-17) - Root candidate: none found; searched open issues for git, worktree, octokit, ruby port, python, statusline, reset --hard. Related but not a match: #845, #853, #857, #1527, #1554. - Where: llf-schema/lib/llf/release_build_steps.rb, llf-schema/lib/llf/release_publisher.rb - Session: 1a5b2630-09c9-46cb-aee4-a5a98e2e7d24 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/1a5b2630-09c9-46cb-aee4-a5a98e2e7d24.jsonl
Author
Owner

Resolution

Done: llf-schema release steps and publisher use OsGit: tag?, commit with Commit::Plan, tag, clone depth 1, Remote#push to main with a timeout. Backend::Cli already runs on the host, so HostTransport keeps only composer, docker, and curl. Test seam: Backend::Fake messages through an injected git: that defaults to OsGit::Repository.

Evidence: llf-schema ee19c4e, not pushed: 119 runs, 467 assertions, 0 failures. Real-repository test confirms a lightweight tag; push tested on a local bare repository. No real release ran.

Follow-ups: none

## Resolution **Done:** llf-schema release steps and publisher use OsGit: tag?, commit with Commit::Plan, tag, clone depth 1, Remote#push to main with a timeout. Backend::Cli already runs on the host, so HostTransport keeps only composer, docker, and curl. Test seam: Backend::Fake messages through an injected git: that defaults to OsGit::Repository. **Evidence:** llf-schema ee19c4e, not pushed: 119 runs, 467 assertions, 0 failures. Real-repository test confirms a lightweight tag; push tested on a local bare repository. No real release ran. **Follow-ups:** none
jared closed this issue 2026-11-06 23:44:48 +00:00
jared referenced this issue from a commit 2026-11-07 07:09:21 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#1602
No description provided.