This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit ba60392f880c95fd4f25e39260ab43ff441f2ce3 Author: Stephen Mallette <[email protected]> AuthorDate: Fri Aug 7 16:48:47 2026 -0400 Close tasks as they finish, not at merge Section 2 wires blocks edges so bd ready reports what can start, but sections 3 and 4 held everything open until the PR landed. A dependent is released when its blocker closes, so bd ready could never change during a session. Tasks now close on completion; the root closes at merge. Assisted-by: Claude Code:claude-opus-5 --- .beads/PRIME.md | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/.beads/PRIME.md b/.beads/PRIME.md index 8991c57ede..0e36213018 100644 --- a/.beads/PRIME.md +++ b/.beads/PRIME.md @@ -12,8 +12,10 @@ survive context compaction. file. They are session-scoped: nothing in one survives, so nothing in one is memory. Your harness may prompt you to use them. Decline. - **Lifecycle** — create the bead **before** writing code, `--claim` it **before you edit**, - close it at merge. A bead that never enters `in_progress` is one no later session can - resume. Status is not paperwork; it is the handoff. + `bd close` it **as soon as that task's work is done**, and pin the whole subtree at merge. + A bead that never enters `in_progress` is one no later session can resume, and one that + never closes leaves everything downstream of it blocked. Status is not paperwork; it is + both the handoff and the gate. - **Plan mode** — fine, and the plan file your harness writes is not yours to avoid. But it lives outside the repo and outside the graph. Anything you weighed and rejected while planning belongs in a bead **before you start executing**, not after. @@ -59,6 +61,8 @@ bd dep cycles # a plan with a cycle cannot execute how you end up with a flat star and no parallelism. - **A task with no blocker asserts it can start immediately.** The absence of an edge is a claim, not an oversight — decide it deliberately for every task. +- **A blocked task is released when its blocker closes**, so tasks must close as they finish + rather than at merge. Hold them all open until the PR lands and the graph never advances. - **Link a decision to the work it caused** — `bd dep add <task> <decision> -t caused-by`. Without it there is no path from a task back to the reasoning that shaped it. @@ -75,14 +79,19 @@ a list and called it a plan. bd update <id> --claim # sets assignee to you, status to in_progress ``` -It stays `in_progress` until the PR merges — see section 4. That window **is** the memory: -a later session runs `bd list --status=in_progress` and learns what was underway, who had -it, and where it stopped. A bead that jumps from `open` straight to `closed` records that -the work happened but never that it was yours, never where you were when context ran out. +That window **is** the memory: a later session runs `bd list --status=in_progress` and learns +what was underway, who had it, and where it stopped. A bead that jumps from `open` straight +to `closed` records that the work happened but never that it was yours, never where you were +when context ran out. If you are editing files and nothing is `in_progress`, you have already lost that. Stop and claim the bead you are actually working on. +**Close a task the moment its work is done — do not wait for the merge.** Closing is what +releases the tasks that were waiting on it, so a task left `in_progress` out of caution +stalls everything downstream. The root is the exception: it represents the deliverable and +closes at merge (section 4). + **Then watch for these five things. They are observable events, not judgment calls:** 1. **The operator redirects you** — "no, do X instead", "we tried that", "that breaks @@ -126,13 +135,14 @@ comment. --- -## 4. At merge — close, then pin +## 4. At merge — close the root, then pin -When the PR lands on its target branch: +Tasks closed as they finished (section 3). What is left at merge is the **root** — the +deliverable — plus any decision beads, which are not work and never closed on their own. ```bash -bd close <id> # normal completion -bd children <root> # the whole subtree +bd children <root> # the whole subtree; nothing should still be in_progress +bd close <root> <decision-ids> # whatever the work itself did not close bd update <id1> <id2> ... -s pinned bd dolt pull && bd dolt push ``` @@ -210,17 +220,12 @@ a root *after* its children exist do not backfill, so label the root first. |---|---| | Module | `gremlin-core`, `gremlin-server`, `gremlin-test`, `tinkergraph`, `gremlator`, and `gremlin-python` / `gremlin-javascript` / `gremlin-go` / `gremlin-dotnet` | | Concern | `io`, `traversal`, `docs`, `antlr`, `process`, `specification`, `glv`, `breaking-change`, `deprecation` | -| Topic | a long-running effort spanning roots — `gql`, `gql-gremlin`, `match-step`, `tiny-gremlin` | -| Release | `3.7`, `3.8` | | Semantic | `rejected-alternative`, `human`, and record kinds `jira` / `pr` / `dev-list` / `proposal` | **Never label a bead with something `--type` already says.** `feature`, `task`, `bug` are types; a `feature` label is on 18 beads today and carries no information the type field lacks. That is the drift `bd label list-all` is meant to catch. -**Use the full module name.** `gremlin-javascript`, not `javascript`; `gremlin-python`, not -`python`. Both forms exist in the database and the short ones are drift, not a convention. - These are conventions, not enforced values — but a new label splits every query that used the old one, so introducing one is a decision. Treat it as such.
