You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Privacy gap: local file paths with OS account names reach telemetry and the aggregate CSVs.llm.model is sent without sanitization. The extract's redaction only knows emails, UUIDs and ak_ hashes. In this window, 46 provider_stack_daily.csv rows (20 distinct values, 67,010 completed runs) have an llm_model containing a home-directory segment (/home/…, /Users/…, /root/…). That includes the current release, 1.6.0. Open PR SDK-775 feat: Make pipeline telemetry diagnosable #5159 adds embedding.model through the same regexes, so it would widen the gap.
The other trend breaks (POST /v1/add −28.1% WoW, neo4j completions −38.4% WoW, azure_openai +381%) trace back to one to four deployments each. They are listed under Watching, not filed.
Data window and method
Window:telemetry_aggregates/*.csv, 2026-07-16 → 2026-09-24 (WINDOW.txt: window_days=70). 09-24 is partial: 41,126 fleet pipeline starts vs 362,045 on 09-23. It is left out of every rate. 09-23 is the only day that became complete since Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182. Weeks: W1 = 09-17…09-23, W2 = 09-10…09-16, W3 = 09-03…09-09.
Tooling: earlier reports had to hand-sum. This run computed every aggregate with jq over the CSVs (python, awk and bc are still refused). The fleet 09-22 totals reproduce Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182's hand sums exactly (357,673 started / 225,761 completed / 81,035 errored). 1.6.0's 09-23 cohort split adds back to its pipeline_outcomes_daily.csv total (30,272 + 50,414 = 80,686).
Fleet pipeline, last complete days (pipeline_outcomes_daily.csv):
Finding 1 — llm.model sends local filesystem paths, including OS account names, and the extract's redaction misses them (severity: high, privacy)
Computed
provider_stack_daily.csv, whole window. Counts only: no matching value is reproduced here, on purpose.
slice
rows
distinct llm_model values
completed runs
days present
value contains a home-directory segment (`(^
/)(home|users|root)/`, case-insensitive)
46
20
67,010
value contains any absolute path (//, leading /, drive letter, or \)
97
40
70,332
—
for comparison: values already bucketed as redacted
91
—
4,361
—
Versions affected (home-directory slice): 1.2.2, 1.4.0, 1.4.1, 1.4.2, 1.5.3 and 1.6.0. Two of the 46 rows fall in the last seven days.
llm_provider on those rows: openai 25, custom 18, llama_cpp 3. These are local GGUF or model-directory setups served through OpenAI-compatible or llama.cpp endpoints. That is exactly what the keyless and local-model path in 1.6.0 encourages.
Each row covers at most 2 identities. So this is a handful of deployments, each with its account name written into a CSV that gets posted to the analysis runner. The row inspected while finding this had an OS account name right after /home/.
Cause (code reading, not a hypothesis)
Client:run_tasks_with_telemetry (cognee/modules/pipelines/operations/run_tasks_with_telemetry.py:19-33) merges get_current_settings() into every Pipeline Run Started/Completed/Errored event. That dict carries llm.model = llm_config.llm_model verbatim (cognee/modules/settings/get_current_settings.py:43-46). send_telemetry only hashes keys named in TELEMETRY_SANITIZED_PROPERTIES = ["url", "session_id", "session_ids", "datasets"] (cognee/shared/utils.py:134, applied at :406). The DB url fields are hashed; model is not. So the raw path, untruncated, is stored in the warehouse.
Extract:CELL_PATTERNS (.github/scripts/telemetry_aggregate_extract.py:38-42) are email, UUID and ak_ hash. The same patterns drive the SQL bucketing (_provider_dimension, :46-56, applied at :151-155) and the post-write privacy guard (:196-210). A path matches none of them, so it goes through both the redaction and the guard that is supposed to fail the job.
Open PR SDK-775 feat: Make pipeline telemetry diagnosable #5159 extends the gap. It adds "embedding": {"provider", "model"} to get_current_settings() and an embedding_model column to the extract, redacted "like the LLM ones". Local embedding models are just as often given as filesystem paths.
Proposed fix
Client (the root cause). Sanitize model identifiers in cognee/shared/utils.py before sending. If llm.model (and embedding.model once SDK-775 feat: Make pipeline telemetry diagnosable #5159 lands) looks like a filesystem path (leading / or ~, a drive letter, a backslash, or a provider//abs/path form), replace it with its basename or a fixed local-path token. The provider prefix is still useful. Add a unit test next to cognee/tests/unit/shared/test_telemetry_dataset_names.py.
Extract (defence in depth). Add a path pattern to CELL_PATTERNS, for example (^|[/\\])(home|users|root)[/\\] plus ^[a-z]:[/\\]. That lets the SQL redaction and the post-write guard both catch paths. Extend test_redacts_identifiers_in_provider_dimensions in cognee/tests/unit/test_telemetry_aggregate_extract.py. Apply it to SDK-775 feat: Make pipeline telemetry diagnosable #5159's embedding_model column before that PR merges.
Warehouse. Consider scrubbing already-stored properties.llm.model values that match the pattern. The extract fix only hides them from the CSVs.
Confirming observable. In the next extract after (2), rows whose llm_model matches the home-directory pattern should be 0 (from 46), and the redacted bucket should grow by the matching runs. After (1) ships, new-version rows should show basenames or local-path instead of redacted.
Finding 2 — "1.0.3" and "1.1.0" are forks, and they distort fleet error and search metrics (severity: medium, analysis integrity)
Computed
Search types never in upstream.search_type_daily.csv, whole window, checked against cognee/modules/search/types/SearchType.py. git log --all -S/-G finds none of these names in the file's history:
1.0.3's search counters stopped matching up on 09-18.sdk_exec_outcomes_daily.csv 1.0.3 search: completed/started was ≤1.0 every day through 09-17. From 09-18 → 09-23 it was 1.13, 1.74, 1.83, 1.34, 1.74, 1.88 (for example 09-23: 5,025 started / 9,424 completed). W1 overall: 77,709 / 101,416 = 130.5%. That is nearly all of the fleet's cognee.search EXECUTION COMPLETED +23.2% WoW. Upstream 1.0.3 code cannot have changed on 09-18, so this is the fork's own instrumentation.
Hypothesis
Two downstream forks keep upstream's pyproject.toml version string and add their own retrievers. Upstream 1.0.3 was superseded on 2026-05-02 (798d84280, bump to 1.0.4). The "1.0.3" fork is a git/Docker build (-local). The "1.1.0" fork is installed as a package (non--local). Earlier reports treated both labels as upstream releases:
The aggregates cannot say whether every deployment under these labels is the fork (1.0.3-local has 19–32 identities a day). They only show that fork traffic is a large share of it.
Proposed fix
Extract (.github/scripts/telemetry_aggregate_extract.py). Add a per-(version, self_hosted) conformance flag: whether any search_type outside the upstream SearchType enum was seen in the window. Put it in version_lifecycle.csv so the analysis can exclude fork cohorts from fleet medians and WoW decompositions. This needs only the already-exported search_type dimension; no new data is collected.
1.6.0 search mix is CHUNKS-heavy: in W1, CHUNKS was 4,342 of 6,107 events (71.1%) and HYBRID_COMPLETION (the recall() default with an LLM key) was 407 (6.7%). This fits keyless setups, where recall() falls back to CHUNKS, or explicit CHUNKS calls; the aggregates cannot tell which. Note that 1.6.0 SDK search starts (29,422 in W1) far exceed its search_type rows. Worth keeping an eye on as keyless adoption grows.
Explained trend breaks (no product signal):POST /v1/add −28.1% WoW (347,895 → 250,280). 1.4.2 −73,402, where the daily non--local add volume came from 1–3 deployments and stopped after 09-14, and 1.0.1 −22,278. Neo4j completed runs −38.4% WoW (344,909 → 212,523), led by one single-identity 1.0.8 stack (91,343 → 22,086). azure_openai +381% (34,297 → 165,080), almost all on 1.4.2 with at most 4 identities per row; this is also why 1.4.2's pipeline volume roughly doubled at a 1.98% W1 error rate. vertex_ai +1,557% is one 1.5.4 deployment (48,049). Search-mix shifts are version-local: 1.5.0 CHUNKS_LEXICAL −10,267, 1.5.3 GRAPH_COMPLETION +11,573, and the 1.0.3 fork's RAG_COMPLETION −5,394. None is a routing change in a current release.
Data window and privacy note
This analysis used only the pre-aggregated, anonymized CSVs in telemetry_aggregates/ (2026-07-16 → 2026-09-24, 09-24 partial), plus this repository's git history and public issue/PR metadata via gh. No warehouse or external data source was queried. Finding 1 describes identifier-bearing values found in those CSVs. This report deliberately reproduces none of them; only counts are given. No attempt was made to get finer-grained data.
Telemetry insights — 2026-09-24
Executive summary
llm.modelis sent without sanitization. The extract's redaction only knows emails, UUIDs andak_hashes. In this window, 46provider_stack_daily.csvrows (20 distinct values, 67,010 completed runs) have anllm_modelcontaining a home-directory segment (/home/…,/Users/…,/root/…). That includes the current release, 1.6.0. Open PR SDK-775 feat: Make pipeline telemetry diagnosable #5159 addsembedding.modelthrough the same regexes, so it would widen the gap.SearchTypevalues that have never existed in cognee: 31.3% and 26.3% of their search events. In W1 these two cohorts are 9.94% of fleet pipeline starts, 13.14% of fleet errors, and 40.9% of the +30% WoW error increase. This changes how Telemetry insights: 2026-09-19 — fleet-wide pipeline error step change around Sept 10 #5140 F5, Telemetry insights: 2026-09-22 — demo Postgres graph backend carries 19% of fleet completed runs #5167 F3 and part of Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182 should be read.-localbuilds failed at 29.04% and the rest at 11.73%; 1.5.4-local failed at 47.87% vs 12.33% for other 1.5.4.POST /v1/add−28.1% WoW, neo4j completions −38.4% WoW,azure_openai+381%) trace back to one to four deployments each. They are listed under Watching, not filed.Data window and method
telemetry_aggregates/*.csv, 2026-07-16 → 2026-09-24 (WINDOW.txt:window_days=70). 09-24 is partial: 41,126 fleet pipeline starts vs 362,045 on 09-23. It is left out of every rate. 09-23 is the only day that became complete since Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182. Weeks: W1 = 09-17…09-23, W2 = 09-10…09-16, W3 = 09-03…09-09.jqover the CSVs (python, awk and bc are still refused). The fleet 09-22 totals reproduce Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182's hand sums exactly (357,673 started / 225,761 completed / 81,035 errored). 1.6.0's 09-23 cohort split adds back to itspipeline_outcomes_daily.csvtotal (30,272 + 50,414 = 80,686).pipeline_outcomes_daily.csv):originstill takes onlysdk(3,837 rows) andunknown(32,081 rows). There is nocliorcloud(already reported in Telemetry insights: 2026-09-19 — fleet-wide pipeline error step change around Sept 10 #5140 F3c). Analysis 1 therefore uses event families.Finding 1 —
llm.modelsends local filesystem paths, including OS account names, and the extract's redaction misses them (severity: high, privacy)Computed
provider_stack_daily.csv, whole window. Counts only: no matching value is reproduced here, on purpose.llm_modelvalues//, leading/, drive letter, or\)redactedllm_provideron those rows:openai25,custom18,llama_cpp3. These are local GGUF or model-directory setups served through OpenAI-compatible or llama.cpp endpoints. That is exactly what the keyless and local-model path in 1.6.0 encourages./home/.Cause (code reading, not a hypothesis)
run_tasks_with_telemetry(cognee/modules/pipelines/operations/run_tasks_with_telemetry.py:19-33) mergesget_current_settings()into everyPipeline Run Started/Completed/Erroredevent. That dict carriesllm.model = llm_config.llm_modelverbatim (cognee/modules/settings/get_current_settings.py:43-46).send_telemetryonly hashes keys named inTELEMETRY_SANITIZED_PROPERTIES = ["url", "session_id", "session_ids", "datasets"](cognee/shared/utils.py:134, applied at:406). The DBurlfields are hashed;modelis not. So the raw path, untruncated, is stored in the warehouse.CELL_PATTERNS(.github/scripts/telemetry_aggregate_extract.py:38-42) are email, UUID andak_hash. The same patterns drive the SQL bucketing (_provider_dimension,:46-56, applied at:151-155) and the post-write privacy guard (:196-210). A path matches none of them, so it goes through both the redaction and the guard that is supposed to fail the job."embedding": {"provider", "model"}toget_current_settings()and anembedding_modelcolumn to the extract, redacted "like the LLM ones". Local embedding models are just as often given as filesystem paths.Proposed fix
cognee/shared/utils.pybefore sending. Ifllm.model(andembedding.modelonce SDK-775 feat: Make pipeline telemetry diagnosable #5159 lands) looks like a filesystem path (leading/or~, a drive letter, a backslash, or aprovider//abs/pathform), replace it with its basename or a fixedlocal-pathtoken. The provider prefix is still useful. Add a unit test next tocognee/tests/unit/shared/test_telemetry_dataset_names.py.CELL_PATTERNS, for example(^|[/\\])(home|users|root)[/\\]plus^[a-z]:[/\\]. That lets the SQL redaction and the post-write guard both catch paths. Extendtest_redacts_identifiers_in_provider_dimensionsincognee/tests/unit/test_telemetry_aggregate_extract.py. Apply it to SDK-775 feat: Make pipeline telemetry diagnosable #5159'sembedding_modelcolumn before that PR merges.properties.llm.modelvalues that match the pattern. The extract fix only hides them from the CSVs.llm_modelmatches the home-directory pattern should be 0 (from 46), and theredactedbucket should grow by the matching runs. After (1) ships, new-version rows should show basenames orlocal-pathinstead ofredacted.Duplicate check
gh issue list --label telemetry-insights --state all→ Telemetry insights: 2026-09-19 — fleet-wide pipeline error step change around Sept 10 #5140, Telemetry insights: 2026-09-20 — v1.6.0 GA day: 67% of pipeline runs emit no terminal event #5147, Telemetry insights: 2026-09-22 — demo Postgres graph backend carries 19% of fleet completed runs #5167, Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182. None mentions paths, usernames or model-string privacy. New.gh pr list --state all --search "telemetry model path redact"→ nothing relevant."telemetry sanitize llm model"→ fix: Sanitize identifiers in telemetry aggregates (COG-6288) #4941 (CLOSED, unmerged, "Sanitize identifiers in telemetry aggregates") and SDK-775 feat: Make pipeline telemetry diagnosable #5159 (OPEN, addsembedding.modelthrough the same patterns, no path handling). The merged fix(ci): redact identifiers in telemetry provider aggregates #5034 (b66f515df) introduced the current email/UUID/ak_redaction and covers no paths. The dataset-name fingerprinting commits of 09-17 (0109e1c96,24ee40f26) do not touchmodel. Not addressed by a merged PR; the leak persists on 1.6.0, released after all of them.Finding 2 — "1.0.3" and "1.1.0" are forks, and they distort fleet error and search metrics (severity: medium, analysis integrity)
Computed
Search types never in upstream.
search_type_daily.csv, whole window, checked againstcognee/modules/search/types/SearchType.py.git log --all -S/-Gfinds none of these names in the file's history:KV146,119,HYBRID_RERANK94,271,FOLDER7,398,HYBRID6,860,KV_GREP4,913,CHUNKS_WINDOW3,517 (new, first seen 09-21),OBJECTS2,724,DB_SCHEMA_*62,THEME11SPARSE10,906,DENSE_SPARSE6,926,ADAPTIVE_COMPLETION5,885,SPARSE_COMPLETION166,DENSE_SPARSE_COMPLETION123,SUMMARIES_COMPLETION53,PARQUET_HYBRID10(Also
DISPUTES114 on 1.5.4 on 09-17 only, which is negligible. The CamelCase values on 0.1.3/0.2.0 are real legacy upstream names.)Weight in W1 fleet pipeline metrics (
daily_event_volumes.csv, split by theself_hostedflag, which means-local):-local-local)Pipeline Run Erroredrose +30.0% WoW (386,345 → 502,424, +116,079), which clears the analysis-1 threshold. Per version (pipeline_outcomes_daily.csv): 1.0.3 +29,919, 1.1.0 +17,514. Together that is 40.9% of the increase. Most of the rest is already tracked: 1.5.2 +39,015 (Telemetry insights: 2026-09-22 — demo Postgres graph backend carries 19% of fleet completed runs #5167 F2), 1.5.4 +26,180 and 1.4.1 +17,810 (Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182), and 1.6.0 +25,760 (new in W1).sdk_exec_outcomes_daily.csv1.0.3 search: completed/started was ≤1.0 every day through 09-17. From 09-18 → 09-23 it was 1.13, 1.74, 1.83, 1.34, 1.74, 1.88 (for example 09-23: 5,025 started / 9,424 completed). W1 overall: 77,709 / 101,416 = 130.5%. That is nearly all of the fleet'scognee.search EXECUTION COMPLETED+23.2% WoW. Upstream 1.0.3 code cannot have changed on 09-18, so this is the fork's own instrumentation.Hypothesis
Two downstream forks keep upstream's
pyproject.tomlversion string and add their own retrievers. Upstream 1.0.3 was superseded on 2026-05-02 (798d84280, bump to 1.0.4). The "1.0.3" fork is a git/Docker build (-local). The "1.1.0" fork is installed as a package (non--local). Earlier reports treated both labels as upstream releases:HYBRID/HYBRID_RERANK"legacy". They were never upstream.-localcohort includes the 1.0.3 fork (23.02% error rate). That does not overturn Telemetry insights: 2026-09-23 — source/Docker builds now 67% of fleet pipeline errors #5182: the effect there was driven by 1.5.4/1.5.2/1.6.0. But fleet medians and cohort rates in these reports include fork traffic.The aggregates cannot say whether every deployment under these labels is the fork (1.0.3-local has 19–32 identities a day). They only show that fork traffic is a large share of it.
Proposed fix
.github/scripts/telemetry_aggregate_extract.py). Add a per-(version, self_hosted) conformance flag: whether anysearch_typeoutside the upstreamSearchTypeenum was seen in the window. Put it inversion_lifecycle.csvso the analysis can exclude fork cohorts from fleet medians and WoW decompositions. This needs only the already-exportedsearch_typedimension; no new data is collected.install_kind. Include a stable fingerprint of theSearchTypemember set (or the distribution'sdirect_url.jsonVCS URL hash for git installs). That separates upstream from forks even when a fork never calls a custom search type.Duplicate check
gh pr list --state all --search "fork version telemetry search type"→ nothing relevant. Not addressed.Verification of prior findings (not re-filed)
-localbuilds carry most errors): persists. On 09-23,-localwas 48,921 / 168,464 = 29.04% and the rest 22,604 / 192,784 = 11.73%. 1.5.4-local was 17,312 / 36,167 = 47.87% (56.86% on 09-22) and other 1.5.4 was 5,259 / 42,635 = 12.33%. 1.6.0-local was 7,946 / 50,414 = 15.76% and non--local1.6.0 was 1,271 / 30,272 = 4.20%. SDK-775 feat: Make pipeline telemetry diagnosable #5159 is still open.Watching (near-threshold, single-deployment, or one day)
-localerror rate is creeping up: 0.79% → 2.59% → 4.20% (09-21 → 09-23), with 25 → 32 → 27 deployments reporting errors. Still far below the fleet. Re-check next run.cognify: W1 had 3,401 started / 3 completed / 3,216 errored (94.6%), from 1–3 deployments,version=unknown. The Telemetry insights: 2026-09-19 — fleet-wide pipeline error step change around Sept 10 #5140 F3b class; still under 1,000 events a day.CHUNKSwas 4,342 of 6,107 events (71.1%) andHYBRID_COMPLETION(therecall()default with an LLM key) was 407 (6.7%). This fits keyless setups, whererecall()falls back toCHUNKS, or explicit CHUNKS calls; the aggregates cannot tell which. Note that 1.6.0 SDK search starts (29,422 in W1) far exceed itssearch_typerows. Worth keeping an eye on as keyless adoption grows.POST /v1/add−28.1% WoW (347,895 → 250,280). 1.4.2 −73,402, where the daily non--localadd volume came from 1–3 deployments and stopped after 09-14, and 1.0.1 −22,278. Neo4j completed runs −38.4% WoW (344,909 → 212,523), led by one single-identity 1.0.8 stack (91,343 → 22,086).azure_openai+381% (34,297 → 165,080), almost all on 1.4.2 with at most 4 identities per row; this is also why 1.4.2's pipeline volume roughly doubled at a 1.98% W1 error rate.vertex_ai+1,557% is one 1.5.4 deployment (48,049). Search-mix shifts are version-local: 1.5.0CHUNKS_LEXICAL−10,267, 1.5.3GRAPH_COMPLETION+11,573, and the 1.0.3 fork'sRAG_COMPLETION−5,394. None is a routing change in a current release.Data window and privacy note
This analysis used only the pre-aggregated, anonymized CSVs in
telemetry_aggregates/(2026-07-16 → 2026-09-24, 09-24 partial), plus this repository's git history and public issue/PR metadata viagh. No warehouse or external data source was queried. Finding 1 describes identifier-bearing values found in those CSVs. This report deliberately reproduces none of them; only counts are given. No attempt was made to get finer-grained data.