$ cat node-template.py

T

Task

// One unit of intent, above the lanes that attempt it. Holds the brief and nothing else: wire it into one or more Lane nodes and they share that one text, while the board rolls their states up into a single status for the task. A lane is a worker on a branch — this is the thing the worker is working ON, and it outlives any single attempt.

Input
Data
#task#plan#lane#vibe
template.py
1"""Task — one unit of intent, above the lanes that attempt it (T25).23A lane is a WORKER: one branch, one clone, one agent, one pull request, nailed4to that branch for life (D18). A task is the thing the worker is working on,5and it outlives any single attempt — which is what lets an attempt be abandoned6without losing the intent.78## Why this node has ONE field910It carries a brief and nothing else. Its value is STRUCTURAL, not in its11fields: the template id is what `isTaskNode` keys on to roll its lanes up into12one status, and the `brief` edge is what makes a lane a lane OF this task. The13name comes from the node's own label, and what it depends on comes from its14edges — both free, and neither worth a second copy inside the node.1516It shipped briefly with `title`, `acceptance` and `owns`. All three were17removed on 2026-09-22 because nothing read them: `title` duplicated the node18label the board actually renders, and `acceptance` and `owns` were output ports19wired to nothing — a Lane accepts only `brief, decisions, repo, checks, branch,20llmModelId`. A field that no code reads is not a lightweight convention, it is21a promise the board appears to make and does not keep.2223`acceptance` is worth having again once something can consume it: prose "done24when" needs a judge, and that is the M2 review gate. Until then it would either25be duplicated brief text or a text box that does nothing.26"""2728import json29import sys303132def main():33    try:34        raw = json.loads(sys.stdin.read())35        inputs = raw.get("inputs", {})36        print(json.dumps({"brief": inputs.get("brief") or ""}))37    except Exception as e:38        print(json.dumps({"error": str(e), "errorType": type(e).__name__}), file=sys.stderr)39        sys.exit(1)404142if __name__ == "__main__":43    main()44

$ git log --oneline

v2.0.0
HEAD
2026-10-14

First marketplace publish: vibe-coding lanes and the gstack plan flow (PR #1313).