@se-studio/skills 1.7.9 → 1.7.10

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @se-studio/skills
2
2
 
3
+ ## 1.7.10
4
+
5
+ ### Patch Changes
6
+
7
+ - 9dd8d68: Drop the work/active yaml session ledger. In-flight work is open PRs (including cloud) and local git worktrees. Customer-only work must not write files in se-core-product; shared behaviour still belongs in packages, not a one-site fork.
8
+
3
9
  ## 1.7.9
4
10
 
5
11
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/skills",
3
- "version": "1.7.9",
3
+ "version": "1.7.10",
4
4
  "description": "SE Studio agent skills for marketing site development with Contentful CMS",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,7 +27,7 @@ Before non-trivial code, run the placement checklist (in the skill). Summary:
27
27
  | **Customer shared package** (if monorepo) | Consent/analytics shared across sites in this customer |
28
28
  | **`se-core-product`** (`@se-studio/*`) | Fixes/features needed by 2+ sites, CMS infrastructure |
29
29
 
30
- If the checklist says **core**, stop and switch to core-first mode — do not patch `@se-studio` behaviour in this repo.
30
+ If the checklist says **core**, stop and switch to core-first mode — do not patch `@se-studio` behaviour in this repo. Shared converters, Visual/video delivery, cms-edit runtime, sitemap helpers, and site-check assertions belong in core, not a one-site fork.
31
31
 
32
32
  ### Deploy smoke failed?
33
33
 
@@ -37,7 +37,7 @@ Do **not** change `baseUrl`, discovery routes, or add `getRequestBaseUrl()` to u
37
37
  2. Bump `@se-studio/site-check@2.9.4+` after npm publish (`discovery.urlOrigin: auto`)
38
38
  3. Customer-only: curate new URLs in `smoke.cases.json` when CMS routes go live — not package assertion hacks
39
39
 
40
- Record `placement.decision` in `work/active/<feature>.yaml` before smoke/server-config commits aimed at deploy smoke.
40
+ State placement in chat (and the PR) before smoke/server-config commits aimed at deploy smoke. Do not write files in se-core-product for customer-only work.
41
41
 
42
42
  ### Core release order
43
43
 
@@ -53,13 +53,14 @@ Never hand-edit `package.json` dependency versions.
53
53
  ### Parallel features
54
54
 
55
55
  - One feature = one `feature/<scope>/<slug>` branch
56
- - **Git worktree required** for all feature work — do not implement on the primary `develop` checkout
56
+ - **Local git worktree** for feature work — do not implement on the primary `develop` checkout
57
57
  - Path: registry `worktreesRoot` / `<feature-slug>` (see se-core-product `packages/skills/references/agent-session/projects.registry.json`)
58
58
  - Create: `git worktree add <worktreesRoot>/<feature-slug> -b feature/<scope>/<slug> origin/develop`
59
59
  - Then seed env: `pnpm --dir ~/source/se/se-core-product local-env seed --project <key>` (no-clobber copy of `.env.local`; never invent a stub or symlink at develop)
60
- - Manifest must set `worktree:`; opt out only if the user says “work in place” / “no worktree” (`worktree_opt_out: true`)
60
+ - Opt out only if the user says “work in place” / “no worktree”
61
+ - **Cloud agents:** draft PR to `develop` (that is the ledger; do not write yaml in se-core-product)
61
62
  - CMS edits: `--session <feature-slug>` (isolate cms-edit sessions)
62
- - Track in-flight work: manifest at `~/source/se/se-core-product/work/active/<feature>.yaml` (or `work/active/` in this repo if core checkout unavailable)
63
+ - In-flight work: open PRs + local `git worktree list`
63
64
 
64
65
  ### Production handoff
65
66
 
@@ -1,14 +1,14 @@
1
1
  {
2
- "manifestPath": "work/active/<feature>.yaml",
3
2
  "integrationBranches": {
4
3
  "core": "dev",
5
4
  "customer": "develop"
6
5
  },
7
6
  "branchPattern": "feature/<scope>/<short-slug>",
7
+ "ledger": "Open PRs to dev/develop (all machines, including cloud) plus local git worktrees. No work/active yaml.",
8
8
  "worktrees": {
9
- "requiredForFeatureBranches": true,
9
+ "requiredForLocalFeatureBranches": true,
10
10
  "pathPattern": "<worktreesRoot>/<feature-slug>",
11
- "notes": "Feature work (feature/*) must use a git worktree under the project's worktreesRoot. Primary checkouts stay on integration branches only. Opt out only if the user explicitly says work in place / no worktree in the current conversation."
11
+ "notes": "Local feature/* work uses a git worktree under the project's worktreesRoot. Cloud agents use their VM checkout and a draft PR. Primary checkouts stay on integration branches. Opt out of local worktrees only if the user explicitly says work in place / no worktree in the current conversation."
12
12
  },
13
13
  "localEnvRoot": "~/source/local-env",
14
14
  "localEnvExtras": [
@@ -1,17 +1,19 @@
1
1
  # Refuse customer patches (site-first guardrails)
2
2
 
3
- Agents in **site-first** mode must **refuse** customer-repo changes that belong in **`se-core-product`** (`@se-studio/*`), unless the user explicitly approves **`defer-extract`** in the manifest with `extract_to_core: pending` and a dated extraction plan.
3
+ Agents in **site-first** mode must **refuse** customer-repo changes that belong in **`se-core-product`** (`@se-studio/*`), unless the user explicitly approves **`defer-extract`** in chat with a dated extraction plan in the PR.
4
4
 
5
5
  Run this table **in addition to** the placement checklist (`site-workflows-agent-session` Step 3) when the task touches smoke, deploy checks, shared packages, or infra.
6
6
 
7
+ Customer-only work must **not** add files in se-core-product.
8
+
7
9
  ## Refusal triggers
8
10
 
9
11
  | Symptom, file, or request | Correct owner | Agent action (site-first) |
10
12
  |---------------------------|---------------|---------------------------|
11
- | Deploy / `smoke-test:live` failure after bumping `@se-studio/*` | **core** — fix package behaviour | **Stop.** Switch to core-first or set `blocked_on: "@se-studio/<pkg>@<version>"`. Customer only bumps after npm publish. |
13
+ | Deploy / `smoke-test:live` failure after bumping `@se-studio/*` | **core** — fix package behaviour | **Stop.** Switch to core-first. Customer only bumps after npm publish. |
12
14
  | Discovery smoke (`llms.txt`, `markdown-index.txt`, `cms.txt`, `site-info.md`) origin mismatch on `*.vercel.app` | **core** — `@se-studio/site-check` (`discovery.urlOrigin`) | **Refuse** per-request origin hacks (`getRequestBaseUrl`, `headers()` for `baseUrl`). Bump `site-check@2.9.4+`. |
13
15
  | Patching `@se-studio/site-check` expectations in app code | **core** `site-check` | **Refuse.** Open core PR + changeset. |
14
- | Forking converter / link logic already in `contentful-rest-api` | **core** | **Refuse.** Fix converter or API in core. |
16
+ | Forking converter / link / media / sitemap / Visual behaviour already in `@se-studio/*` | **core** | **Refuse.** Fix the package, then bump the customer. |
15
17
  | `pnpm patch`, `patchedDependencies`, or overrides to fork `@se-studio/*` | **forbidden** | **Refuse** (see root `AGENTS.md`). |
16
18
  | New smoke assertion that should apply to all marketing sites | **core** `site-check` | **Refuse** site-only assertion helpers; extend site-check. |
17
19
  | `route-build-policy.json` change to hide a core regression (e.g. allow new `ƒ` on CMS routes) | **core** + site routing fix | **Refuse** policy-only workaround; fix why route went dynamic. |
@@ -29,12 +31,12 @@ Run this table **in addition to** the placement checklist (`site-workflows-agent
29
31
 
30
32
  Use only when the user **explicitly** accepts short-term customer code with a core extraction ticket:
31
33
 
32
- 1. Manifest `placement.decision: defer-extract`
33
- 2. `extract_to_core: pending` + `extract_rationale` (what moves to which package)
34
- 3. Add `work/tracker.yaml` rollout or `attention` item if multi-site
35
- 4. **Do not** merge to customer `develop` if it blocks other sites on a shared package fix
34
+ 1. Placement decision `defer-extract` stated in chat and the customer PR
35
+ 2. Name the target `@se-studio/*` package and what moves
36
+ 3. **Do not** merge to customer `develop` if it blocks other sites on a shared package fix
37
+ 4. **Do not** write a yaml tracker in se-core-product
36
38
 
37
- ## Manifest gate
39
+ ## Commit gate (no yaml)
38
40
 
39
41
  Before committing customer changes to any of:
40
42
 
@@ -44,7 +46,7 @@ Before committing customer changes to any of:
44
46
 
45
47
  …when the **stated goal** is “fix deploy smoke” or “fix site-check failure”:
46
48
 
47
- 1. Record `placement.decision` and `placement.rationale` in `work/active/<feature>.yaml`
49
+ 1. State placement in chat (`core` | `customer` | `defer-extract`)
48
50
  2. If decision is `core`: **do not commit customer workaround** — switch mode
49
51
  3. If decision is `customer`: user must confirm in chat (legitimate site-only URL curation)
50
52
  4. If decision is `defer-extract`: user must confirm extraction plan in chat
@@ -55,4 +57,4 @@ Before committing customer changes to any of:
55
57
  - `workflow_dispatch` deployment smoke against a known-good URL
56
58
  - Skip Vercel Deployment Check with **human** approval
57
59
 
58
- Never treat emergency bypass as permission to land a permanent customer patch for `@se-studio/*` behaviour.
60
+ Never treat emergency bypass as permission to land a permanent customer patch for `@se-studio/*` behaviour.
@@ -18,11 +18,10 @@ Read the failing step and package:
18
18
 
19
19
  ## 2. If `@se-studio/*` behaviour is wrong → core-first
20
20
 
21
- 1. Set manifest `mode: core-first` (or stop and ask user to switch).
21
+ 1. Switch to **core-first** (or stop and ask the user).
22
22
  2. Fix in `packages/<pkg>/`, add **changeset**, run package tests.
23
- 3. Push `dev` → wait for CI npm publish.
24
- 4. Add/update `work/tracker.yaml` **rollout** for customer bumps.
25
- 5. Set customer manifest `blocked_on: "@se-studio/<pkg>@<version>"` until npm confirms.
23
+ 3. Push `dev` → wait for CI npm publish. The core PR is the rollout record.
24
+ 4. Do not push customer `develop` until npm confirms; then `pnpm update` and a customer PR.
26
25
 
27
26
  **Customer repo during wait:** only dependency bump via `pnpm update` — no `baseUrl` / origin / assertion hacks.
28
27
 
@@ -47,14 +46,14 @@ Examples: wrong slug in `smoke.cases.json`, page unpublished, new article type n
47
46
 
48
47
  1. Core: `@se-studio/site-check@2.9.4+` with `discovery.urlOrigin: auto` (default in smoke runner).
49
48
  2. Customer: `pnpm update @se-studio/site-check@2.9.4 -r`, keep canonical `baseUrl` in app config.
50
- 3. Tracker rollout: `site-check-discovery-canonical` in `work/tracker.yaml`.
49
+ 3. Core PR + npm bump; customer `pnpm update @se-studio/site-check@2.9.4+`.
51
50
 
52
51
  ## 5. Emergency unblock (human or agent with explicit approval)
53
52
 
54
53
  | Action | Use when |
55
54
  |--------|----------|
56
55
  | `workflow_dispatch` deployment smoke | Re-test after core fix + customer bump |
57
- | `SMOKE_TEST_IGNORE=true` | One-off deploy; document in manifest notes |
56
+ | `SMOKE_TEST_IGNORE=true` | One-off deploy; say so in the PR |
58
57
  | Human approves blocked Deployment Check | Production promotion already reviewed |
59
58
 
60
59
  Record what was bypassed and the real fix still required (core PR / npm bump).
@@ -72,9 +71,8 @@ Deployment checks stay **HTTP-only** — never enable `cmsIntegrity` on Vercel l
72
71
 
73
72
  ## 7. Handoff
74
73
 
75
- Include in manifest / handoff:
74
+ Include in the PR / handoff:
76
75
 
77
76
  - Root cause (core vs customer)
78
77
  - Published package versions required
79
- - Tracker rollout id
80
78
  - Whether any emergency bypass was used
@@ -423,12 +423,12 @@ When **`pnpm smoke-test:live`**, Vercel Deployment Checks, or preview smoke fail
423
423
  Quick sequence:
424
424
 
425
425
  1. **Classify** — discovery/origin → `site-check`; broken slug → customer `smoke.cases.json`; new `ƒ` route → fix dynamic APIs.
426
- 2. **Core-first** if package behaviour is wrong — changeset, push `dev`, tracker rollout, customer `blocked_on` until npm.
426
+ 2. **Core-first** if package behaviour is wrong — changeset, push `dev`, customer bump after npm.
427
427
  3. **Customer-only** if curating URLs — refresh from sitemap; one case per **enabled** article-type segment.
428
- 4. **Discovery canonical origin** — bump `site-check@2.9.4+`; never add `getRequestBaseUrl()` (tracker rollout `site-check-discovery-canonical`).
428
+ 4. **Discovery canonical origin** — bump `site-check@2.9.4+`; never add `getRequestBaseUrl()`.
429
429
  5. **Emergency** — `SMOKE_TEST_IGNORE` or `workflow_dispatch` smoke; not a permanent site patch.
430
430
 
431
- Record `placement.decision` in manifest before smoke/server-config commits aimed at unblocking deploy.
431
+ State placement in chat before smoke/server-config commits aimed at unblocking deploy. Do not write se-core-product yaml.
432
432
 
433
433
  ## Reference
434
434
 
@@ -11,10 +11,10 @@ Orchestrates **where** to work, **where code belongs**, and **how to isolate par
11
11
 
12
12
  **Local env / worktrees:** [`local-env.md`](../../references/agent-session/local-env.md) — canonical `~/source/local-env`, no-clobber seed, 1Password backup only.
13
13
 
14
- **Manifest template:** [`packages/skills/references/agent-session/manifest.template.yaml`](../../references/agent-session/manifest.template.yaml)
15
-
16
14
  **Human guide:** `docs/WORKFLOW.md` in se-core-product.
17
15
 
16
+ **Do not write yaml ledgers.** No `work/active/<feature>.yaml`, no session manifests in se-core-product for customer work. In-flight work is **open PRs** (local and cloud) plus **local git worktrees** on this machine.
17
+
18
18
  ---
19
19
 
20
20
  ## When to load this skill
@@ -25,14 +25,14 @@ Triggers:
25
25
 
26
26
  - User pastes a session opener (`Mode: site-first`, `Feature: …`)
27
27
  - User asks to work on a customer site or core package
28
- - User starts parallel work on another feature (new manifest, new branch)
28
+ - User starts parallel work on another feature (new branch)
29
29
  - User asks "where should this live?" (run placement checklist)
30
30
 
31
31
  ---
32
32
 
33
33
  ## Step 1 — Resolve session context
34
34
 
35
- Collect or infer:
35
+ Collect or infer (say them in chat; do not file them in se-core-product):
36
36
 
37
37
  | Field | Required | Notes |
38
38
  |-------|----------|-------|
@@ -41,7 +41,7 @@ Collect or infer:
41
41
  | `project_key` | Yes | From registry (`om1`, `se-core-product`, `pedestal`, …) |
42
42
  | `primary_repo` | Yes | Absolute path from registry |
43
43
  | `branch` | Yes | `feature/<scope>/<slug>` — see naming below |
44
- | `worktree` | **Yes** (feature work) | Path under registry `worktreesRoot`/`<feature-slug>`. Required for `feature/*`. Null only with explicit user opt-out + `worktree_opt_out: true` |
44
+ | `worktree` | Local `feature/*` | Path under registry `worktreesRoot`/`<feature-slug>`. Required for **local** laptop feature work. Cloud / Cursor cloud agents work on a branch in their VM — the **PR** is the record; do not also write files in se-core-product. |
45
45
 
46
46
  **Default mode if unclear:** ask once. Site-specific UI/content → `site-first`. Package/framework/multi-site → `core-first`.
47
47
 
@@ -68,35 +68,22 @@ Integration branches (agents push feature branches here via PR or merge — **ne
68
68
 
69
69
  ---
70
70
 
71
- ## Step 2 — Write or update manifest
72
-
73
- Path in **se-core-product** (canonical ledger for cross-repo visibility):
74
-
75
- ```
76
- work/active/<feature>.yaml
77
- ```
78
-
79
- Copy from `manifest.template.yaml`, fill all fields, set `status: in_progress`, `started_at` to today (ISO date).
71
+ ## Step 2 — Ledger: PRs and worktrees (not yaml)
80
72
 
81
- If the user works only in a customer repo with no core checkout, still create/update the manifest in se-core-product when that repo is available; otherwise create `work/active/<feature>.yaml` in the customer repo and note `manifest_location: customer` in the file.
73
+ Customer-only work **must not** create or update files in `se-core-product`. Cross-machine and cloud work will not appear in a laptop `git worktree list`.
82
74
 
83
- **One feature = one manifest.** Do not append unrelated work to an existing manifest.
75
+ **What's in flight** (when the user asks, or before a tidy-up):
84
76
 
85
- ### Cross-site tracker (`work/tracker.yaml`)
77
+ 1. **Open PRs** targeting `dev` (core) or `develop` (customer) — `gh pr list --base <integration> --state open`. This includes Cursor cloud / other machines.
78
+ 2. **This machine:** `git fetch --prune` then `git worktree list` on the registry primary checkout.
86
79
 
87
- For work that spans repos (core npm rollouts, deployment gates, “bump on all sites”):
88
-
89
- 1. Add or update a `rollouts` entry in `work/tracker.yaml` when a `@se-studio/*` release needs customer adoption
90
- 2. Add `attention` items for human-only gates (blocked Vercel deploy, hosted MCP smoke, merge decisions)
91
- 3. Run `pnpm work:tracker` from se-core-product to refresh `work/TRACKER.md`
92
-
93
- Humans glance at **`work/TRACKER.md`** for the dashboard; agents edit `tracker.yaml` + manifests.
80
+ Do not invent a second ledger in git. Stale local trees vs merged PRs are a prune problem, not a yaml problem.
94
81
 
95
82
  ---
96
83
 
97
84
  ## Step 3 — Placement checklist (before non-trivial code)
98
85
 
99
- Run before implementing anything beyond a one-line fix. Record results in manifest `placement:`.
86
+ Run before implementing anything beyond a one-line fix. State the decision in chat (and in the PR body). **Do not** record it in se-core-product yaml.
100
87
 
101
88
  | Question | If yes → lean |
102
89
  |----------|----------------|
@@ -106,24 +93,35 @@ Run before implementing anything beyond a one-line fix. Record results in manife
106
93
  | Shared only within **one customer monorepo** (e.g. `@brightline/shared`)? | **customer-shared** |
107
94
  | Bug in published `@se-studio/*` behaviour? | **core** — never fork in customer |
108
95
 
109
- **Outcomes** — set `placement.decision`:
110
-
111
96
  | Decision | Action |
112
97
  |----------|--------|
113
98
  | `core` | Edit `se-core-product` only; changeset before push to `dev`; customer waits for npm |
114
- | `customer` | Edit customer repo only; do not touch core |
115
- | `customer-shared` | Edit customer's shared package; not `@se-studio/*` |
116
- | `defer-extract` | Implement in customer now; set `extract_to_core: pending` + `extract_rationale` |
99
+ | `customer` | Edit **that customer repo only**. Do not touch se-core-product (no docs, no skills, no `work/` files) |
100
+ | `customer-shared` | Edit that customer's shared package; not `@se-studio/*` |
101
+ | `defer-extract` | Implement in customer now **only** if the user explicitly approves in chat; PR must say what will move to which package |
102
+
103
+ **Site-first guard:** If the checklist says **core**, **stop**. Ask to switch to core-first. Do not implement shared behaviour in the customer repo.
104
+
105
+ **Core-first guard:** If the checklist says **customer**, implement in the customer repo only (read-only probe in core example apps if useful).
106
+
107
+ ### Shared work must not land in one customer
117
108
 
118
- **Site-first guard:** If checklist says `core` but mode is `site-first`, **stop** and ask whether to switch mode or record `defer-extract`.
109
+ These are **core** (or customer-shared inside one monorepo). Doing them only in OM1 / HSD / etc. isolates a fleet fix:
119
110
 
120
- **Core-first guard:** If checklist says `customer`, implement in customer repo (read-only probe in core example apps only if useful).
111
+ - Converters, link/media resolution, cache tags, sitemap Route Handler helpers
112
+ - `Visual` / video delivery, mute-loop, overscan, ImageKit/HLS behaviour
113
+ - cms-edit host/runtime, search webhooks, site-check / smoke assertion helpers
114
+ - Copying a `@se-studio/*` workaround into `src/` instead of a package fix
115
+
116
+ If you catch yourself duplicating package behaviour: **stop**, switch to core-first, changeset, then bump the customer after npm.
117
+
118
+ Reviews (PR + `CODE_REVIEW_PROMPT.md` on core; this checklist on customer PRs) must flag those smells. See [`refuse-customer-patches.md`](../../references/agent-session/refuse-customer-patches.md).
121
119
 
122
120
  ### Step 3b — Refuse customer patches (mandatory)
123
121
 
124
122
  After the placement checklist, run the **refusal table** when the task involves deploy smoke, `smoke.cases.json`, discovery routes, `server-config`, or “fix site-check / unblock Vercel.”
125
123
 
126
- **Reference:** [`packages/skills/references/agent-session/refuse-customer-patches.md`](../../references/agent-session/refuse-customer-patches.md)
124
+ **Reference:** [`refuse-customer-patches.md`](../../references/agent-session/refuse-customer-patches.md)
127
125
 
128
126
  | If the fix would… | Agent must |
129
127
  |-------------------|------------|
@@ -132,21 +130,21 @@ After the placement checklist, run the **refusal table** when the task involves
132
130
  | Change `route-build-policy.json` only to hide a new `ƒ` CMS route | **Refuse** — fix dynamic usage (Biome / layout) |
133
131
  | Add curated URLs or site-only probe cases | **Allow** — placement `customer`; follow smoke-test skill |
134
132
 
135
- **Deploy / live smoke failed?** Follow [`smoke-deploy-failure-playbook.md`](../../references/agent-session/smoke-deploy-failure-playbook.md) — classify failure → core vs customer → `blocked_on` if waiting on npm. Emergency: `SMOKE_TEST_IGNORE` or human Deployment Check approval — **not** permanent site hacks.
136
-
137
- **Manifest gate:** Before committing customer changes to smoke config, discovery routes, or `server-config` for deploy-smoke goals, record `placement.decision` in `work/active/<feature>.yaml`. If `core`, do not commit customer workaround.
133
+ **Deploy / live smoke failed?** Follow [`smoke-deploy-failure-playbook.md`](../../references/agent-session/smoke-deploy-failure-playbook.md) — classify failure → core vs customer. Emergency: `SMOKE_TEST_IGNORE` or human Deployment Check approval — **not** permanent site hacks.
138
134
 
139
- **`defer-extract`:** Only when the user explicitly approves in chat. Set `extract_to_core: pending` + rationale; add tracker rollout if multi-site.
135
+ **Smoke/server-config commits:** If the goal is “fix deploy smoke” and placement is `core`, **do not commit** a customer workaround. If `customer`, confirm in chat that it is URL curation only. If `defer-extract`, the user must confirm the extraction plan in chat.
140
136
 
141
137
  ---
142
138
 
143
- ## Step 4 — Git isolation (worktrees required)
139
+ ## Step 4 — Git isolation
144
140
 
145
- **Required for all projects:** any work on a `feature/*` branch must run in a **git worktree**, not the primary `dev` / `develop` checkout. This applies to se-core-product and every customer site in the registry.
141
+ **Local laptop:** any work on a `feature/*` branch must run in a **git worktree**, not the primary `dev` / `develop` checkout. This applies to se-core-product and every customer site in the registry.
146
142
 
147
- Primary checkouts (`path` / develop / dev) stay on the integration branch for fetch, deps, and short integration-only maintenance. Feature implementation always uses `worktreesRoot`.
143
+ **Cloud / remote agents:** they already have an isolated checkout. Open a **draft PR** to the integration branch so other machines can see the work. Do not require a yaml file in se-core-product. Do not implement on a registry `productionPath`.
148
144
 
149
- ### Create worktree (mandatory for feature/*)
145
+ Primary checkouts (`path` / develop / dev) stay on the integration branch for fetch, deps, and short integration-only maintenance.
146
+
147
+ ### Create worktree (mandatory for local feature/*)
150
148
 
151
149
  ```bash
152
150
  cd <primary_repo> # registry path — develop/dev checkout
@@ -171,7 +169,7 @@ cd <worktreesRoot>/<feature-slug>
171
169
  | `hsd` | `~/source/customers/hopskipdrive/worktrees` |
172
170
  | `highlander` | `~/source/customers/highlander/worktrees` |
173
171
 
174
- **Manifest gate:** set `worktree:` to the worktree path before coding. Do all edits, installs, tests, and commits from that path. Do not leave the primary checkout on a feature branch.
172
+ Do all local edits, installs, tests, and commits from that path. Do not leave the primary checkout on a feature branch.
175
173
 
176
174
  ### Portless URLs in worktrees
177
175
 
@@ -181,24 +179,16 @@ Portless prefixes the hostname with the **last segment of the branch name**. `fe
181
179
 
182
180
  Without the OS service, agents may get `https://<name>.localhost:1355` from an ad-hoc proxy — do not hardcode `:1355` in docs or cms-edit `devBaseUrl`.
183
181
 
184
- ### Gate — refuse primary-checkout feature work
182
+ ### Gate — refuse primary-checkout feature work (local)
185
183
 
186
- If you are about to implement a feature and `worktree` is null without `worktree_opt_out: true`:
184
+ If you are about to implement a feature locally and you are on the primary develop/dev checkout:
187
185
 
188
186
  1. **Stop** — create the worktree (or ask the user to confirm opt-out)
189
187
  2. Do not edit product code on the primary develop/dev checkout for a feature branch
190
188
 
191
189
  ### Opt-out (narrow)
192
190
 
193
- Only when the user **explicitly** says work in place / no worktree **in the current conversation**:
194
-
195
- ```bash
196
- cd <primary_repo>
197
- git fetch origin
198
- git checkout -b <branch> origin/<integration-branch>
199
- ```
200
-
201
- Set `worktree: null` and `worktree_opt_out: true` in the manifest. Do not invent an opt-out.
191
+ Only when the user **explicitly** says work in place / no worktree **in the current conversation**. Do not invent an opt-out.
202
192
 
203
193
  ### CMS parallel sessions
204
194
 
@@ -209,8 +199,6 @@ When editing Contentful in parallel on the same space, use distinct cms-edit ses
209
199
  # or CONTENTFUL_CMS_SESSION=<feature-slug>
210
200
  ```
211
201
 
212
- Record `cms_session: <feature-slug>` in manifest when doing CMS work.
213
-
214
202
  ---
215
203
 
216
204
  ## Step 5 — Work execution rules
@@ -243,9 +231,9 @@ Record `cms_session: <feature-slug>` in manifest when doing CMS work.
243
231
 
244
232
  **Related skills:** `site-workflows-figma-design-snapshot` / `site-workflows-apply-design-snapshot` for token sync; Figma MCP `get_design_context` for node-level implementation.
245
233
 
246
- ### Blocked work
234
+ ### Blocked on npm
247
235
 
248
- If manifest has `blocked_on: "@se-studio/foo@1.2.3"`, do not push customer `develop` until npm publish is confirmed. Update manifest when unblocked.
236
+ If customer work needs an unpublished `@se-studio/<pkg>@<version>`, do not push customer `develop` until npm publish is confirmed. Say that in the PR, not in a core yaml file.
249
237
 
250
238
  ---
251
239
 
@@ -258,8 +246,6 @@ Minimum per repo type (see registry `validate` for full command):
258
246
  | se-core-product | `pnpm validate` or targeted `pnpm type-check` + tests |
259
247
  | Customer | registry `validate` field |
260
248
 
261
- Record commands run in manifest `validation:` before push.
262
-
263
249
  ---
264
250
 
265
251
  ## Step 7 — Push and PR policy
@@ -272,13 +258,13 @@ Agents may push to:
272
258
 
273
259
  Agents must **never** push **se-core-product** `main`. Agents must **never** ship from a registry `productionPath` (e.g. HSD `~/source/customers/hopskipdrive/production-hsd-website`). Opening a production PR is not a merge.
274
260
 
275
- **Preferred:** open a **draft PR** targeting the integration branch:
261
+ **Preferred:** open a **draft PR** targeting the integration branch (this is how cloud + other laptops see the work):
276
262
 
277
263
  ```bash
278
264
  gh pr create --base <integration-branch> --head <branch> --draft --title "<feature>: <summary>"
279
265
  ```
280
266
 
281
- If `gh` is unavailable or user prefers direct push, push `feature/*` and note in handoff.
267
+ If `gh` is unavailable or user prefers direct push, push `feature/*` and note the remote URL in handoff.
282
268
 
283
269
  ---
284
270
 
@@ -286,9 +272,7 @@ If `gh` is unavailable or user prefers direct push, push `feature/*` and note in
286
272
 
287
273
  When **marketing** work is ready for production, **stop** and hand off. Do **not** merge `develop` → production unless [`production-merge.md`](../../references/agent-session/production-merge.md) passed in this conversation (ask + restatement + second yes). One customer repo at a time. cms-edit host extra gate: [`cms-edit-prod-merge.md`](../../references/agent-session/cms-edit-prod-merge.md).
288
274
 
289
- 1. Set manifest `status: ready_for_review`
290
- 2. Deliver handoff using template below
291
- 3. If core release was part of the work, list published package versions needed for customer bump
275
+ Deliver handoff using the template below. If a core release was part of the work, list published package versions needed for the customer bump.
292
276
 
293
277
  ### Handoff template
294
278
 
@@ -296,7 +280,7 @@ When **marketing** work is ready for production, **stop** and hand off. Do **not
296
280
  ## Handoff: <feature>
297
281
 
298
282
  **Mode:** <core-first | site-first>
299
- **Manifest:** work/active/<feature>.yaml
283
+ **PRs:** <links>
300
284
 
301
285
  ### Repos and branches
302
286
  - <repo>: `<branch>` → merge to `<integration-branch>`
@@ -324,13 +308,10 @@ Do not merge until the human asks **and** confirms (`production-merge.md`). Not
324
308
 
325
309
  ## Step 9 — Complete or park
326
310
 
327
- | Outcome | Manifest update |
328
- |---------|-----------------|
329
- | Merged / done | Move to `work/completed/<feature>.yaml` or delete from `work/active/` |
330
- | Blocked | `status: blocked`, set `blocked_on` |
331
- | Parked | `status: parked`, add `parked_reason` |
332
-
333
- Remove worktree when done:
311
+ | Outcome | Action |
312
+ |---------|--------|
313
+ | Merged / done | Remove the **local** worktree if you created one; the PR close is the record |
314
+ | Parked | Leave the branch + draft PR; say why in chat |
334
315
 
335
316
  ```bash
336
317
  git worktree remove <worktree-path>
@@ -350,7 +331,7 @@ Feature: hero-redesign
350
331
  Branch: feature/om1/hero-redesign
351
332
  ```
352
333
 
353
- Agent must load this skill, write manifest (with `worktree` path), run placement checklist, create the worktree, then proceed.
334
+ Agent must load this skill, run placement checklist, create a **local** worktree (or use the cloud checkout), then proceed. **Do not** write `work/active/*.yaml`.
354
335
 
355
336
  ---
356
337
 
@@ -360,7 +341,7 @@ Agent must load this skill, write manifest (with `worktree` path), run placement
360
341
  |-----|-------------|-------------------------|------|
361
342
  | `se-core-product` | `dev` | `main` | core monorepo |
362
343
  | `se2026` | `develop` | `main` | customer |
363
- | `brightline` | `develop` | `main` | customer monorepo |
344
+ | `brightline` | `develop` | `main` | customer |
364
345
  | `om1` | `develop` | `main` | customer |
365
346
  | `pointme` | `develop` | `main` | customer |
366
347
  | `pedestal` | `develop` | `main` | customer monorepo |
@@ -55,7 +55,7 @@ Run that locally **before push** whenever `package.json`, lockfile, or overrides
55
55
 
56
56
  User may name a key (`update deps in om1`) or ask to run through all projects sequentially.
57
57
 
58
- **HSD:** Agents update **only** `~/source/customers/hopskipdrive/develop-hsd-website` on `develop`. Production is human-only: branch `production`, checkout `~/source/customers/hopskipdrive/production-hsd-website` — never push or promote from there. Prefer targeted `@se-studio/*` bumps per `work/tracker.yaml` rollout before full `pnpm update -r --latest`.
58
+ **HSD:** Agents update **only** `~/source/customers/hopskipdrive/develop-hsd-website` on `develop`. Production is human-only: branch `production`, checkout `~/source/customers/hopskipdrive/production-hsd-website` — never push or promote from there. Prefer targeted `@se-studio/*` bumps from the core release PR before full `pnpm update -r --latest`.
59
59
 
60
60
  ---
61
61
 
@@ -154,7 +154,7 @@ When work depends on a new `@se-studio/*` npm release: release from `se-core-pro
154
154
 
155
155
  ### Parallel features
156
156
 
157
- One feature = one `feature/<scope>/<slug>` branch. **Git worktree required** for feature work (registry `worktreesRoot`/`<feature-slug>`). CMS: `--session <feature-slug>`. Manifest: `~/source/se/se-core-product/work/active/<feature>.yaml` with `worktree:` set.
157
+ One feature = one `feature/<scope>/<slug>` branch. **Local git worktree** for feature work (registry `worktreesRoot`/`<feature-slug>`). Cloud: draft PR. CMS: `--session <feature-slug>`. Do not write `work/active` yaml in se-core-product for this customer.
158
158
 
159
159
  ### Production handoff
160
160
 
@@ -1,37 +0,0 @@
1
- # Copy to work/active/<feature>.yaml — one file per in-flight feature.
2
- # Canonical location: se-core-product/work/active/ (cross-repo visibility).
3
-
4
- feature: my-feature-slug
5
- mode: site-first # core-first | site-first
6
- project_key: om1
7
- primary_repo: ~/source/customers/om1/om1-website
8
- branch: feature/om1/my-feature-slug
9
- # REQUIRED for feature/* work — path under registry worktreesRoot (e.g. ~/source/customers/om1/worktrees/my-feature-slug).
10
- # null only when user explicitly opts out of worktrees in this conversation (record worktree_opt_out: true).
11
- worktree: ~/source/customers/om1/worktrees/my-feature-slug
12
- worktree_opt_out: false
13
- integration_branch: develop
14
-
15
- related_repos:
16
- - repo: se-core-product
17
- path: ~/source/se/se-core-product
18
- role: read-only # read-only | pending-extract | active
19
-
20
- placement:
21
- decision: customer # core | customer | customer-shared | defer-extract
22
- rationale: One-site hero layout tied to OM1 Figma
23
- extract_to_core: null # pending | null
24
- extract_rationale: null
25
- # Required before smoke/server-config commits for deploy-smoke goals (agent-session Step 3b):
26
- # smoke_edit: null # curated-urls | blocked-on-core | defer-extract
27
-
28
- blocked_on: null # e.g. "@se-studio/core-ui@2.1.0"
29
- cms_session: null # set to feature slug when doing parallel CMS edits
30
-
31
- status: in_progress # in_progress | blocked | parked | ready_for_review
32
- started_at: 2026-07-05
33
- updated_at: 2026-07-05
34
-
35
- validation: []
36
-
37
- handoff: null