# Data dictionary

Empty cells mean not applicable, absent, indeterminable, or not coded as governed by the file's status and codebook fields; they are never silently converted to zero. All public excerpts are at most 25 words.

## `articles.csv`

| Field | Type | Meaning |
|---|---|---|
| `article_id` | string | `spec-` plus the first 16 hex characters of SHA-256 of canonical URL. |
| `title`, `subtitle`, `description` | string | Published headline, subheadline, and description metadata. Description is not imputed as subtitle. |
| `author` | string | Published byline(s), semicolon separated when multiple. |
| `date` | ISO date | URL/archive publication date. |
| `section`, `subdesk` | enum | `university_news` and one of `administration`, `academics`, `student_life`. |
| `url` | URL | Canonical public article URL. |
| `retrieval_date` | ISO date | Date content was collected/verified. |
| `topic_classifications` | string | Semicolon-separated lede-based automated topic screens. |
| `leadership_period` | enum | `147th`, `148th`, `149th`, or `150th`; descriptive control only. |
| `article_type` | enum | Automated type proxy unless replaced by a manual value in the audit file. |
| `discovery_method` | string | Official authorized archive route. |
| `content_access` | enum | `full_text_private_working_corpus`; body is not redistributed. |
| `content_hash` | SHA-256 | Hash of normalized private body. |
| `word_count` | integer | Stored normalized-body word count. |
| `visible_update_or_correction` | enum | Visible status parsed from the latest page. |
| `coding_status` | enum | `manual_validation_sample` or `automated_census_screen`. |
| `exclusion_reason` | string | Blank for included census rows; reason if an archive item is excluded. |

## `article-coding.csv`

One automated row per 1,527 census article. None of these fields is a judgment of motive.

| Fields | Type | Meaning |
|---|---|---|
| `article_id`, `title`, `subtitle`, `author`, `date`, `subdesk`, `url` | identifiers/metadata | Join and published metadata fields. |
| `first_author`, `author_count` | string/integer | First byline and number of parsed bylines. |
| `publication_month`, `quarter`, `section_label`, `retrieved_at` | controls/metadata | Time and page-section fields. |
| `body_sha256`, `extraction_status`, `word_count`, `computed_word_count` | integrity | Body hash, success status, stored count, and rule-token count. Different tokenizers can produce different counts. |
| `topic_labels`, `primary_topic` | string/enum | Multilabel and priority lede-based topic screens after the logged parser fix. |
| `article_type_proxy`, `leadership_period` | enum | Rule-based type and descriptive board-period controls. |
| `admin_present_strict`, `challenger_present_strict`, `paired_actor_article_strict` | binary | Strict dictionary presence and paired eligibility. |
| `admin_present_broad`, `challenger_present_broad`, `paired_actor_article_broad` | binary | Broad-dictionary sensitivity presence. |
| `admin_marked_auto`, `challenger_marked_mean_auto`, `paired_framing_gap_auto` | numeric | Strict administration mark, mean pooled-challenger mark, and within-article difference. |
| `admin_scrutiny_score_auto`, `challenger_scrutiny_mean_auto`, `paired_scrutiny_gap_auto` | numeric 0–3 | Automated claim/scrutiny scores and within-article difference. |
| `admin_direct_quote_words_auto`, `challenger_direct_quote_words_auto`, `direct_quote_word_share_gap_auto`, `first_quote_gap_auto` | count/proportion | Automated quotation quantities and administration-minus-challenger gaps. These require cautious validation. |
| `first_actor_auto`, `first_quoted_actor_auto` | actor enum | First substantive actor and first attributed quotation proxy. |
| `quote_count_total`, `quote_word_count_total`, `quote_attributed_count`, `quote_attribution_confidence` | count/proportion | Mechanical quote screen and rule confidence. |
| `source_count_proxy`, `source_type_count_proxy`, `source_types_proxy` | count/string | Conservative source proxies, not verified unique-source counts. |
| `university_official_origin_auto` | binary | Explicit official-origin cue in title/lede. |
| `university_release_reliance_auto` | integer 0–3 | Rule-based official-material dependence score. |
| `high_release_reliance_auto` | binary | Official-origin story with no early affected/challenger quotation or document test. |
| `official_assertion_tested_auto`, `challenger_assertion_tested_auto` | binary/blank | Independent-test pattern conditional on material claim proxy. |
| `documents_records_data_auto`, `affected_people_consulted_auto`, `power_history_consequences_context_auto`, `follow_up_orientation_auto` | binary | Article-level semantic screens. |
| `visible_update_correction_status` | enum | `none_observed`, `updated`, `corrected`, `editors_note`, or combinations. |
| `vulnerable_identification_auto` | binary/blank | Text-only risk cue; cannot evaluate images, consent, or necessity. |
| `semantic_confidence`, `semantic_confidence_numeric` | enum/number | Aggregate rule-confidence label and score. |
| `marked_evidence_excerpt_max_25_words` | string | Short rule-trigger excerpt. |
| `coding_status`, `parser_failure_reason` | status/string | Automated screen status and any failure explanation. |

## `actor-level-analysis.csv`

One row per category detected by either actor dictionary (6,614 rows after parser repair). Missing category rows are absent under both rules, not scored actor units.

| Fields | Type | Meaning |
|---|---|---|
| `article_id`, `url`, `date`, `subdesk` | metadata | Article join fields. |
| `actor_category`, `actor_group` | enum | Seven-category actor label and `administration`, `challenger`, or contextual group. |
| `strict_present`, `broad_present` | binary | Narrow and broad dictionary presence. |
| `presence_confidence`, `presence_confidence_numeric` | enum/number | Rule confidence. |
| `mention_count`, `window_words`, `broad_mention_count`, `broad_window_words` | counts | Matched mentions and actor-window denominators. |
| `favorable_count`, `adverse_count`, `delegitimizing_count`, `legitimating_count`, `conflict_count` | counts | Fixed lexicon hits after reporter-voice masking. |
| `favorable_rate_per_1000`, `adverse_rate_per_1000` | rate | Counts normalized per 1,000 actor-window words. |
| `marked_strict`, `marked_adverse_plus_conflict`, `marked_include_quotes` | binary | Preregistered framing thresholds/sensitivities. |
| `headline_frame`, `lede_frame` | enum | Rule-based `favorable`, `adverse`, `conflict`, `neutral_descriptive`, or `not_present`. |
| `quote_count`, `direct_quote_words`, `actor_quoted` | count/binary | Attributed direct quotations by actor. |
| `attr_neutral`, `attr_epistemically_marked`, `attr_concession_or_fault`, `attr_emotive_or_adversarial` | counts | Attribution-verb classes. |
| `marked_evidence_excerpt` | string | Short example trigger. |
| `broad_marked_strict`, `broad_marked_adverse_plus_conflict` | binary | Broad-presence framing sensitivities. |
| `first_actor`, `first_quoted_actor` | binary | Whether this actor category is first in the article. |
| `substantive_claim_proxy`, `scrutiny_score_auto` | binary/0–3 | Claim eligibility and rule-based scrutiny. |
| `quote_attribution_confidence`, `reporter_window_confidence`, `semantic_confidence`, `semantic_confidence_numeric` | number/enum | Measurement confidence fields. |
| `validation_status` | enum | Whether the semantic field passed, failed, or lacked the manual gate. |
| `word_count`, `primary_topic`, `article_type_proxy`, `leadership_period`, `first_author`, `author_count` | controls | Article-level model covariates copied for actor analysis. |

## `university-manual-audit.csv`

One adjudicated/manual row for each of 230 audit articles. Core fields are defined in `codebook.md`:

`article_id`, `url`, `manual_reviewer`, `eligible_news`, `article_type`, `admin_present`, `challenger_present`, `admin_tone`, `challenger_tone`, four headline/lede frame fields, two skepticism fields, two assertion-test fields, `release_reliance`, four document/source/context/follow-up fields, `first_actor`, `first_quoted_actor`, `vulnerable_identification`, `evidence_excerpt`, and `manual_notes`.

Added sampling fields are `coding_provenance`, `date`, `word_count`, `subdesk`, `quarter`, `length_band`, `sample_stratum`, `screen_relevant`, `screen_actor_class`, `screen_release_origin`, and `screen_marked_language`. The audit deliberately balances screen diversity and is not a self-weighting prevalence sample.

## Reliability and validation files

- `university-manual-intercoder-reliability.csv`: variable, statistic, valid pair count, raw agreement, and kappa/weighted kappa on the 50 overlaps.
- `university-automation-validation.csv`: measure, valid pair count, raw agreement, Cohen's kappa, κ=.60 gate, sensitivity, specificity, precision, error counts, and example disagreement IDs.
- `university-validation-results.json`: same validation results in website-ready form plus measures that lacked manual ground truth.

## Claim, leadership, and source files

`claim-ledger.csv` has `claim_id`, claim, source document, five-level status, supporting sources, contrary evidence, safe wording, caveat, and last-check date. `leadership-timeline.csv` is one role/person/period/source assertion per row; `leadership.json` groups the same assertions for websites. `sources.csv` records source ID, title, organization, URL, type, dates, supported use, and notes.

## JSON outputs

`results.json` follows `results.schema.json`. `chart-data.json` supplies chart IDs, labels, values, denominators, intervals, status, notes, and evidence-row IDs. A `null` estimate means suppressed/not estimable, never zero.
