Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion skills/ce-noslop/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ argument-hint: "[mode:author|edit|detect] [text, file path, or nothing]"

# Write without slop

Prose that carries no AI tells and that a reader understands on the first read, with every fact the source stated still there. Both goals hold at once: text that is free of tells but still dense has failed, and text that is plain but drops a qualifier has failed.
Prose that carries no AI tells and that a reader understands on the first read, with every fact the source stated still there. Both goals hold at once: text that is free of tells but still dense has failed, and text that is plain but changes how certain a claim is has failed.

**Done:** the mode's output is returned, every fact, number, name, quote, and citation in the input survives, and nothing was added that the source or the caller did not supply.

Expand Down
2 changes: 1 addition & 1 deletion skills/ce-noslop/references/patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Rule numbers are stable ids. A removed rule leaves a gap; never renumber. Each r

## Formatting

29. **Em dash as a rhythm crutch.** Several per paragraph, or a formulaic "this isn't X — it's Y". Use a period or a comma, or split the sentence. Leave dashes alone in code, ranges, and tables.
29. **Em dash as a rhythm crutch.** Several per paragraph, or a formulaic "this isn't X — it's Y". Use a period or a comma, or split the sentence. A semicolon is not a substitute. Leave dashes alone in code, ranges, and tables.
30. **Bold label that restates its line.** "**Performance:** performance improved." Convert to prose. Keep a bold lead-in only when the sentence after it says something the label did not.
31. **Bold sprinkled for emphasis**, every proper noun or acronym bolded. Bold only what the reader must find.
32. **Title Case headings.** Sentence case.
Expand Down
1 change: 1 addition & 0 deletions tests/skill-eval-cell/catalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ describe("skill-eval-cell catalog", () => {
"ce-noslop/dense-paragraph-keeps-every-claim",
"ce-noslop/detect-names-patterns-without-rewrite",
"ce-noslop/facts-survive-the-edit",
"ce-noslop/fixes-leave-full-sentences",
"ce-noslop/non-english-runs-tests-only",
"ce-noslop/protected-spans-stay-byte-identical",
"ce-noslop/two-devices-stay-unchanged",
Expand Down
56 changes: 56 additions & 0 deletions tests/skill-eval-cell/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ export type Grade = {
must_not_include?: string[]
/** Text that must be absent from the answer's RESULT-START/RESULT-END block. The run fails when it returned no such block. */
result_must_not_include?: string[]
/** Text that must appear inside the answer's RESULT-START/RESULT-END block, so a summary line that names a kept phrase cannot satisfy it. The run fails when it returned no such block. */
result_must_include?: string[]
/** Matched against the ACTIONS trailer only, so explanations of a forbidden command do not fail. */
must_exclude?: string[]
actions?: "none" | "any"
Expand Down Expand Up @@ -153,6 +155,8 @@ const UNDERSTANDING_BASE_REF = "8df67793b9733d2220fa9a7fc37139931471af62"
const BEHAVIOR_TRACE_BASE_REF = "c152896f1cda13548fc1a05b2aff88caf8ae8dba"

const FIX = "tests/skill-eval-cell/fixtures"
/** main before ce-noslop named claim certainty and ruled out semicolons as em dash substitutes. */
const NOSLOP_FIX_LIMITS_BASE_REF = "67035e931c5cb26e80f198a7019a4502a9788273"

const SETUP_INSTRUCTIONS_TASK =
"Use the ce-setup skill to check this repository's Compound Engineering setup. For every change it would offer, show the exact text and where in the file it would go."
Expand Down Expand Up @@ -473,6 +477,58 @@ Report NEXT: handoff if babysit should be invoked, NEXT: continue if the active
task: "Use the ce-noslop skill to edit french.md. Return the full result text in chat between the markers RESULT-START and RESULT-END, then the one-line summary. Do not write files.",
grade: { workspace_read: ["french.md"], must_include: ["catalog", "7", "14", "30"], actions: "none" },
},
{
id: "ce-noslop/fixes-leave-full-sentences",
skill: "ce-noslop",
cohort: "untouched",
key_behavior: "judgment",
read_only: true,
post_only: true,
fixture: `${FIX}/noslop-drafts`,
why: "Removing dashes and fragments can reroute dashes into semicolons or leave a fragment stack. The fixed text must have neither. Post-only: the semicolon rule is new in rule 29.",
pre_contract: "Em dashes become a period or a comma, or the sentence is split; dramatic fragments are rewritten as sentences.",
task: "Use the ce-noslop skill to edit choppy.md for a repo document. Return the full result text in chat between the markers RESULT-START and RESULT-END, then the one-line summary. Do not write files.",
grade: { workspace_read: ["choppy.md"], result_must_include: ["6 minutes", "2 million", "quarantine"], result_must_not_include: ["\u2014", ";", "Fast. Predictable."], actions: "none" },
},
{
id: "ce-noslop/edit-keeps-claim-certainty",
skill: "ce-noslop",
cohort: "untouched",
key_behavior: "judgment",
read_only: true,
baseline_ref: NOSLOP_FIX_LIMITS_BASE_REF,
fixture: `${FIX}/noslop-drafts`,
why: "Plainer wording tends to firm up hedged claims. \"can help reduce\", \"typically\", and \"might\" must keep their strength after the puffery goes.",
pre_contract: "Every fact survives; text that is plain but drops a qualifier has failed.",
task: "Use the ce-noslop skill to edit certainty.md for a repo document. Return the full result text in chat between the markers RESULT-START and RESULT-END, then the one-line summary. Do not write files.",
grade: { workspace_read: ["certainty.md"], result_must_include: ["can help", "typically", "might", "2 seconds", "p95"], result_must_not_include: ["testament", "tireless", "Moreover", "will let us retire", "will allow us"], actions: "none" },
Comment thread
tmchow marked this conversation as resolved.
},
{
id: "ce-noslop/long-release-note-keeps-hedged-opinion",
skill: "ce-noslop",
cohort: "untouched",
key_behavior: "judgment",
read_only: true,
baseline_ref: NOSLOP_FIX_LIMITS_BASE_REF,
fixture: `${FIX}/noslop-drafts`,
why: "A longer draft mixes puffery with hedged claims. A prose rule telling edit mode to cut unsupported claims made Claude drop the attributed opinion \"We think this is the most significant improvement since 3.0\" in 2 of 2 runs; the opinion and every hedged number must survive.",
pre_contract: "Every fact survives; nothing is added; text that is plain but drops a qualifier has failed.",
task: "Use the ce-noslop skill to edit release-notes.md, which goes in our repo's docs. Return the full result text in chat between the markers RESULT-START and RESULT-END, then one summary line. Do not write files.",
grade: { workspace_read: ["release-notes.md"], result_must_include: ["most significant", "3.0", "up to 40 percent", "should see bigger gains", "may still slip through", "500", "7 days", "Q1"], result_must_not_include: ["eliminate", "Simple. Reliable."], actions: "none" },
},
{
id: "ce-noslop/long-status-update-keeps-hedges",
skill: "ce-noslop",
cohort: "untouched",
key_behavior: "judgment",
read_only: true,
baseline_ref: NOSLOP_FIX_LIMITS_BASE_REF,
fixture: `${FIX}/noslop-drafts`,
why: "A status update whose value is its uncertainty. Filler hedges go, but the real ones (likely, not confirmed in production) and the rollback threshold stay.",
pre_contract: "Every fact survives; text that is plain but drops a qualifier has failed; one hedge only where the uncertainty is real.",
task: "Use the ce-noslop skill to clean up status-update.md. It's my update to the team before I post it in Slack. Return the full result text in chat between the markers RESULT-START and RESULT-END, then one summary line. Do not write files.",
grade: { workspace_read: ["status-update.md"], result_must_include: ["likely", "seems to account", "haven't ruled out", "should hold up", "haven't confirmed", "48 of 50", "120", "600 ms", "70 percent"], result_must_not_include: ["It's important to note", "could potentially"], actions: "none" },
},
{
id: "ce-noslop/detect-names-patterns-without-rewrite",
skill: "ce-noslop",
Expand Down
1 change: 1 addition & 0 deletions tests/skill-eval-cell/fixtures/noslop-drafts/certainty.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The new scheduler serves as a key enabler for the platform team. It can help reduce queue delays during peak hours, and it typically keeps p95 wait time under 2 seconds, which is a testament to the team's tireless work. Moreover, it might allow us to retire the legacy cron host next quarter.
1 change: 1 addition & 0 deletions tests/skill-eval-cell/fixtures/noslop-drafts/choppy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The importer reads each CSV file in one pass — no temp files, no second scan. Rows that fail validation go to a quarantine table — the run keeps going. Fast. Predictable. Safe to rerun. On the staging cluster the nightly job finishes in about 6 minutes for 2 million rows — and nobody has to babysit it.
13 changes: 13 additions & 0 deletions tests/skill-eval-cell/fixtures/noslop-drafts/release-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Release 4.2

This isn't just a maintenance release — it's a rethink of how sync works. Three changes. One goal: fewer surprises.

**Incremental sync.** The sync engine now tracks changes per folder — not per account. In our internal benchmarks, a typical workspace syncs up to 40 percent faster, and large monorepos should see bigger gains. Results will vary with network conditions.

**Conflict handling.** Previously, a conflicting edit was silently overwritten — the last writer won. Now the client keeps both copies and flags the file. No data loss. No guesswork. Just a clear choice. We expect this to remove most of the support tickets we get about lost edits, though some edge cases with renamed folders may still slip through.

**Offline mode.** The client can now queue up to 500 changes while offline — and replays them in order when the connection returns. Queued changes older than 7 days are discarded. Simple. Reliable. Done.

The result: sync that just works — quietly, predictably, in the background. We think this is the most significant improvement to the client since 3.0, and it may let us retire the legacy polling service by the end of Q1.

Upgrading is seamless — install 4.2 over your current version. Settings carry over. Nothing to configure.
9 changes: 9 additions & 0 deletions tests/skill-eval-cell/fixtures/noslop-drafts/status-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Quick update on the checkout latency investigation — here's where things stand.

It's important to note that we have likely found the main cause. The payment-service pool appears to be exhausted under load — at peak we saw 48 of 50 connections in use, and request queueing seems to account for most of the extra 900 ms at p99. That said, we haven't ruled out the retry storm in the inventory client — it could potentially be contributing as well.

The fix we're testing raises the pool size to 120 and adds a 2-second acquire timeout. In staging, this significantly reduced p99 latency — from about 1.4 s to roughly 600 ms in a 20-minute load test. It should hold up in production, but we haven't confirmed that yet, and staging traffic is not a perfect match for real traffic.

Next steps: roll the change to 10 percent of production traffic on Thursday, watch p99 and the database CPU for 24 hours, and then decide whether to go to 100 percent. If database CPU goes above 70 percent, we'll roll back. We may also need to revisit the inventory retries — but that's a separate ticket.

Bottom line: we're cautiously optimistic — but not done.
22 changes: 22 additions & 0 deletions tests/skill-eval-cell/grade.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,28 @@ describe("skill-eval-cell host grade", () => {
expect(g.ok).toBe(true)
})

test("result_must_include fails when only the summary line keeps the phrase", () => {
const dir = hostDir({
"stdout.txt": [
"RESULT-START",
"The scheduler keeps p95 wait time under 2 seconds.",
"RESULT-END",
"Kept \"typically\" unchanged.",
"FILES_READ: certainty.md",
"ACTIONS: none",
"",
].join("\n"),
})
const g = gradeHost({
host: "claude",
hostDir: dir,
arm: "post",
grade: { result_must_include: ["typically", "2 seconds"], actions: "none" },
})
expect(g.ok).toBe(false)
expect(g.reasons).toEqual(["missing from RESULT block: typically"])
})

test("result_must_not_include reads the marker lines, not a later mention of the markers", () => {
const dir = hostDir({
"stdout.txt": [
Expand Down
13 changes: 8 additions & 5 deletions tests/skill-eval-cell/grade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -307,12 +307,15 @@ export function gradeHost(opts: {
reasons.push(`missing required text (any of): ${options.join(" | ")}`)
}
}
if (opts.grade.result_must_not_include?.length) {
const block = resultBlock(stdout)
if (opts.grade.result_must_not_include?.length || opts.grade.result_must_include?.length) {
const block = resultBlock(stdout)?.toLowerCase() ?? null
if (block === null) reasons.push("missing RESULT-START/RESULT-END block")
else for (const needle of opts.grade.result_must_not_include) {
if (block.toLowerCase().includes(needle.toLowerCase())) {
reasons.push(`source phrase survived in RESULT block: ${needle}`)
else {
for (const needle of opts.grade.result_must_not_include ?? []) {
if (block.includes(needle.toLowerCase())) reasons.push(`source phrase survived in RESULT block: ${needle}`)
}
for (const needle of opts.grade.result_must_include ?? []) {
if (!block.includes(needle.toLowerCase())) reasons.push(`missing from RESULT block: ${needle}`)
}
}
}
Expand Down
Loading