feat(telemetry): ambient surfacings count, apart — enter_project and the skill sync emit
CI & Build / Python lint (push) Successful in 5s
CI & Build / Plugin hooks (push) Successful in 8s
CI & Build / integration (push) Successful in 16s
CI & Build / TypeScript typecheck (push) Successful in 32s
CI & Build / Python tests (push) Successful in 47s
CI & Build / Build & push image (push) Successful in 25s
CI & Build / Python lint (push) Successful in 5s
CI & Build / Plugin hooks (push) Successful in 8s
CI & Build / integration (push) Successful in 16s
CI & Build / TypeScript typecheck (push) Successful in 32s
CI & Build / Python tests (push) Successful in 47s
CI & Build / Build & push image (push) Successful in 25s
#2477, option (a) as decided, with the readout changed in the same commit. ## The two silent surfaces enter_project returns open tasks + recent notes on every project entry — probably the largest surfacing by volume — and emitted nothing, so the pulls it caused floated unattributed and the surfaced:pulled ratio ran against a denominator missing its biggest contributor. Now source "enter_project". build_process_manifest installs every reachable Process as an auto-surfacing skill on the operator's machine — its own docstring calls it the most consequential passive surface Scribe has — and emitted nothing, so a Process matched on every relevant turn and never opened was indistinguishable from one never installed. Now source "process_skill_sync": the honest event is "installed", which is a surfacing in effect since the description sits in front of the model each session. ## The readout, same commit — the condition option (a) carried Both surfaces are AMBIENT: top-N-by-recency and install-everything are not ranked choices. Pooling them into surfaced_count would make a note's number dominated by "recently updated in a project you opened", and dead-weight detection would read that as popularity — the wrong number read confidently, which is the corrupts-data tier the survey ranked above everything else. So usage_for_notes splits: surfaced_count stays RANKED-ONLY (every existing consumer's reading — "surfaced often, never pulled → dead weight" — keeps meaning what it meant), and ambient_count is new. Classified in SQL via a CASE on AMBIENT_SOURCES so the group count stays three rows per note, not one per distinct source. Pulls stay pooled: "did anyone ever open this?" does not depend on how it was found. #1038 and #2085 read agent pulls and ranked surfacings; both are unaffected by ambient volume, which is the point. Refs #2477
This commit is contained in:
@@ -243,6 +243,19 @@ async def build_process_manifest(user_id: int) -> dict:
|
||||
entry["shared"] = True
|
||||
entry["owner"] = it.get("owner")
|
||||
procs.append(entry)
|
||||
|
||||
# The most consequential passive surface Scribe has (see SCOPE above), and
|
||||
# it emitted nothing — a Process installed as a skill, matched on every
|
||||
# relevant turn and never once opened, was indistinguishable from one never
|
||||
# installed (#2477). The honest event is "installed on the operator's
|
||||
# machine", which is a surfacing in effect: the skill description is in
|
||||
# front of the model each session. AMBIENT source — installation is not a
|
||||
# ranked choice — so it lands in ambient_count, not surfaced_count.
|
||||
record_surfaced(
|
||||
user_id=user_id,
|
||||
note_ids=[int(p["id"]) for p in procs],
|
||||
source="process_skill_sync",
|
||||
)
|
||||
return {"processes": procs, "total": len(procs)}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user