@se-studio/skills 1.7.8 → 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,17 @@
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
+
9
+ ## 1.7.9
10
+
11
+ ### Patch Changes
12
+
13
+ - Stop applying 2px video overscan by default (`edgeOverscan` opt-in). Remove ImageKit/HLS. CMS local files are mute-loop packs only (click-to-play is YouTube/Vimeo). Raise mute-loop max duration to 2 minutes. Drop `videoPrefix`.
14
+
3
15
  ## 1.7.8
4
16
 
5
17
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/skills",
3
- "version": "1.7.8",
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
 
@@ -12,7 +12,7 @@ Canonical skill: `site-workflows-agent-session`. Customer `AGENTS.md` copies the
12
12
 
13
13
  | Repo | Integration | Production (Git-connected Vercel) |
14
14
  |------|-------------|-----------------------------------|
15
- | Customer marketing sites | `develop` (or registry override, e.g. Highlander `port-2026`) | usually `main` |
15
+ | Customer marketing sites | `develop` | usually `main` |
16
16
  | HopSkipDrive | `develop` | **`production`** |
17
17
 
18
18
  Never ship from a registry `productionPath` checkout. Merge with `gh` from the **develop** checkout.
@@ -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": [
@@ -107,12 +107,13 @@
107
107
  "displayName": "Highlander Health",
108
108
  "path": "~/source/customers/highlander/highlander-health-website-2026",
109
109
  "worktreesRoot": "~/source/customers/highlander/worktrees",
110
- "branch": "port-2026",
110
+ "branch": "develop",
111
+ "productionBranch": "main",
111
112
  "type": "customer",
112
113
  "contentfulSpaceId": "bkkox68g99rn",
113
114
  "hostedMcp": "cms-edit-highlander",
114
115
  "validate": "pnpm check && pnpm type-check && pnpm validate:routes",
115
- "notes": "New 2026 stack. Integration branch is port-2026 until go-live, then develop/main. Live Bond/Netlify site remains highlander-health-website. cms-edit DNS/OAuth for highlander.content.se.studio is a human gate."
116
+ "notes": "2026 stack is live on Vercel (develop preview, main production alias). Public DNS is still Bond/Netlify highlanderhealth.com until cutover. cms-edit DNS/OAuth for highlander.content.se.studio is a human gate."
116
117
  }
117
118
  ]
118
119
  }
@@ -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
@@ -83,11 +83,12 @@
83
83
  "key": "highlander",
84
84
  "displayName": "Highlander Health",
85
85
  "path": "~/source/customers/highlander/highlander-health-website-2026",
86
- "branch": "port-2026",
86
+ "branch": "develop",
87
+ "productionBranch": "main",
87
88
  "validate": "pnpm check && pnpm type-check && pnpm validate:routes",
88
89
  "workspace": true,
89
90
  "hasPinOverrides": false,
90
- "notes": "2026 port. Integration branch port-2026 until live; then develop/main."
91
+ "notes": "2026 stack. Integration develop; Vercel production tracks main. Public DNS still Bond/Netlify until cutover."
91
92
  }
92
93
  ]
93
94
  }
@@ -13,14 +13,13 @@ Use this skill when you need to read or edit content in Contentful using **hoste
13
13
 
14
14
  ## Overview
15
15
 
16
- `cms-edit` lets you read and edit Contentful draft content without publishing. It uses a **snapshot → ref → edit → save** workflow:
16
+ `cms-edit` lets you read and edit Contentful draft content without publishing.
17
17
 
18
- 1. `open` a page to load the content tree into a session
19
- 2. `snapshot` to see the tree with `@ref` labels
20
- 3. `read` an entry to inspect its fields
21
- 4. `set` / `rtf` to modify fields
22
- 5. `diff` to review changes
23
- 6. `save` to write drafts to Contentful (NEVER publishes)
18
+ **New page/article:** `schema` for this space → `create from-json --dry-run --strict` → `create from-json` (`--json` or `--json-base64`). Nested tree key is `components`; discriminator is `type`.
19
+
20
+ **Edit a tree:** `open` → `export from-json` → edit JSON → `apply from-json`. Tiny patches: `set` / `rtf` / `add` then `diff` → `save`.
21
+
22
+ **Never publish.** Hosted MCP cannot see your disk — send JSON in the tool call.
24
23
 
25
24
  ## Safety Rules
26
25
 
@@ -159,15 +158,10 @@ Markdown support:
159
158
  - `` `inline code` ``
160
159
  - `---` for horizontal rule
161
160
 
162
- For any content with multiple paragraphs or newlines, use `printf` piped to stdin — `\n` in a double-quoted shell string is **not** interpreted as a newline by bash:
161
+ For multi-paragraph Markdown, pass `--content` or `--base64` on MCP (no stdin, no `--file`):
163
162
 
164
- ```bash
165
- # Correct — printf interprets \n properly
166
- printf '## Why it matters\n\nOur platform helps teams **move faster**.\n\n- Instant setup\n- No code required\n' | cms-edit rtf @c1 body --markdown -
167
-
168
- # Also correct — file input
169
- cms-edit rtf @c1 body --markdown --content "# Heading\n\nBody."
170
- cms-edit rtf @c1 body --markdown - < path/to/file.md
163
+ ```
164
+ cms_edit ["rtf", "@c1", "body", "--content", "## Why it matters\n\nOur platform helps teams **move faster**."]
171
165
  ```
172
166
 
173
167
  Single-line content (no newlines) can be passed as a quoted argument directly:
@@ -679,12 +673,11 @@ cms-edit peek --id <entryId> # Look up by entry ID
679
673
 
680
674
  ## Batch Operations (batch run)
681
675
 
682
- Run a sequence of operations from a JSON file or stdin.
676
+ Run a sequence of operations from `--json` or `--json-base64` (hosted MCP).
683
677
 
684
- ```bash
685
- cms-edit batch run --json '[...]' # Run batch ops from inline JSON
686
- echo '[...]' | cms-edit batch run # Pipe from stdin
687
- cms-edit batch run --json '[...]' --dry-run # Validate without saving
678
+ ```
679
+ cms_edit ["batch", "run", "--json", "[...]"]
680
+ cms_edit ["batch", "run", "--json-base64", "<b64>", "--dry-run"]
688
681
  ```
689
682
 
690
683
  Supported ops: `open`, `set`, `rtf`, `rtf-replace`, `save`, `add`, `links-add`.
@@ -715,13 +708,17 @@ Example `ops.json` — update an existing page with a new CTA that has two butto
715
708
 
716
709
  ## Create Page or Article from JSON
717
710
 
718
- Create a complete page or article — including all components, fields, and CTA links — from a single declarative JSON file. This is the recommended approach for creating multiple pages or articles in bulk.
711
+ Create a complete page or article from `--json` or `--json-base64`. Dry-run is local (no CMA) once the index is warm.
719
712
 
720
- ```bash
721
- cms-edit create from-json --json '{...}' # Create from inline JSON
722
- cms-edit create from-json --json '{...}' --dry-run # Preview without writing
723
- cat page.json | cms-edit create from-json # Pipe from stdin
724
713
  ```
714
+ cms_edit ["help", "create-from-json"]
715
+ cms_edit ["create", "from-json", "--json", "{...}", "--dry-run", "--strict"]
716
+ cms_edit ["create", "from-json", "--json-base64", "<b64>"]
717
+ cms_edit ["export", "from-json"]
718
+ cms_edit ["apply", "from-json", "--json-base64", "<b64>"]
719
+ ```
720
+
721
+ Use `"components"` not `"content"`. Nested discriminator is `"type"` not `"componentType"`. Empty `components` fails. `schema <contentType>` for this space’s field ids.
725
722
 
726
723
  **Page JSON schema:**
727
724
 
@@ -165,7 +165,7 @@ Pass `componentLabel` (usually `cmsLabel`) and `analyticsContext` to enable clic
165
165
  The `IResponsiveVisual` type (from `@se-studio/core-data-types`) supports:
166
166
 
167
167
  1. **Image**: Standard Contentful image asset.
168
- 2. **Video**: Hosted video file (mp4/webm). The component handles `<video>` tag rendering with autoplay/loop/muted attributes suitable for background videos.
168
+ 2. **Video**: Mute autoplay-loop local files via the hero pipeline (`HERO_VIDEO_*`, R2 / `video.se.studio`). Click-to-play is YouTube or Vimeo — do not play Contentful MP4s. Cover/fill does not overscan unless you pass `edgeOverscan` (parent must clip; `HeroLoopVideo` does not self-clip). Mute-loops may be up to 2 minutes.
169
169
  3. **Animation**: Lottie motion file. Player is chosen by **file extension**:
170
170
  * **`.json`** (or `application/json`) → `@lottiefiles/lottie-player` (classic Lottie).
171
171
  * **`.lottie`** → `@lottiefiles/dotlottie-react` (ThorVG / WASM). Wrong extension ⇒ wrong player.
@@ -14,7 +14,7 @@ Reference app: **example-empty** (this monorepo). Customer implementations: see
14
14
  | `cms.ts` | Yes | Types, buildComponentRecord / buildCollectionRecord / buildExternalRecord (array → Record), then build*Maps from those Records, createConverterContext |
15
15
  | `cms-server.ts` | No (server-only) | createAppHelpers, buildOptions, getContentfulConfig, projectRendererConfig |
16
16
  | `config.ts` | Yes | isProduction, isDevelopment |
17
- | `server-config.ts` | No | draftOnly, videoPrefix, baseUrl, revalidationSecret |
17
+ | `server-config.ts` | No | draftOnly, baseUrl, revalidationSecret |
18
18
  | `constants.ts` | Yes | ARTICLES_BASE, TAGS_BASE, PEOPLE_BASE, enable flags, customer name |
19
19
  | `registrations.ts` | Yes | componentRegistrationsList, collectionRegistrationsList, externalComponentRegistrationsList (arrays) |
20
20
  | `SizingInformation.ts` | Yes | getSizingInformation for dynamic heading sizes |
@@ -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,11 +341,11 @@ 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 |
367
348
  | `hsd` | `develop` (`develop-hsd-website`) | `production` (`production-hsd-website`) | customer |
368
- | `highlander` | `port-2026` until live, then `develop` | `main` after cutover | customer |
349
+ | `highlander` | `develop` | `main` | customer |
369
350
 
370
351
  Full paths (`path`, `worktreesRoot`, `productionPath`), MCP keys: `projects.registry.json`.
@@ -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