Repository navigation
Conversation
11ab2da to
1e2b334
Compare
1e2b334 to
85a2c75
Compare
85a2c75 to
d0d2ad4
Compare
d0d2ad4 to
b541a03
Compare
b541a03 to
e6c954c
Compare
A work session is a bounded place for a coding process to work on one pull request, plus a record of what it was asked and what it did. Quinjet does not run a model and does not know which tool does the writing; the part that is the same either way is the boundary and the record. The boundary is stated on the session rather than implied. A session may read and write files inside its own worktree, commit to its own branch, and run the verification commands recorded on it. It may not push, comment on the pull request, resolve a thread, or merge, close or edit it. Those four stay explicit Quinjet operations somebody asks for, so publishing a session writes one local commit and then names the commands that would take it further rather than running them. `work start` records the pull request's head object name exactly and, with `--worktree`, checks it out on `quinjet/work/<id>` beside the repository, so nothing a session does shows up in the checkout the reviewer is using and a later push cannot change what the session appears to have changed. The task list is exactly what the source names: the blocking rows of the feedback queue, or the failing checks and their failure annotations, or nothing at all. Each task carries the Quinjet command that resolves it, as information the session cannot act on. `work verify` spawns its command as argv with the worktree as the working directory, never through a shell, and stores it as argv for the same reason: a record that flattened it to a string would imply a shell parsed it. Re-running a recorded command replaces its result rather than stacking a second one, and a session that has run nothing refuses to report a pass it did not earn. `work publish` previews the exact file set it would stage, tracked and untracked, and names a failing verification rather than either hiding it or refusing. `work abort` counts the checkpoint commits that would go with the branch before removing anything, and leaves the pull request untouched because GitHub never knew the session existed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011n3Xp6dLNibg3gCBN9y5ij
e6c954c to
4073c18
Compare
|
What happened. The job passed the Why it can hang indefinitely. The two test steps use different runners: - name: Tests
run: cargo nextest run --all-features --locked --no-fail-fast
- name: Tests (release)
run: cargo test --all-features --locked --releasecargo-nextest applies a per-test timeout (it terminates at 120s); plain The likely test. On an earlier commit of #110 the nextest step reported Why it is not this pull request's. Nothing in this stack touches What I have not done. I have not modified that test — fixing it is worth doing but belongs in its own change rather than widened into this pull request. The durable fixes are a Generated by Claude Code |
|
Root cause for the Attempt 2 of run 33258952100 ended the same way as attempt 1: The log names the test, and it is not the one I guessed before: It is Why it only bites the release step: This is not this pull request's failure. test:
name: Test (${{ matrix.os }})
+ timeout-minutes: 30 - name: Tests (release)
- run: cargo test --all-features --locked --release
+ run: cargo nextest run --all-features --locked --no-fail-fast --cargo-profile releaseThe first bounds any future hang to 30 minutes instead of six hours. The second gives the release step the same process-per-test isolation and per-test cap that already makes the debug step reliable on Windows, so a stuck test fails as a test rather than as a cancelled job. Whoever picks that up may also want to look at why that test can block on Windows at all, since the timeout only bounds the symptom. My one permitted re-run is spent, so I am not re-running a third time, and I have not touched the test. Generated by Claude Code |
Seventh in the review control plane stack. Stacked on #108 (
claude/quinjet-context-bundle); review the last commit only.What this adds
quinjet workruns a bounded coding session against one pull request: an isolated checkout at an exact commit, a task list drawn from something Quinjet already computes, verification commands whose results are recorded, and one local commit at the end. Quinjet does not run a model and does not know which coding tool does the writing. The part that is the same either way is the boundary and the record, and that is what this is.The boundary is stated, not implied
Every session stores what it may and may not do, and prints both:
May — read and write files inside its own worktree; commit to its own branch; run the verification commands recorded on it.
May not — push the branch or any other ref; comment on the pull request or reply to a thread; resolve, unresolve or otherwise change a review thread; merge, close, reopen or edit the pull request.
Those four are not gaps to fill in later. Quinjet stays the source of truth for everything that reaches GitHub.
work publishwrites one local commit and then names the commands that would take it further —git push origin quinjet/work/w42-1,quinjet pr gate 42— without running them.The exact starting commit
work start --pr 42 --worktreerecords the head object name at that moment and checks it out onquinjet/work/w42-1viagit worktree add -b, as a sibling of the repository. Nothing a session does appears as an untracked file in the checkout the reviewer is using, and a push landing on the pull request while the session is open changes neither the base the session is measured from nor what it appears to have changed.Without
--worktreeor--intoa session records its task list and nothing else, which is what you want when the coding tool brings its own sandbox.diff,verifyandpublishthen say plainly that there is no worktree.Task lists are exactly what the source names
--from feedbacktakes the blocking rows ofpr feedback;--from failed-checkstakes the failing gate checks and the failure-severity annotations;--from wholetakes nothing. A session started from failing checks does not quietly also carry the review threads, because then nobody could say afterwards what it was for. Each task carries the Quinjet command that resolves it, as information the session cannot act on.Task summaries and bodies are text written by whoever can reach the pull request, and the text face prints them under a heading that says so.
Verification, honestly recorded
work verify w42-1 -- cargo testspawns the command as argv with the worktree as its working directory. No shell: no pipe, no glob, no expansion. It is stored as an argv array rather than a string for the same reason, because a record that flattened it would imply a shell parsed it.Re-running a recorded command replaces its row rather than stacking a second one, so the list is always the latest result per distinct command.
work verify w42-1with no command replays exactly what was recorded. A session that has run nothing refuses to report a pass it did not earn, and says so with exit 1.--exit-codeturns the session's verdict into the process's.Publish and abort
publishpreviews the exact set it would stage — tracked changes and untracked additions both — names a failing verification rather than hiding it or refusing over it, and commits nothing without--yes.abortcounts the checkpoint commits that would go with the branch before removing anything, and leaves the pull request untouched.Tests
src/git/work/tests.rs(13): the exact start commit and branch naming; the forbidden list being present and covering all four operations; feedback sessions taking blocking rows and leaving advisories; failed-check sessions naming checks and never threads; a check name with a space quoted in the command it suggests;wholecarrying no tasks even when a queue and gate are supplied; a session with no runs not counting as verified; re-running replacing rather than stacking; the failing verification being the one reported; no-worktree and deleted-worktree both erroring rather than reporting empty.src/state/work_session/tests.rs(7): round trip, replace-and-move-to-front, identifier allocation skipping every stored name, forgetting one leaving its neighbours, the cap dropping the least recently touched, and an unreadable state document reading as no sessions.tests/cli/work.rs(20): the worktree really being checked out at the pull request head on the session branch; the boundary in both faces; both task sources end to end; list; a diff measured from the start commit; passing and failing verifications with their exit codes and--exit-code; replay not stacking; the refusal to replay nothing; publish previewing without committing; publish committing tracked and untracked files, using the message, and making noghcall at all; publish on an empty session; the unverified and failing-verification notices; abort previewing and then removing worktree, branch and record; every session-taking verb returning exit 3 with a hint for an unknown name; two sessions on one pull request getting distinct names and branches.workadded to the root subcommand list.src/cli/tests/arguments.rswas over the 500-line limit after the new cases, so the two case-table tests moved tosrc/cli/tests/relationships.rs.Checks
cargo fmt(stable and nightly),cargo clippy --all-targets(stable 1.98 and beta),cargo test,scripts/check_rust_sizes.py,scripts/check_comments.py,scripts/check_secrets.pyall clean.Same unrelated pre-existing failure as the earlier PRs in this stack:
git::github::tests::operations::discovers_distinct_fetch_and_push_repositories_for_each_remotefails onmaintoo in this sandbox, because the global git config here rewritesgit@github.com:to HTTPS and that unit test does not isolate against it.Docs
New
docs/cli/work/group with a README covering the boundary, the exact starting commit and the untrusted task text, plus a page per verb. Linked from the CLI index.🤖 Generated with Claude Code
https://claude.ai/code/session_011n3Xp6dLNibg3gCBN9y5ij
Generated by Claude Code