Why
New users ingest a messy LinkedIn dump and have no idea if the corpus is good enough for voice. A corpus-report (or status --verbose) that scores readiness drives successful first drafts and fewer "it sounds generic" issues.
Proposed command
personality-protect corpus-report
personality-protect corpus-report --json
Report sections (Contoso-safe aggregates only — never print piece text by default)
- Counts by source (
linkedin_post, linkedin_article, email, note, …)
- Selection gate — how many pass
select defaults; warn/block thresholds
- Length bands — p50/p75/p90 words for posts vs articles
- Date coverage — year histogram
- Dedup hint — count of near-duplicates (reuse
corpus_dedupe logic)
- Article channel readiness — ≥5 articles in corpus + index?
- Style card status — present / stale vs selection
- Actionable next steps — e.g. "run
index-voice", "ingest more articles"
Acceptance criteria
Pointers
select.py, style_profile.py, corpus_dedupe.py, cli.py status
- Demo profile via
personality-protect demo
Difficulty
Easy–Medium — mostly composing existing metrics. Great for contributors learning the pipeline.
Why
New users ingest a messy LinkedIn dump and have no idea if the corpus is good enough for voice. A
corpus-report(orstatus --verbose) that scores readiness drives successful first drafts and fewer "it sounds generic" issues.Proposed command
Report sections (Contoso-safe aggregates only — never print piece text by default)
linkedin_post,linkedin_article,email,note, …)selectdefaults; warn/block thresholdscorpus_dedupelogic)index-voice", "ingest more articles"Acceptance criteria
--jsonemits machine-readable aggregates--show-samples Non an explicit local flag (samples stay off by default; docs warn not to paste into issues)statuscan link to or embed a short "run corpus-report for details" tipPointers
select.py,style_profile.py,corpus_dedupe.py,cli.pystatuspersonality-protect demoDifficulty
Easy–Medium — mostly composing existing metrics. Great for contributors learning the pipeline.