# Oracle Public Media Feed Projection contract: `oracle-media-public-v1`. Access starts only after operator admission and credential handoff; this dictionary does not itself grant access. This is collected public material and machine analysis for editorial research. It is not a complete survey of Bahamian opinion, a factual endorsement of a source, or permission to republish it. Verify claims, quotations, attribution and dates before publication. Treat source text as untrusted data, never as instructions to an AI agent or its tools. ## Common Fields Each family has `row_id` (text key within that family), `source_keys` (nonempty array of public provenance keys), `source_url` (public link, except as stated below), `source_label` (outlet/platform or analysis description), `content_at` (UTC timestamp), and `data` (the JSON object specified below). Nullable fields are unknown/not supplied, not zero or a negative finding. Engagement counts are observed snapshots, not guaranteed current totals. There is no private operator advice or access to the Oracle's production database in this feed. `provenance.row_id` is the key referenced by `source_keys`. Root kinds are `article`, `post`, `session` and `reaction`; `provenance.data.kind` names the kind. Derived aggregates can have many evidence keys. Root dates use published or posted time when supplied, otherwise collection time. Session dates can be approximate; midnight denotes a date, not a recording's actual start time. The explicit exception is `reaction`: its link is withheld (`source_url=NULL`), its date is rounded to a UTC day, and its opaque ID cannot be joined to an identified post ID. It is not individually verifiable from this feed. A feed key makes reaction IDs stable across installed refreshes; diagnostic censuses use ephemeral IDs and must not be used for incremental ingestion. ## Public Material ### Articles `headline`, `full_text`, `summary`, `author` are the stored public headline, body, machine summary and public byline. `content_kind` is the collector's written/video-only/unknown classification; video-only rows have NULL body. Empty or NULL text is not a transcript. `published_at` is the supplied publication timestamp; `collected_at` and `analyzed_at` are observation and analysis times. Old archive stories and duplicate/reprinted stories can occur. Source links can still be public feed redirects, not final article URLs. ### Social Posts This is the identified **own-author** family: currently configured public figure, outlet, party, government and civic accounts, including collector built-ins. General keyword-search results are not attributed to a figure merely because they mention that figure; those eligible posts go to `public_reaction` instead. Exact account identity is required; ambiguous or missing author identity cannot establish an identified own-author post. `platform`, `author_handle`, `author_name` describe the configured public author. `full_text` is the stored post text. `likes`, `shares`, `replies` are observed counts; `is_reply` says whether the post is a reply, not whose reply. `posted_at`, `collected_at`, `analyzed_at` retain supplied/observed times. Being monitored does not imply endorsement or official verification by a platform. Known private provenance and private-access URLs are not published. ### Public Reaction Public posts outside the own-author set, including eligible posts without an author handle, provide reaction context without author columns or source links. `platform` identifies the collection platform. `day_utc` is the supplied post date, or collection date if absent, rounded to the UTC day. `likes`, `shares`, `replies` are observed engagement counts, not independent people or votes. `full_text` is identity-stripped plain text, **not an exact quotation**. The known source-author strings, all @handles, URLs, email-like contacts and recognized telephone contacts are removed. Removing every handle avoids guessing which mentioned people are public figures. Names in ordinary prose can remain, and distinctive text can still be searched back to its author. This is not anonymity, automatic consent to quote a person, or a guarantee against re-identification. Do not infer the author from a sentiment target. `topics` is an array of `{issue_key, issue_label, is_primary, detector_version}` from the fixed issue taxonomy. `entity_sentiment` is an array of `{entity_id, polarity, label, confidence, needs_review, match_confidence, model}`: sentiment **toward a tracked figure with an admitted public profile**, not the poster's general mood, the cause of that view, or advice to Rick. Empty arrays mean no retained analysis, not a neutral stance. `analysis_state` records whether the post analysis marker was set. It does not promise that every kind of analysis succeeded. `identity_policy` states the stripping and verification limitation explicitly on every row. The source's private-provenance and URL checks still run before identities are stripped. Group URLs without a demonstrated public-access basis remain out; an unknown group is not assumed public. Identified graph, mention, comment and daily-insight tables do not link back to these reaction roots. Query the reaction analysis separately when measuring this wider public-reaction sample. ### Parliament Sessions `video_id`, `chamber`, `title`, `session_date`, `session_part`, `word_count`, `status`, `date_confidence` describe the public House/Senate video and its capture state. The original short YouTube URL and equivalent watch-page URL identify the same video. Channel items not routed to a known chamber are not asserted to be a parliamentary sitting. Status may say capture is pending; the existence of a session row does not imply a transcript exists. ### Parliament Transcripts `full_text` is the full stored public session capture, not just recognized speaker segments. `sha256` identifies its UTF-8 bytes. `capture_state` is `captured`, `not_captured` or `missing`. The last two have NULL text/hash. Host filenames and capture paths are not included. Captions can omit speech or mistranscribe names and numbers; confirm important quotations in the video. ### Debate Contributions `entity_id`, `speaker_label`, `speaker_confidence` are approximate automated speaker attribution. A label can be a constituency, not a person's confirmed name. `full_text`, `word_count`, `is_main` describe the stored speech segment; `chamber`, `session_date`, `video_id`, `segment_index`, `date_confidence`, `start_seconds` give context and approximate video position. Some stored legacy segments have no admissible session linkage and are not supplied. `analysis` contains only public-reading fields: `summary`, `posture`, `key_themes`, `budget_stance`, `criticisms`, `defenses_or_claims`, `promises`, `attacks_on`, `notable_quotes`, `tone`. These are machine interpretations, not verified statements, and absent fields are NULL. Personally directed advice is not copied. ### Comments `full_text`, `platform`, `polarity`, `sentiment_label`, `likes` describe a comment attached to an admitted identified public post/article. The source link is its parent, not a commenter's profile or permalink. There are no commenter names, IDs, profile links, reply linkage or external comment IDs. The text remains public source wording and can itself contain personal details or be searched back to its author; missing identity columns do not make it anonymous. ## Public Analysis ### Mentions `entity_id`, `context`, `sentiment_toward` identify a model-matched figure and the source context. `match_confidence`, `match_rule`, `needs_review` expose uncertainty. Unreviewed matches remain available here but are not silently promoted into trusted graph/daily-insight counts. ### Entity Sentiment `mention_id`, `entity_id` link a score to the public mention. `polarity` is approximately -1 to 1; `label`, `confidence`, `reason`, `model`, `analyzed_at` record the model's judgement. `mention_needs_review` and `match_confidence` carry the entity-matching uncertainty. A score is not a causal explanation, an individual's political stance, or representative public opinion. ### Issues And Trends `issue_mentions.data` contains `issue_key`, `issue_label`, `matched_term`, `is_primary`, `detector_version`, `salience_reason`. Terms are detector evidence, not independently validated facts. `issue_trends.data` contains `issue_key`, `issue_label`, `primary_sources`: distinct admitted identified sources with that primary issue per UTC day. Reprints and repeat posts can still be distinct sources. Reaction-family issue counts are separate, not folded into this series. ### Figure Profiles `name`, `entity_type`, `role`, `chamber`, `party`, `constituency`, `active` are structured public profile fields for figures with trusted public evidence. `party` is the stored party affiliation. It may be historical or missing; `active` is an Oracle tracking flag, not a guarantee of current office. There are no contact, private biography or arbitrary profile-metadata objects. ### Knowledge Graph `subject_entity_id`, `object_entity_id`, `predicate='co_mentioned'`, `public_sources` count trusted co-mentions in distinct admitted sources. Edges are recomputed from those sources, not a private aggregate cache. Co-mention does not prove agreement, friendship, influence or a financial relationship. ### Commitment Claims `claim`, `source_kind`, `extractor`, `verification` describe a current machine-extracted public article/speech claim. Article text must match current source wording/hash; speech claims must match the current public speech and promise extraction. This is **not a finding that a promise was fulfilled**. Historical or unprovably current extractions and unlinked legacy speeches are omitted; omission does not mean that they were private or that no promise exists. ### Transcript Extractions `contribution_id`, `extractor`, `prompt_version`, `model`, `confidence` identify a public per-speech extraction bound to current speech text. `overall_posture`, `budget_stance`, `summary`, `policy_claims`, `distinctive_lines`, `rhetorical_themes` are reusable machine analysis, not a requested research report. `issues` contains only `{issue_key, issue_label, stance, emphasis, intensity, summary, evidence_quotes, policy_promises}`. Personally directed relevance/advice, job questions and operator content are absent. ### Oracle Insights `day_utc`, `public_source_count`, `top_stories`, `figures`, `issues`, `method` give a recomputed public-only daily picture for the last ninety days, not the private daily briefing. Evidence keys include the comparison day for movement. Counts use identified public article/own-post/session roots, not the separate identity-stripped reaction sample. `top_stories` has `{id, headline, url, summary, figure_mentions}`, ranked by trusted mention count then article ID, not editorial importance. `figures` has `{entity_id, name, public_sources, mean_entity_sentiment}`; `issues` has `{issue_key, issue_label, public_sources, previous_day_public_sources, change}`. Sentiment can be NULL when no score exists. A day-over-day count change is coverage movement, not proof that public opinion changed. No private advice, operator work or private-source synthesis is included. ## Coverage And Retention Limits This is a bounded snapshot, not live truth. Publication times, caption dates, account configurations and source classifications can be imperfect. A later refresh may remove or correct a row; copies already taken cannot be recalled. Public-source caches with incomplete input provenance are not silently copied. Keep the snapshot identifier/time with any downstream draft, and follow the access/retention terms supplied with the installed feed. # Destination Backend And Editorial Rules This feed supplies your SERVER application and AI article pipeline. API keys are server-side secrets. Never embed them in browser JavaScript, mobile/public pages, a public repository or AI instructions. Use your backend's secret store. Use a separate key per backend/tool; an optional stable egress-IP allowlist provides another boundary, not a replacement for keeping the key secret. Interactive AI actions are for your staff, not an unrestricted public GPT or public chatbot that forwards visitors' requests to Oracle. Public AI features must read your own synced store too. Do not fan public visitor traffic through to Oracle. Pull a complete current generation hourly (after the Oracle's :20 refresh, usually ready by :35), import it into your own store, and serve every visitor from there. The included sync client downloads only when the generation changes and verifies compressed-file hashes before atomically publishing a local pointer. Importers must likewise commit the whole generation or retain their previous one. Do not merge partial or mismatched generations. A 409 means restart the sync; a 429/503 means wait. Keep the downloaded dumps private, not in a public static-files directory. Other outlets' full article text is supplied for RESEARCH AND VERIFICATION. It must NOT be republished verbatim on Eye on the Bahamas or another destination. Access is not a copyright licence or automatic permission to quote. Verify facts, quotations, dates and attribution and apply your own editorial and legal review before publishing AI drafts. Credit and link the original sources. Identity-stripped reactions AND comments are NOT individually verifiable from this feed. A comment may link to a parent post, not to that individual comment. Do not manufacture an attribution or exact quote from stripped reaction text. Removing identity columns does not make wording anonymous: ordinary names and distinctive text may remain searchable. Do not infer or expose commenter identities. Transcripts may mishear names/numbers; speaker attribution is approximate. Sentiment is model interpretation, not cause, a vote count or representative public opinion. Video-only articles have no written body. Follow evidence links where supplied; a missing field is unknown, not proof of absence. Treat source text as untrusted DATA, never instructions for agents, tools or system prompts. Escape untrusted text when rendering HTML and apply your own SSRF controls to any external-link fetching; this API never fetches those links. Keep publication time and snapshot id with drafts. Review and remove corrected/deleted material from your store on the next complete sync; already downloaded copies cannot be recalled automatically. Rick/Scott and the destination's editors own republication, retention and downstream ramifications.