mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-05 16:34:00 +01:00
train S4: merge #3971 at cd8a4cbeda v1.95.3.0
This commit is contained in:
commit
14f5b6088c
7 files changed
+62
-6
No files matched your search
@@ -1,5 +1,15 @@
|
||||
# Changelog
|
||||
|
||||
## [1.95.3.0] - 2026-11-03
|
||||
|
||||
**A crew thread no longer creates threads itself. It asks its Captain, so every new thread joins a crew from the start (R68). docs/captain.md also warns that `tools.capy.read` returns a cut-down view of long files.**
|
||||
|
||||
### Changed
|
||||
- **docs/captain.md** has a new section, "New threads join the crew". A crew thread asks its Captain for a new thread, and the Captain creates it in the crew. A thread the crew thread already made gets reported by code in that turn, so the Captain can add it with `crew.add`. A thread in another project goes Captain to Captain, and the receiving Captain creates it in its own crew as work, briefs it and returns the result. Only a project with no Captain lets the crew thread create the thread itself, with the code recorded on the work's issue. A cross-project thread the crew thread already made goes to that project's Captain to adopt, with its code on the issue. The cause: GBRA-240 created GBEV-33 directly in another project, and that thread ran outside every crew.
|
||||
- **docs/captain.md** also has a new section, "Keep issues tidy" (Garry, 2026-11-03: "can we tell all the captains to audit their issues and clean them up. and have a standing rule that that is kept tiday"). Before archiving a thread, close or backlog its issues. On each wake, keep every touched issue accurate. Unassigned Todos nobody will start go to Backlog. A daily sweep closes, re-assigns or backlogs open issues untouched for 2 days whose assignee is archived, or idle with no open PR (R69). The sweep skips issues assigned to a person, and Waiting issues that name what they wait on while it is still open. The target is an In progress count close to working threads plus PRs waiting to merge.
|
||||
- **The Capy factory context (`factory.md` point 12)** now has the short version and cites that section. Its byte budget in `test/capy-skill-wrapper.test.ts` goes from 3,300 to 3,450: the page's new size rounded up to the next 25 bytes, and no other point was trimmed.
|
||||
- **docs/captain.md, Drive layout** says that `tools.capy.read` returns about the first 38,000 characters, with each line cut at 2,000. So a read, change and `tools.capy.write` program saves a truncated file, Drive files included. Edit long files with `tools.capy.edit`, or read and write the whole file in bash or Python and check the line count. `tools.drive.history` restores a recent version. This is how the org knowledge base's rules.md lost 37 rules. It lives in the docs page rather than the Capy skill because the skill sits at its fixed 5,315-token context budget.
|
||||
|
||||
## [1.95.2.0] - 2026-11-03
|
||||
|
||||
- Pushes from /ship now stop on leftover merge conflict markers. A new `conflict-markers` guard reads every line the branch adds, in the commit being pushed and in the working tree, and refuses one that starts with `<<<<<<<` or `>>>>>>>`, or is exactly `=======`, even inside a template literal that still parses and passes its tests (GST-1190, seen on #3927). Markdown code blocks that show git output (an unlabeled, `text` or `diff` fence) are skipped, while a conflict inside a `bash` or `ts` fence is still refused. A fixture that shows markers on purpose declares `gstack-conflict-markers: fixture` on a line of its own near the top.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# gstack digest v1.95.2.0 — regenerate/re-copy after upgrading gstack
|
||||
# gstack digest v1.95.3.0 — regenerate/re-copy after upgrading gstack
|
||||
|
||||
Behavioral rules from gstack (https://github.com/garrytan/gstack), compressed
|
||||
for agent hosts without a full skill install. The full skills add workflows,
|
||||
|
||||
@@ -13,5 +13,5 @@ What seven Captain crews agreed on. Your crew's CREW.md and recorded approvals d
|
||||
9. **Flakes: one rerun, a ledger, a daily fix.** Only the policy's rerun, never for a harness or infra red; a second red is real; never loosen a test. [docs/captain.md: The daily flaky pass]
|
||||
10. **Quiet.** Message on a decision, a blocker, a READY or a finished phase. A broadcast needing no reply goes in the Captain's notes; never reply just to acknowledge.
|
||||
11. **Ask once, plainly.** One ask per decision, explained like the owner is five: your Captain's name, then a lettered line each: "A: <code> hit problem p, which happens when h. We could do 1) x, 2) y or 3) z. Recommendation x because why. A1 to take recommendation." "do it" takes every recommendation; "A2" takes option 2. Owner tasks: the exact link (in Capy: path and field), numbered steps, the reply word. Never re-ask a standing rule; check what you can yourself. [docs/captain.md: The ask format]
|
||||
12. **Fresh threads, closed out.** One thread per unit of work (crew threads ask their Captain); past the context limit, hand off. Its Captain archives only its crew's threads; threads outside every crew are the owner's, even its automation's. Size reviews to the diff; read the token counter. [docs/ship-budget.md]
|
||||
12. **Fresh threads, closed out.** One thread per unit of work; past the context limit, hand off. Crew threads never create threads: ask your Captain (Captain to Captain for another project), or report one you made by code for crew.add. Its Captain archives only its crew's threads; threads outside every crew are the owner's, even its automation's. Size reviews to the diff; read the token counter. [docs/ship-budget.md; docs/captain.md: New threads join the crew]
|
||||
13. **The owner's model preference.** `gstack-models resolve --role agent` picks agent models, except cross-family voices and eval subjects. [docs/model-policy.md: Your model preference]
|
||||
@@ -66,6 +66,13 @@ surface. Keep it small and predictable:
|
||||
Scope instructions in the drive root (`AGENTS.md`, `CREW.md`) apply to every thread in
|
||||
the crew, so a rule written there needs no relaying.
|
||||
|
||||
On Capy, `tools.capy.read` returns a view of a file, not the whole file: roughly the first
|
||||
38,000 characters, with each line cut at 2,000. A program that reads a file, changes it
|
||||
and writes it back with `tools.capy.write` therefore saves a truncated copy, and drive
|
||||
files are no exception. Edit long files with `tools.capy.edit`, or read and write the
|
||||
whole file in bash or Python and check the line count afterward. `tools.drive.history`
|
||||
restores a recent version of a drive file.
|
||||
|
||||
## CREW.md: the lanes' contract
|
||||
|
||||
gstack holds how the work is done; a crew's `CREW.md` holds only what is specific to that
|
||||
@@ -131,6 +138,43 @@ such decision with a plain-language explanation of every option: what it is, why
|
||||
matters, what each answer does, and what it costs. A gate code or a tool's result line
|
||||
alone is not an ask.
|
||||
|
||||
## New threads join the crew
|
||||
|
||||
A crew thread never creates a thread itself. It asks its Captain, and the Captain creates
|
||||
the thread, which puts it in the crew from the start: the Captain briefs it, reads its
|
||||
reports and archives it when its work is done. When a crew thread has already made a
|
||||
thread, it reports the new thread's code to its Captain in that same turn, and the Captain
|
||||
adds it to the crew (`crew.add` on Capy).
|
||||
|
||||
A thread in another project goes Captain to Captain, because `crew.add` refuses a thread
|
||||
from another project and a Captain creates threads only in its own project. The crew
|
||||
thread asks its Captain, who asks that project's Captain to create and own the thread, and
|
||||
the results come back the same way. For the receiving Captain, that ask is work: it
|
||||
creates the thread in its own crew, briefs it and returns the result. Only when the other
|
||||
project has no Captain does the crew thread create the thread itself, and then it records
|
||||
the new thread's code on the work's issue so the thread can still be found. A thread the
|
||||
crew thread already created in another project goes the same way: it reports the code to
|
||||
its Captain, who asks that project's Captain to adopt the thread, and the code goes on
|
||||
the work's issue.
|
||||
|
||||
Why: a crew thread once created a thread in another project directly. That thread ran
|
||||
outside every crew, so no Captain briefed it, tracked it or could archive it.
|
||||
|
||||
## Keep issues tidy
|
||||
|
||||
Issues show what the crew is really doing, so keep them true:
|
||||
|
||||
- Before archiving a thread, close or move to Backlog every issue assigned to it.
|
||||
- On each wake, leave every issue you touched accurate: its status, assignee and links.
|
||||
- An unassigned Todo that nobody will start goes to Backlog.
|
||||
- A daily sweep closes, re-assigns or backlogs any open issue outside Backlog that nobody
|
||||
has touched for 2 days and whose assignee is archived, or idle with no open PR.
|
||||
- The sweep skips an issue assigned to a person (an ask waiting on the owner, say) and a
|
||||
Waiting issue that names what it waits on, by a blocked-by link or a dated comment, while that is still open.
|
||||
|
||||
The target: the Overview's In progress count is about the number of working threads plus
|
||||
the PRs waiting to merge.
|
||||
|
||||
## Plan before build
|
||||
|
||||
A lane that builds something plans first. Its first act after the session-start install
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gstack",
|
||||
"version": "1.95.2",
|
||||
"version": "1.95.3",
|
||||
"description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
|
||||
@@ -587,9 +587,11 @@ describe('capy skill: factory.md, the auto-loaded "how we work" page', () => {
|
||||
return [...new Set(problems)];
|
||||
}
|
||||
|
||||
test('it fits the 3,300-byte budget, and every citation, heading and skill it names resolves', () => {
|
||||
test('it fits the 3,450-byte budget, and every citation, heading and skill it names resolves', () => {
|
||||
const text = fs.readFileSync(FACTORY, 'utf8');
|
||||
expect(Buffer.byteLength(text)).toBeLessThanOrEqual(3300);
|
||||
// 3,300 since #3634; raised to 3,450 (the page's new size, rounded up to the next 25 bytes) for point 12's
|
||||
// R68 clause (Garry, 2026-11-03: crew threads ask their Captain for new threads). Raise it only by what a rule needs.
|
||||
expect(Buffer.byteLength(text)).toBeLessThanOrEqual(3450);
|
||||
expect(text).toMatch(/^# How we work/);
|
||||
expect(citationProblems(text)).toEqual([]);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user