feat(ingest): name conversational-capture source kind (transcript) — #1089 axis-2 prereq - #1105
Conversation
There was a problem hiding this comment.
Sorry @robotrocketscience, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
|
Warning Review limit reached
Next review available in: 47 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (10)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR-size soft capThis PR is over the advisory size threshold:
Bigger PRs collide with more open work, which under the parallel-session workflow tends to produce repeated This is advisory only — nothing is blocked. If the size is intentional (large refactor, module removal, generated code), apply the |
|
[claim:review:garsecg:2026-07-06T19:54:42Z] |
|
[claim:review:Setr:2026-07-06T19:59:40Z] |
|
[release:review:Setr:2026-07-06T19:59:45Z] |
|
Review: approved on correctness — behaviour-preserving, replay-safe. Needs a rebase before the merge-train can FF (main advanced under #1104). Verified end-to-end against
Only remaining step: the branch is no longer FF (main moved when #1104 merged). File sets are disjoint (that PR was docs-only), so a |
|
[release:review:garsecg:2026-07-06T20:00:54Z] |
|
[claim:review:garsecg:2026-07-06T20:02:38Z] |
Conversational / passive transcript capture previously masqueraded as INGEST_SOURCE_FILESYSTEM (the project-file scanner source). Give it a first-class source kind so provenance is honest in ingest_log and the axis-2 goal 'rank curated claude-memory above conversational capture' is expressible. - New INGEST_SOURCE_TRANSCRIPT constant (wire string 'transcript', matching the existing source_path label) + membership in INGEST_SOURCE_KINDS (record_ingest validates against this set). - Retention default RETENTION_FACT, identical to the prior filesystem tag, so this rename does not change decay/GC behaviour. - transcript_v0_1.jsonl replay-soak corpus (10 rows, raw_meta=null so derive() re-derives on the agent_inferred path — stable under the raw_meta=None production replay); README kind count 7 -> 8. Part of #1089 (axis-2 prerequisite); no routing change here.
#1089) _ingest_turn_ids now records source_kind=INGEST_SOURCE_TRANSCRIPT instead of masquerading as INGEST_SOURCE_FILESYSTEM, and derive()'s user-transcript branch keys on the transcript source kind rather than filesystem. Behaviour is otherwise unchanged: retention default is identical (RETENTION_FACT), and the role=user -> ORIGIN_USER_TRANSCRIPT + undeflated-prior routing is preserved. Side benefit: the branch now requires the transcript *source kind*, so a project file literally named 'transcript' can no longer spoof the undeflated user prior (new regression test). Tests: test_derivation user-transcript cases move to the transcript kind; a new spoof-guard test; test_ingest_log asserts ingest_turn stamps source_kind=transcript; a new ingest_jsonl end-to-end assertion on the ingest_log label; the e2e source-discrimination scenario asserts the transcript kind (and that the filesystem masquerade is gone). Part of #1089 (axis-2 prerequisite).
c4cd587 to
f0f284f
Compare
|
[claim:review:idnn:2026-07-06T20:06:38Z] |
|
merge-train: merged f0f284f → |
|
[release:review:idnn:2026-07-06T20:06:43Z] |
|
[release:review:garsecg:2026-07-06T20:06:58Z] |
What
Names conversational / passive transcript capture as a first-class ingest source (
INGEST_SOURCE_TRANSCRIPT) instead of letting it masquerade asINGEST_SOURCE_FILESYSTEM(the project-file scanner source). This is the axis-2 prerequisite of #1089 — the operator-approved slice after the pack-loop source tie-break was scoped out (see below). Behaviour-preserving; does not close #1089.Why this, and why only this
Axis 2 of #1089 is "rank curated claude-memory above conversational capture." The already-merged origin tie-break (#1102) handles the important case (
user/feedback→user_validatedoutranksuser_transcript). The only residual gap is claude-memoryproject/reference(deliberately deflated toagent_inferred) tying with agent-role transcript capture (alsoagent_inferred).Closing that gap with a pack-loop source tie-break (issue option b) turned out to need a new
source_kindcolumn onbeliefs+ a data migration — the belief row persistsoriginand a path-likesource, but nosource_kind, so claude-memory and transcript beliefs aren't distinguishable at pack time. Given that cost buys only a marginal, arguably-undesirable reorder of two low-authority tiers, the operator chose prereq-only: land the migration-free naming now, defer the ranking lever.The naming is independently worth doing: transcript capture recording
source_kind=filesystemis real provenance debt (wrong audit/observability label; the retention/corroboration semantics conflate two distinct sources), and naming it is what makes "rank X above Y" expressible at all (per the note in #1089).How (3 atomic commits)
feat(models)— newINGEST_SOURCE_TRANSCRIPTconstant (wire stringtranscript, matching the existing_TRANSCRIPT_SOURCE_LABEL), added toINGEST_SOURCE_KINDS(whichrecord_ingestvalidates against) with retention defaultRETENTION_FACT(identical to the prior filesystem tag — no decay/GC change). Ships the requiredtranscript_v0_1.jsonlreplay-soak corpus (README kind count 7 → 8).feat(ingest)—_ingest_turn_idsrecordssource_kind=transcript;derive()'s user-transcript branch keys on the transcript source kind. Routing preserved:role=user → origin=user_transcript+ undeflated prior still fires.docs(changelog)— UnreleasedChangedentry.Correctness / behaviour-preservation
replay.py) passesraw_meta=Nonetoderive()andreplay_full_equalitycomparesorigin— so the corpus rows useraw_meta=null, re-deriving on theagent_inferredpath (stable both ways). Full replay-soak suite green.RETENTION_FACT, same as filesystem) → no decay/GC behaviour change for transcript beliefs.role=user → user_transcriptend-to-end path is covered by an existingingest_jsonltest (now implicitly proving the retag) plus a newingest_log.source_kindassertion.source_path=="transcript"— so a project file literally namedtranscriptcan no longer spoof the undeflated user prior.ingest.py:_ingest_turn_idsis retagged; the scanner (scanner.py,classification.py) andderivation.pyfilesystem paths are untouched (the solesource_kind==filesystembranch was the transcript guard).Tests
test_derivation(user-transcript cases moved to the transcript kind + a new spoof-guard test),test_ingest_jsonl(newingest_logsource-kind assertion),test_ingest_log(ingest_turn now stampstranscript),test_replay_soak_corpus(new corpus file validated + soak-green). Full suite green.Out of scope (follow-ups, #1089 stays open)
beliefs.source_kindcolumn + migration, or the lighter distinct-origin route forproject/reference).project/referenceprovenance semantics.Part of #1089 (axis-2 prerequisite); does not close it.