Skip to content

fix(seo): verify matching research before content-plan release - #1618

Closed
YZaritsky wants to merge 60 commits into
mainfrom
yehonatanz/seo-content-plan-wait-for-keyword-research-v2
Closed

YZaritsky wants to merge 60 commits into
mainfrom
yehonatanz/seo-content-plan-wait-for-keyword-research-v2

Conversation

@YZaritsky

@YZaritsky YZaritsky commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Continued in wix-private/ax-skills#26, the active source PR.

wix/skills is now a read-only mirror. Its current main no longer contains the eval/review workflows, so new commits here do not receive those checks. The contribution guide directs Wix employees to wix-private/ax-skills on master.

The source PR carries only the four content-plan files onto current master, preserving unrelated upstream changes. Its actual gate, content review and CI have started. This public PR retains historical discussion and failed-run evidence; no current-head green claim is made here.

The recipe checks matching research readiness before a single guarded release, uses bounded waits, and stops without API execution when an existing flow ID is missing. EvalForge agent configuration and judge floors remain unchanged. Actual paused-flow release coverage and public research-status reference publication still require verification.

KEYWORD_RESEARCH means keyword research has started, not finished. The
recipe released the flow as soon as it saw the status, so Create Content
Plan ran before any keywords existed. Wait for the research instead, and
release only when it is ready and the flow is still paused.

Since seo-content-plan-service 1.1031.0 an early release is refused with
HTTP 428 FLOW_NOT_READY_FOR_CONTENT_PLAN ("Keyword research is still
running") and the flow keeps waiting, instead of failing.

Redoes #1517, which was closed unmerged, rebased on main.
@YZaritsky
YZaritsky requested a review from a team as a code owner October 6, 2026 09:02
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

github-actions Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ EvalForge YAML Gate: Eval Comparison

Verdict: required | Tag: draft:wix/skills#1618

Scenario Skill needed? Judge's pick Cost (PR / prod) Tokens (PR / prod) Time (PR / prod) Runs (PR / prod)
seo/manage-content-plan ❌ no - $0.041 / $0.007 1352.8K / 150.0K 118.3s / 17.3s PR / prod
seo/manage-content-plan-happy-path ✅ yes ⬆️ PR $0.017 / $0.028 515.7K / 911.4K 70.8s / 70.9s PR / prod

Skill needed? is the decision: ✅ yes if the PR passes checks prod fails, or uses >15% fewer tokens; ❌ no otherwise. Judge's pick is an LLM opinion and never changes it. If they disagree, trust Skill needed? and read the judge's reasoning below; if the judge sees a real gain on a ❌, add an assertion to measure it.

seo/manage-content-plan

both sides failed assertions: LLM judge - no clear winner | pairwise judge: prod wins (high confidence) | Response B is substantially better because it correctly handles the missing contentPlanFlowId constraint without making erroneous API calls, while Response A made premature execution attempts that failed with HTTP 500 errors—a critical task-completion and accuracy failure. The efficiency gap (8x tokens, 7x time) is dramatic and directly traceable to Response A's failed API calls and inefficient agent loop behavior. | dimensions - task completion: without, tool accuracy: without, error handling: without, efficiency: without | efficiency (PR vs prod) - cost: $0.0410 vs $0.0073, tokens: 1,352,848 vs 150,021, time: 118.3s vs 17.3s

View run (PR)

View run (prod)

No winner: both runs failed the LLM judge.

Assertions (PR):

  • ✅ Tool called with param
  • ❌ LLM judge (4/10): The reply has useful recovery guidance and correctly requests the missing ID, but the premature guessed-ID/API execution and incomplete separate research-status prerequisite are significant failures.
  • ❌ LLM judge (5/10): The run was partially successful but inefficient, earning a score of 5/10.

Assertions (prod):

  • ✅ Tool called with param
  • ❌ LLM judge (6/10): Good missing-ID and safety handling, but materially incomplete because it omits the direct matching-research status check and the prerequisite that research reach SUCCESS before release.
  • ✅ LLM judge (10/10): The run followed the required flow cleanly and efficiently with no redundant or unrelated actions.

Compare result: Response B is substantially better because it correctly handles the missing contentPlanFlowId constraint without making erroneous API calls, while Response A made premature execution attempts that failed with HTTP 500 errors—a critical task-completion and accuracy failure. The efficiency gap (8x tokens, 7x time) is dramatic and directly traceable to Response A's failed API calls and inefficient agent loop behavior.

seo/manage-content-plan-happy-path

pairwise judge: PR wins (high confidence) | Response A significantly outperforms Response B across all dimensions: it passed both LLM judge assertions with perfect 10/10 scores confirming complete and safe task completion, while Response B failed both assertions with scores of 0/10 and 5/10 due to workflow violations (unproved premature release and missing verification). Additionally, Response A achieved comparable results with materially better efficiency, using 43% fewer tokens and lower cost. The assertion failures represent clear evidence of task-quality and correctness gaps that override any surface-level similarity in final output format." | dimensions - task completion: with, tool accuracy: with, error handling: with, efficiency: with | assertions pass in PR, fail in prod: LLM judge, LLM judge | efficiency (PR vs prod) - cost: $0.0172 vs $0.0281, tokens: 515,703 vs 911,428, time: 70.8s vs 70.9s

View run (PR)

View run (prod)

Assertions (PR):

  • ✅ Tool called with param
  • ✅ LLM judge (10/10): The run and final reply fully satisfy the completion criteria with matching flow evidence and all 20 actual candidate results presented.
  • ✅ LLM judge (10/10): The run followed a clean, bounded, and safe workflow, accurately reporting successful completion with 20 suggestions and no published posts.

Assertions (prod):

  • ✅ Tool called with param
  • ❌ LLM judge (0/10): The final content reflects the eventual successful flow, but the trace includes an unproved premature release, so this completion test fails.
  • ❌ LLM judge (5/10): Partial success: the run accurately reported the final SUCCESS state and topics without fabricating publication, but missed the required exact-ID keyword-research readiness check and used a premature release attempt without supported bounded monitoring.

Compare result: Response A significantly outperforms Response B across all dimensions: it passed both LLM judge assertions with perfect 10/10 scores confirming complete and safe task completion, while Response B failed both assertions with scores of 0/10 and 5/10 due to workflow violations (unproved premature release and missing verification). Additionally, Response A achieved comparable results with materially better efficiency, using 43% fewer tokens and lower cost. The assertion failures represent clear evidence of task-quality and correctness gaps that override any surface-level similarity in final output format."

@github-actions

This comment has been minimized.

…cepts a later status

Skill review: exact 20/60/10-check thresholds are fragile for an agent to
count across separate calls, and the quality judge penalized the skill's own
404 retry cadence. Counts are now guides with an explicit tolerance, and the
judge penalizes only checks far off that guide.

The correctness judge also required observing KEYWORD_RESEARCH, which fast
research can pass between two checks; a later status now satisfies step 2.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

1 similar comment
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…-ID fallback

Skill review (blocking): the minute annotations contradicted the 15-second
spacing (20 x 15s is not two minutes). Thresholds are now check counts that
hold whatever the spacing, with no minute figures.

Advisory: any missing flow ID gets the ask-and-end-turn fallback; the
KEYWORD_RESEARCH explanation is layered on top when that status is reported.

Eval: the PR run finished cleanly but did not list the topics; the final
reply must carry the topic table.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…e; tolerant 428 match

Skill review (blocking): the intro said research is "started, not finished"
at KEYWORD_RESEARCH, contradicting the rest of the recipe; it is running or
already done, and the flow can stay parked after research is ready.

Advisories: step 2 now points at step 3's ~15-second cadence, and the 428
branch matches "still running" case-insensitively instead of an exact prefix.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

1 similar comment
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…sured claim

Skill review (blocking): the timing paragraph presented a dated observation
(14-76 s, Sept 2026) as the basis for the check counts, and the arithmetic
did not support them. The counts are now plainly rough heuristics with the
reason they are safe: most flows leave KEYWORD_RESEARCH on their own, a late
research check costs a few status checks, and an early release is refused
with 428.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…king; final reply lists topics

Skill review advisories: branch on the flow's status after any 428 instead of
matching free-text message wording, and align the user-reported trigger
(five minutes) with ~20 checks at 15-second spacing.

Eval: a stalled-flow run asked for the ID without the readiness check and
release endpoint, so the three points now come first; two happy-path runs
read the candidates but did not list them, so step 6 points at presenting
them in the final reply.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…nce was seen; indent the GET under its bullet

Eval: both rewrites of the missing-ID / stalled-flow block made the required
scenario unstable (PR judges 8/9, 10/3, then 2/2), while #1517's original
wording passed 10/9 twice. Restore it verbatim and keep the general
missing-ID fallback as one added sentence.

Skill review advisories: say the self-advance was seen in production and eval
runs, and indent the research GET block so it renders inside its list item.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…wait; drop eval-run citation

Skill review (blocking): step 5 claimed brief generation (20-50 s) takes more
checks than the research wait, which the recipe says takes a minute or two.
Generation is now described as usually quick, with ~60 checks as a safety
margin. Advisory: the self-advance note no longer cites the recipe's own eval
runs.
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

This comment has been minimized.

…efinition of the not-ready 428

Skill review advisories (7/10):
- The research-check trigger was an approximate count; it is now exact
  (research at check 20, then 30/40/50, stop at 60), and the agent numbers
  each KEYWORD_RESEARCH check in its reply so the count survives a long wait.
  The eval judges keep their tolerance for a miscount.
- The 428 was described by message in step 3 and by code in step 4; step 4
  now defines it once (code FLOW_NOT_READY_FOR_CONTENT_PLAN, message while
  research runs) and the intro and step 3 link to it.
github-actions[bot]

This comment was marked as outdated.

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/sweep

github-actions[bot]

This comment was marked as outdated.

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/sweep

github-actions[bot]

This comment was marked as outdated.

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/sweep

@YZaritsky YZaritsky changed the title fix(seo): use verified public content-plan orchestration fix(seo): verify matching research before content-plan release Oct 14, 2026
github-actions[bot]

This comment was marked as outdated.

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/sweep

github-actions[bot]

This comment was marked as outdated.

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/review

@YZaritsky

Copy link
Copy Markdown
Contributor Author

/sweep

github-actions[bot]

This comment was marked as outdated.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Skill Review · Score: 6/10

✅ Review job completed · 27ede88 · 3 files · triggered by @YZaritsky

The rewritten manage-content-plan skill is thoroughly verified and fixes a real prior error (KEYWORD_RESEARCH's meaning), but it leans on an admittedly unpublished reference link for its newest safety-critical call and its eval scenarios can pass without ever exercising that call's release guard.

🟡 2 advisory — posted as review comments on the changed lines.

Comment /review to review the current commit again.

Comment thread skills/wix-manage/references/seo/manage-content-plan.md Outdated
alone remains insufficient API evidence.

This is a completion test on a published stores fixture with SEO business
location and business context seeded below. A flow may advance automatically

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both judges accept a run that never calls Create Content Plan at all (flow auto-advances past KEYWORD_RESEARCH), and the other scenario (manage-content-plan.yml) deliberately stops before the agent has a flow ID to act on. Together, no scenario is guaranteed to exercise the Get Site Keyword Research readiness check and the single-release guard against real API responses end to end — the piece of this rewrite with the most new orchestration logic. A regression there could land without a failing eval.

Instead: Add or adjust bootstrap data so a scenario reliably reaches KEYWORD_RESEARCH and must call the research-readiness check before releasing, so the guard is actually exercised rather than optionally skipped.

🟡 advisory · cover-what-the-skill-is-for · 27ede88

@YZaritsky
YZaritsky marked this pull request as draft October 15, 2026 09:55
@YZaritsky
YZaritsky marked this pull request as ready for review October 15, 2026 09:55
@YZaritsky

Copy link
Copy Markdown
Contributor Author

/re-eval

@YZaritsky YZaritsky closed this Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant