Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
efd71ae
feat(infra): add BaseAgent, tools registry, and skill files
Apr 6, 2026
87077da
fix: add response_schema to all agents to prevent JSON parse failures
Apr 7, 2026
51672b1
feat(stack-8): wire 4-agent pipeline with revision loop
Apr 7, 2026
b780ce1
test: add unit tests for BaseAgent, WriterAgent, StructurerAgent, SEO…
Apr 7, 2026
bf4d950
chore: delete dead DraftAgent code replaced by 4-agent pipeline
Apr 7, 2026
3a3c2b6
test(qa): add retry resilience tests and pipeline_summary CLI coverage
Apr 7, 2026
3a8d9e1
chore(qa): update TODOS.md — mark CLI-1, CLI-3, PIPE-1 resolved/inval…
Apr 8, 2026
6d4885b
refactor(gap-1): remove _extract_json dead code from all 4 agent files
Apr 8, 2026
b0b9bfb
fix(gap-2,gap-3,gap-4): WriterSchema fields, seo_score propagation, d…
Apr 8, 2026
b10ee67
chore(gap-5,gap-6): add MarkdownFixer and SEO patcher TODOs to backlog
Apr 8, 2026
2606a15
docs: add engagement-publishing pipeline design spec
May 1, 2026
6594a65
docs: add engagement-publishing pipeline implementation plan
May 1, 2026
9d9d245
chore: add .worktrees to gitignore
May 1, 2026
c7721c2
feat(engagement): extend BlogJob with engagement metadata schema
May 1, 2026
4796e80
feat(engagement): extend BlogJob with engagement data models
May 1, 2026
d614717
refactor(engagement): improve model immutability and validation
May 1, 2026
283fde0
fix(engagement): add validation to readability_score field
May 1, 2026
8ad84a0
docs: add engagement E2E test design spec
May 3, 2026
c0b8dc9
docs(media): design blog-aware header image pipeline
May 4, 2026
ff73d9f
docs(media): revise header image plan for ADK workflow
May 4, 2026
206278f
feat(publish): add body sanitizer to strip pipeline scaffolding
May 4, 2026
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ tmp/
# Playwright / browser caches
playwright-report/
test-results/
.worktrees/
72 changes: 60 additions & 12 deletions TODOS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,30 +22,65 @@ Generated by /plan-ceo-review on 2026-04-04. Updated by reviews.

---

### CLI-1: --auto-approve flag silently ignored
### CLI-1: --auto-approve flag silently ignored — RESOLVED

**What:** `brewpress draft --auto-approve` is accepted by the parser and stored in `args.auto_approve` but never passed to `Orchestrator.draft()`. Users expecting scripted end-to-end runs will be confused when the command stops at the review step.
**Status:** ✅ Fixed by feat(stack-8). `auto_approve` is now passed to `Orchestrator.draft()` (cli.py:275). When critic verdict = "pass", the job is auto-approved to APPROVED_STEP_1. Fixed by /qa on feat/ga-release, 2026-04-08.

**Why:** Broken UX for CI/scripted pipelines that depend on this flag.
**Effort:** S (CC: ~20 min)
**Priority:** P1
**Depends on:** Decision on what auto-approve should do (skip review step? auto-approve-content?)
---

### CLI-2: reject() blocked at APPROVED_STEP_2 — RESOLVED

**Status:** ✅ Fixed. `brewpress reject --force` flag added (forces rejection at any state including APPROVED_STEP_2).
**README:** Add one-liner: "`brewpress reject --force` — discard a job stuck at any approval state."

---

### CLI-2: reject() blocked at APPROVED_STEP_2 with no escape hatch
### CLI-3: Score transparency after `brewpress draft` — RESOLVED

**What:** A job stuck at `APPROVED_STEP_2` (e.g., WP publish failed, user wants to discard) cannot be rejected — the state machine blocks rejection at this state. The only escape is manual deletion of `~/.brewpress/last_draft.json`.
**Status:** ✅ Fixed by feat(stack-8). `DraftResult.pipeline_summary` printed to stdout when non-empty (cli.py:283-284). Format: `[pipeline] N rounds | seo: X, clarity: X, tech_accuracy: X, readiness: X`. Fixed by /qa on feat/ga-release, 2026-04-08.

**Why:** Users who hit publish errors have no CLI-level way to reset and start fresh.
**Fix:** Either allow `brewpress reject --force` at APPROVED_STEP_2, or add a `brewpress reset` command that clears state.
**Effort:** S (CC: ~15 min)
**Priority:** P1
---

### PIPE-1: BREWPRESS_PIPELINE_MODE feature flag — INVALIDATED

**Status:** ❌ Invalidated. DraftAgent (v1) was deleted in chore(stack-8) — no v1 code path exists to fall back to. The 4-agent pipeline IS the only pipeline. This TODO is no longer actionable. Closed by /qa on feat/ga-release, 2026-04-08.

---

## P2 — Medium Priority

### GAP-5: Code-based MarkdownFixer for StructurerAgent

**What:** Replace StructurerAgent's LLM call with deterministic markdown transformations:
- Heading level normalization (H3 before H2 → demote H3 to sub-H2)
- H1 dedup (multiple H1s → demote 2nd+ to H2)
- CTA injection at end of body if `BlogJob.cta` is set but absent from markdown

**Why:** Structure issues are rule-based, not creative. Eliminates 0–1 LLM calls per run.
The LLM call is the only one in the pipeline with zero creative upside.
**Effort:** M (human: ~3 hr / CC: ~30 min)
**Priority:** P2
**Depends on:** Nothing (self-contained)

---

### GAP-6: Code-based SEO patcher (pre-LLM pass in SEOAgent)

**What:** Before calling `think()` in `SEOAgent.optimize()`, run a deterministic patcher:
- Inject `primary_keyword` into the first paragraph if missing
- Trim title to ≤60 chars or expand to ≥50 chars via slug-based suffix
- Trim/expand meta_description to 120–160 chars

After patching, re-run `seo.full`. If score ≥ 85 now, skip the LLM call entirely.

**Why:** Eliminates 0–1 LLM calls per run for posts that are "almost there" SEO-wise.
Most SEO issues are mechanical (length, keyword presence) and don't need generation.
**Effort:** M (human: ~3 hr / CC: ~30 min)
**Priority:** P2
**Depends on:** Nothing (SEOAgent already calls seo.full)

---

### WP-1: 'Already wrote about this?' duplicate detection

**What:** Before generating, query WP REST API for posts with matching slug or
Expand Down Expand Up @@ -76,6 +111,19 @@ fetches diff from GitHub API directly.

---

### SEO-1: Consolidate boost_eval.py into tools/seo.py

**What:** Once SEOAgent uses `seo.full` from `tools/seo.py` directly, `boost_eval.py` and its `run_checks()` function become redundant. Post-GA cleanup: merge the deterministic check logic into `tools/seo.py` and update CriticAgent to use `seo.full` tool via the tools registry.

**Why:** DRY violation — two modules doing the same SEO analysis. Maintenance burden as SEO rules evolve.
**Pros:** Single source of truth for SEO checks. Simplifies CriticAgent's fast path.
**Cons:** Breaking change to CriticAgent imports; requires updating test_critic_agent.py.
**Effort:** S (human: ~2 hr / CC: ~20 min)
**Priority:** P3
**Depends on:** SEOAgent shipped and proven in production

---

## P3 — Low Priority / Vision

### WATCH-1: CLI watch mode
Expand Down
Loading
Loading