@domandigital/craft 0.8.0 → 0.9.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 +12 -0
- package/CHARACTER.md +1 -1
- package/COPY.md +6 -2
- package/dist/{audit-W57YDZ2K.js → audit-5P65UMFL.js} +3 -3
- package/dist/audit.cjs +7 -4
- package/dist/audit.js +7 -4
- package/dist/{chunk-OVOH7KZY.js → chunk-5LI2VFN5.js} +5 -5
- package/dist/{chunk-Q4MN3OXF.js → chunk-BYY32NIN.js} +2 -2
- package/dist/{chunk-35OX6C4H.js → chunk-DAENYJUO.js} +5 -5
- package/dist/{chunk-OGSYVCMU.js → chunk-EHNEGKFR.js} +1 -1
- package/dist/{chunk-ULYKASLA.js → chunk-JRMU6GYX.js} +1 -1
- package/dist/{chunk-K253ZXB3.js → chunk-VKQDOUHO.js} +4 -4
- package/dist/{chunk-X65RDW65.js → chunk-YLQE35PN.js} +7 -7
- package/dist/{chunk-CZHRNPDD.js → chunk-ZT3WLN7R.js} +7 -4
- package/dist/{cli-KA3JDNDH.js → cli-3XPEGBUR.js} +4 -4
- package/dist/{cli-F7ONSKZS.js → cli-4VAOH7ST.js} +4 -4
- package/dist/cli-J7C6TI2B.js +16 -0
- package/dist/{cli-LZ7R6KJM.js → cli-V55MTIOP.js} +9 -9
- package/dist/cli-WDSVVHKG.js +15 -0
- package/dist/cli.js +2 -2
- package/dist/index.cjs +7 -4
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -4
- package/package.json +1 -1
- package/word-lists.json +1 -1
- package/dist/cli-FKJOMOOF.js +0 -15
- package/dist/cli-SHLNRHK6.js +0 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @domandigital/craft
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- bbf1f54: `chatbot-residue` moves to the house blocking tier. A pasted chat reply (citation tokens, entity markers, "as an AI language model") now fails `craft copy --gate`, `copy-check` and `sanity-copy`. Its estate hits were read first: 15 of 15 real, no false alarms.
|
|
8
|
+
|
|
9
|
+
## 0.8.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 74a6fd6: `chatbot-residue` now finds ChatGPT entity markers, such as `entity["company","Bark","services marketplace"]`, which render as visible text where a plain name belongs. Found live on a published article, 2026-09-23. Catalogue version 2026.09.7.
|
|
14
|
+
|
|
3
15
|
## 0.8.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/CHARACTER.md
CHANGED
|
@@ -534,7 +534,7 @@ Generated from the package. Run `pnpm --filter @domandigital/craft run docs`
|
|
|
534
534
|
after changing an entry; a test fails until you do.
|
|
535
535
|
|
|
536
536
|
<!-- craft:catalogue:start -->
|
|
537
|
-
Catalogue version `2026.09.
|
|
537
|
+
Catalogue version `2026.09.7`, 54 tells.
|
|
538
538
|
|
|
539
539
|
| Id | Gen | Surface | Severity | Tell | Why it is a default |
|
|
540
540
|
| --- | --- | --- | --- | --- | --- |
|
package/COPY.md
CHANGED
|
@@ -45,6 +45,11 @@ A single hit fails the check. These are not judgment calls.
|
|
|
45
45
|
a signed-in route (`/admin/`, `/portal/`, `/dashboard/`).
|
|
46
46
|
- **"No X, no Y" as a list**, anywhere in a sentence. "No obligation, no
|
|
47
47
|
spam." Defining the business by what it is not, itemised.
|
|
48
|
+
- **Chatbot residue.** "Certainly! Here's a revised version", "as an AI
|
|
49
|
+
language model", "let me know if you'd like me to", ChatGPT citation tokens
|
|
50
|
+
and entity markers, links tracked `utm_source=chatgpt.com`. This is not
|
|
51
|
+
style: it is proof a chat reply was pasted in whole. Remove it, then source
|
|
52
|
+
or cut any claim a citation token was backing. Never re-cite from memory.
|
|
48
53
|
- The phrase list: `let's dive in`, `let's unpack`, `let's break this down`,
|
|
49
54
|
`here's the thing`, `it's important to note`, `at its core`,
|
|
50
55
|
`the key takeaway`, `the reality is`, `the truth is`,
|
|
@@ -96,14 +101,13 @@ person reading decides which instance earns its place.
|
|
|
96
101
|
| `question-reveal` | "The result? Twice the bookings.", "What does this mean for you? It means...": a staged reveal |
|
|
97
102
|
| `inline-label-list` | three or more bullets in a row opening "**Label:**", where the label repeats the line |
|
|
98
103
|
| `placeholder` | "[Insert client name]", lorem ipsum, `TODO_PLACEHOLDER`. Fine in a draft commit; **zero in anything delivered** |
|
|
99
|
-
| `chatbot-residue` | "Certainly! Here's a revised version", "as an AI language model", "let me know if you'd like me to", chat citation tokens, links tracked `utm_source=chatgpt.com`. **Zero in anything delivered**, and the first candidate for the blocking tier |
|
|
100
104
|
|
|
101
105
|
### Style is not evidence
|
|
102
106
|
|
|
103
107
|
Most tells here are house style: they make copy generic, whoever wrote it. The
|
|
104
108
|
research is clear that an em dash, a rule of three or a rhetorical question
|
|
105
109
|
proves nothing about authorship, and em dash rates even run in opposite
|
|
106
|
-
directions between models. Only
|
|
110
|
+
directions between models. Only chatbot residue, in the blocking tier, is evidence that a chat reply
|
|
107
111
|
was pasted. Report findings as an editorial diagnosis ("three benefit claims
|
|
108
112
|
lack a mechanism; two stock phrases recur"), never as a score or an
|
|
109
113
|
accusation.
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
snapshotPage,
|
|
7
7
|
snapshotUrl,
|
|
8
8
|
snapshotUrls
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-BYY32NIN.js";
|
|
10
|
+
import "./chunk-EHNEGKFR.js";
|
|
11
|
+
import "./chunk-ZT3WLN7R.js";
|
|
12
12
|
export {
|
|
13
13
|
audit,
|
|
14
14
|
collectInPage,
|
package/dist/audit.cjs
CHANGED
|
@@ -617,6 +617,9 @@ var RESIDUE = [
|
|
|
617
617
|
// which survive a copy and paste into a CMS: found live, 2026-09-23.
|
|
618
618
|
/[\uE200-\uE2FF]*(?:cite)?[\uE200-\uE2FF]*(?:turn\d+(?:search|news|view|fetch|file|image)\d+[\uE200-\uE2FF]*)+/,
|
|
619
619
|
/:?contentReference\[oaicite:\d+\](?:\{index=\d+\})?/,
|
|
620
|
+
// Entity markers from the same paste: entity["company","Bark","services
|
|
621
|
+
// marketplace"] shows on the page where the plain name "Bark" belongs.
|
|
622
|
+
/[\uE200-\uE2FF]*entity[\uE200-\uE2FF]*\["[a-z_]+"\s*,\s*"[^"\n]{1,80}"(?:\s*,\s*"[^"\n]{0,160}")*\][\uE200-\uE2FF]*/,
|
|
620
623
|
/【\d+(?:[:†][^】]{0,40})?】/
|
|
621
624
|
];
|
|
622
625
|
var AI_UTM = /utm_source=(?:chatgpt\.com|chat\.openai\.com|openai|perplexity(?:\.ai)?|claude\.ai|copilot(?:\.microsoft\.com)?|gemini(?:\.google\.com)?)\b/gi;
|
|
@@ -2291,6 +2294,9 @@ var HOUSE = {
|
|
|
2291
2294
|
"plain-english": { tier: "block", label: 'use "properly explained"' },
|
|
2292
2295
|
buzzword: { tier: "block", label: "forbidden phrase" },
|
|
2293
2296
|
"negative-reassurance": { tier: "block", label: "negative reassurance, say what they get" },
|
|
2297
|
+
// Evidence of a pasted chat reply, not a matter of style. Moved from review
|
|
2298
|
+
// on 2026-09-24 after its estate hits were read (ROADMAP.md): 15 of 15 real.
|
|
2299
|
+
"chatbot-residue": { tier: "block", label: "chatbot residue. A chat reply was pasted in: remove it, and source or cut the claim it backed" },
|
|
2294
2300
|
"review-phrase": { tier: "review", label: "review tier" },
|
|
2295
2301
|
"ai-vocabulary": { tier: "review", label: "AI vocabulary" },
|
|
2296
2302
|
"stock-phrase": { tier: "review", label: "stock phrase" },
|
|
@@ -2302,9 +2308,6 @@ var HOUSE = {
|
|
|
2302
2308
|
"vague-attribution": { tier: "review", label: "unnamed source" },
|
|
2303
2309
|
"closing-summary": { tier: "review", label: "closing summary" },
|
|
2304
2310
|
"false-range": { tier: "review", label: "false range" },
|
|
2305
|
-
// The first candidate for block: evidence of a pasted chat reply, not a
|
|
2306
|
-
// matter of style. Blocks once its estate hits have been read (ROADMAP.md).
|
|
2307
|
-
"chatbot-residue": { tier: "review", label: "chatbot residue" },
|
|
2308
2311
|
"placeholder": { tier: "review", label: "unfilled placeholder" },
|
|
2309
2312
|
"question-reveal": { tier: "review", label: "staged reveal" },
|
|
2310
2313
|
"inline-label-list": { tier: "review", label: "bold-label bullets" },
|
|
@@ -2672,7 +2675,7 @@ var RENDERED_PATHS = {
|
|
|
2672
2675
|
};
|
|
2673
2676
|
|
|
2674
2677
|
// src/character/check.ts
|
|
2675
|
-
var CATALOGUE_VERSION = "2026.09.
|
|
2678
|
+
var CATALOGUE_VERSION = "2026.09.7";
|
|
2676
2679
|
var CATALOGUE = [...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map(
|
|
2677
2680
|
(t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t
|
|
2678
2681
|
);
|
package/dist/audit.js
CHANGED
|
@@ -585,6 +585,9 @@ var RESIDUE = [
|
|
|
585
585
|
// which survive a copy and paste into a CMS: found live, 2026-09-23.
|
|
586
586
|
/[\uE200-\uE2FF]*(?:cite)?[\uE200-\uE2FF]*(?:turn\d+(?:search|news|view|fetch|file|image)\d+[\uE200-\uE2FF]*)+/,
|
|
587
587
|
/:?contentReference\[oaicite:\d+\](?:\{index=\d+\})?/,
|
|
588
|
+
// Entity markers from the same paste: entity["company","Bark","services
|
|
589
|
+
// marketplace"] shows on the page where the plain name "Bark" belongs.
|
|
590
|
+
/[\uE200-\uE2FF]*entity[\uE200-\uE2FF]*\["[a-z_]+"\s*,\s*"[^"\n]{1,80}"(?:\s*,\s*"[^"\n]{0,160}")*\][\uE200-\uE2FF]*/,
|
|
588
591
|
/【\d+(?:[:†][^】]{0,40})?】/
|
|
589
592
|
];
|
|
590
593
|
var AI_UTM = /utm_source=(?:chatgpt\.com|chat\.openai\.com|openai|perplexity(?:\.ai)?|claude\.ai|copilot(?:\.microsoft\.com)?|gemini(?:\.google\.com)?)\b/gi;
|
|
@@ -2259,6 +2262,9 @@ var HOUSE = {
|
|
|
2259
2262
|
"plain-english": { tier: "block", label: 'use "properly explained"' },
|
|
2260
2263
|
buzzword: { tier: "block", label: "forbidden phrase" },
|
|
2261
2264
|
"negative-reassurance": { tier: "block", label: "negative reassurance, say what they get" },
|
|
2265
|
+
// Evidence of a pasted chat reply, not a matter of style. Moved from review
|
|
2266
|
+
// on 2026-09-24 after its estate hits were read (ROADMAP.md): 15 of 15 real.
|
|
2267
|
+
"chatbot-residue": { tier: "block", label: "chatbot residue. A chat reply was pasted in: remove it, and source or cut the claim it backed" },
|
|
2262
2268
|
"review-phrase": { tier: "review", label: "review tier" },
|
|
2263
2269
|
"ai-vocabulary": { tier: "review", label: "AI vocabulary" },
|
|
2264
2270
|
"stock-phrase": { tier: "review", label: "stock phrase" },
|
|
@@ -2270,9 +2276,6 @@ var HOUSE = {
|
|
|
2270
2276
|
"vague-attribution": { tier: "review", label: "unnamed source" },
|
|
2271
2277
|
"closing-summary": { tier: "review", label: "closing summary" },
|
|
2272
2278
|
"false-range": { tier: "review", label: "false range" },
|
|
2273
|
-
// The first candidate for block: evidence of a pasted chat reply, not a
|
|
2274
|
-
// matter of style. Blocks once its estate hits have been read (ROADMAP.md).
|
|
2275
|
-
"chatbot-residue": { tier: "review", label: "chatbot residue" },
|
|
2276
2279
|
"placeholder": { tier: "review", label: "unfilled placeholder" },
|
|
2277
2280
|
"question-reveal": { tier: "review", label: "staged reveal" },
|
|
2278
2281
|
"inline-label-list": { tier: "review", label: "bold-label bullets" },
|
|
@@ -2640,7 +2643,7 @@ var RENDERED_PATHS = {
|
|
|
2640
2643
|
};
|
|
2641
2644
|
|
|
2642
2645
|
// src/character/check.ts
|
|
2643
|
-
var CATALOGUE_VERSION = "2026.09.
|
|
2646
|
+
var CATALOGUE_VERSION = "2026.09.7";
|
|
2644
2647
|
var CATALOGUE = [...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map(
|
|
2645
2648
|
(t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t
|
|
2646
2649
|
);
|
|
@@ -3,18 +3,18 @@ import {
|
|
|
3
3
|
hueName,
|
|
4
4
|
loadNull,
|
|
5
5
|
shapeName
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-VKQDOUHO.js";
|
|
7
7
|
import {
|
|
8
8
|
parseFlags
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-YLQE35PN.js";
|
|
10
10
|
import {
|
|
11
11
|
fingerprint,
|
|
12
12
|
fingerprintDistance
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-EHNEGKFR.js";
|
|
14
14
|
import {
|
|
15
15
|
SNAPSHOT_VERSION,
|
|
16
16
|
auditSnapshot
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
18
18
|
|
|
19
19
|
// src/estate/cli.ts
|
|
20
20
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -92,7 +92,7 @@ async function snapshotOf(target, cwd) {
|
|
|
92
92
|
return snap;
|
|
93
93
|
}
|
|
94
94
|
if (!/^https?:\/\//.test(target)) throw new Error(`${target} is neither a URL, a snapshot file, nor a site in the register`);
|
|
95
|
-
const { snapshotUrl } = await import("./audit-
|
|
95
|
+
const { snapshotUrl } = await import("./audit-5P65UMFL.js");
|
|
96
96
|
return snapshotUrl(target);
|
|
97
97
|
}
|
|
98
98
|
var line = (distance, sibling, shared) => `${distance.toFixed(2)}${sibling ? " SIBLING" : ""}${shared.length ? ` shares ${shared.join(", ")}` : ""}`;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
fingerprint
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EHNEGKFR.js";
|
|
4
4
|
import {
|
|
5
5
|
SNAPSHOT_VERSION,
|
|
6
6
|
auditSnapshot
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
8
8
|
|
|
9
9
|
// src/audit/collect.ts
|
|
10
10
|
function collectInPage() {
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
snapshotUrl
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BYY32NIN.js";
|
|
4
4
|
import {
|
|
5
5
|
describeTypicality,
|
|
6
6
|
loadNull,
|
|
7
7
|
typicality
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VKQDOUHO.js";
|
|
9
9
|
import {
|
|
10
10
|
SOURCE_FILE,
|
|
11
11
|
finish,
|
|
12
12
|
loadExceptions,
|
|
13
13
|
parseFlags,
|
|
14
14
|
readPaths
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-YLQE35PN.js";
|
|
16
16
|
import {
|
|
17
17
|
fingerprint
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-EHNEGKFR.js";
|
|
19
19
|
import {
|
|
20
20
|
SNAPSHOT_VERSION,
|
|
21
21
|
auditSnapshot,
|
|
22
22
|
scanSource
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
24
24
|
|
|
25
25
|
// src/audit/cli.ts
|
|
26
26
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseFlags
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YLQE35PN.js";
|
|
4
4
|
import {
|
|
5
5
|
fingerprint,
|
|
6
6
|
fingerprintDistance
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EHNEGKFR.js";
|
|
8
8
|
import {
|
|
9
9
|
CATALOGUE_VERSION,
|
|
10
10
|
REFLEX_FONTS_1,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
isCream,
|
|
19
19
|
oklchToRgb,
|
|
20
20
|
scanSource
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
22
22
|
|
|
23
23
|
// src/null/cli.ts
|
|
24
24
|
import { spawn } from "child_process";
|
|
@@ -352,7 +352,7 @@ async function build(flags, io) {
|
|
|
352
352
|
const toShoot = ids.filter((id) => existsSync(join(pages, `${id}.html`)) && !existsSync(join(shots, `${id}.json`)));
|
|
353
353
|
if (toShoot.length) {
|
|
354
354
|
io.out(`craft null: snapshotting ${toShoot.length} page${toShoot.length === 1 ? "" : "s"}`);
|
|
355
|
-
const { snapshotUrls } = await import("./audit-
|
|
355
|
+
const { snapshotUrls } = await import("./audit-5P65UMFL.js");
|
|
356
356
|
const results = await snapshotUrls(toShoot.map((id) => pathToFileURL(join(pages, `${id}.html`)).href));
|
|
357
357
|
results.forEach((r, i) => {
|
|
358
358
|
const id = toShoot[i];
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
fileKind,
|
|
9
9
|
houseRule,
|
|
10
10
|
scanSource
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
12
12
|
|
|
13
13
|
// src/character/cli.ts
|
|
14
14
|
import { execFileSync } from "child_process";
|
|
@@ -274,25 +274,25 @@ var NOT_COPY_DIR = (name) => name.startsWith("_");
|
|
|
274
274
|
function run(argv, io) {
|
|
275
275
|
const [command, ...rest] = argv;
|
|
276
276
|
if (command === "direction") {
|
|
277
|
-
return import("./cli-
|
|
277
|
+
return import("./cli-3XPEGBUR.js").then((m) => m.runDirection(rest, io));
|
|
278
278
|
}
|
|
279
279
|
if (command === "report" || command === "retrofit") {
|
|
280
|
-
return import("./cli-
|
|
280
|
+
return import("./cli-V55MTIOP.js").then((m) => m.runReport(command, rest, io));
|
|
281
281
|
}
|
|
282
282
|
if (command === "estate") {
|
|
283
|
-
return import("./cli-
|
|
283
|
+
return import("./cli-J7C6TI2B.js").then((m) => m.runEstate(rest, io));
|
|
284
284
|
}
|
|
285
285
|
if (command === "null") {
|
|
286
|
-
return import("./cli-
|
|
286
|
+
return import("./cli-4VAOH7ST.js").then((m) => m.runNull(rest, io));
|
|
287
287
|
}
|
|
288
288
|
if (command === "tells" && rest[0] === "harvest") {
|
|
289
|
-
return import("./cli-
|
|
289
|
+
return import("./cli-4VAOH7ST.js").then((m) => m.runHarvest(rest, io)).catch((error) => {
|
|
290
290
|
io.err(`craft: ${error.message}`);
|
|
291
291
|
return 2;
|
|
292
292
|
});
|
|
293
293
|
}
|
|
294
294
|
if (command === "snapshot" || command === "audit") {
|
|
295
|
-
return import("./cli-
|
|
295
|
+
return import("./cli-WDSVVHKG.js").then((m) => m.runAudit(command, rest, io));
|
|
296
296
|
}
|
|
297
297
|
if (!command || command === "help" || command === "--help" || command === "-h") {
|
|
298
298
|
io.out(HELP);
|
|
@@ -919,6 +919,9 @@ var RESIDUE = [
|
|
|
919
919
|
// which survive a copy and paste into a CMS: found live, 2026-09-23.
|
|
920
920
|
/[\uE200-\uE2FF]*(?:cite)?[\uE200-\uE2FF]*(?:turn\d+(?:search|news|view|fetch|file|image)\d+[\uE200-\uE2FF]*)+/,
|
|
921
921
|
/:?contentReference\[oaicite:\d+\](?:\{index=\d+\})?/,
|
|
922
|
+
// Entity markers from the same paste: entity["company","Bark","services
|
|
923
|
+
// marketplace"] shows on the page where the plain name "Bark" belongs.
|
|
924
|
+
/[\uE200-\uE2FF]*entity[\uE200-\uE2FF]*\["[a-z_]+"\s*,\s*"[^"\n]{1,80}"(?:\s*,\s*"[^"\n]{0,160}")*\][\uE200-\uE2FF]*/,
|
|
922
925
|
/【\d+(?:[:†][^】]{0,40})?】/
|
|
923
926
|
];
|
|
924
927
|
var AI_UTM = /utm_source=(?:chatgpt\.com|chat\.openai\.com|openai|perplexity(?:\.ai)?|claude\.ai|copilot(?:\.microsoft\.com)?|gemini(?:\.google\.com)?)\b/gi;
|
|
@@ -2626,6 +2629,9 @@ var HOUSE = {
|
|
|
2626
2629
|
"plain-english": { tier: "block", label: 'use "properly explained"' },
|
|
2627
2630
|
buzzword: { tier: "block", label: "forbidden phrase" },
|
|
2628
2631
|
"negative-reassurance": { tier: "block", label: "negative reassurance, say what they get" },
|
|
2632
|
+
// Evidence of a pasted chat reply, not a matter of style. Moved from review
|
|
2633
|
+
// on 2026-09-24 after its estate hits were read (ROADMAP.md): 15 of 15 real.
|
|
2634
|
+
"chatbot-residue": { tier: "block", label: "chatbot residue. A chat reply was pasted in: remove it, and source or cut the claim it backed" },
|
|
2629
2635
|
"review-phrase": { tier: "review", label: "review tier" },
|
|
2630
2636
|
"ai-vocabulary": { tier: "review", label: "AI vocabulary" },
|
|
2631
2637
|
"stock-phrase": { tier: "review", label: "stock phrase" },
|
|
@@ -2637,9 +2643,6 @@ var HOUSE = {
|
|
|
2637
2643
|
"vague-attribution": { tier: "review", label: "unnamed source" },
|
|
2638
2644
|
"closing-summary": { tier: "review", label: "closing summary" },
|
|
2639
2645
|
"false-range": { tier: "review", label: "false range" },
|
|
2640
|
-
// The first candidate for block: evidence of a pasted chat reply, not a
|
|
2641
|
-
// matter of style. Blocks once its estate hits have been read (ROADMAP.md).
|
|
2642
|
-
"chatbot-residue": { tier: "review", label: "chatbot residue" },
|
|
2643
2646
|
"placeholder": { tier: "review", label: "unfilled placeholder" },
|
|
2644
2647
|
"question-reveal": { tier: "review", label: "staged reveal" },
|
|
2645
2648
|
"inline-label-list": { tier: "review", label: "bold-label bullets" },
|
|
@@ -2989,7 +2992,7 @@ var RENDERED_PATHS = {
|
|
|
2989
2992
|
};
|
|
2990
2993
|
|
|
2991
2994
|
// src/character/check.ts
|
|
2992
|
-
var CATALOGUE_VERSION = "2026.09.
|
|
2995
|
+
var CATALOGUE_VERSION = "2026.09.7";
|
|
2993
2996
|
var CATALOGUE = [...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map(
|
|
2994
2997
|
(t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t
|
|
2995
2998
|
);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DIRECTION_VERSION,
|
|
3
3
|
validateDirection
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JRMU6GYX.js";
|
|
5
5
|
import {
|
|
6
6
|
parseFlags
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-YLQE35PN.js";
|
|
8
8
|
import {
|
|
9
9
|
fingerprint
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-EHNEGKFR.js";
|
|
11
11
|
import {
|
|
12
12
|
deltaEOk,
|
|
13
13
|
formatHex,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
isCream,
|
|
17
17
|
oklchToRgb,
|
|
18
18
|
parseColour
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
20
20
|
|
|
21
21
|
// src/direction/cli.ts
|
|
22
22
|
import { existsSync, readdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
nullPath,
|
|
7
7
|
runHarvest,
|
|
8
8
|
runNull
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-VKQDOUHO.js";
|
|
10
|
+
import "./chunk-YLQE35PN.js";
|
|
11
|
+
import "./chunk-EHNEGKFR.js";
|
|
12
|
+
import "./chunk-ZT3WLN7R.js";
|
|
13
13
|
export {
|
|
14
14
|
describeTypicality,
|
|
15
15
|
formatHarvest,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatMatches,
|
|
3
|
+
formatPairs,
|
|
4
|
+
loadEstate,
|
|
5
|
+
runEstate
|
|
6
|
+
} from "./chunk-5LI2VFN5.js";
|
|
7
|
+
import "./chunk-VKQDOUHO.js";
|
|
8
|
+
import "./chunk-YLQE35PN.js";
|
|
9
|
+
import "./chunk-EHNEGKFR.js";
|
|
10
|
+
import "./chunk-ZT3WLN7R.js";
|
|
11
|
+
export {
|
|
12
|
+
formatMatches,
|
|
13
|
+
formatPairs,
|
|
14
|
+
loadEstate,
|
|
15
|
+
runEstate
|
|
16
|
+
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
validateDirection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JRMU6GYX.js";
|
|
4
4
|
import {
|
|
5
5
|
merge
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-DAENYJUO.js";
|
|
7
|
+
import "./chunk-BYY32NIN.js";
|
|
8
8
|
import {
|
|
9
9
|
SIBLING_AT,
|
|
10
10
|
compareToEstate,
|
|
11
11
|
loadEstate
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-5LI2VFN5.js";
|
|
13
13
|
import {
|
|
14
14
|
loadNull,
|
|
15
15
|
typicality
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-VKQDOUHO.js";
|
|
17
17
|
import {
|
|
18
18
|
COPY_FILE,
|
|
19
19
|
NOT_COPY_DIR,
|
|
@@ -21,17 +21,17 @@ import {
|
|
|
21
21
|
loadExceptions,
|
|
22
22
|
parseFlags,
|
|
23
23
|
readPaths
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-YLQE35PN.js";
|
|
25
25
|
import {
|
|
26
26
|
fingerprint
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-EHNEGKFR.js";
|
|
28
28
|
import {
|
|
29
29
|
CATALOGUE,
|
|
30
30
|
SNAPSHOT_VERSION,
|
|
31
31
|
auditSnapshot,
|
|
32
32
|
checkCopy,
|
|
33
33
|
scanSource
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-ZT3WLN7R.js";
|
|
35
35
|
|
|
36
36
|
// src/report/cli.ts
|
|
37
37
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -259,7 +259,7 @@ async function runReport(command, args, io) {
|
|
|
259
259
|
snap = JSON.parse(readFileSync(local, "utf8"));
|
|
260
260
|
if (snap.version !== SNAPSHOT_VERSION) throw new Error(`${target2} is not a snapshot`);
|
|
261
261
|
} else {
|
|
262
|
-
const { snapshotUrl } = await import("./audit-
|
|
262
|
+
const { snapshotUrl } = await import("./audit-5P65UMFL.js");
|
|
263
263
|
snap = await snapshotUrl(target2);
|
|
264
264
|
}
|
|
265
265
|
const fp = fingerprint(snap);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
describeFingerprint,
|
|
3
|
+
merge,
|
|
4
|
+
runAudit
|
|
5
|
+
} from "./chunk-DAENYJUO.js";
|
|
6
|
+
import "./chunk-BYY32NIN.js";
|
|
7
|
+
import "./chunk-VKQDOUHO.js";
|
|
8
|
+
import "./chunk-YLQE35PN.js";
|
|
9
|
+
import "./chunk-EHNEGKFR.js";
|
|
10
|
+
import "./chunk-ZT3WLN7R.js";
|
|
11
|
+
export {
|
|
12
|
+
describeFingerprint,
|
|
13
|
+
merge,
|
|
14
|
+
runAudit
|
|
15
|
+
};
|
package/dist/cli.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1985,6 +1985,9 @@ var RESIDUE = [
|
|
|
1985
1985
|
// which survive a copy and paste into a CMS: found live, 2026-09-23.
|
|
1986
1986
|
/[\uE200-\uE2FF]*(?:cite)?[\uE200-\uE2FF]*(?:turn\d+(?:search|news|view|fetch|file|image)\d+[\uE200-\uE2FF]*)+/,
|
|
1987
1987
|
/:?contentReference\[oaicite:\d+\](?:\{index=\d+\})?/,
|
|
1988
|
+
// Entity markers from the same paste: entity["company","Bark","services
|
|
1989
|
+
// marketplace"] shows on the page where the plain name "Bark" belongs.
|
|
1990
|
+
/[\uE200-\uE2FF]*entity[\uE200-\uE2FF]*\["[a-z_]+"\s*,\s*"[^"\n]{1,80}"(?:\s*,\s*"[^"\n]{0,160}")*\][\uE200-\uE2FF]*/,
|
|
1988
1991
|
/【\d+(?:[:†][^】]{0,40})?】/
|
|
1989
1992
|
];
|
|
1990
1993
|
var AI_UTM = /utm_source=(?:chatgpt\.com|chat\.openai\.com|openai|perplexity(?:\.ai)?|claude\.ai|copilot(?:\.microsoft\.com)?|gemini(?:\.google\.com)?)\b/gi;
|
|
@@ -3616,6 +3619,9 @@ var HOUSE = {
|
|
|
3616
3619
|
"plain-english": { tier: "block", label: 'use "properly explained"' },
|
|
3617
3620
|
buzzword: { tier: "block", label: "forbidden phrase" },
|
|
3618
3621
|
"negative-reassurance": { tier: "block", label: "negative reassurance, say what they get" },
|
|
3622
|
+
// Evidence of a pasted chat reply, not a matter of style. Moved from review
|
|
3623
|
+
// on 2026-09-24 after its estate hits were read (ROADMAP.md): 15 of 15 real.
|
|
3624
|
+
"chatbot-residue": { tier: "block", label: "chatbot residue. A chat reply was pasted in: remove it, and source or cut the claim it backed" },
|
|
3619
3625
|
"review-phrase": { tier: "review", label: "review tier" },
|
|
3620
3626
|
"ai-vocabulary": { tier: "review", label: "AI vocabulary" },
|
|
3621
3627
|
"stock-phrase": { tier: "review", label: "stock phrase" },
|
|
@@ -3627,9 +3633,6 @@ var HOUSE = {
|
|
|
3627
3633
|
"vague-attribution": { tier: "review", label: "unnamed source" },
|
|
3628
3634
|
"closing-summary": { tier: "review", label: "closing summary" },
|
|
3629
3635
|
"false-range": { tier: "review", label: "false range" },
|
|
3630
|
-
// The first candidate for block: evidence of a pasted chat reply, not a
|
|
3631
|
-
// matter of style. Blocks once its estate hits have been read (ROADMAP.md).
|
|
3632
|
-
"chatbot-residue": { tier: "review", label: "chatbot residue" },
|
|
3633
3636
|
"placeholder": { tier: "review", label: "unfilled placeholder" },
|
|
3634
3637
|
"question-reveal": { tier: "review", label: "staged reveal" },
|
|
3635
3638
|
"inline-label-list": { tier: "review", label: "bold-label bullets" },
|
|
@@ -4313,7 +4316,7 @@ var RENDERED_PATHS = {
|
|
|
4313
4316
|
};
|
|
4314
4317
|
|
|
4315
4318
|
// src/character/check.ts
|
|
4316
|
-
var CATALOGUE_VERSION = "2026.09.
|
|
4319
|
+
var CATALOGUE_VERSION = "2026.09.7";
|
|
4317
4320
|
var CATALOGUE = [...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map(
|
|
4318
4321
|
(t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t
|
|
4319
4322
|
);
|
package/dist/index.d.cts
CHANGED
|
@@ -1031,7 +1031,7 @@ interface CheckReport {
|
|
|
1031
1031
|
* Bumped whenever an entry is added, removed or its detection changes, so a
|
|
1032
1032
|
* report can say which list it was judged against.
|
|
1033
1033
|
*/
|
|
1034
|
-
declare const CATALOGUE_VERSION = "2026.09.
|
|
1034
|
+
declare const CATALOGUE_VERSION = "2026.09.7";
|
|
1035
1035
|
declare const CATALOGUE: readonly Tell[];
|
|
1036
1036
|
declare function tellById(id: string): Tell | undefined;
|
|
1037
1037
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -1031,7 +1031,7 @@ interface CheckReport {
|
|
|
1031
1031
|
* Bumped whenever an entry is added, removed or its detection changes, so a
|
|
1032
1032
|
* report can say which list it was judged against.
|
|
1033
1033
|
*/
|
|
1034
|
-
declare const CATALOGUE_VERSION = "2026.09.
|
|
1034
|
+
declare const CATALOGUE_VERSION = "2026.09.7";
|
|
1035
1035
|
declare const CATALOGUE: readonly Tell[];
|
|
1036
1036
|
declare function tellById(id: string): Tell | undefined;
|
|
1037
1037
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1835,6 +1835,9 @@ var RESIDUE = [
|
|
|
1835
1835
|
// which survive a copy and paste into a CMS: found live, 2026-09-23.
|
|
1836
1836
|
/[\uE200-\uE2FF]*(?:cite)?[\uE200-\uE2FF]*(?:turn\d+(?:search|news|view|fetch|file|image)\d+[\uE200-\uE2FF]*)+/,
|
|
1837
1837
|
/:?contentReference\[oaicite:\d+\](?:\{index=\d+\})?/,
|
|
1838
|
+
// Entity markers from the same paste: entity["company","Bark","services
|
|
1839
|
+
// marketplace"] shows on the page where the plain name "Bark" belongs.
|
|
1840
|
+
/[\uE200-\uE2FF]*entity[\uE200-\uE2FF]*\["[a-z_]+"\s*,\s*"[^"\n]{1,80}"(?:\s*,\s*"[^"\n]{0,160}")*\][\uE200-\uE2FF]*/,
|
|
1838
1841
|
/【\d+(?:[:†][^】]{0,40})?】/
|
|
1839
1842
|
];
|
|
1840
1843
|
var AI_UTM = /utm_source=(?:chatgpt\.com|chat\.openai\.com|openai|perplexity(?:\.ai)?|claude\.ai|copilot(?:\.microsoft\.com)?|gemini(?:\.google\.com)?)\b/gi;
|
|
@@ -3466,6 +3469,9 @@ var HOUSE = {
|
|
|
3466
3469
|
"plain-english": { tier: "block", label: 'use "properly explained"' },
|
|
3467
3470
|
buzzword: { tier: "block", label: "forbidden phrase" },
|
|
3468
3471
|
"negative-reassurance": { tier: "block", label: "negative reassurance, say what they get" },
|
|
3472
|
+
// Evidence of a pasted chat reply, not a matter of style. Moved from review
|
|
3473
|
+
// on 2026-09-24 after its estate hits were read (ROADMAP.md): 15 of 15 real.
|
|
3474
|
+
"chatbot-residue": { tier: "block", label: "chatbot residue. A chat reply was pasted in: remove it, and source or cut the claim it backed" },
|
|
3469
3475
|
"review-phrase": { tier: "review", label: "review tier" },
|
|
3470
3476
|
"ai-vocabulary": { tier: "review", label: "AI vocabulary" },
|
|
3471
3477
|
"stock-phrase": { tier: "review", label: "stock phrase" },
|
|
@@ -3477,9 +3483,6 @@ var HOUSE = {
|
|
|
3477
3483
|
"vague-attribution": { tier: "review", label: "unnamed source" },
|
|
3478
3484
|
"closing-summary": { tier: "review", label: "closing summary" },
|
|
3479
3485
|
"false-range": { tier: "review", label: "false range" },
|
|
3480
|
-
// The first candidate for block: evidence of a pasted chat reply, not a
|
|
3481
|
-
// matter of style. Blocks once its estate hits have been read (ROADMAP.md).
|
|
3482
|
-
"chatbot-residue": { tier: "review", label: "chatbot residue" },
|
|
3483
3486
|
"placeholder": { tier: "review", label: "unfilled placeholder" },
|
|
3484
3487
|
"question-reveal": { tier: "review", label: "staged reveal" },
|
|
3485
3488
|
"inline-label-list": { tier: "review", label: "bold-label bullets" },
|
|
@@ -4163,7 +4166,7 @@ var RENDERED_PATHS = {
|
|
|
4163
4166
|
};
|
|
4164
4167
|
|
|
4165
4168
|
// src/character/check.ts
|
|
4166
|
-
var CATALOGUE_VERSION = "2026.09.
|
|
4169
|
+
var CATALOGUE_VERSION = "2026.09.7";
|
|
4167
4170
|
var CATALOGUE = [...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map(
|
|
4168
4171
|
(t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t
|
|
4169
4172
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@domandigital/craft",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "The Doman Digital house craft standard as numbers: OKLCh colour ramps that snap to existing anchors, derived semantic tokens with measured WCAG and APCA contrast, one shared motion vocabulary for CSS and JS, and a base stylesheet. Zero dependencies.",
|
|
6
6
|
"license": "Apache-2.0",
|
package/word-lists.json
CHANGED
package/dist/cli-FKJOMOOF.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
describeFingerprint,
|
|
3
|
-
merge,
|
|
4
|
-
runAudit
|
|
5
|
-
} from "./chunk-35OX6C4H.js";
|
|
6
|
-
import "./chunk-Q4MN3OXF.js";
|
|
7
|
-
import "./chunk-K253ZXB3.js";
|
|
8
|
-
import "./chunk-X65RDW65.js";
|
|
9
|
-
import "./chunk-OGSYVCMU.js";
|
|
10
|
-
import "./chunk-CZHRNPDD.js";
|
|
11
|
-
export {
|
|
12
|
-
describeFingerprint,
|
|
13
|
-
merge,
|
|
14
|
-
runAudit
|
|
15
|
-
};
|
package/dist/cli-SHLNRHK6.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
formatMatches,
|
|
3
|
-
formatPairs,
|
|
4
|
-
loadEstate,
|
|
5
|
-
runEstate
|
|
6
|
-
} from "./chunk-OVOH7KZY.js";
|
|
7
|
-
import "./chunk-K253ZXB3.js";
|
|
8
|
-
import "./chunk-X65RDW65.js";
|
|
9
|
-
import "./chunk-OGSYVCMU.js";
|
|
10
|
-
import "./chunk-CZHRNPDD.js";
|
|
11
|
-
export {
|
|
12
|
-
formatMatches,
|
|
13
|
-
formatPairs,
|
|
14
|
-
loadEstate,
|
|
15
|
-
runEstate
|
|
16
|
-
};
|