@se-studio/skills 1.5.11 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @se-studio/skills
2
2
 
3
+ ## 1.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add source readiness review as a core editor task, wire create-from-document / create-article / preview-verify to faithful package intake (no copy rewrite), and ship SOURCE-READINESS plus multi-site input examples for playbook authors.
8
+
3
9
  ## 1.5.11
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.5.11",
3
+ "version": "1.6.0",
4
4
  "description": "SE Studio agent skills for marketing site development with Contentful CMS",
5
5
  "repository": {
6
6
  "type": "git",
@@ -73,7 +73,8 @@
73
73
  "path": "~/source/customers/hopskipdrive/hsd-extended-port",
74
74
  "branch": "extended-port",
75
75
  "type": "customer",
76
- "wip": true,
76
+ "contentfulSpaceIds": ["gqa3p93n5wse"],
77
+ "hostedMcp": ["cms-edit-hsd"],
77
78
  "validate": "pnpm validate"
78
79
  }
79
80
  ]
@@ -122,15 +122,36 @@ Fetch live markdown when `website.markdownAccess` is enabled: `https://<prod><pa
122
122
 
123
123
  - `people.md` — `enablePerson=false`; clinicians covered by `provider-pages.md` on Brightline
124
124
 
125
+ ## Article create pipeline (all sites)
126
+
127
+ When agents build articles or long pages from an **external package** (doc, Drive, Figma, zip):
128
+
129
+ ```text
130
+ task-source-readiness-review → soft-proof + light human yes
131
+ → task-create-from-document / task-create-article
132
+ → task-preview-verify (multi-block QA when relevant)
133
+ ```
134
+
135
+ **Core principles** (also in `SOURCE-READINESS.md`):
136
+
137
+ 1. **No copy rewrite** — faithful structure only
138
+ 2. **Source sequence** beats CMS convenience
139
+ 3. **Do not invent pair/side-by-side layouts** unless the source is a true pair
140
+ 4. **Placeholders** for missing art (GO-WITH-GAPS) rather than silent reordering
141
+ 5. **Merge continuous prose** — avoid body-only section spam
142
+
143
+ Site `articles.md` must name **this site’s** body components. Do not paste SE multi-block / Case study rich text stacks onto brands that use a single Article rich text body.
144
+
125
145
  ## Other playbook types
126
146
 
127
147
  | File | When |
128
148
  |------|------|
129
- | `articles.md` / `ARTICLES.md` | Article types, tag rules, featuredImage vs visuals |
149
+ | `articles.md` / `ARTICLES.md` | Article types, tag rules, featuredImage vs visuals, readiness pointer |
130
150
  | `people.md` | `enablePerson=true` — team profiles, author import |
131
151
  | `blog-tag-matrix.md` | Complex tag governance (Brightline) |
132
152
  | `site-facts.json` | Canonical support email, phone — becomes `site-facts` resource |
133
153
  | `tasks/*.md` only | Overrides for core tasks (e.g. `import-blog-tag-matrix`) |
154
+ | `case-study-from-package.md` (SE) | Optional specialized multi-block package playbook + hosted example |
134
155
 
135
156
  ## Generator behaviour
136
157
 
@@ -178,12 +178,14 @@ Skill: **`contentful-cms-create-editor-playbooks`**
178
178
  | Action | Rationale |
179
179
  |--------|-----------|
180
180
  | **Tighten** existing `pages.md` | Ensure reference table, component mapping, and out-of-scope are current |
181
- | **Tighten** `articles.md` | Work / video / blog rules, case study picks in **Article browser** collections |
181
+ | **Tighten** `articles.md` | Work / video / blog rules; **multi-block Case study / Blog rich text**; **source readiness** + faithful sequence (demote inventing Separated pairs); lab ports |
182
+ | **Add** `case-study-from-package.md` + task stub | Hosted soft-proof example + package intake for work multi-block |
182
183
  | **Avoid** many specialized page playbooks | No `/providers/`-style families |
183
- | Optional `work-case-study-pages.md` | If editors frequently add case studies |
184
184
  | Optional `demo-landing-pages.md` | Campaign clones from `/demo-landing` |
185
185
  | **Do not** add `people.md` | Use articles + Team grid Person guidance inside `pages.md` |
186
186
 
187
+ See also: `SOURCE-READINESS.md` and `examples/se-case-study-*.md` in this references folder.
188
+
187
189
  ### SE website editor guardrails (put in `pages.md`)
188
190
 
189
191
  - New marketing pages: clone `/about`, `/services`, or `/demo-landing` — not blank canvas
@@ -196,6 +198,10 @@ Skill: **`contentful-cms-create-editor-playbooks`**
196
198
 
197
199
  ---
198
200
 
201
+ ## PointMe note
202
+
203
+ When `docs/cms-editor/pointme/` is created, add the shared **source readiness + faithful structure** paragraph to `articles.md` (see other sites’ light-touch pattern). No SE multi-block stacks.
204
+
199
205
  ## Per-project audit checklist
200
206
 
201
207
  Copy into working notes for each site:
@@ -209,8 +215,9 @@ Copy into working notes for each site:
209
215
  [ ] capabilities.json reviewed
210
216
  [ ] P0 playbook list approved by user
211
217
  [ ] pages.md hub links all specialized playbooks
218
+ [ ] articles.md points at task-source-readiness-review (faithful structure, no copy rewrite)
212
219
  [ ] task stub per specialized playbook
213
- [ ] editor-pack regenerated
220
+ [ ] editor-pack regenerated (after @se-studio/contentful-cms bump when new core tasks)
214
221
  [ ] project doctor clean
215
222
  [ ] pushed to develop
216
223
  ```
@@ -0,0 +1,96 @@
1
+ # Source readiness review (generic)
2
+
3
+ Canonical agent guidance for **package intake before CMS create**. Hosted MCP surfaces the short task as `cms-edit://customer/task-source-readiness-review` (from `@se-studio/contentful-cms` editor-tasks). This file is the fuller reference for playbook authors and coding agents.
4
+
5
+ ## Pipeline
6
+
7
+ ```text
8
+ Intake → inventory → beat sheet → verdict → soft-proof → light human yes → create → preview QA
9
+ ```
10
+
11
+ Never skip readiness for non-trivial external packages (Drive, Figma, multi-file zip, long brief).
12
+
13
+ ## Non-negotiables
14
+
15
+ | Rule | Meaning |
16
+ |------|---------|
17
+ | **No copy rewrite** | cms-edit structures and places source text only |
18
+ | **Sequence from design/source** | Do not invent order |
19
+ | **No invented pairs** | Side-by-side collections only when the source is a true pair |
20
+ | **Placeholders beat reordering** | Keep missing slots labeled |
21
+ | **Merge continuous prose** | Don’t split body-only blocks without a layout break |
22
+ | **Light human yes** | Accept “yes” / “go” / “proceed” |
23
+
24
+ ## Verdict threshold
25
+
26
+ ### NO-GO (any one)
27
+
28
+ - Sequence unknown
29
+ - Narrative incomplete for the content type
30
+ - Building would invent structure (pairs, titles, order)
31
+ - Conflicting sources with no owner decision
32
+
33
+ ### GO-WITH-GAPS
34
+
35
+ - Sequence clear + narrative usable as written
36
+ - Missing art **≤ 3** slots **or** **≤ ~25%** of visual beats, each named with placeholder strategy
37
+
38
+ ### GO
39
+
40
+ - GO-WITH-GAPS plus art complete for the soft-proof (or explicit CMS asset reuse)
41
+
42
+ ## Artifact templates
43
+
44
+ ### Inventory
45
+
46
+ | # | Role | Source file / ref | Status | CMS mapping |
47
+ |---|------|-------------------|--------|-------------|
48
+ | 1 | Hero | `hero.jpg` | ready | article `featuredImage` |
49
+ | 2 | Product UI | — | missing | body visual + placeholder label |
50
+
51
+ ### Beat sheet
52
+
53
+ | Order | Beat | Source | Block type | Notes |
54
+ |-------|------|--------|------------|-------|
55
+ | 1 | Open | Doc §1 | Body RTF | merge paras |
56
+ | 2 | Product | `ui.png` | Body + visual | width per playbook |
57
+
58
+ ### Soft-proof (human yes)
59
+
60
+ ```text
61
+ Verdict: GO-WITH-GAPS
62
+ Gaps: #3 left pair art missing → labeled placeholder
63
+ 1. …
64
+ 2. …
65
+ Copy: unchanged from source
66
+ ```
67
+
68
+ ## Site playbooks
69
+
70
+ When authoring `docs/cms-editor/<projectKey>/articles.md`:
71
+
72
+ 1. Point create-from-package flows at `task-source-readiness-review`
73
+ 2. State **faithful structure only**
74
+ 3. Describe **this site’s** body components (do not paste SE multi-block stacks onto other brands)
75
+ 4. Optionally link or embed one condensed example (hosted MCP cannot read skills package paths)
76
+
77
+ ## Worked examples
78
+
79
+ See `examples/` in this folder:
80
+
81
+ | File | Flavour |
82
+ |------|---------|
83
+ | `se-case-study-om1-shaped.md` | SE multi-block work, GO-WITH-GAPS |
84
+ | `se-case-study-meet-makers-shaped.md` | SE simpler multi-block, GO |
85
+ | `om1-resource-case-study-shaped.md` | OM1 resource URL + single body RTF |
86
+ | `brightline-learning-hub-article-shaped.md` | Brightline learning hub |
87
+ | `pedestal-publication-shaped.md` | Pedestal publication |
88
+ | `headwater-news-shaped.md` | Headwater news (GO vs thin NO-GO) |
89
+
90
+ ## Anti-patterns
91
+
92
+ - Defaulting every two images to a pair/side-by-side collection
93
+ - Rewriting client copy “for tone”
94
+ - Dropping missing art and renumbering
95
+ - One body block per paragraph with no visual between (gappy section shells on some sites)
96
+ - Building before soft-proof + yes on a multi-asset package
@@ -0,0 +1,48 @@
1
+ # Example — Brightline learning hub article (readiness + tags)
2
+
3
+ **Site:** Brightline · **Family:** learning hub / blog · **Verdict:** GO-WITH-GAPS
4
+
5
+ ## Scenario
6
+
7
+ > “Turn this clinical-education brief and 2 images into a learning hub article. Follow tag matrix rules.”
8
+
9
+ ## Sources
10
+
11
+ | Source | Notes |
12
+ |--------|--------|
13
+ | Editorial brief | Title + body sections |
14
+ | 2 images | Hero + inline |
15
+ | Tag guidance | blog-tag-matrix / site playbook |
16
+
17
+ ## Inventory
18
+
19
+ | # | Role | Status | Mapping |
20
+ |---|------|--------|---------|
21
+ | 1 | Hero | ready | featuredImage |
22
+ | 2 | Body | ready | Article body per Brightline ARTICLES playbook |
23
+ | 3 | Inline figure | **missing** | placeholder or omit only if human says skip |
24
+ | 4 | Tags | needs human | matrix-constrained |
25
+
26
+ ## Verdict
27
+
28
+ **GO-WITH-GAPS** if body + hero ready and only optional inline missing with a named plan; **NO-GO** if tags/topic cannot be chosen without inventing clinical categories.
29
+
30
+ ## Soft-proof
31
+
32
+ ```text
33
+ Verdict: GO-WITH-GAPS
34
+ 1. Hero + SEO fields from brief (no claim invention)
35
+ 2. Body RTF — source sections in order
36
+ 3. Inline image slot — placeholder or deferred
37
+ 4. Tags — proposed from matrix; human yes required
38
+ ```
39
+
40
+ ## What not to do
41
+
42
+ - Invent tags outside matrix
43
+ - Soften clinical language without human request
44
+ - Clone wrong template family
45
+
46
+ ## Copy policy
47
+
48
+ Faithful structure only; clinical tone left as provided.
@@ -0,0 +1,48 @@
1
+ # Example — Headwater news (GO vs thin NO-GO)
2
+
3
+ **Site:** Headwater Science · **Type:** news · **Verdicts:** GO or NO-GO
4
+
5
+ ## Scenario A — GO
6
+
7
+ > “Publish this press note: full short body (3 paras), date, logo/hero.”
8
+
9
+ ### Inventory
10
+
11
+ | # | Role | Status |
12
+ |---|------|--------|
13
+ | 1 | Headline + body | ready |
14
+ | 2 | Date | ready |
15
+ | 3 | Hero/logo | ready |
16
+
17
+ ### Soft-proof
18
+
19
+ ```text
20
+ Verdict: GO
21
+ 1. News article type + slug
22
+ 2. Title/date/description from source
23
+ 3. Body RTF — three paras as written
24
+ 4. featuredImage
25
+ ```
26
+
27
+ ## Scenario B — NO-GO
28
+
29
+ > “Make a news post from this one-line LinkedIn blurb and no assets.”
30
+
31
+ ### Why NO-GO
32
+
33
+ - Narrative incomplete (no usable body)
34
+ - No art and no permission to ship without
35
+ - Building would invent paragraphs
36
+
37
+ ### Agent response
38
+
39
+ Stop. List blockers. Do not invent body copy. Ask for full release text or explicit human-written draft.
40
+
41
+ ## What not to do
42
+
43
+ - Expand a one-liner into a fake press release
44
+ - Borrow SE case-study multi-block patterns
45
+
46
+ ## Copy policy
47
+
48
+ Only structure what was given.
@@ -0,0 +1,52 @@
1
+ # Example — OM1 resource case study (single body, readiness still applies)
2
+
3
+ **Site:** OM1 · **URL family:** `/resources/case-studies/{topic}/{slug}/` · **Verdict:** GO
4
+
5
+ OM1 does **not** use SE multi-block CSRT stacks. Body is typically **one Article rich text** (+ optional quote/callout). Readiness still runs so agents don’t invent structure or rewrite.
6
+
7
+ ## Scenario
8
+
9
+ > “Create a case study article from this approved PDF/narrative and hero image. Topic tag AI.”
10
+
11
+ ## Sources
12
+
13
+ | Source | Notes |
14
+ |--------|--------|
15
+ | Approved narrative PDF/doc | Full article copy |
16
+ | Hero landscape | featuredImage |
17
+ | Primary topic | `ai` (must match URL segment) |
18
+ | Clone ref | Existing case-studies article from playbook |
19
+
20
+ ## Inventory
21
+
22
+ | # | Role | Status | Mapping |
23
+ |---|------|--------|---------|
24
+ | 1 | Hero | ready | `featuredImage` |
25
+ | 2 | Body | ready | Article rich text (single) |
26
+ | 3 | Authors | ready | Person links |
27
+ | 4 | Primary tag | ready | drives `{topic}` |
28
+
29
+ ## Verdict
30
+
31
+ **GO** — narrative complete, hero present, topic decided. No multi-ART invent.
32
+
33
+ ## Soft-proof
34
+
35
+ ```text
36
+ Verdict: GO
37
+ 1. [template] Article hero fields from entry
38
+ 2. Article rich text — full body from doc (as written)
39
+ 3. Optional quote only if present in source
40
+ Slug/topic/type per resource-article-pages playbook
41
+ ```
42
+
43
+ ## What not to do
44
+
45
+ - Import SE “Case study rich text” multi-block pattern
46
+ - Invent Separated visuals
47
+ - Rewrite clinical claims
48
+ - Wrong primary tag (breaks URL)
49
+
50
+ ## Copy policy
51
+
52
+ Unchanged; structure into one body RTF (+ embeds only if source has them).
@@ -0,0 +1,50 @@
1
+ # Example — Pedestal publication (poster + download fields)
2
+
3
+ **Site:** Pedestal Health · **Type:** publications · **Verdict:** GO
4
+
5
+ ## Scenario
6
+
7
+ > “Add this publication: title, abstract, poster image, and PDF download.”
8
+
9
+ ## Sources
10
+
11
+ | Source | Notes |
12
+ |--------|--------|
13
+ | Title + abstract | From publisher brief |
14
+ | Poster image | Landscape/portrait per playbook |
15
+ | PDF file | Download asset |
16
+ | Clone ref | Recent publication from playbook |
17
+
18
+ ## Inventory
19
+
20
+ | # | Role | Status | Mapping |
21
+ |---|------|--------|---------|
22
+ | 1 | Listing/hero art | ready | featuredImage / poster field per playbook |
23
+ | 2 | Abstract | ready | summary / body fields as site defines |
24
+ | 3 | PDF | ready | download / media field |
25
+ | 4 | Tags/type | ready | publications type + routing |
26
+
27
+ ## Verdict
28
+
29
+ **GO** when PDF + poster + abstract present. **NO-GO** if PDF missing and playbook requires download (don’t fake a link).
30
+
31
+ ## Soft-proof
32
+
33
+ ```text
34
+ Verdict: GO
35
+ 1. Article type publications + slug
36
+ 2. Fields: title, date, description from abstract (no rewrite)
37
+ 3. Poster / featured image
38
+ 4. PDF asset linked
39
+ 5. Body only if playbook expects more than abstract
40
+ ```
41
+
42
+ ## What not to do
43
+
44
+ - Invent abstract from title alone
45
+ - Skip PDF and ship empty download
46
+ - Apply SE multi-block case-study layout
47
+
48
+ ## Copy policy
49
+
50
+ Abstract and titles as provided.
@@ -0,0 +1,51 @@
1
+ # Example — SE case study (Meet the Makers–shaped, GO)
2
+
3
+ **Site:** SE Studio · **Type:** work · **Verdict:** GO
4
+
5
+ Smaller multi-block set; good first lab target. Production public path pattern: `/work/{client}/{title-slug}/` (lab: `lab/…`).
6
+
7
+ ## Scenario
8
+
9
+ > “Port this simpler case study multi-block for lab. Faithful art order; don’t invent pairs.”
10
+
11
+ ## Sources
12
+
13
+ | Source | Notes |
14
+ |--------|--------|
15
+ | Ordered image list from human / Figma | Clear sequence |
16
+ | Short narrative | Intro, process, outcome |
17
+ | Existing assets in CMS or Drive | All present |
18
+
19
+ ## Inventory (excerpt)
20
+
21
+ | # | Role | Status | Mapping |
22
+ |---|------|--------|---------|
23
+ | 1 | Hero | ready | featuredImage |
24
+ | 2 | Intro copy | ready | CSRT body (merge) |
25
+ | 3 | Maker portraits sequence | ready | CSRT visuals or Visuals only if design is a grid |
26
+ | 4 | Closing copy | ready | CSRT body |
27
+
28
+ ## Verdict
29
+
30
+ **GO** — sequence known, art complete, copy usable as written.
31
+
32
+ ## Soft-proof
33
+
34
+ ```text
35
+ Verdict: GO
36
+ 1. Hero (template)
37
+ 2. CSRT body — intro
38
+ 3. CSRT visual / stacked media per design (not inventing Separated)
39
+ 4. CSRT body — close
40
+ Lab flags on
41
+ ```
42
+
43
+ ## What not to do
44
+
45
+ - Force Separated because “there are two portraits”
46
+ - Add section headings the source doesn’t have
47
+ - Touch production entry — always new lab draft
48
+
49
+ ## Copy policy
50
+
51
+ Unchanged from source.
@@ -0,0 +1,70 @@
1
+ # Example — SE case study from package (OM1-shaped, GO-WITH-GAPS)
2
+
3
+ **Site:** SE Studio (`se2026`) · **Type:** work case study · **Verdict used:** GO-WITH-GAPS
4
+
5
+ Synthetic package shaped like a real multi-block work port (Drive zip + Figma sequence + narrative). Names are illustrative.
6
+
7
+ ## Scenario
8
+
9
+ > “Build a lab case study from this Drive folder and the Figma OM1 frame. Keep copy as written.”
10
+
11
+ ## Sources provided
12
+
13
+ | Source | Notes |
14
+ |--------|--------|
15
+ | Figma frame (ordered art direction) | Sequence + pair moments + widths |
16
+ | Drive zip (~11 files) | Photos, UI grabs, 2 decorative videos |
17
+ | Narrative doc | Origin → challenge → approach → close |
18
+ | Production ref | Other SE work pieces for hero/template only |
19
+
20
+ ## Inventory (excerpt)
21
+
22
+ | # | Role | File | Status | Mapping |
23
+ |---|------|------|--------|---------|
24
+ | 1 | Hero | `OM1_Hero.jpg` | ready | article `featuredImage` |
25
+ | 2 | Website UI | `OM1_websiteImage.png` | ready | CSRT `visual` ~80% |
26
+ | 3L | Pair left | — | **missing** | Separated left + **placeholder** |
27
+ | 3R | Pair right | `OM1_BlueModel.jpg` | ready | Separated right |
28
+ | 4 | Origin copy | Doc §1–2 | ready | CSRT body only (merge paras) |
29
+ | 5 | Hands photo | `OM1_HandsWithScreen.jpg` | ready | CSRT visual 100% |
30
+ | 6L | Pair left | `OM1_ManAndPatterns.jpg` | ready | Separated left |
31
+ | 6R | Pair right dialogs | — | **missing** | Separated right + **placeholder** |
32
+ | 7 | Challenge copy | Doc §3 | ready | CSRT body only |
33
+ | 8 | Landscape demo | `…LandscapeBlue….mp4` | ready | CSRT visual; autoplay+loop |
34
+ | … | … | … | … | … |
35
+
36
+ ## Verdict
37
+
38
+ **GO-WITH-GAPS** — sequence clear from Figma; narrative complete; **2 missing visual slots** (≤3), each placeholder-labeled. Do not invent substitute art or drop slots.
39
+
40
+ ## Soft-proof (structure only; copy unchanged)
41
+
42
+ ```text
43
+ Verdict: GO-WITH-GAPS
44
+ 1. [template] Article hero — title/subtitle from doc; featuredImage hero
45
+ 2. CSRT media — website UI 80%
46
+ 3. Separated visuals — placeholder left | blue model right
47
+ 4. CSRT body — origin paras (merged)
48
+ 5. CSRT media — hands 100%
49
+ 6. Separated — man/patterns | placeholder dialogs
50
+ 7. CSRT body — challenge
51
+ 8. CSRT media — landscape video autoplay+loop ~70%
52
+ 9. CSRT body — approach
53
+ 10. CSRT media — mobile screens
54
+ 11. Quote — as in source
55
+ 12. Separated or CSRTs — pattern | orange demo (only if Figma is a true pair)
56
+ 13. CSRT body — close
57
+ Lab: slug lab/…, hidden, unindexed
58
+ ```
59
+
60
+ ## What not to do
61
+
62
+ - Invent Separated for stacked single images
63
+ - Rewrite narrative “for flow”
64
+ - Reorder to put all text first
65
+ - Use article `visuals` as a dump for body art
66
+ - Skip placeholders and renumber
67
+
68
+ ## Copy policy
69
+
70
+ **Unchanged.** Meta `description` drafted from existing claims only; human **yes** on soft-proof.
@@ -0,0 +1,66 @@
1
+ # Deployment smoke — skip on feature branches
2
+
3
+ Vercel **Deployment Checks** wait for a GitHub status from the smoke workflow. On feature-branch previews the `smoke` job `if` excludes the branch, so **no job runs and no status is posted** — Vercel stays on "Waiting for checks" and the PR blocks.
4
+
5
+ **Fix:** add a `skip-smoke-outside-integration-branches` job that posts **success** when the deploy ref is not an integration/production branch. Real smoke still runs only on integration preview + production.
6
+
7
+ ## Requirements
8
+
9
+ 1. Workflow file must exist on the repo **default branch** (`develop`, `dev`, or registry override) — `repository_dispatch` runs workflows from default branch, not the feature branch.
10
+ 2. `permissions.statuses: write` on the workflow.
11
+ 3. `CHECK_NAME` must match the status name registered in Vercel → Settings → Deployment Checks (exact string).
12
+ 4. `smoke` job `if` must already limit runs to integration + production (do not run smoke on feature branches).
13
+
14
+ ## Integration branch names
15
+
16
+ | Repo type | Preview smoke ref | Production smoke ref |
17
+ |-----------|-------------------|----------------------|
18
+ | Most customer sites | `develop` | `main` |
19
+ | HopSkipDrive extended-port | `extended-port` | `main` (if production checks enabled) |
20
+ | se-core-product apps | `dev` | `main` |
21
+
22
+ Use `client_payload.git.ref` (branch name, not `refs/heads/...` — verify per project in a test dispatch).
23
+
24
+ ## Copy-paste
25
+
26
+ See [`workflow-snippet.yml`](workflow-snippet.yml). One skip job per Vercel project / workflow file (monorepos with multiple marketing apps need one skip job each).
27
+
28
+ ## cms-edit host (optional)
29
+
30
+ Feature-branch PRs also trigger cms-edit Vercel projects. Skip builds outside integration branches via `ignoreCommand` in `cms-edit/host/vercel.json`:
31
+
32
+ ```json
33
+ "ignoreCommand": "if [ \"$VERCEL_GIT_COMMIT_REF\" != \"develop\" ] && [ \"$VERCEL_GIT_COMMIT_REF\" != \"main\" ]; then exit 0; fi; git diff HEAD^ HEAD --quiet -- . ../ ../../pnpm-lock.yaml ../../pnpm-workspace.yaml ../../package.json || exit 1; exit 0"
34
+ ```
35
+
36
+ Replace `develop` with your integration branch (e.g. `extended-port`).
37
+
38
+ ## Rollout status
39
+
40
+ | Repo | Skip job on feature branches | cms-edit ignore |
41
+ |------|------------------------------|-----------------|
42
+ | brightline-sites | done (both apps) | done |
43
+ | se-website-2026 | pending → M4 branch | pending |
44
+ | om1-website | audit | audit |
45
+ | pedestal-sites | audit | audit |
46
+ | pointme | audit | audit |
47
+ | hsd-extended-port | audit | n/a |
48
+
49
+ Update this table when applying the pattern.
50
+
51
+ ## Emergency unblock (one PR)
52
+
53
+ If the skip job is not yet on default branch, post success manually:
54
+
55
+ ```bash
56
+ gh api "repos/<owner>/<repo>/statuses/<commit-sha>" \
57
+ -f state=success \
58
+ -f context="Vercel - <project-name>: deployment smoke" \
59
+ -f description="Skipped — deployment smoke runs only on develop and main"
60
+ ```
61
+
62
+ ## Verify
63
+
64
+ 1. Merge skip job to default branch.
65
+ 2. Open a feature PR — Vercel preview should complete without pending deployment smoke.
66
+ 3. Push to `develop` — deployment smoke should run and gate aliasing as before.
@@ -0,0 +1,38 @@
1
+ # Add BEFORE the smoke job in each deployment-smoke workflow.
2
+ # Replace <vercel-project-name> and integration/production refs as needed.
3
+
4
+ jobs:
5
+ skip-smoke-outside-integration-branches:
6
+ if: |
7
+ github.event_name == 'repository_dispatch' &&
8
+ github.event.client_payload.project.name == '<vercel-project-name>' &&
9
+ github.event.client_payload.git.ref != 'develop' &&
10
+ github.event.client_payload.git.ref != 'main'
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Skip deployment smoke on feature branches
14
+ env:
15
+ CHECK_NAME: 'Vercel - <vercel-project-name>: deployment smoke'
16
+ DEPLOYMENT_SHA: ${{ github.event.client_payload.git.sha }}
17
+ GH_TOKEN: ${{ github.token }}
18
+ run: |
19
+ gh api "repos/${GITHUB_REPOSITORY}/statuses/${DEPLOYMENT_SHA}" \
20
+ -f state=success \
21
+ -f context="${CHECK_NAME}" \
22
+ -f description="Skipped — deployment smoke runs only on develop and main" \
23
+ -f target_url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
24
+
25
+ smoke:
26
+ if: |
27
+ (github.event_name == 'workflow_dispatch') ||
28
+ (
29
+ github.event_name == 'repository_dispatch' &&
30
+ github.event.client_payload.project.name == '<vercel-project-name>' &&
31
+ (
32
+ (github.event.client_payload.git.ref == 'develop' &&
33
+ github.event.client_payload.environment == 'preview') ||
34
+ (github.event.client_payload.git.ref == 'main' &&
35
+ github.event.client_payload.environment == 'production')
36
+ )
37
+ )
38
+ # ... existing smoke steps unchanged ...
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "canonicalPatchesScript": "~/source/se/se-core-product/scripts/check-no-pnpm-patches.mjs",
3
3
  "pinOverrides": {
4
- "next": "^15.5.19",
5
- "@types/node": "^24.13.2"
4
+ "next": "^15.5.21",
5
+ "@types/node": "^24.13.3"
6
6
  },
7
7
  "pnpm": {
8
8
  "major": 11,
@@ -72,8 +72,7 @@
72
72
  "displayName": "HopSkipDrive Extended Port",
73
73
  "path": "~/source/customers/hopskipdrive/hsd-extended-port",
74
74
  "branch": "extended-port",
75
- "wip": true,
76
- "wipNote": "Parity port from legacy GraphQL/Netlify site onto @se-studio packages. Work on extended-port only — not develop/production. Defer routine deps bumps until parity snags are under control unless explicitly requested.",
75
+ "wipNote": "Parity port complete (2026-07-07). Work on extended-port only — not develop/production until cutover. Rollouts tracked in work/tracker.yaml.",
77
76
  "validate": "pnpm validate",
78
77
  "workspace": false,
79
78
  "hasPinOverrides": false
@@ -50,5 +50,6 @@ Apply the full stack when touching deps or CI in each repo:
50
50
  | om1-website | — | — | — | — |
51
51
  | se-website-2026 | yes | yes | yes | yes |
52
52
  | pointme | — | — | — | — |
53
+ | hsd-extended-port | yes | yes (extended-port) | n/a | yes |
53
54
 
54
55
  Update this table as repos adopt the pattern.
@@ -11,8 +11,10 @@ Use this skill when a customer site needs **hosted MCP editor playbooks** — th
11
11
 
12
12
  | File | Purpose |
13
13
  |------|---------|
14
- | `.agents/references/contentful-cms-editor-playbooks/PATTERNS.md` | Two-file pattern, sections, naming, Brightline examples |
14
+ | `.agents/references/contentful-cms-editor-playbooks/PATTERNS.md` | Two-file pattern, sections, naming, Brightline examples, article create pipeline |
15
15
  | `.agents/references/contentful-cms-editor-playbooks/PROJECT-ROLLOUT.md` | Rollout queue (Pedestal → OM1 → PointMe → SE website) and per-site audit hints |
16
+ | `.agents/references/contentful-cms-editor-playbooks/SOURCE-READINESS.md` | Package intake, GO / GO-WITH-GAPS / NO-GO, faithful structure (no copy rewrite) |
17
+ | `.agents/references/contentful-cms-editor-playbooks/examples/` | Worked input packages (SE, OM1, Brightline, Pedestal, Headwater) |
16
18
 
17
19
  ## When to use
18
20
 
@@ -139,6 +141,18 @@ See `PATTERNS.md` for the full Brightline hub example.
139
141
 
140
142
  **Do not** put task stubs in the root — only under `tasks/`.
141
143
 
144
+ ### Articles playbooks (article-heavy sites)
145
+
146
+ When writing or tightening `articles.md` / `ARTICLES.md`:
147
+
148
+ 1. Point external package creates at **`task-source-readiness-review`** (core task from `@se-studio/contentful-cms`)
149
+ 2. State **faithful structure only — do not rewrite source copy**
150
+ 3. Composition follows **source sequence**; do **not** invent pair/side-by-side layouts unless the design is a true pair
151
+ 4. Name **this site’s** body components only (never paste SE Case study rich text multi-block onto other brands)
152
+ 5. Optional: one condensed example or link to a specialized package playbook for high-traffic types
153
+
154
+ See `SOURCE-READINESS.md` and `examples/`.
155
+
142
156
  ### Specialized playbook sections
143
157
 
144
158
  Each `<topic>.md` should include:
@@ -56,6 +56,8 @@ Example `package.json` entries:
56
56
 
57
57
  **Vercel Deployment Check (live URL)** — GitHub Action on `vercel.deployment.ready` tests `client_payload.url` before production domains alias. Workflow must live on the repo **default branch**. Register the status `name` in Vercel → Settings → Build and Deployment → Deployment Checks.
58
58
 
59
+ **Feature branches must not run smoke** — limit the `smoke` job to integration preview (`develop` + `preview`) and production (`main` + `production`). Feature-branch previews still fire `repository_dispatch`; without a matching job, Vercel waits forever on "Waiting for checks". Add a `skip-smoke-outside-integration-branches` job that posts **success** for non-integration refs. Full rollout guide: [`references/deployment-smoke-feature-branch-skip/`](../../references/deployment-smoke-feature-branch-skip/README.md). Monorepos: one skip job per Vercel project workflow. Non-`develop` integration branches (e.g. HSD `extended-port`): adjust ref checks in both jobs.
60
+
59
61
  Filter on `client_payload.environment == 'production'` when Deployment Checks target production only. Vercel also dispatches for preview and custom environments (`preview`, `develop`, etc.); skip those to avoid duplicate CI runs. Use `workflow_dispatch` without an environment filter for manual smoke against any URL.
60
62
 
61
63
  ```yaml
@@ -67,11 +69,45 @@ on:
67
69
  types:
68
70
  - vercel.deployment.ready
69
71
 
72
+ permissions:
73
+ contents: read
74
+ actions: read
75
+ statuses: write
76
+
70
77
  jobs:
71
- smoke:
78
+ skip-smoke-outside-integration-branches:
72
79
  if: |
80
+ github.event_name == 'repository_dispatch' &&
73
81
  github.event.client_payload.project.name == '<vercel-project-name>' &&
74
- github.event.client_payload.environment == 'production'
82
+ github.event.client_payload.git.ref != 'develop' &&
83
+ github.event.client_payload.git.ref != 'main'
84
+ runs-on: ubuntu-latest
85
+ steps:
86
+ - name: Skip deployment smoke on feature branches
87
+ env:
88
+ CHECK_NAME: 'Vercel - <vercel-project-name>: deployment smoke'
89
+ DEPLOYMENT_SHA: ${{ github.event.client_payload.git.sha }}
90
+ GH_TOKEN: ${{ github.token }}
91
+ run: |
92
+ gh api "repos/${GITHUB_REPOSITORY}/statuses/${DEPLOYMENT_SHA}" \
93
+ -f state=success \
94
+ -f context="${CHECK_NAME}" \
95
+ -f description="Skipped — deployment smoke runs only on develop and main" \
96
+ -f target_url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
97
+
98
+ smoke:
99
+ if: |
100
+ (github.event_name == 'workflow_dispatch') ||
101
+ (
102
+ github.event_name == 'repository_dispatch' &&
103
+ github.event.client_payload.project.name == '<vercel-project-name>' &&
104
+ (
105
+ (github.event.client_payload.git.ref == 'develop' &&
106
+ github.event.client_payload.environment == 'preview') ||
107
+ (github.event.client_payload.git.ref == 'main' &&
108
+ github.event.client_payload.environment == 'production')
109
+ )
110
+ )
75
111
  runs-on: ubuntu-latest
76
112
  steps:
77
113
  - uses: vercel/repository-dispatch/actions/checkout@v1
@@ -303,6 +303,6 @@ Agent must load this skill, write manifest, run placement checklist, confirm bra
303
303
  | `om1` | `develop` | customer |
304
304
  | `pointme` | `develop` | customer |
305
305
  | `pedestal` | `develop` | customer monorepo |
306
- | `hsd-extended-port` | `extended-port` | customer (WIP) |
306
+ | `hsd-extended-port` | `extended-port` | customer |
307
307
 
308
308
  Full paths and MCP keys: `projects.registry.json`.
@@ -51,11 +51,11 @@ Run that locally **before push** whenever `package.json`, lockfile, or overrides
51
51
  | `om1` | OM1 Website | `develop` |
52
52
  | `pointme` | PointMe Marketing Site | `develop` |
53
53
  | `pedestal` | Pedestal Sites | `develop` |
54
- | `hsd-extended-port` | HopSkipDrive Extended Port **(WIP)** | `extended-port` |
54
+ | `hsd-extended-port` | HopSkipDrive Extended Port | `extended-port` |
55
55
 
56
56
  User may name a key (`update deps in om1`) or ask to run through all projects sequentially.
57
57
 
58
- **WIP:** `hsd-extended-port` is an active parity port — branch `extended-port`, not `develop`. Prefer standards alignment and targeted `@se-studio/*` catch-up over full `pnpm update -r --latest` until the snag list is stable.
58
+ **HSD extended-port:** Parity complete (2026-07-07). Branch `extended-port`, not `develop`, until production cutover. Rollouts tracked in `work/tracker.yaml` — prefer targeted `@se-studio/*` bumps per rollout before full `pnpm update -r --latest`.
59
59
 
60
60
  ---
61
61