@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 +12 -0
- package/package.json +1 -1
- package/references/agent-session/customer-agents-block.md +6 -5
- package/references/agent-session/production-merge.md +1 -1
- package/references/agent-session/projects.registry.json +6 -5
- package/references/agent-session/refuse-customer-patches.md +12 -10
- package/references/agent-session/smoke-deploy-failure-playbook.md +6 -8
- package/references/deps-update/projects.registry.json +3 -2
- package/skills/contentful-cms-core/SKILL.md +22 -25
- package/skills/se-marketing-sites-handling-media/SKILL.md +1 -1
- package/skills/se-marketing-sites-lib-cms-structure/SKILL.md +1 -1
- package/skills/se-marketing-sites-smoke-test-setup/SKILL.md +3 -3
- package/skills/site-workflows-agent-session/SKILL.md +56 -75
- package/skills/site-workflows-deps-update/SKILL.md +1 -1
- package/skills/site-workflows-new-project/SKILL.md +1 -1
- package/references/agent-session/manifest.template.yaml +0 -37
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
|
@@ -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
|
-
|
|
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
|
-
- **
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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`
|
|
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
|
-
"
|
|
9
|
+
"requiredForLocalFeatureBranches": true,
|
|
10
10
|
"pathPattern": "<worktreesRoot>/<feature-slug>",
|
|
11
|
-
"notes": "
|
|
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": "
|
|
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": "
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
33
|
-
2.
|
|
34
|
-
3.
|
|
35
|
-
4. **Do not**
|
|
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
|
-
##
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|
|
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
|
|
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": "
|
|
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
|
|
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.
|
|
16
|
+
`cms-edit` lets you read and edit Contentful draft content without publishing.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
161
|
+
For multi-paragraph Markdown, pass `--content` or `--base64` on MCP (no stdin, no `--file`):
|
|
163
162
|
|
|
164
|
-
```
|
|
165
|
-
|
|
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
|
|
676
|
+
Run a sequence of operations from `--json` or `--json-base64` (hosted MCP).
|
|
683
677
|
|
|
684
|
-
```
|
|
685
|
-
|
|
686
|
-
|
|
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
|
|
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**:
|
|
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,
|
|
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`,
|
|
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()
|
|
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
|
-
|
|
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
|
|
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` |
|
|
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 —
|
|
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
|
-
|
|
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
|
-
**
|
|
75
|
+
**What's in flight** (when the user asks, or before a tidy-up):
|
|
84
76
|
|
|
85
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
115
|
-
| `customer-shared` | Edit customer's shared package; not `@se-studio/*` |
|
|
116
|
-
| `defer-extract` | Implement in customer now;
|
|
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
|
-
**
|
|
109
|
+
These are **core** (or customer-shared inside one monorepo). Doing them only in OM1 / HSD / etc. isolates a fleet fix:
|
|
119
110
|
|
|
120
|
-
|
|
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:** [`
|
|
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
|
|
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
|
-
|
|
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
|
|
139
|
+
## Step 4 — Git isolation
|
|
144
140
|
|
|
145
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
234
|
+
### Blocked on npm
|
|
247
235
|
|
|
248
|
-
If
|
|
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
|
-
|
|
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
|
-
**
|
|
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 |
|
|
328
|
-
|
|
329
|
-
| Merged / done |
|
|
330
|
-
|
|
|
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,
|
|
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
|
|
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` | `
|
|
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
|
|
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. **
|
|
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
|