forge-orkes 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,6 +45,37 @@ its version runs it once, and after the version is stamped it falls out of range
45
45
  ledger, no per-version code, no staleness. (It also closes the install-run blind spot:
46
46
  detection keys off the freshly-synced guides on disk, not the skill's own pre-sync code.)
47
47
 
48
+ ### Experimental-skill guard (read if your change lives in an experimental skill)
49
+
50
+ If the behavior your guide migrates is implemented **only inside an experimental,
51
+ opt-in skill** (e.g. `.claude/skills/orchestrating/` from `experimental/m10/`),
52
+ a version-stamp check is **not enough**. `upgrading` never overwrites an
53
+ experimental skill in its base sync (it offers a re-sync in Step 3b, which the
54
+ user may decline), so the skill can stay pinned at install-time content while the
55
+ version stamp advances — and a stamp-only Detection block would report "nothing
56
+ to migrate" while the behavior is silently absent. This is exactly how the 0.28.0
57
+ repo-scoped worktree root became a no-op (issue #5).
58
+
59
+ So when your change touches experimental-skill behavior, the Detection block MUST
60
+ inspect the **skill's content on disk**, not the version, and emit `MIGRATE` when
61
+ the skill is stale:
62
+
63
+ ```bash
64
+ # The behavior lives in an experimental skill — check its CONTENT, not the version.
65
+ S=.claude/skills/orchestrating/SKILL.md
66
+ [ -f "$S" ] || exit 0 # skill not installed → nothing to do
67
+ if grep -q 'forge-worktrees' "$S" \
68
+ && ! grep -q '<repo>-worktrees' "$S"; then
69
+ echo "MIGRATE — experimental orchestrating skill is pinned to the pre-0.28.0 worktree root; re-sync it"
70
+ fi
71
+ ```
72
+
73
+ Better still, **also promote the load-bearing convention into base** (`FORGE.md`
74
+ or a base skill) so it is upgrade-synced regardless of the experimental skill's
75
+ state — then the base workflow no longer depends on experimental internals at all
76
+ (issue #6). The content-check Detection above is the floor; base promotion is the
77
+ durable fix.
78
+
48
79
  ### Detection block skeleton (applies)
49
80
 
50
81
  ```bash
@@ -106,5 +137,7 @@ must be confirmed with the user.>
106
137
  - [ ] Exactly one `## Detection` heading; exactly one ` ```bash ` block under it.
107
138
  - [ ] Block emits `MIGRATE` on stdout iff the migration applies; silent + exit 0 otherwise.
108
139
  - [ ] Block is safe on a clean/empty project (no errors, exit 0).
140
+ - [ ] If the change lives in an experimental skill, Detection checks the skill's **content** (not just the version stamp) — see the Experimental-skill guard above.
141
+ - [ ] Any new accumulating artifact declares owner, size gate, archive/compaction rule, derived vs source-of-truth status, and future migration behavior.
109
142
  - [ ] Mirrored byte-identical to `docs/migrations/{same-name}.md`.
110
143
  - [ ] No edit to `upgrading/SKILL.md` or `create-forge.js` was needed (the loop covers it).
@@ -0,0 +1,34 @@
1
+ # Forge Streams — Active Project Map
2
+ # Size gate: keep this file <= 20 KB. It is the Project Chief's default context.
3
+ # Store summaries only. Deep stream history belongs in streams/{stream}/.
4
+
5
+ version: 1
6
+ updated_at: null
7
+
8
+ project_chief:
9
+ current_stream: null
10
+ merge_policy: "chief-owned"
11
+ notes: ""
12
+
13
+ streams:
14
+ # - id: "billing-retries"
15
+ # status: active # draft | active | paused | delegated | blocked | ready | merged | closed
16
+ # goal: "Fix checkout retry handling"
17
+ # branch: "forge/stream-billing-retries"
18
+ # worktree: "../app-worktrees/billing-retries"
19
+ # owner: "" # session/thread/user label
20
+ # owned_surfaces:
21
+ # - "src/billing/**"
22
+ # shared_surfaces:
23
+ # - "src/lib/events.ts"
24
+ # risk: medium # low | medium | high | unknown
25
+ # blocked_by: []
26
+ # next_action: "Review event contract before editing shared surface"
27
+ # last_sync: null
28
+ []
29
+
30
+ merge_queue:
31
+ # - stream: "billing-retries"
32
+ # status: waiting # waiting | merging | blocked | merged
33
+ # reason: "shared event contract pending"
34
+ []
@@ -0,0 +1,47 @@
1
+ # Stream Brief: {stream}
2
+
3
+ Size gate: keep this brief <= 8 KB. It is the first file loaded when resuming a stream.
4
+
5
+ ## Goal
6
+
7
+ {One sentence describing the line of work.}
8
+
9
+ ## Current State
10
+
11
+ Status: draft | active | paused | delegated | blocked | ready | merged | closed
12
+
13
+ {What is true right now? Include whether code has changed, whether workers are active, and whether merge is safe.}
14
+
15
+ ## Ownership
16
+
17
+ Owned surfaces:
18
+ - {paths/modules this stream may edit}
19
+
20
+ Shared surfaces:
21
+ - {paths/modules requiring contract or Project Chief approval}
22
+
23
+ Read-only surfaces:
24
+ - {paths/modules this stream may inspect but not edit}
25
+
26
+ Forbidden surfaces:
27
+ - {paths/modules this stream must not touch}
28
+
29
+ ## Decisions
30
+
31
+ - {Locked decisions that apply to this stream}
32
+
33
+ ## Findings
34
+
35
+ - {Recent findings needed to resume without chat history}
36
+
37
+ ## Work Packages
38
+
39
+ - {WP-id}: {status} — {short goal}
40
+
41
+ ## Blockers
42
+
43
+ - {blocker or "none"}
44
+
45
+ ## Next Action
46
+
47
+ {The next concrete action for the stream chief or worker.}
@@ -0,0 +1,56 @@
1
+ # Forge Stream State
2
+ # Copy to .forge/streams/{stream}.yml.
3
+ # Size gate: keep per-stream state <= 15 KB. Put narrative in brief.md or findings.md.
4
+
5
+ version: 1
6
+
7
+ stream:
8
+ id: ""
9
+ goal: ""
10
+ status: draft # draft | active | paused | delegated | blocked | ready | merged | closed
11
+ tier: null # quick | standard | full | null until known
12
+ created_at: null
13
+ updated_at: null
14
+ owner: ""
15
+
16
+ runtime:
17
+ branch: ""
18
+ worktree: ""
19
+ chief_session: ""
20
+ worker_sessions: []
21
+
22
+ ownership:
23
+ owned_surfaces: []
24
+ shared_surfaces: []
25
+ read_only_surfaces: []
26
+ forbidden_surfaces: []
27
+ reservations:
28
+ # - surface: "src/lib/events.ts"
29
+ # reason: "Event contract update"
30
+ # status: proposed # proposed | approved | blocked | released
31
+ []
32
+
33
+ dependencies:
34
+ blocked_by_streams: []
35
+ blocks_streams: []
36
+ contracts: []
37
+
38
+ context:
39
+ brief: ".forge/streams/{stream}/brief.md"
40
+ findings: ".forge/streams/{stream}/findings.md"
41
+ packages_dir: ".forge/streams/{stream}/packages"
42
+
43
+ blockers:
44
+ # - type: decision | conflict | external | human-action
45
+ # summary: ""
46
+ # since: null
47
+ # resolution: ""
48
+ []
49
+
50
+ merge:
51
+ readiness: not_ready # not_ready | ready | blocked | merged
52
+ risk: unknown # low | medium | high | unknown
53
+ required_checks: []
54
+ notes: ""
55
+
56
+ next_action: ""
@@ -0,0 +1,70 @@
1
+ # Forge Work Package Template
2
+ # Bounded delegated work for a single stream.
3
+ # Copy to: .forge/streams/{stream}/packages/{id}.yml
4
+
5
+ package:
6
+ id: "{package-id}"
7
+ stream: "{stream-id}"
8
+ title: ""
9
+ status: draft # draft | assigned | active | blocked | ready | returned | closed
10
+ created_at: "{ISO-8601}"
11
+ updated_at: "{ISO-8601}"
12
+ owner: "" # worker session, person, or agent label
13
+ reports_to: "chief-of-staff" # Project Chief or stream chief
14
+
15
+ goal:
16
+ summary: ""
17
+ observable_outcome: ""
18
+ non_goals: []
19
+
20
+ scope:
21
+ owns:
22
+ # Files, dirs, modules, routes, or contracts this worker may edit.
23
+ - ""
24
+ may_read:
25
+ # Context surfaces the worker may inspect but should not edit.
26
+ - ""
27
+ shared_surfaces:
28
+ # APIs, schemas, data contracts, docs, or config shared with other streams.
29
+ - surface: ""
30
+ contract_owner: ""
31
+ rule: "report changes before editing"
32
+ must_not_touch:
33
+ # Explicit exclusions. Any need to edit these returns to the Chief.
34
+ - ""
35
+
36
+ dependencies:
37
+ blocked_by: []
38
+ provides_to: []
39
+ contracts_required: []
40
+
41
+ verify:
42
+ commands:
43
+ # - cmd: "npm test -- ..."
44
+ # advisory: false
45
+ manual_checks: []
46
+ evidence_required: []
47
+
48
+ stop_conditions:
49
+ - "Need to edit must_not_touch or undeclared shared surface"
50
+ - "Find conflicting ownership with another stream"
51
+ - "Contract is missing, ambiguous, or contradicted by implementation"
52
+ - "Task scope expands beyond the package goal"
53
+ - "Verification cannot be run or fails for reasons outside package scope"
54
+
55
+ deliverables:
56
+ - "Changed files or commits"
57
+ - "Verification evidence"
58
+ - "Decision notes or conflicts found"
59
+ - "Recommended next action"
60
+
61
+ handoff:
62
+ instructions: ""
63
+ report_back:
64
+ to: "chief-of-staff"
65
+ include:
66
+ - "what changed"
67
+ - "what was verified"
68
+ - "conflicts or scope expansion"
69
+ - "open risks"
70
+ - "next action"