"Scientia publication: what you type vs what the system derives"

Scientia publication: operator inputs vs system-derived fields

Use this with How-To: Publish Scientia findings and the publication playbook.

Surfaces (same manifest, different entry points)

SurfaceYou provideSystem derives
CLI vox db publication-*Flags, paths, publication_id, approver id, optional --channels CSVDigest (content_sha3_256), attempt rows, gate evaluation (dual approval + armed), worthiness score from default contract + manifest (for per-channel policy floors), optional live block via VOX_SOCIAL_WORTHINESS_ENFORCE / VOX_SOCIAL_WORTHINESS_SCORE_MIN
MCP vox_scientia_publication_*Tool params (publication_id, dry_run, optional channels, json)Same as CLI; MCP also merges orchestrator [news].dry_run and publish_armed with tool dry_run for the live gate; worthiness live enforcement follows [news].worthiness_* or the same VOX_SOCIAL_WORTHINESS_* env overrides
Orchestrator NewsServiceMarkdown under news_dir; [orchestrator.news] configUnifiedNewsItem from file content; digest; worthiness score probe; DB upsert for manifest

Live publish gate (all surfaces): two distinct digest-bound approvers in VoxDb, publish_armed (config and/or VOX_NEWS_PUBLISH_ARMED), no overriding dry-run on item + surface. CLI armed uses env only; MCP/orchestrator use config OR env.

If syndication.distribution_policy.dry_run is true in metadata, the runtime forces syndication.dry_run on (stricter than omitting the flag).

Config precedence (MCP publication): env vars read by PublisherConfig::from_operator_environment win over orchestrator TOML for Twitter chunk/suffix and API bases; orchestrator fills gaps only when env left those fields unset. Site URLs use [news] then VOX_NEWS_SITE_BASE_URL / VOX_NEWS_RSS_FEED_PATH. CLI publication uses contract defaults plus the same news site env overrides (no orchestrator TOML).

Rough character budgets (typed by you vs derived)

Approximate UTF-8 characters; platforms may count code points differently. “You” = manifest fields + syndication overrides; “System” = truncation/summaries from content_markdown / title.

DestinationYou (typical)System (typical)Contract / env knobs
Body / long-formFull markdown (unbounded in DB; keep under ~50k chars pragmatically)Digest hash, templates
Twitter singleOptional short_text (0–~240 if you set it)Else derived summary capped by TWITTER_TEXT_CHUNK_MAX minus margin (VOX_NEWS_TWITTER_TEXT_CHUNK_MAX, VOX_SOCIAL_TWITTER_SUMMARY_MARGIN_CHARS)vox_publisher::contract
Reddit titleOften implicit from item titleClamped ~300REDDIT_TITLE_MAX
Reddit self-post bodyOptional text_overrideDerived summary capVOX_SOCIAL_REDDIT_SELFPOST_SUMMARY_MAX
Hacker Newstitle_override if set (~80)Else title shortenedHACKER_NEWS_TITLE_MAX
YouTube titleOptional override (~100)From item titleYOUTUBE_TITLE_MAX
YouTube descriptionOptional overrideFrom bodyYOUTUBE_DESCRIPTION_MAX
GitHub releaserepo, tag, body fragmentsRendered from templates
Open Collectivecollective_slug + privacyShort text from markdown

Per-channel: typical manual burden

ChannelYou usually setDerived / automatic
RSSEnable + site base_url / feed_path (config)Feed XML rewrite paths from item body/title
TwitterOptional short_text, thread; API token (Clavis / env)Summary truncation using twitter_text_chunk_max and margin env
GitHubrepo, release/discussion fieldsRelease tag text from title/version patterns when using templates
Open Collectivecollective_slug, privacyGraphQL payload from markdown summary
RedditSubreddit, post kind, overridesTitle/body caps from contract env overrides
Hacker Newsmanual_assist mode (no official post API)Assist text only; no automated submit
YouTubevideo_asset_ref + OAuth secretsUpload uses repo-root asset resolution; skips cleanly if asset missing
crates.ioPayload in contract onlyNot implemented: runtime returns explicit dry-run / failure, never silent publish

Scholarly submit: VOX_SCHOLARLY_ADAPTERlocal_ledger (default, Codex-friendly ledger id) or echo_ledger (deterministic id, no external repo call; tests/CI). Unknown values fail fast.

Metadata keys (DB / frontmatter)

Persist syndication policy under metadata_json as syndication, not a top-level scientia_distribution key. Optional topic_pack string merges topic-pack YAML. See contracts/scientia/distribution.schema.json.