@piercebarney/whs-eleventy 2026.10.21 → 2026.10.22

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piercebarney/whs-eleventy",
3
- "version": "2026.10.21",
3
+ "version": "2026.10.22",
4
4
  "description": "The web house style's Eleventy + Netlify tooling — the compliance sweep, the infra doctor, the link/CSP integrity check, and the a11y scan, shared by every project on the stack.",
5
5
  "bin": {
6
6
  "whs": "cli.js"
@@ -31,7 +31,7 @@
31
31
  "node": ">=22"
32
32
  },
33
33
  "dependencies": {
34
- "@piercebarney/whs-core": ">=2026.10.21",
34
+ "@piercebarney/whs-core": ">=2026.10.22",
35
35
  "node-html-parser": "^9.0.2"
36
36
  },
37
37
  "devDependencies": {
@@ -23,6 +23,152 @@ enforced, new *opt-in* chapters/capabilities, tooling-only changes — is
23
23
 
24
24
  ---
25
25
 
26
+ ## 2026-10-22 [breaking]
27
+
28
+ Inbox triage release: fixes a SvelteKit `build.ts` bug that made the
29
+ `#noindex` "Layer 1, verified working" claim false for the client bundle —
30
+ "corrects a documented mechanism that didn't actually work," per this file's
31
+ own breaking definition. Also lands the two-way `requests/` drawer +
32
+ placeholder rule (`core.md#content-model`) across every stack, a new
33
+ SvelteKit `pages` binding, and the CI/verify plumbing to actually run a
34
+ SvelteKit add-on's tests.
35
+
36
+ **Action for SvelteKit projects:** replace `src/lib/build.ts` with the
37
+ version below and add the `envPrefix: ['VITE_', 'DEPLOY_TARGET']` line to
38
+ `vite.config.ts`, as documented in `stacks/sveltekit-netlify.md#noindex` /
39
+ `#config-idiom`. A project with `content-ops: reserved` should also adopt
40
+ the two-way `requests/` wording (`requests/README.md`, `CONTENT.md`,
41
+ `.claude/agents/content.md`).
42
+
43
+ ### core: content-model
44
+
45
+ The escalation channel (`requests/`) is now explicitly **two-way**: content
46
+ → build (a structural change the content arm can't make) and build →
47
+ content (the build needs content it isn't allowed to author — e.g. a schema
48
+ gains a required field with no real copy behind it yet). A new
49
+ **build → content placeholder rule** is the sole exception to the reserved
50
+ set's read-only rule: the build writes only a clearly-marked `[COPY
51
+ PENDING]` placeholder (never authored prose) into each newly-required
52
+ field, flags the entry as a draft wherever the schema allows so it can't
53
+ publish, and files the `requests/` note listing each field; the content arm
54
+ replaces the placeholders and clears the draft flag. Verify line added: a
55
+ production build contains no `[COPY PENDING]` text.
56
+
57
+ ### templates/sveltekit-netlify
58
+
59
+ - **`src/lib/build.ts` / `vite.config.ts`** — `isProduction` now reads
60
+ `import.meta.env.DEPLOY_TARGET` instead of `process.env.DEPLOY_TARGET`,
61
+ with `envPrefix: ['VITE_', 'DEPLOY_TARGET']` added to `vite.config.ts` so
62
+ the existing `DEPLOY_TARGET` env var (unchanged — `bin/deploy`/CI keep
63
+ setting it the same way) is populated identically in the server bundle, a
64
+ real production client bundle, and the plain dev server. `process.env`
65
+ reads don't survive Vite's classic unbundled `vite dev` for client code at
66
+ all (crashes with `process is not defined`) and silently evaluate to `{}`
67
+ in a bundled client build (always `false`, regardless of the real
68
+ `DEPLOY_TARGET`) — so a production page kept re-adding the noindex meta
69
+ and showing draft links after hydration. `$env/static/public` was weighed
70
+ and rejected: it would need either renaming the var to
71
+ `PUBLIC_DEPLOY_TARGET` or widening `kit.env.publicPrefix`, a single string
72
+ that can't also keep matching `PUBLIC_`. `envPrefix` matches by
73
+ `startsWith`, not exact name, so this array exposes exactly
74
+ `DEPLOY_TARGET` to the client bundle — a future client-exposed var is
75
+ added by its own full name, never by widening either entry to a broad
76
+ prefix like `'DEPLOY_'`, which would inline every matching var, secret or
77
+ not.
78
+ - **`.claude/agents/brand.md` / `stacks/sveltekit-netlify.md#styling`** —
79
+ the `tailwind-shadcn` recipe now documents `shadcn-svelte@1.7.0`'s real
80
+ `init` flow: a two-step preset menu (curated-list vs. one-by-one, then the
81
+ eight named presets with Vega pre-highlighted), followed by an unrelated
82
+ `layout.css` overwrite confirmation — not the single default-highlighted
83
+ prompt previously described. States plainly that the CLI is **not
84
+ pipe-scriptable** (clack's TUI needs a real pty; a plain pipe or `yes`
85
+ just hangs with no error) and gives an `expect` recipe that sizes the pty
86
+ with `stty rows/columns` before sending input and waits on rendered
87
+ anchor text per screen.
88
+ - **Two-way `requests/`** — `requests/README.md`, `CONTENT.md`,
89
+ `.claude/agents/content.md` all now document both directions and the
90
+ placeholder rule, matching the `core.md#content-model` update above.
91
+ - **`add-ons/pages/` (new)** — the `pages` marketing-blocks module's
92
+ SvelteKit binding (see `### module: pages` below): zod block schemas
93
+ (`hero`, `feature-list`, `cta`) plus a prose section and `include` marker,
94
+ a `Body.svelte` renderer and one Svelte component per block type
95
+ (structure-only, CSP-safe, no inline styles/scripts), the module's shared
96
+ `pages.schema.blocks.json` vendored byte-identical, a `CONTENT.pages.md`
97
+ addendum for reserved projects, and vitest tests against the module's
98
+ shared fixtures (`pages.blocks.test.ts`, 14 tests).
99
+
100
+ ### stacks/sveltekit-netlify.md
101
+
102
+ `#noindex` Layer 1 and `#config-idiom` updated to match the `build.ts` fix
103
+ above; the "verified working" claim now says it's checked after hydration
104
+ in a real browser, not just a diff of two builds' prerendered `index.html`.
105
+ `#content-model` mirrors the two-way `requests/` + placeholder rule.
106
+ `#styling`'s `tailwind-shadcn` recipe corrected per the `shadcn-svelte`
107
+ entry above.
108
+
109
+ ### module: pages
110
+
111
+ New binding: `templates/sveltekit-netlify/add-ons/pages/`, following
112
+ `modules/pages/MODULE.md` and mirroring the shape of
113
+ `templates/eleventy-netlify/add-ons/pages/`. `modules/README.md`'s index
114
+ now lists `sveltekit-netlify` for `pages`.
115
+
116
+ ### templates/eleventy-netlify / stacks/eleventy-netlify.md
117
+
118
+ Wording-only recheck of the `#content-model` mirror for the two-way
119
+ `requests/` + placeholder rule — no mechanism change.
120
+ `templates/eleventy-netlify/requests/README.md`, `CONTENT.md`, and
121
+ `.claude/agents/content.md` updated to match. Also corrects the **Drafts**
122
+ bullet in `stacks/eleventy-netlify.md`: draft state is a `draft` boolean
123
+ field on the content-model entry itself (`src/content/schema.js`), not
124
+ frontmatter — each domain's directory-data file computes
125
+ `isSuppressedDraft` and suppresses production/collection inclusion
126
+ accordingly.
127
+
128
+ ### bin/check
129
+
130
+ Sterility allowlist gains `shadcn-svelte\.com` alongside the existing
131
+ CSS-tooling domains (`daisyui.com`, `tailwindcss.com`, `heroicons.com`) —
132
+ it's the real CLI's own prompt text, quoted verbatim in
133
+ `stacks/sveltekit-netlify.md`.
134
+
135
+ ### templates/verify.sh, .github/workflows/standard.yml
136
+
137
+ Both now run a SvelteKit template's own `add-ons/*/*.test.*` files when
138
+ present, matching the eleventy branch's `node --test
139
+ add-ons/*/test/*.test.js` intent for this stack's runner (vitest). Neither
140
+ `npm run check` nor the project's own `vite.config.ts` (its `test.projects`
141
+ workspace scopes `include` to `src/**/*`) reaches add-on sources before
142
+ they're copied into the project, so each now writes a throwaway vitest
143
+ config (outside the template's own workspace-projects setup, so its
144
+ `src/`-only `include` doesn't shadow it) scoped to `add-ons/**/*.{test,spec}.{js,ts}`
145
+ and runs it with `npx vitest run --config <tmp file>` — no file under
146
+ `templates/sveltekit-netlify/` changed. Verified against
147
+ `add-ons/pages/pages.blocks.test.ts`: 14 tests pass.
148
+
149
+ ### BACKLOG.md
150
+
151
+ - New `ready` entry `commit-early-often` (source: request, owner,
152
+ 2026-09-28): a commit-cadence rule (distinct from `core.md`'s existing
153
+ commit-granularity rule), with the filed note's open questions carried
154
+ over verbatim.
155
+ - `sveltekit-tooling-parity` gains `covenant-in-color` to `requested-by:`,
156
+ `reduced-motion-check-scope` to `aliases:`, and a line on the fix: `whs
157
+ compliance`'s `#a11y` reduced-motion check only scans `src/`, `static/`,
158
+ `scripts/` for CSS `transition`/`animation`, missing a root-level authored
159
+ stylesheet/script and JS-driven smooth scroll (`scrollIntoView({ behavior:
160
+ "smooth" })`) — folds into `whs-core`'s shared a11y check (CSS
161
+ `scroll-behavior`, a crude JS smooth-scroll match, and root-level
162
+ authored `*.css`/`*.js`) during Release 2b, not a per-stack fix.
163
+
164
+ The `feedback/2026-09-27-reduced-motion-check-scope.md` and
165
+ `needs/2026-09-28-commit-early-often.md` notes are folded/backlogged, not
166
+ closed — no slug for either below.
167
+
168
+ **Closes:** build-ts-process-env-in-client, shadcn-init-not-scriptable-by-pipe,
169
+ requests-drawer-one-directional, sveltekit-pages-binding,
170
+ sveltekit-envprefix-too-broad
171
+
26
172
  ## 2026-10-21 [non-breaking]
27
173
 
28
174
  Release 2a of SvelteKit stack parity (`BACKLOG.md#sveltekit-tooling-parity`):
package/standard/core.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Web project house style — CORE (stack-agnostic)
2
2
 
3
- **Version:** 2026-10-21 · **Status:** active
3
+ **Version:** 2026-10-22 · **Status:** active
4
4
 
5
5
  This is the stack-agnostic contract every web project follows, regardless of
6
6
  framework, host, or CSS system. It says **what** must be true, with concrete
@@ -127,18 +127,31 @@ a build-time schema gate hard-fails the build on invalid content.
127
127
  and one file at the repo root (`CONTENT.md`) names the reserving party and
128
128
  the exact set it owns, and is authoritative for every party. The builder
129
129
  treats the reserved set as read-only and routes any change it needs there
130
- through the project's escalation channel, never a direct edit. The reserved
131
- set is enumerated at whatever granularity the project needs — all content,
132
- or named collections/paths.
130
+ through the project's escalation channel, never a direct edit — the sole
131
+ exception is the placeholder rule below. The reserved set is enumerated at
132
+ whatever granularity the project needs — all content, or named
133
+ collections/paths.
133
134
  - An **LLM agent** editing reserved content follows a documented per-project
134
135
  content-ops protocol: it changes only the reserved set; a pre-commit content
135
136
  check (the content-relevant slice of the gate) **errors** on any staged change
136
- outside that set; a `content:` commit convention; and an escalation channel for
137
- anything structural, so a blocked request is recorded, not lost. The agent does
138
- not deploy: it commits a finished change to the default branch and hands it to
139
- the human deploy cadence (`#ci-cd`) — a session-closing report that names what
137
+ outside that set; a `content:` commit convention; and a **two-way escalation
138
+ channel** for anything structural, so a blocked request is recorded, not
139
+ lost — content → build when the content arm needs a structural change it
140
+ isn't allowed to make itself; build → content when the build needs content
141
+ it isn't allowed to author (a schema gains a required field whose real copy
142
+ must come from the reserved content operation). The agent does not deploy:
143
+ it commits a finished change to the default branch and hands it to the
144
+ human deploy cadence (`#ci-cd`) — a session-closing report that names what
140
145
  landed and whether it is time-sensitive, with any deadline also carried in the
141
146
  commit subject. See your stack's impl doc.
147
+ - **Build → content placeholder rule** is the sole exception to the reserved
148
+ set's read-only rule above. Filing a build → content request does not block
149
+ the build on an answer: it files a build → content escalation note listing
150
+ every affected field, writes only a clearly-marked `[COPY PENDING]`
151
+ placeholder — never authored prose — into exactly those fields, and flags
152
+ the entry as a draft wherever the schema allows so it can't publish. The
153
+ content arm supplies the real copy, replaces each placeholder, and clears
154
+ the draft flag.
142
155
  - **Drafts** are a data flag. A draft renders in local and preview builds
143
156
  (reviewable) but is excluded from the production build and the sitemap.
144
157
  Publishing is removing the flag.
@@ -165,7 +178,7 @@ reserved set is what lets a builder and a separate content operation work the
165
178
  same repo without overwriting each other or leaving a request unanswered.
166
179
 
167
180
  **Verify.** The gate fails the build on invalid content. The audit page shows
168
- validation status.
181
+ validation status. A production build contains no `[COPY PENDING]` text.
169
182
 
170
183
  **Implementation.** See your stack's impl doc, same slug.
171
184
 
@@ -1541,7 +1554,7 @@ governs it and follow that chapter — the slugs are the index (a `<script>` →
1541
1554
  - content-type: tool # tool | article (article => feeds)
1542
1555
  - add-ons: none # or: comma list of modules/ packs no field above implies (calculator, glossary, pages) — see modules/README.md
1543
1556
  - publishing-rate: ~5 pages/week
1544
- - standard-version: 2026-10-21 # recommended — enables standard-version drift tracking (#compliance)
1557
+ - standard-version: 2026-10-22 # recommended — enables standard-version drift tracking (#compliance)
1545
1558
 
1546
1559
  <!-- optional, present only while a filed need is unresolved -->
1547
1560
  ### Waiting on the standard