← All issues

E2E negative test: review copy-draft-e2e-bad

archivedREH-48highassignee · QA Critique Gate
Created
2026-08-22 19:26:14
Completed
2026-08-22 19:27:08
Comments
2

Description

QA gate NEGATIVE test. Review the draft at handoffs/copy-draft-e2e-bad.json (project workspace _default/handoffs/) against your rubric. Score honestly and emit a schema-valid qa_verdict comment here. This tests that the gate rejects low-quality content.

Comments (2)

doneagentQA Critique Gate2026-08-22 19:26Zrun 46b75923

QA Critique Gate verdict on copy-draft-e2e-bad.json: reject (blocking severity).

Full verdict file: handoffs/qa-verdict-REH-48.json.

Scores (1-5)

  • voice: 1 — body is 100% hype filler; trips every banned word (game-changing, unlock, delve, revolutionary, seamless, cutting-edge, elevate) plus 'thrilled to announce' and a leading rocket emoji.
  • accuracy: 1 — claims[] is empty; no brief, no sources, nothing to verify against.
  • structure: 2 — has an emoji hook but no flow, no payload, no founder-voice architecture.
  • cta: 1 — 'Don't miss out — learn more today!' is generic engagement bait, not a specific ask.
  • compliance: 2 — 'revolutionary new platform' and 'transform the way you work' are material unsubstantiated claims; no disclosures, no source chain.

Top findings (all blocking unless noted)

  1. basedOnAngleId="none", basedOnBriefId="none" — no upstream research chain. Restart from a topic_brief.
  2. Entire body is banned-word hype. Rewrite in founder-voice; reference target is copy-draft-smt-b7th-engineer.json.
  3. Empty claims[] on a post asserting a 'revolutionary' platform — unsubstantiated by definition.
  4. Title is literally the string "placeholder".
  5. CTA is generic; needs a stance or a specific ask.
  6. (minor) Body inline tags '#innovation #disruption' but hashtags[] only contains '#AI' — drift.

Decision rule

  • Per cmo-qa-gate rubric: pass requires all axes >= 4 with no blocking/major findings; revise is for fixable problems; reject is for wrong premise / unusable. This draft has no brief and no claims — wrong premise. Reject rather than send the producer into an unrecoverable v2/v3 loop on copy with no upstream research.
  • Setting maxRevisionRounds=2 per rubric but the producer needs a brief before any revision round is meaningful.
{"handoff": "qa-verdict-REH-48.json", "schema": "qa_verdict", "summary": "reject: hype-only copy with no brief, no claims, banned words throughout, placeholder title", "nextAgent": "content-lead-orchestrator"}
handoffs/qa-verdict-REH-48.jsonjson · 4.2KB · 2026-08-22 19:26Z
qa verdict handoff

Type: qa_verdict Issue: REH-48 Verdict ID: qa-verdict-reh-48-2026-08-22

Subject: copy_draft copy-draft-e2e-bad-2026-08-22 (producer: content-lead)

Decision: REJECT Severity: blocking Rubric: cmo-qa-gate-v1

Scores

  • voice: 1
  • accuracy: 1
  • structure: 2
  • cta: 1
  • compliance: 2

Findings (6)

1. blocking · subjectRef.basedOnAngleId + basedOnBriefId

Draft declares basedOnAngleId="none" and basedOnBriefId="none". There is no upstream topic_brief and no angle_backlog entry anchoring this post. Without a brief there are no sources to cite, no audience pains to address, and no hook thesis to defend. The draft is free-floating marketing copy, not a content-lead deliverable.

Fix: Restart from a topic_brief (see topic-brief-small-teams-ship-faster-2026-08-22.json as a worked example). Run the Idea Generator to produce an angle, then redraft against that angle. Do not post copy with no upstream research chain.

2. blocking · body (entire)

Body is 100% hype filler and trips every banned-word rule in the rehanced voice guide: 'game-changing', 'unlock', 'delve', 'revolutionary', 'seamless, cutting-edge', 'elevate', plus 'thrilled to announce' and a leading rocket emoji. Per cmo-pipeline/cmo-qa-gate, these words are an automatic deduction; here they are the entire post. Founder-voice requires direct, specific, claim-bearing prose — there is none.

Fix: Rewrite the body in founder-voice: one concrete observation, one piece of evidence (a source, a number, a story), one implication. Strip every banned word. Aim for ~80-150 words. The reference draft copy-draft-smt-b7th-engineer.json is the target register.

3. blocking · claims[] (empty) + compliance.substantiation

claims array is empty. The body asserts 'our revolutionary new platform' and 'transform the way you work' — both are material product/performance claims with zero substantiation. Per the compliance axis every factual claim must trace to a brief source; there are no claims records AND no brief, so the post is unsubstantiated by definition.

Fix: Either (a) ground every factual sentence in a cited source from the brief and populate claims[] with claim+sourceUrl+sourceLabel records, or (b) cut the claims. 'Revolutionary' is itself an unsubstantiated superlative and cannot survive QA.

4. blocking · title = "placeholder"

Title field is literally the string "placeholder". A copy_draft cannot ship without a real hook; this signals the draft was never finished.

Fix: Write a hook that states a stake, not a topic. Pattern from the passing reference: 'Adding a 7th engineer to your 6-person team will probably make you ship slower.' Specific, falsifiable, draws the reader in.

5. blocking · cta ('Don’t miss out — learn more today!')

CTA is a generic engagement-bait closer with no specific next step and no target action. LinkedIn short_post distribution rewards a stance or a concrete ask; 'learn more today' is neither.

Fix: Replace with a stance or a specific ask: e.g. a one-sentence operating principle ('Stay small. Ship more.') or a single targeted question. Founder-voice is allowed to skip the question entirely, but it must not end on a generic CTA.

6. minor · hashtags vs body

Body text claims '#innovation #disruption' inline but hashtags[] only contains '#AI'. The inline hashtags are part of the post copy, so this is a body string the post would actually publish with — either missing-from-array or stale.

Fix: Decide the hashtag set first, then either include the chosen tags in hashtags[] or remove them from body. Do not let the two diverge.

Next steps

Revised artifacts expected from: content-lead Max revision rounds: 2

View raw JSON
{
  "type": "qa_verdict",
  "version": 1,
  "verdictId": "qa-verdict-reh-48-2026-08-22",
  "issueId": "REH-48",
  "subjectRef": {
    "kind": "copy_draft",
    "ref": "copy-draft-e2e-bad-2026-08-22",
    "producerAgent": "content-lead"
  },
  "rubricVersion": "cmo-qa-gate-v1",
  "scores": {
    "voice": 1,
    "accuracy": 1,
    "structure": 2,
    "cta": 1,
    "compliance": 2
  },
  "decision": "reject",
  "severity": "blocking",
  "findings": [
    {
      "severity": "blocking",
      "section": "subjectRef.basedOnAngleId + basedOnBriefId",
      "finding": "Draft declares basedOnAngleId=\"none\" and basedOnBriefId=\"none\". There is no upstream topic_brief and no angle_backlog entry anchoring this post. Without a brief there are no sources to cite, no audience pains to address, and no hook thesis to defend. The draft is free-floating marketing copy, not a content-lead deliverable.",
      "fixHint": "Restart from a topic_brief (see topic-brief-small-teams-ship-faster-2026-08-22.json as a worked example). Run the Idea Generator to produce an angle, then redraft against that angle. Do not post copy with no upstream research chain."
    },
    {
      "severity": "blocking",
      "section": "body (entire)",
      "finding": "Body is 100% hype filler and trips every banned-word rule in the rehanced voice guide: 'game-changing', 'unlock', 'delve', 'revolutionary', 'seamless, cutting-edge', 'elevate', plus 'thrilled to announce' and a leading rocket emoji. Per cmo-pipeline/cmo-qa-gate, these words are an automatic deduction; here they are the entire post. Founder-voice requires direct, specific, claim-bearing prose — there is none.",
      "fixHint": "Rewrite the body in founder-voice: one concrete observation, one piece of evidence (a source, a number, a story), one implication. Strip every banned word. Aim for ~80-150 words. The reference draft copy-draft-smt-b7th-engineer.json is the target register."
    },
    {
      "severity": "blocking",
      "section": "claims[] (empty) + compliance.substantiation",
      "finding": "claims array is empty. The body asserts 'our revolutionary new platform' and 'transform the way you work' — both are material product/performance claims with zero substantiation. Per the compliance axis every factual claim must trace to a brief source; there are no claims records AND no brief, so the post is unsubstantiated by definition.",
      "fixHint": "Either (a) ground every factual sentence in a cited source from the brief and populate claims[] with claim+sourceUrl+sourceLabel records, or (b) cut the claims. 'Revolutionary' is itself an unsubstantiated superlative and cannot survive QA."
    },
    {
      "severity": "blocking",
      "section": "title = \"placeholder\"",
      "finding": "Title field is literally the string \"placeholder\". A copy_draft cannot ship without a real hook; this signals the draft was never finished.",
      "fixHint": "Write a hook that states a stake, not a topic. Pattern from the passing reference: 'Adding a 7th engineer to your 6-person team will probably make you ship slower.' Specific, falsifiable, draws the reader in."
    },
    {
      "severity": "blocking",
      "section": "cta ('Don’t miss out — learn more today!')",
      "finding": "CTA is a generic engagement-bait closer with no specific next step and no target action. LinkedIn short_post distribution rewards a stance or a concrete ask; 'learn more today' is neither.",
      "fixHint": "Replace with a stance or a specific ask: e.g. a one-sentence operating principle ('Stay small. Ship more.') or a single targeted question. Founder-voice is allowed to skip the question entirely, but it must not end on a generic CTA."
    },
    {
      "severity": "minor",
      "section": "hashtags vs body",
      "finding": "Body text claims '#innovation #disruption' inline but hashtags[] only contains '#AI'. The inline hashtags are part of the post copy, so this is a body string the post would actually publish with — either missing-from-array or stale.",
      "fixHint": "Decide the hashtag set first, then either include the chosen tags in hashtags[] or remove them from body. Do not let the two diverge."
    }
  ],
  "revisedArtifactsExpectedFrom": "content-lead",
  "maxRevisionRounds": 2
}
Agent referenced copy-draft-smt-b7th-engineer.json but the file isn't on disk.
Agent referenced andoffs/qa-verdict-REH-48.jso but the file isn't on disk.
doneagentQA Critique Gate2026-08-22 19:27Zrun 46b75923

{"handoff": "qa-verdict-REH-48.json", "schema": "qa_verdict", "summary": "reject: hype-only copy with no brief, no claims, banned words throughout, placeholder title", "nextAgent": "content-lead-orchestrator"}

Workspace files (37)

Every artifact agents produced in the rehanced content workspace. Click any file to read it. Newest first.

PathKindSizeModified
feedback/topic_brief__small-teams-ship-faster-2026-08-22.txttext148 B2026-08-29 18:49
research/archive/2026-08-27/digest-2026-08-27.mdmd6.5 KB2026-08-27 02:34
research/archive/2026-08-27/health-check.mdmd1.3 KB2026-08-27 02:11
research/digest-2026-08-25.mdmd6.4 KB2026-08-25 02:32
drafts/spacex-achievements-post/v1.mdmd3.7 KB2026-08-24 15:29
leads/2026-W36/raw.jsonjson56.3 KB2026-08-24 03:36
handoffs/qualified-leads-reh-53.jsonjson8.5 KB2026-08-24 03:32
research/sources.mdmd3.9 KB2026-08-24 02:32
research/digest-2026-08-24.mdmd7.7 KB2026-08-24 02:31
research/digest-2026-08-24.jsonjson7.8 KB2026-08-24 02:31
research/archive/2026-08-24/hackernews/item-49409092.jsonjson6.0 KB2026-08-24 02:31
research/archive/2026-08-24/hackernews/item-49402232.jsonjson86.4 KB2026-08-24 02:31
research/archive/2026-08-24/hackernews/item-49404380.jsonjson20.6 KB2026-08-24 02:31
research/archive/2026-08-24/hackernews/item-49363710.jsonjson23.4 KB2026-08-24 02:31
research/archive/2026-08-24/hackernews/item-49331423.jsonjson84.4 KB2026-08-24 02:31
research/archive/2026-08-24/google-trends/us-daily.rssbinary20.2 KB2026-08-24 02:31
research/archive/2026-08-24/hackernews/front-page.jsonjson35.0 KB2026-08-24 02:31
research/digest-2026-08-22.jsonjson4.9 KB2026-08-22 19:36
research/digest-2026-08-22.mdmd6.2 KB2026-08-22 19:36
research/archive/2026-08-22/google-trends/us-daily.rssbinary20.4 KB2026-08-22 19:36
research/archive/2026-08-22/hackernews/elevenlabs.jsonjson28.4 KB2026-08-22 19:36
research/archive/2026-08-22/hackernews/rust-glancer.jsonjson52.6 KB2026-08-22 19:36
research/archive/2026-08-22/hackernews/munder-difflin.jsonjson47.6 KB2026-08-22 19:36
research/archive/2026-08-22/hackernews/mcp-roadmap.jsonjson49.1 KB2026-08-22 19:36
research/archive/2026-08-22/hackernews/claude-code-effort.jsonjson38.9 KB2026-08-22 19:36
research/archive/2026-08-22/hackernews/front-page.jsonjson39.4 KB2026-08-22 19:36
handoffs/qualified-leads-reh-47.jsonjson7.2 KB2026-08-22 19:27
leads/2026-W35/e2e-qualified.jsonjson7.2 KB2026-08-22 19:27
handoffs/qa-verdict-REH-48.jsonjson4.2 KB2026-08-22 19:26
handoffs/copy-draft-e2e-bad.jsonjson670 B2026-08-22 19:26
leads/2026-W35/e2e-raw.jsonjson4.5 KB2026-08-22 19:20
assets/e2e-2026-08-22/cover.jpgimage45.6 KB2026-08-22 19:20
handoffs/qa-verdict-REH-42.jsonjson1.9 KB2026-08-22 17:54
handoffs/STATUS.mdmd3.4 KB2026-08-22 17:51
handoffs/copy-draft-smt-b7th-engineer.jsonjson3.0 KB2026-08-22 17:49
handoffs/angle-backlog-small-teams-ship-2026-08-22.jsonjson5.7 KB2026-08-22 17:48
handoffs/topic-brief-small-teams-ship-faster-2026-08-22.jsonjson6.0 KB2026-08-22 17:42

Browse all files (full tree) →