Skip to main content

CSV Data Model

SCS stores operational state in several linked CSVs. Every stage row carries the shared keys so it can be read alone or joined on pid.

For every field, owner, and gate, see Field Reference.

Shared keys​

ColumnRole
pidPrimary key: <PREFIX>-<NNNN>
site_idForeign key to config/sites.csv
titleWorking title
keywordPrimary target query
created, updatedISO dates

pid scheme​

pid = <PREFIX>-<NNNN>

Prefixes are unique per site. Numbers are never reused; the high-water mark is in config/pids.reserved.

The CSVs​

config/sites.csv​

The site registry and WordPress connection:

FieldDescription
site_idSite registry ID; foreign key on every row
prefix2–4 uppercase PID prefix
domainSite hostname
nameDisplay name
statusactive, development, or inactive
focusShort content focus
nw_projectNeuronWriter project
wp_rootWordPress root on the server
wp_urlSite URL
wp_userSystem user for WP-CLI
ssh_hostSSH alias
notesFree text
createdISO date (auto)

<workspace>-keywords.csv​

The master row. Demand metrics, intent/business/SERP evidence, the human decision, GOS, gos_tier, and lifecycle status. See Field Reference for every keyword field.

<workspace>-clusters.csv​

The portfolio plan:

FieldDescription
kc_typeCluster role: Topic, Pillar Page, Keyword Cluster, Sub Topic, Supporting
topicSEO subject area
pillar_pid, parent_pidCluster relationships
funnelTOFU / MOFU / BOFU
coverage_statusplanned / in_progress / covered / gap / not_needed
coverage_goalWhole-number target
coverage_notesScope and gaps
entity_coveragePipe-separated entities
cluster_priorityP0–P3
comp_gapCompetitor gap notes
notesFree text

All stage rows also carry the shared keys.

<workspace>-briefs.csv​

The production spec index:

FieldDescription
brief_statusDraft / Review / Approved / Rejected
brief_depthfull / standard / light
frameworkOne of the seowriting frameworks
content_typeEditorial format
word_count, tone, author_roleOptional editorial guidance
audienceWho the page is for
hook_angleOpening promise
angle_typefresher data / first-hand experience / niche audience / contrarian / superior depth / better format
differentiationOne-sentence angle
information_gainOriginal element
cta, kpi, targetConversion and success metric
model, prompt_instructionsGeneration notes
reviewer, due_dateReview owner and deadline
nw_brief_pathOptional raw NeuronWriter export path
brief_path, article_pathSame file (brief + article)
notesFree text

The rich brief lives in the same md/<pid>--*.md file as the article; brief_path and article_path point to that file.

<workspace>-links.csv​

The internal-link plan:

FieldDescription
from_pid, to_pidSource and target pages
anchor_textRequired anchor
link_typehub / pillar / cluster / supporting / cross-cluster
placementintro / body / faq / conclusion / sidebar
statusplanned / added / verified / broken
verified_dateISO date
notesFree text

<workspace>-publishing.csv​

WordPress state:

FieldDescription
wp_category, wp_tag, wp_authority_topicWordPress taxonomy
wp_content_formatArticle format taxonomy (content_format)
wp_statusDraft / Pending / Scheduled / Published
wp_linkWordPress edit URL
publish_dateISO date
wp_post_id, wp_author_idWordPress IDs
slugPost slug
meta_title, meta_descriptionSEO metadata
schema_type, schema_fileJSON-LD type/file
featured_imageFeatured image reference
qa_status, qa_reviewer, qa_date, qa_scope, qa_notesQA gate snapshot
index_statusIndexing state
notesFree text

<workspace>-performance.csv​

Query-level GSC history:

FieldDescription
periodReporting period
querySearch query
urlPage URL
pulledPull date
gsc_clicks, gsc_impressions, gsc_ctr, gsc_positionGSC metrics
notesFree text

Store query rows only; derive page totals.

Relationships​

  • keywords.csv is the master.
  • clusters, briefs, and publishing are effectively 1:1.
  • links is many-to-many through PIDs.
  • performance is 1:N by period and query.

v0.2 additions​

AreaChange
Decisiondecision, decision_reason, decision_factors, decided_by, decided_on
GOSpriority renamed gos_tier; GOS is supporting only
Researchper-PID folder, no new CSV
BriefMarkdown brief + depth/framework/audience/differentiation/information-gain fields, in the article file
Linksnew links.csv
QAWordPress ACF review; snapshot in publishing.csv
Publishingwp_post_id, wp_author_id, slug, metadata, wp_content_format
Performanceurl, pulled

Conventions​

  • Dates: ISO YYYY-MM-DD.
  • Lists: pipe-separated (Images|PAA).
  • Enums: lowercase snake_case.
  • Empty means unknown; never invent a value.
  • CSV is authoritative for metadata; Markdown body is authoritative for prose.
warning

content_type in the WordPress ACF group means hub/pillar/cluster/supporting. The article format taxonomy is content_format. Do not conflate them.