forge-orkes 0.72.2 → 0.73.1

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.
@@ -130,6 +130,36 @@ case "$out" in
130
130
  *) bad "catchup summary" "no while-you-were-away line: $out" ;;
131
131
  esac
132
132
 
133
+ # --- 14-15. BARE BRANCH LOOSENING (issue #25): --list-logs glob against REAL git worktrees on
134
+ # bare m-<id>-slug branches (no forge/ prefix) — --list-logs only needs the notify-log
135
+ # PATH, no id derivation, so this pins the match extension alone (FORGE_JARVIS_REPO_ROOT
136
+ # points the glob at a throwaway fixture repo). --------------------------------------------
137
+ GITROOT="$ROOT/git-fixture"; mkdir -p "$GITROOT/main"
138
+ (
139
+ cd "$GITROOT/main" || exit 1
140
+ git init -q .
141
+ git config user.email t@t.com; git config user.name test
142
+ : > .gitkeep; git add .gitkeep; git commit -q -m init
143
+ git worktree add -q -b m-176-marcy-mcp "$GITROOT/bare-1" >/dev/null 2>&1
144
+ git worktree add -q -b fix-issue-2 "$GITROOT/guard-1" >/dev/null 2>&1
145
+ ) >/dev/null 2>&1
146
+
147
+ out="$(FORGE_JARVIS_REPO_ROOT="$GITROOT/main" sh "$RELAY" --list-logs 2>/dev/null)"
148
+
149
+ # 14. bare branch m-176-marcy-mcp emits its notify-log path (pings reach the phone)
150
+ if printf '%s' "$out" | grep -q "$GITROOT/bare-1/.forge/runner-work/notify.log"; then
151
+ ok "bare branch m-176-marcy-mcp: --list-logs emits its notify-log path"
152
+ else
153
+ bad "bare branch --list-logs path" "$out"
154
+ fi
155
+
156
+ # 15. GUARD: a bare-number branch (fix-issue-2, no m- token) emits NO log path
157
+ if ! printf '%s' "$out" | grep -q 'guard-1'; then
158
+ ok "guard: bare-number branch fix-issue-2 (no m- token) emits no log path"
159
+ else
160
+ bad "guard: bare-number branch fix-issue-2 (no m- token) emits no log path" "$out"
161
+ fi
162
+
133
163
  # --- summary -----------------------------------------------------------------
134
164
  printf '\n%s: %d passed, %d failed\n' "$(basename "$0")" "$PASSED" "$FAILED"
135
165
  [ "$FAILED" = 0 ]
@@ -1,46 +1,16 @@
1
- # Forge Desire-Path Observation — APPEND-ONLY
2
- #
3
- # One observation = one new file under state/desire-paths/. NEVER edit an
4
- # existing observation in place and NEVER keep a mutable occurrence counter
5
- # that is what used to make state/index.yml conflict across worktrees.
6
- #
7
- # Filename: state/desire-paths/{YYYY-MM-DD}-{type}-{milestone}-{slug}.yml
8
- # e.g. state/desire-paths/2026-06-10-recurring_friction-m7-uncommitted-state.yml
9
- # The date+type+milestone+slug make the name unique, so concurrent agents in
10
- # different worktrees only ever ADD files — git never has to merge content.
11
- #
12
- # Occurrence counts are DERIVED: the `forge` skill globs this directory and
13
- # groups by (type + normalized note). A pattern appearing in 3+ files is a
14
- # candidate for framework evolution, surfaced at `forge` boot — the single
15
- # review owner (see ADR-012).
16
- #
17
- # SCOPE decides where a 3+ pattern's fix lands:
18
- # project = fix targets user-owned files (constitution.md, design-system.md,
19
- # context.md). Stays in-project.
20
- # framework = fix targets Forge's own skills/templates. Eligible for UPSTREAM
21
- # transport — forge review writes a portable block to
22
- # state/desire-paths/upstream/ and (when gh + forge.upstream_repo
23
- # are available) offers a GH issue against the Forge repo.
24
- # Lazy migration: a file with no `scope` is read as `project`.
1
+ # Forge Desire-Path Observation — one file per observation
2
+ # Copy to .forge/state/desire-paths/{YYYY-MM-DD}-{type}-{milestone}-{slug}.yml
3
+ # Append-only: never edit an existing observation file; recurrence is derived
4
+ # by globbing (type + normalized note), not a counter. See FORGE.md § state/desire-paths/.
25
5
 
26
- type: "" # deviation_pattern | tier_override | skipped_step |
27
- # recurring_friction | agent_struggle | user_correction
28
- scope: "" # project | framework set AT CAPTURE by the writing
29
- # skill, from the file its suggested fix targets.
30
- # Absent project (lazy migration).
31
- suggestion_target: "" # optional: the skill/file the fix would touch
32
- # (e.g. "planning/executing skills", "constitution.md")
33
- milestone: "" # e.g. "m7" (or "global" if not milestone-scoped)
34
- skill: "" # skill that observed it (executing, planning, verifying, ...)
35
- first_seen: null # ISO 8601 date this observation was recorded
36
- related_files: [] # source files involved, if any
37
- note: "" # one-line description — the grouping key for occurrence counts
38
-
39
- # Optional type-specific detail (fill what applies to `type`):
40
- detail:
41
- detected: "" # tier_override: what Forge detected
42
- overridden_to: "" # tier_override: what the user chose
43
- rule: null # deviation_pattern: 1 | 2 | 3
44
- correction: "" # user_correction: the repeated correction
45
- failure_pattern: "" # agent_struggle: how the task fails
46
- step: "" # skipped_step: the step skipped
6
+ type: "" # recurring_friction | agent_struggle | user_correction (etc. — free-form, grouped by exact string)
7
+ date: "" # ISO 8601 date the observation was made, e.g. "2026-07-23"
8
+ milestone: "" # milestone id, or a short label for non-milestone work (e.g. "quick-task (...)")
9
+ scope: project # project | framework absent project (this repo only; framework ⇒ upstream-eligible per ADR-012)
10
+ suggestion_target: "" # the file/skill this observation would change if acted on
11
+ note: >
12
+ What was observed concrete enough that a future review can judge recurrence
13
+ (same type + normalized note) without re-reading the original session.
14
+ suggestion: >
15
+ What to do about it, if a fix is proposed. Omit this key when the observation
16
+ has no concrete suggestion yet.