@natjswenson/devlog 0.13.0 → 0.14.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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "comment": "Prose guardrails in SKILL.md that must survive edits (the `prose` array each pattern is a case-insensitive regex tested against the full SKILL.md text) and code-level guards elsewhere in this skill's source (the `code` array each pattern is tested against the file named by its own `file` field, not SKILL.md). Both are checked by tests/skill_contract.test.mjs. If you intentionally change one, update it here in the same commit and say why in the PR.",
2
+ "comment": "Prose guardrails in SKILL.md that must survive edits (the `prose` array \u2014 each pattern is a case-insensitive regex tested against the full SKILL.md text) and code-level guards elsewhere in this skill's source (the `code` array \u2014 each pattern is tested against the file named by its own `file` field, not SKILL.md). Both are checked by tests/skill_contract.test.mjs. If you intentionally change one, update it here in the same commit and say why in the PR.",
3
3
  "prose": [
4
4
  {
5
5
  "id": "immutable-entries",
@@ -19,7 +19,7 @@
19
19
  {
20
20
  "id": "gotchas-never-invented",
21
21
  "pattern": "never invented",
22
- "rationale": "Gotchas come from real history (fix commits, reverts, changelog) fabricating them breaks the product's honesty."
22
+ "rationale": "Gotchas come from real history (fix commits, reverts, changelog) \u2014 fabricating them breaks the product's honesty."
23
23
  },
24
24
  {
25
25
  "id": "reader-side-verify",
@@ -64,12 +64,12 @@
64
64
  {
65
65
  "id": "private-project-no-links",
66
66
  "pattern": "no post ever[\\s\\S]{0,10}links a commit for it",
67
- "rationale": "A private project's commits must never scan as public just because remoteMatches + branch-contains happen to hold losing this line reopens the dead-link-to-a-private-repo path."
67
+ "rationale": "A private project's commits must never scan as public just because remoteMatches + branch-contains happen to hold \u2014 losing this line reopens the dead-link-to-a-private-repo path."
68
68
  },
69
69
  {
70
70
  "id": "cover-composition-scope",
71
71
  "pattern": "never the raw draft file, never[\\s\\S]{0,10}## Changelog",
72
- "rationale": "Cover composition must draw only from title/tags/summary/## Shipped never the raw draft or Changelog losing this line reopens off-scope content leaking into an auto-composed image."
72
+ "rationale": "Cover composition must draw only from title/tags/summary/## Shipped \u2014 never the raw draft or Changelog \u2014 losing this line reopens off-scope content leaking into an auto-composed image."
73
73
  },
74
74
  {
75
75
  "id": "cover-never-blocks-publish",
@@ -79,12 +79,12 @@
79
79
  {
80
80
  "id": "cover-review-gate",
81
81
  "pattern": "this interactive review IS the quality gate for the cover",
82
- "rationale": "The rendered cover must be shown to the user before push, the same way Step 4 gates the prose losing this line reopens publishing an unreviewed cover."
82
+ "rationale": "The rendered cover must be shown to the user before push, the same way Step 4 gates the prose \u2014 losing this line reopens publishing an unreviewed cover."
83
83
  },
84
84
  {
85
85
  "id": "ground-truth-gate",
86
86
  "pattern": "verify each one with a git command run NOW",
87
- "rationale": "The 6-run audit found a post that published a provably false premise about the author's own repo (resume/v1.0.1: 'two of four packages never got tags' all four existed). Every repo-fact claim must be re-verified against git in-session before publish; losing this line reopens the fabricated-premise path."
87
+ "rationale": "The 6-run audit found a post that published a provably false premise about the author's own repo (resume/v1.0.1: 'two of four packages never got tags' \u2014 all four existed). Every repo-fact claim must be re-verified against git in-session before publish; losing this line reopens the fabricated-premise path."
88
88
  },
89
89
  {
90
90
  "id": "no-unrun-output",
@@ -104,7 +104,17 @@
104
104
  {
105
105
  "id": "cover-custom-illustration",
106
106
  "pattern": "cover that just re-renders the title in large text is a failure",
107
- "rationale": "First shipped version of this feature produced a shared text-heavy template with a rotating stock shape rejected as bland/repetitive. Losing this line reopens that regression. Independent of, not superseded by, the v0.9.0 geometry guard (cover-catalog-hero-overlap-guard, below): that guard is a mechanical check on an agent's rendered composition each time a cover is rendered; this line is a prose guardrail against a future SKILL.md/style-guide edit silently reintroducing the bland-template regression at the instruction level. Two different regression surfaces, both still worth guarding."
107
+ "rationale": "First shipped version of this feature produced a shared text-heavy template with a rotating stock shape \u2014 rejected as bland/repetitive. Losing this line reopens that regression. Independent of, not superseded by, the v0.9.0 geometry guard (cover-catalog-hero-overlap-guard, below): that guard is a mechanical check on an agent's rendered composition each time a cover is rendered; this line is a prose guardrail against a future SKILL.md/style-guide edit silently reintroducing the bland-template regression at the instruction level. Two different regression surfaces, both still worth guarding."
108
+ },
109
+ {
110
+ "id": "concept-draft-only",
111
+ "pattern": "draft-only; never fall through to Generate or publish-entry",
112
+ "rationale": "Explicit concept requests must not fall into automatic release publication."
113
+ },
114
+ {
115
+ "id": "native-art-no-implicit-fallback",
116
+ "pattern": "No implicit API fallback",
117
+ "rationale": "Optional Codex art must not create a new paid dependency or silently invoke a fallback."
108
118
  }
109
119
  ],
110
120
  "code": [
@@ -112,7 +122,7 @@
112
122
  "id": "cover-catalog-hero-overlap-guard",
113
123
  "file": "lib/render_cover.mjs",
114
124
  "pattern": "(?:getBoundingClientRect[\\s\\S]{0,400}hero-zone|hero-zone[\\s\\S]{0,400}getBoundingClientRect)",
115
- "rationale": "The catalog-icon/hero-zone overlap check must stay wired into renderCoverImage() losing it silently reopens the gap where a catalog icon (or two, connected by a line) can stand in for the required bespoke hero illustration."
125
+ "rationale": "The catalog-icon/hero-zone overlap check must stay wired into renderCoverImage() \u2014 losing it silently reopens the gap where a catalog icon (or two, connected by a line) can stand in for the required bespoke hero illustration."
116
126
  }
117
127
  ],
118
128
  "cli_commands_referenced": [
@@ -128,7 +138,10 @@
128
138
  "render-cover",
129
139
  "tombstone",
130
140
  "sync-entry",
131
- "assemble-post"
141
+ "assemble-post",
142
+ "lint-guide",
143
+ "prepare-guide",
144
+ "compose-art-cover"
132
145
  ],
133
146
  "_baseline_comment": "Baseline eval sets: deterministic, offline, $0 checks pinned against artifacts from real local runs. These gate `ci / devlog` alongside the unit tests. Every entry names the test that enforces it so tools/lint_baseline.py can verify the declaration is not aspirational.",
134
147
  "baseline": [
@@ -138,7 +151,15 @@
138
151
  "test": "tests/baseline.test.mjs",
139
152
  "corpus_glob": "evals/baseline/published/*.md",
140
153
  "min_corpus": 8,
141
- "rationale": "tests/lint_post.test.mjs unit-tests each rule against small crafted inputs and tests/evals.test.mjs drives the good/bad/irreproducible fixtures through the judge. All of those are hand-authored to exercise the rules; none answers whether the linter still accepts the real thing. evals/baseline/published/ holds eight entries copied verbatim from natejswenson.io posts that went through the full pipeline, were reviewed, and are live so 'this passes' means 'a human shipped this and stands behind it'. A rule that grows too strict starts rejecting work like this, and the cost lands at publish time on a real release. Deliberately a CURATED subset: of 61 published entries only 17 satisfy today's contract, the rest predating rules that landed later (the 5-10 tags-count range especially). Those are stale, not bad asserting over all 61 would encode 'the linter must accept its own history', a different and wrong requirement. Paired negative assertions (bad-post.md must still produce findings; the three required-section rules must still fire) stop the corpus passing vacuously against a linter that returned nothing."
154
+ "rationale": "tests/lint_post.test.mjs unit-tests each rule against small crafted inputs and tests/evals.test.mjs drives the good/bad/irreproducible fixtures through the judge. All of those are hand-authored to exercise the rules; none answers whether the linter still accepts the real thing. evals/baseline/published/ holds eight entries copied verbatim from natejswenson.io \u2014 posts that went through the full pipeline, were reviewed, and are live \u2014 so 'this passes' means 'a human shipped this and stands behind it'. A rule that grows too strict starts rejecting work like this, and the cost lands at publish time on a real release. Deliberately a CURATED subset: of 61 published entries only 17 satisfy today's contract, the rest predating rules that landed later (the 5-10 tags-count range especially). Those are stale, not bad \u2014 asserting over all 61 would encode 'the linter must accept its own history', a different and wrong requirement. Paired negative assertions (bad-post.md must still produce findings; the three required-section rules must still fire) stop the corpus passing vacuously against a linter that returned nothing."
155
+ },
156
+ {
157
+ "id": "real-concept-handoff",
158
+ "kind": "corpus",
159
+ "test": "tests/guide_draft.test.mjs",
160
+ "corpus_glob": "tests/fixtures/guide/*.md",
161
+ "min_corpus": 1,
162
+ "rationale": "Frozen ESM consolidation pilot that completed an independent ledger-project adaptation. Exact full-payload and clipboard tests plus malformed-handoff mutations retain its delivery contract; this does not claim future semantic review passed."
142
163
  }
143
164
  ]
144
165
  }