Skip to main content

QA Gate and WordPress Review

QA is not duplicated in SCS. WordPress is the review surface; SCS reads the review state through WP-CLI and enforces it before a page can move to Scheduled, Published, or Tracking.

What already exists on opshell.dev​

Verified on the pilot site:

  • ACF Pro 6.8.10 is active.
  • group_opshell_technical_review on post stores opshell_technical_reviewer (user) and opshell_review_date (date).
  • The theme displays “Reviewed By …” in the byline.
  • The SEO Architecture group stores content_type (hub, pillar, cluster, supporting), hub_parent, pillar_parent, cluster_parent, primary_keyword, and semantic_tags.
  • The author profile group on users stores expertise, credentials, and reviewed_on.

That review group is attribution, not a gate: it records who reviewed and when, but not what was checked or whether it passed.

The portable review gate​

The pilot adds wpstrategist-review-gate, a small plugin that registers group_wpw_review_gate on posts and pages:

FieldTypeValues
wpw_review_statusSelectnot_reviewed, in_review, changes_requested, approved
wpw_reviewerUserWordPress user
wpw_review_dateDateStored as Ymd
wpw_review_scopeCheckboxfactual, technical, editorial, ymyl, legal, accessibility
wpw_review_checklistCheckboxaccuracy, sources, originality, internal_links, metadata, schema, media, disclosure
wpw_review_notesTextareaReviewer notes

The plugin also syncs wpw_reviewer and wpw_review_date to the legacy opshell_technical_reviewer / opshell_review_date fields when they exist, so the byline keeps working.

note

The field names are deliberately generic (wpw_*) so the same plugin can be installed on other sites. The existing opshell fields remain untouched.

SCS commands​

scs wp draft --workspace bs --pid FS-0001 # create/update a draft
scs qa open --workspace bs --pid FS-0001 # print the WP edit URL
scs qa pull --workspace bs --pid FS-0001 # read ACF review state
scs qa check --workspace bs --pid FS-0001 # fail unless approved
scs qa check --workspace bs --pid FS-0001 --advance # set status Scheduled on pass
scs wp publish now --workspace bs --pid FS-0001 # publish live after approval
scs wp publish 2026/12/31 --workspace bs --pid FS-0001 # schedule after approval

qa pull writes a snapshot to publishing.csv: qa_status, qa_reviewer, qa_date, qa_scope, qa_notes. The snapshot is for terminal reporting; WordPress remains authoritative.

Gate rules​

scs qa check requires:

  • wpw_review_status = approved
  • a reviewer
  • a review date
  • checklist items: accuracy, sources, originality, internal_links, metadata
  • ymyl in wpw_review_scope when the brief says YMYL review required: yes

If the review fields are missing, the status is not_configured and the check fails closed. SCS will not treat “reviewer + date” as an automatic approval.

Status mapping​

SCS keyword statusWordPressMeaning
Writing / EditingdraftDraft being written
QAdraftDraft created, review pending
Scheduleddraft / scheduledReview approved, ready for scheduling
PublishedpublishLive
TrackingpublishGSC data being collected

scs publish creates or updates a draft. A live post is never converted back to draft. The state transition to publish requires an approved QA snapshot.

Two status vocabularies​

WordPress and SCS use different words for the same states. Do not compare them directly.

WordPress wpw_review_statusSCS publishing.qa_statusMeaning
not_reviewedpendingDraft created, nobody has reviewed it
in_reviewin_reviewReview started
changes_requestedchanges_requestedReviewer wants changes
approvedapprovedGate passed
— (fields missing)not_configuredReview plugin or fields absent; fails closed

scs qa pull writes the SCS snapshot. WordPress remains authoritative.

warning

For YMYL finance/health content, require a named reviewer with relevant credentials and set the ymyl scope. A generic editor review is not enough.