Siftly epistemic report
Type: agentic-system-analyses/types/agentic-system-epistemic-report.md
Source-and-claim boundary
The question is how Siftly's bookmark collection acquires truth-apt content, generates annotations, checks candidates and licenses later reliance. Scope, exclusions and source identity are see boundary; evidence layers are see its Source register. All source-dependent findings below use SRC-1, implementation unless explicitly marked doctrine/design. No target execution was performed or supplied.
The material distinction is between admitting usable metadata and accepting its truth. Siftly's structural checks can reject malformed or out-of-domain output. They do not independently check whether a depicted person, transcribed sentence, topic assignment or relevance explanation is correct. Imported statements remain acquired source content, not propositions established by Siftly. Source attribution is retained through bookmark identities/raw JSON, but source warrant is unknown; recording a tweet does not verify what it says. See RT-RTE-import-content.
Consequential claims are RT-CLM-bookmark-work, RT-CLM-category-policy and EPI-CLM-tags-reliability. The last two explicitly license reliance on earlier AI output. The search/retrieval architecture can be assessed without asserting that these reliability claims are true.
| Entry point or operation | Source path | Coverage and records | Basis or remaining limit |
|---|---|---|---|
| File import and browser pipeline trigger | app/api/import/route.ts, app/import/page.tsx |
RT-RTE-import-content | Supplied runtime; endpoint persistence is distinct from browser-triggered processing. |
| Bookmarklet, Twitter, live/sync, OAuth ingestion | app/api/import/bookmarklet/route.ts, app/api/import/twitter/route.ts, lib/x-sync.ts, app/api/import/x-oauth/fetch/route.ts |
RT-RTE-import-content | Supplied runtime/boundary; OAuth normalization not independently inspected here. This prevents a system-complete assertion about import fidelity. |
| Main pipeline, force, stop, write and read-back | app/api/categorize/route.ts, lib/categorizer.ts |
RT-RTE-enrich-categorize, EPI-RTE-semantic-tags | Direct reads of parser/writer, prompts, pipeline enrichment and endpoint selector; supplied runtime for stop branches. |
| Raw JSON entity backfill | lib/rawjson-extractor.ts |
EPI-RTE-entity-extraction | Direct read of extraction/backfill; tool-domain lookup internals not independently assessed. |
| Vision and independent image endpoint | lib/vision-analyzer.ts, app/api/analyze/images/route.ts |
EPI-RTE-image-analysis | Direct read of analysis, cache, failure disposition and independent endpoint; helper batch scheduling partly supplied by runtime. |
| Image-context reduction | lib/image-context.ts |
EPI-RTE-image-context | Complete direct read; concrete deduction below. |
| Category generation, creation, manual replacement and deletion | lib/category-suggester.ts, app/api/categories/suggest/route.ts, app/api/bookmarks/[id]/categories/route.ts, app/api/categories/[slug]/route.ts |
RT-RTE-category-admission, EPI-RTE-content-withdrawal | Supplied runtime for suggestion/manual admission; direct read of deletion. |
| Direct caller-authored categories and empty-store default seeding | app/api/categories/route.ts |
EPI-OBJ-category-description | Direct read confirms additional writer and GET seeding. Not fully assessed as a separate authority route; category-admission inventory remains partial. No inference that custom descriptions must originate in model suggestions or that only pipeline start seeds defaults. |
| AI search and FTS | app/api/search/ai/route.ts, lib/fts.ts |
RT-RTE-search-content, EPI-CLM-tags-reliability | Direct read of reranking prompt/parser/hydration/cache write and complete FTS; supplied runtime for candidate selectors. |
| CLI dispatch, show and non-model search; exports | cli/siftly.ts, lib/obsidian-exporter.ts |
RT-RTE-cli-export | Direct CLI dispatch inspection confirms only search/list/show/categories/stats. Supplied runtime for command bodies; direct reads of emitted-field builders in lib/exporter.ts and lib/obsidian-exporter.ts establish omission of imageTags, not full export fidelity. |
| Browse, graph, count and clearing operations | app/api/bookmarks/route.ts, app/api/mindmap/route.ts, app/api/stats/route.ts |
RT-OBJ-bookmark, EPI-RTE-content-withdrawal | Direct browse/clear read; graph/count roles supplied by boundary, not full direct inspection. No graph-wide semantic guarantee follows. |
| Provider/CLI settings and dispatch | lib/ai-client.ts, lib/claude-cli.ts, lib/codex-cli.ts, app/api/settings/route.ts |
RT-RTE-model-dispatch, RT-RTE-settings-change | Supplied runtime; no Siftly registered-tool loop identified there. External executables' tools/hooks remain outside frozen source. |
| Media, preview, auth and setup | app/api/media/route.ts, app/api/link-preview/route.ts, middleware.ts, start.sh |
See boundary and RT-RTE-model-dispatch | Transport/admission support retained in scope; no independent claim of an epistemic evaluator for these operations. |
Missing provider responses prevent classifying actual generated edges as faithful transcription, entailed description or novel non-entailed assertion. Missing image ground truth, human judgments and retrieval benchmarks prevent assessing transcription/entity/category/relevance accuracy. Missing execution traces prevent concluding that a route operated, influenced a model, or benefited an agent. Missing provider internals prevent assessing weight updates or internal model criticism. Available operations not directly inspected here are identified above; the report makes no system-complete negative about every possible evaluator or ontology transformation.
Epistemic-object inventory
Objects split where form, producer or reliance differs. Container identity is see RT-OBJ-bookmark; its parts below do not supersede it.
| Object ID | Candidate truth-apt content or none | Claimed role | Evidence source ID and local anchor | Gap/limit |
|---|---|---|---|---|
| RT-OBJ-bookmark | See record; imported text can assert external facts | See record | SRC-1, prisma/schema.prisma |
Collection-level container; acquired source assertions are not verified facts. |
| EPI-OBJ-entities | See record | See record | SRC-1, lib/rawjson-extractor.ts |
Extracted fields and heuristic labels have different warrant. |
| EPI-OBJ-image-tags | See record | See record | SRC-1, lib/vision-analyzer.ts |
No inspected response or ground truth; {} is a control marker, not an image proposition. |
| EPI-OBJ-semantic-tags | See record | See record | SRC-1, lib/vision-analyzer.ts |
Search terms may be non-propositional; sentiment/person/company associations can be true or false over a bookmark. |
| EPI-OBJ-bookmark-category | See record | See record | SRC-1, lib/categorizer.ts |
Topic membership is assessable relative to category meaning; confidence is not calibrated probability. |
| EPI-OBJ-category-description | See record | See record | SRC-1, lib/categorizer.ts |
Category guidance is principally policy, not an explanation validated against evidence. |
| EPI-OBJ-search-matches | See record | See record | SRC-1, app/api/search/ai/route.ts |
Relevance reasons may assert bookmark facts; ranking preference alone is not a factual proposition. |
Authority-route ledger
Ledger fields owned by a shared record use see. Each compact row separates a consequential function even when one source routine implements several. Architectural status concerns source wiring, not observed activation. No ledger row claims observed operation.
Route ID: RT-RTE-import-content
Route function: content transformation
Architectural status: implemented
Object/candidate ID: RT-OBJ-bookmark
Content/update relation: truth-apt transformation: acquisition/import; source warrant unknown.
Transition or check target: See route.
Evaluator/condition and domain: See route; parsing/duplicate checks license shape and identity handling, not truth of tweet statements.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Attribution to imported source only; no fact endorsement established.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/import/route.ts; see route.
Claim IDs or none: RT-CLM-bookmark-work
Mismatch marker or none: none
Gap/limit: Import normalization is not a truth check; operation unobserved.
Route ID: RT-RTE-import-content
Route function: retention
Architectural status: implemented
Object/candidate ID: RT-OBJ-bookmark
Content/update relation: no content change
Transition or check target: See route's write/read-back fields.
Evaluator/condition and domain: See route; storage admission only.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Retention does not add source warrant.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/import/route.ts; see route.
Claim IDs or none: RT-CLM-bookmark-work
Mismatch marker or none: none
Gap/limit: No evidence-consuming factual acceptance decision identified in this route.
Route ID: EPI-RTE-entity-extraction
Route function: content transformation
Architectural status: implemented
Object/candidate ID: EPI-OBJ-entities
Content/update relation: truth-apt transformation: non-ampliative reshaping for copied/lowercased fields; truth-apt transformation: entailed derivation only for code-defined structural predicates such as hasMedia, conditional on correctly encoded input. Tool-name semantic inference remains indeterminate without assessment of lookup conventions.
Transition or check target: See route.
Evaluator/condition and domain: See route; deterministic extraction is not independent evidence of external reality.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Preserves selected source values, not their truth; structural results licensed only in the JSON/code domain.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/rawjson-extractor.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Default original/false values also arise from missing or invalid input; they do not warrant claims about an actual tweet.
Route ID: EPI-RTE-image-analysis
Route function: content transformation
Architectural status: implemented
Object/candidate ID: EPI-OBJ-image-tags
Content/update relation: truth-apt transformation: indeterminate; requested OCR may reshape text, descriptions may be entailed by image evidence, and inferred mood/person/template tags may be ampliative. Actual response and image interpretation are needed to classify an edge.
Transition or check target: See route.
Evaluator/condition and domain: See route; model proposes annotation, not an independent factual evaluator.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Candidate image assertions only, with video assertions scoped to thumbnail rather than whole video.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/vision-analyzer.ts; see route.
Claim IDs or none: RT-CLM-bookmark-work
Mismatch marker or none: none
Gap/limit: CLI receives a URL, not the SDK image bytes; actual image access is not established.
Route ID: EPI-RTE-image-analysis
Route function: check/evidence production
Architectural status: implemented
Object/candidate ID: EPI-OBJ-image-tags
Content/update relation: no content change
Transition or check target: See route's parseability target.
Evaluator/condition and domain: See route; JSON parser licenses syntax only, not OCR accuracy or object identity.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Parseable JSON only; no independent license for its assertions.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/vision-analyzer.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Object field schema and semantic correctness are not established by JSON.parse.
Route ID: EPI-RTE-image-analysis
Route function: disposition/acceptance
Architectural status: implemented
Object/candidate ID: EPI-OBJ-image-tags
Content/update relation: no content change
Transition or check target: See route's success/failure/cache disposition.
Evaluator/condition and domain: See route; automatic software admission, not evidence-consuming factual acceptance.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: No added factual warrant; cached result inherits unknown original warrant.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/vision-analyzer.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: A failure marker suppresses ordinary retry and can be copied; this is operational attempted-state, not accepted knowledge.
Route ID: EPI-RTE-image-analysis
Route function: retention
Architectural status: implemented
Object/candidate ID: EPI-OBJ-image-tags
Content/update relation: no content change
Transition or check target: See route's MediaItem write.
Evaluator/condition and domain: See route.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Candidate retention, not lifecycle integration after factual acceptance.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/vision-analyzer.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: No model-version or correctness-based invalidation established here.
Route ID: EPI-RTE-image-context
Route function: content transformation
Architectural status: implemented
Object/candidate ID: EPI-OBJ-image-tags
Content/update relation: truth-apt transformation: non-ampliative reshaping in the traced well-formed input domain.
Transition or check target: See route.
Evaluator/condition and domain: See route; deterministic selection/truncation, not evaluation of truth.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: No added warrant; omissions narrow information available to subsequent judgments.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/image-context.ts; see route.
Claim IDs or none: RT-CLM-category-policy
Mismatch marker or none: none
Gap/limit: Formatting does not preserve every original field or full OCR text.
Route ID: EPI-RTE-semantic-tags
Route function: content transformation
Architectural status: implemented
Object/candidate ID: EPI-OBJ-semantic-tags
Content/update relation: truth-apt transformation: indeterminate for factual associations; remaining alternatives are reshaping, entailed extraction and ampliative inference. Pure search keywords can instead be non-truth-apt content. Responses and their input evidence are needed to decide.
Transition or check target: See route.
Evaluator/condition and domain: See route; model generation.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Candidate associations, not warranted facts about people, companies or sentiment.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route and RT-BAP-enrichment-search.
Evidence source ID and local anchor: SRC-1, lib/vision-analyzer.ts; see route.
Claim IDs or none: EPI-CLM-tags-reliability
Mismatch marker or none: Claimed reliability exceeds demonstrated evidence.
Gap/limit: Prior image annotations enter generation without independent corroboration.
Route ID: EPI-RTE-semantic-tags
Route function: check/evidence production
Architectural status: implemented
Object/candidate ID: EPI-OBJ-semantic-tags
Content/update relation: no content change
Transition or check target: See route's shape normalization.
Evaluator/condition and domain: See route; checks array/field form, not semantic accuracy or calibrated sentiment.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Normalized strings and nonempty tags only.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/vision-analyzer.ts; see route.
Claim IDs or none: EPI-CLM-tags-reliability
Mismatch marker or none: Shape checks do not establish high reliability.
Gap/limit: Requested tag counts, sentiment vocabulary and entity grounding are not independently enforced in the inspected parser.
Route ID: EPI-RTE-semantic-tags
Route function: disposition/acceptance
Architectural status: implemented
Object/candidate ID: EPI-OBJ-semantic-tags
Content/update relation: no content change
Transition or check target: See route's caller result selection/write condition.
Evaluator/condition and domain: See route; code admits first returned nonempty result in ordinary per-bookmark pipeline. This is a narrower identity check than the separate bulk helper's resultMap lookup.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Computational admission for search use, not criterion-based acceptance of truth.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/categorize/route.ts; see route.
Claim IDs or none: EPI-CLM-tags-reliability
Mismatch marker or none: none
Gap/limit: Parser's nonempty returned ID does not prove correspondence to the requested bookmark in this caller.
Route ID: EPI-RTE-semantic-tags
Route function: retention
Architectural status: implemented
Object/candidate ID: EPI-OBJ-semantic-tags
Content/update relation: no content change
Transition or check target: See route's SQLite write.
Evaluator/condition and domain: See route.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Retained candidate metadata, not lifecycle integration after factual acceptance.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route and RT-BAP-enrichment-search.
Evidence source ID and local anchor: SRC-1, app/api/categorize/route.ts; see route.
Claim IDs or none: EPI-CLM-tags-reliability
Mismatch marker or none: none
Gap/limit: Existing tags can outlive the model or category configuration that generated them.
Route ID: RT-RTE-enrich-categorize
Route function: content transformation
Architectural status: implemented
Object/candidate ID: EPI-OBJ-bookmark-category
Content/update relation: truth-apt transformation: indeterminate; category membership is model judgment under descriptions, not a proven entailment. Actual assignments could be entailed or ampliative relative to the full input.
Transition or check target: See route.
Evaluator/condition and domain: See route; category model with supplied guidance, no answer oracle.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Candidate category membership only.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See RT-BAP-category-guidance and RT-BAP-enrichment-search.
Evidence source ID and local anchor: SRC-1, lib/categorizer.ts; see route.
Claim IDs or none: RT-CLM-category-policy
Mismatch marker or none: Reliance on earlier metadata is requested, not validated.
Gap/limit: Heavy trust can propagate upstream annotation errors; no observed error rate or propagation supplied.
Route ID: RT-RTE-enrich-categorize
Route function: check/evidence production
Architectural status: implemented
Object/candidate ID: EPI-OBJ-bookmark-category
Content/update relation: no content change
Transition or check target: See route's slug/confidence/ID checks.
Evaluator/condition and domain: See route; executable check against registered categories and existing bookmark IDs.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Domain membership and confidence range, not topical correctness or probability calibration.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/categorizer.ts; see route.
Claim IDs or none: RT-CLM-bookmark-work
Mismatch marker or none: Requested 1–3 count and current-batch identity are not enforced.
Gap/limit: An existing but out-of-batch tweet ID can reach writer lookup; source-reachable countercase, not an observed model response.
Route ID: RT-RTE-enrich-categorize
Route function: disposition/acceptance
Architectural status: implemented
Object/candidate ID: EPI-OBJ-bookmark-category
Content/update relation: no content change
Transition or check target: See route's nonempty assignment and database lookup gates.
Evaluator/condition and domain: See route; automatic writer admission, not factual acceptance.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Usable category link, no independent warrant for its meaning.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/categorizer.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: No assignments means no category write; an attempted pipeline item is not necessarily enriched.
Route ID: RT-RTE-enrich-categorize
Route function: retention
Architectural status: implemented
Object/candidate ID: EPI-OBJ-bookmark-category
Content/update relation: no content change
Transition or check target: See route's transactional upsert/enrichedAt write.
Evaluator/condition and domain: See route.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Persistent assignment, not lifecycle integration of an accepted factual claim.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route and RT-BAP-enrichment-search.
Evidence source ID and local anchor: SRC-1, lib/categorizer.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Upsert does not delete prior assignments omitted by a later model response.
Route ID: RT-RTE-category-admission
Route function: content transformation
Architectural status: implemented
Object/candidate ID: EPI-OBJ-category-description
Content/update relation: non-truth-apt policy/content update: model proposes category vocabulary and guidance. Any descriptive claims about sample clustering remain unvalidated candidates.
Transition or check target: See route.
Evaluator/condition and domain: See route; sample-driven model proposal.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Organizational proposal, not evidence of a true explanatory theory of the collection.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See RT-BAP-category-guidance.
Evidence source ID and local anchor: SRC-1, lib/category-suggester.ts; see route.
Claim IDs or none: RT-CLM-bookmark-work
Mismatch marker or none: none
Gap/limit: Sample representativeness and category utility unobserved.
Route ID: RT-RTE-category-admission
Route function: check/evidence production
Architectural status: implemented
Object/candidate ID: EPI-OBJ-category-description
Content/update relation: no content change
Transition or check target: See route's slug/name/length/example checks.
Evaluator/condition and domain: See route; programmatic validity/identity checks only.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Structurally admissible category, not validated topic coverage.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, lib/category-suggester.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Model confidence and sample matches do not supply an expected-answer oracle.
Route ID: RT-RTE-category-admission
Route function: disposition/acceptance
Architectural status: implemented
Object/candidate ID: EPI-OBJ-category-description, EPI-OBJ-bookmark-category
Content/update relation: non-truth-apt policy/content update: category vocabulary admission; no added warrant for category memberships.
Transition or check target: See route, with suggestion creation and manual membership replacement as separate mechanisms there.
Evaluator/condition and domain: See route; UI offers human veto, API caller selection does not prove human review. Manual confidence 1.0 denotes assigned value, not epistemic certainty.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Caller-authorized organization, not named evidence-consuming factual acceptance.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See RT-BAP-category-guidance.
Evidence source ID and local anchor: SRC-1, app/api/categories/suggest/route.ts, app/api/bookmarks/[id]/categories/route.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Organization may change without any assessment of improved search outcomes.
Route ID: RT-RTE-category-admission
Route function: retention
Architectural status: implemented
Object/candidate ID: EPI-OBJ-category-description, EPI-OBJ-bookmark-category
Content/update relation: no content change
Transition or check target: See route's persisted descriptions and manual memberships.
Evaluator/condition and domain: See route.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Retains organization, not integration after acceptance of a truth claim.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See RT-BAP-category-guidance.
Evidence source ID and local anchor: SRC-1, lib/category-suggester.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Default reseeding and category deletion bound persistence; no version history established.
Route ID: RT-RTE-search-content
Route function: operational admission/selection/consumption
Architectural status: implemented
Object/candidate ID: RT-OBJ-bookmark
Content/update relation: truth-apt transformation: non-ampliative reshaping for indexing and candidate context construction.
Transition or check target: See route's keyword/category/recent selectors and prompt construction.
Evaluator/condition and domain: See route; selection rules, not a truth evaluator.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Retrieval eligibility does not endorse content.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See RT-BAP-enrichment-search.
Evidence source ID and local anchor: SRC-1, lib/fts.ts, app/api/search/ai/route.ts; see route.
Claim IDs or none: EPI-CLM-tags-reliability
Mismatch marker or none: none
Gap/limit: Candidate omissions and truncation bound what reranking can assess; stale nonempty indexes need not trigger fallback.
Route ID: RT-RTE-search-content
Route function: check/evidence production
Architectural status: implemented
Object/candidate ID: EPI-OBJ-search-matches
Content/update relation: truth-apt transformation: indeterminate for factual reasons/explanations; ranking itself is a non-truth-apt preference update. Actual output is needed to distinguish reshaping, entailed description or ampliative assertion.
Transition or check target: See route; target is candidate relevance to current query, not truth of the tweet or its underlying explanation.
Evaluator/condition and domain: See route; model relevance judgment over bounded candidate context, no reference-answer oracle.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Proposed relevance, with reasons remaining candidate assertions.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/search/ai/route.ts; see route.
Claim IDs or none: EPI-CLM-tags-reliability
Mismatch marker or none: No independent corroboration of highly reliable tags.
Gap/limit: Relevance success would not establish truth of imported or generated content.
Route ID: RT-RTE-search-content
Route function: disposition/acceptance
Architectural status: implemented
Object/candidate ID: EPI-OBJ-search-matches
Content/update relation: no content change
Transition or check target: See route's hydration and sort.
Evaluator/condition and domain: See route; candidate-ID map restricts returned objects, but does not check relevance reasons or enforce all prompt constraints.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Candidate identity established at hydration, not correctness of score/reason or factual acceptance.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/search/ai/route.ts; see route.
Claim IDs or none: none
Mismatch marker or none: Minimum score, result count and uniqueness are instructions rather than enforced invariants.
Gap/limit: Duplicate candidate matches can survive even though matchMap exists.
Route ID: RT-RTE-search-content
Route function: retention
Architectural status: implemented
Object/candidate ID: EPI-OBJ-search-matches
Content/update relation: no content change
Transition or check target: See route's result cache.
Evaluator/condition and domain: See route; TTL, not endorsement or evidence freshness.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Reuses earlier candidate response without adding warrant.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/search/ai/route.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Cache key lacks collection/model revision; withdrawal need not remove a cached response immediately.
Route ID: RT-RTE-cli-export
Route function: operational admission/selection/consumption
Architectural status: implemented
Object/candidate ID: RT-OBJ-bookmark
Content/update relation: truth-apt transformation: non-ampliative reshaping for JSON/Markdown delivery, within inspected/supplied formatting scope.
Transition or check target: See route.
Evaluator/condition and domain: See route; caller filters and formatting code, not truth evaluation.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Exposes retained content with unknown source/generated warrant, not a guarantee to downstream agents.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, cli/siftly.ts, lib/obsidian-exporter.ts; see route.
Claim IDs or none: RT-CLM-bookmark-work
Mismatch marker or none: none
Gap/limit: Export retention has skip/overwrite semantics, not automatic synchronization or retraction in an external vault.
Route ID: EPI-RTE-content-withdrawal
Route function: disposition/acceptance
Architectural status: implemented
Object/candidate ID: RT-OBJ-bookmark
Content/update relation: no content change
Transition or check target: See route's clear/category-delete operations.
Evaluator/condition and domain: See route; caller-directed deletion, not evidence-based refutation.
Activation and timing: See route.
Possible or observed result: See route.
Implemented force: See route.
Epistemic authority and scope: Removes selected operative records without establishing their falsity.
Operational authority: behavior permitted, blocked, or changed: See route.
Behavioral-authority path: consumer, channel, force, horizon: See route.
Evidence source ID and local anchor: SRC-1, app/api/bookmarks/route.ts, app/api/categories/[slug]/route.ts; see route.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: No full withdrawal guarantee for prior caches, exports or in-flight work.
Route ID: RT-RTE-enrich-categorize, RT-RTE-search-content
Route function: lineage/freshness/recovery
Architectural status: implemented
Object/candidate ID: RT-OBJ-bookmark
Content/update relation: no content change
Transition or check target: See routes' force, failure-marker, stop, FTS and TTL fields.
Evaluator/condition and domain: See routes; procedural state predicates, not accuracy evaluations.
Activation and timing: See routes.
Possible or observed result: See routes.
Implemented force: See routes.
Epistemic authority and scope: No renewed endorsement follows from retry, enrichedAt or a rebuilt index.
Operational authority: behavior permitted, blocked, or changed: See routes.
Behavioral-authority path: consumer, channel, force, horizon: See routes.
Evidence source ID and local anchor: SRC-1, app/api/categorize/route.ts, lib/fts.ts, app/api/search/ai/route.ts; see routes.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: Force resets only failure/empty markers; cooperative stop can leave writes and skip FTS rebuild. These are not transactional rollback or universal recomputation.
Route ID: RT-RTE-settings-change, RT-RTE-model-dispatch
Route function: behavior/policy adaptation
Architectural status: implemented
Object/candidate ID: See routes' Setting values and model components.
Content/update relation: non-truth-apt policy/content update: caller changes provider/model configuration.
Transition or check target: See routes.
Evaluator/condition and domain: See routes; identifier allowlists and availability, not evidence of improvement.
Activation and timing: See routes.
Possible or observed result: See routes.
Implemented force: See routes.
Epistemic authority and scope: No warrant transferred from configuration choice to generated assertions.
Operational authority: behavior permitted, blocked, or changed: See routes.
Behavioral-authority path: consumer, channel, force, horizon: See routes.
Evidence source ID and local anchor: SRC-1, app/api/settings/route.ts, lib/ai-client.ts; see routes.
Claim IDs or none: none
Mismatch marker or none: none
Gap/limit: External CLI resolution can differ from selected SDK model; no parametric update or evaluation-responsive improvement established.
No lifecycle-integration row is asserted: in these inspected annotation, category and search routes, retention and operational use occur without an evidenced prior factual acceptance decision. This is a route-local limit, not an inference that every truth-apt edge lacks warrant or that an operational bookmark organizer has failed its purpose.
System-claim versus route comparison
| Claim ID | Claimed operation or warrant | Claim source ID/anchor and evidence layer | Doctrine/design support | Implemented route IDs | Observed-run support | Causal support and design limits | Supported conclusion | Mismatch/unknown |
|---|---|---|---|---|---|---|---|---|
| RT-CLM-bookmark-work | See record | SRC-1, package.json; doctrine/design |
See record | RT-RTE-import-content, RT-RTE-enrich-categorize, RT-RTE-search-content, RT-RTE-cli-export | None supplied | No accuracy or benefit comparison | Bookmark acquisition, annotation and consumption capacity is wired. | Product usefulness and factual reliability unobserved, not disproved. |
| RT-CLM-category-policy | See record | SRC-1, lib/categorizer.ts; doctrine/design |
See record | EPI-RTE-semantic-tags, RT-RTE-enrich-categorize | None supplied | No independent quality check of precomputed tags; syntactic admission only | A later model is instructed to rely heavily on generated metadata. | Neither compliance nor justified heavy trust established. |
| EPI-CLM-tags-reliability | See record | SRC-1, app/api/search/ai/route.ts; doctrine/design |
See record | EPI-RTE-semantic-tags, RT-RTE-search-content | None supplied | No ground truth or causal experiment; model scores are not a benchmark | Reliability is asserted inside a consequential search prompt; metadata delivery is wired. | “Highly reliable” is not established by parseability, persistence, confidence or relevance generation. |
Bounded conclusion
Acquisition and reshaping are established capacities. Imported bookmarks retain source identity/raw content without verifying source assertions. Entity-field normalization, index building, image-context selection and JSON/Markdown output reshape selected content. The deterministic deductions in EPI-RTE-entity-extraction and EPI-RTE-image-context establish only code-domain consequences, conditional on input encoding; they do not warrant external facts. Their information losses matter because later models receive the selected representation, not necessarily the whole source.
Generation and checking have different licenses. Vision, semantic enrichment, categorization and search can produce truth-apt descriptions or associations, but actual semantic edges remain indeterminate without outputs and their input evidence. JSON parsing, slug filtering, confidence clamping, existing-ID lookup and candidate hydration are implemented checks in their narrow structural domains. They authorize storage/use at those boundaries, not factual acceptance. Search relevance judgments concern a query/candidate relation; even correct relevance would not verify a tweet's claims. See EPI-RTE-image-analysis, EPI-RTE-semantic-tags, RT-RTE-enrich-categorize and RT-RTE-search-content.
Retained metadata has consequential force before factual acceptance. Stored image/semantic tags enter future prompts and keyword eligibility; category assignments affect grouping and retrieval; descriptions guide later assignments. Fixed selectors enforce eligibility while natural-language guidance depends on model interpretation. Human selection is afforded for category suggestions and manual edits, but HTTP admission alone does not establish human review or an evidence-consuming truth criterion. The intended use is collection organization/search, not a universal truth oracle. See RT-BAP-enrichment-search, RT-BAP-category-guidance and RT-RTE-category-admission.
Recovery and withdrawal are partial, not epistemic revision. Failure markers can block retries; force selectively clears them. Null semanticTags allows the enrichment stage to run only after endpoint selection: successful categorization can set enrichedAt despite enrichment failure, excluding the row from later ordinary enrichedAt=null selection. Explicit IDs or force can reselect it; the separate bulk helper's semanticTags=null selector does not establish ordinary endpoint retry. See EPI-RTE-semantic-tags. Category upserts do not retract omitted assignments. Manual replacement and deletion provide real countercases to an assertion that assignments are immutable. Clear/category-delete operations remove live DB content, but short-lived result caches, prior exports and in-flight calls limit immediate withdrawal. None records a criticism showing a proposition false. See EPI-RTE-content-withdrawal, RT-RTE-category-admission and RT-RTE-search-content.
Parameter and improvement conclusions remain separate. Provider components are see RT-CMP-anthropic, RT-CMP-openai and RT-CMP-minimax: exact weights are not pinned, endpoints can resolve differently, and internal mutation is uninspected. Retained guidance can change future application behavior without a weight change. That path does not by itself establish improved capacity, reflection, autonomous theory criticism or self-improvement; no causal improvement evidence was supplied. Category descriptions are individually accessible guidance, not demonstrated content-directed criticism of theories. The route-local lack of factual acceptance does not negate supported acquisition, checking or operational adaptation capacities, nor imply a single system-wide epistemic status.
Shared records
Operative objects
EPI-OBJ-entities
Label: ExtractedEntities Part of: RT-OBJ-bookmark
The Bookmark.entities JSON string in SQLite contains symbolic arrays/labels consumed by fixed selectors and natural-language tokens interpreted by models. Hashtags, URLs and mentions are selected from raw JSON; tools come from URL matching; tweetType/hasMedia/mediaTypes are structural classifications. This part differs from imported text and generated image descriptions in producer and warrant. SRC-1, lib/rawjson-extractor.ts; evidence passage is in EPI-RTE-entity-extraction.
EPI-OBJ-image-tags
Label: MediaItem.imageTags Part of: RT-OBJ-bookmark
SQLite string containing model JSON with natural-language OCR, scenes, people, objects, moods and tags. These associate propositions with an image; JSON syntax is symbolic packaging, not semantic validation. _type denotes video-thumbnail scope; {} can instead be a non-truth-apt attempted/failure marker. Distinct from entities by media/model provenance and retry consumer. SRC-1, lib/vision-analyzer.ts; passages in EPI-RTE-image-analysis.
EPI-OBJ-semantic-tags
Label: semanticTags and enrichmentMeta Part of: RT-OBJ-bookmark
Two SQLite JSON strings written together: semanticTags holds search terms; enrichmentMeta holds sentiment/people/companies. Terms may be indexing choices rather than propositions. Associating a named person/company or sentiment with a bookmark is truth-apt over that content, though sentiment also depends on interpretation. Natural-language values are consumed through model interpretation and keyword selectors. Empty-array markers have separate skip semantics. Distinct from imageTags by producer inputs and consumer fields. SRC-1, lib/vision-analyzer.ts, app/api/categorize/route.ts; passages in EPI-RTE-semantic-tags.
EPI-OBJ-bookmark-category
Label: BookmarkCategory Part of: RT-OBJ-bookmark
SQLite relational link with symbolic bookmark/category IDs and numeric confidence; category meaning is natural-language guidance. Topic-fit claims are relative to that meaning. Confidence is model-generated/clamped or manually set, not measured calibration. Different from Category.description because membership selectors and replacement/upsert policies consume this part. SRC-1, lib/categorizer.ts; closest supplied record is RT-RTE-enrich-categorize, which supplies parser/writer evidence. Manual contrast is see RT-RTE-category-admission.
EPI-OBJ-category-description
Label: Category.description Part of: RT-OBJ-bookmark
SQLite natural-language category guidance; symbolic slug determines output admissibility. Shipped defaults, admitted suggestions and directly caller-authored descriptions have different origins but share the later categorization prompt consumer. The admission-route inventory here is partial: app/api/categories/route.ts also persists caller descriptions with isAiGenerated=false, and its GET seeds defaults when the category store is empty. This is not evidence of human approval or topic quality. SRC-1, app/api/categories/route.ts:
description: description?.trim() ?? null, isAiGenerated: false, ---
app/api/categories/route.ts
These are organizational instructions, not necessarily truth-apt explanations. Distinct from membership links by content and downstream channel. SRC-1, lib/categorizer.ts; see RT-BAP-category-guidance for load-bearing prompt construction and RT-RTE-category-admission for admission.
EPI-OBJ-search-matches
Label: matches and explanation
Model-returned JSON in current request memory and short-lived module cache: symbolic IDs/scores plus natural-language reasons/explanation. Relevance assessments can include factual claims about candidate content. Unlike RT-OBJ-bookmark, this is a transient query-specific result rather than persisted collection state; no supplied object counterpart after comparison. Closest supplied route is RT-RTE-search-content. SRC-1, app/api/search/ai/route.ts:
const response = { bookmarks: results, explanation: aiResponse.explanation } setCache(cacheKey, response) return NextResponse.json(response) ---
app/api/search/ai/route.ts
Routes
EPI-RTE-entity-extraction
Label: Raw JSON entity extraction Part of: RT-RTE-enrich-categorize
Material subroute separated from the pipeline because deterministic extraction has a different warrant from model generation. Pipeline backfill selects Bookmark.entities=null, reads rawJson, applies extractEntities and writes JSON into Bookmark.entities. Software owns progression; abort checks are cooperative. No human per-record veto or expected-answer oracle. Operating mode is ordinary backfill, not an experiment. Missing/invalid JSON yields defaults rather than a source-truth rejection. Fields copied from JSON are acquired assertions; type/media predicates are consequences of code conditions, not independently verified tweet properties. URL tool lookup's semantic fidelity is unassessed.
- Immediate return: Count of updated bookmarks with optional progress callbacks.
- Later read-back: entities feeds categorization, semantic enrichment, FTS/search and CLI detail on later invocations.
- Delegated visibility: Selected hashtags/tools/mentions enter bounded model prompts, not all rawJson.
- Selection predicate: entities=null; chunks of 100; source extraction tries root and legacy paths.
- Invalidation or expiry: No version-based expiry in inspected backfill; non-null values no longer selected there.
- Activation or effect: Code writes fields consumed later; actual influence unobserved.
- Evidence limits: Input encoding fidelity, tool-label correctness and deployed values unobserved; invalid input can resemble a genuinely empty original tweet.
- implementation conclusion status: wired
- operation conclusion status: uninspected
SRC-1, lib/rawjson-extractor.ts:
const hashtags = (hashtagObjs as Record
[]) .map((h) => String(h.tag ?? h.text ?? '').toLowerCase()) .filter(Boolean) --- lib/rawjson-extractor.tsconst hasMedia = (mediaArr as []).length > 0 ---
lib/rawjson-extractor.tsdata: { entities: JSON.stringify(entities) }, ---
lib/rawjson-extractor.ts
Implementation deduction, not execution: for raw input {"entities":{"hashtags":[{"tag":"AI"}],"media":[{"type":"photo"}]}}, root-path lookup yields hashtags ["ai"], hasMedia=true and mediaTypes ["photo"]. This follows only within the inspected JSON/code domain. It does not establish that an image exists remotely or that the post is about AI. No quote or input artifact is claimed as observed operation.
EPI-RTE-image-analysis
Label: Vision annotation and disposition Part of: RT-RTE-enrich-categorize
This is the pipeline's image-analysis part, also reached independently from app/api/analyze/images/route.ts. Model proposes annotations; software fetches image bytes for SDK or sends URL text to an external CLI, extracts an object-shaped substring and checks parseability. The check target is JSON syntax, not correspondence to the image. analyzeItem first checks another row with the same URL and non-null imageTags; cached text can bypass generation and new validation. Video uses thumbnailUrl when present and injects a thumbnail marker into newly generated JSON. Successful text or {} is persisted. Starting analysis is not human approval; code can reject invalid/missing output, retry designated errors or mark attempted failure. No answer oracle; ordinary annotation mode. Force cleanup and downstream selectors are see RT-RTE-enrich-categorize.
- Immediate return: analyzeItem returns 1 after copied/generated tags or 0 after failure marker; independent image endpoint returns analyzed/remaining counts.
- Later read-back: imageTags reaches enrichment, categorization, FTS/AI search, CLI show and later URL cache lookup. Export builders omit the imageTags payload; influence via exported semantic tags or category assignments is a separate upstream chain, not direct payload delivery (SRC-1,
lib/exporter.ts,lib/obsidian-exporter.ts). - Delegated visibility: SDK receives fetched base64 image and analysis prompt; CLI receives sanitized URL text plus prompt. Downstream prompts receive selected image fields.
- Selection predicate: Pipeline untagged media; independent endpoint photo/gif with imageTags=null; URL cache first selects a different row with same URL and non-null imageTags.
- Invalidation or expiry:
{}prevents ordinary null-only retries; force clears these markers, but successful annotations have no assessed TTL/version invalidation. - Activation or effect: Annotation/failure writes and later selectors are wired; correctness and behavioral influence unobserved.
- Evidence limits: Cached marker inherits unknown provenance; CLI image access opaque; JSON syntax establishes neither schema nor truth; counter increments do not certify useful analysis.
- implementation conclusion status: wired
- operation conclusion status: uninspected
SRC-1, lib/vision-analyzer.ts:
JSON.parse(jsonMatch[0]) // throws if invalid return jsonMatch[0] ---
lib/vision-analyzer.tswhere: { url: imageUrl, imageTags: { not: null }, id: { not: excludeId } }, ---
lib/vision-analyzer.tsif (cached) { await prisma.mediaItem.update({ where: { id: item.id }, data: { imageTags: cached } }) return 1 } ---
lib/vision-analyzer.tsawait prisma.mediaItem.update({ where: { id: item.id }, data: { imageTags: '{}' } }) return 0 ---
lib/vision-analyzer.ts
The independent endpoint is a countercase to treating categorization as the only writer:
const analyzed = await analyzeBatch(untagged, client) ---
app/api/analyze/images/route.ts
EPI-RTE-image-context
Label: Compact image context Part of: RT-RTE-model-dispatch
A distinct pre-dispatch transformation, not another model executor. buildImageContext parses imageTags and selects style/scene/action, bounded OCR, first tags and meme template; on parse failure it returns a 300-character raw slice. Category and enrichment prompt builders consume the string. This transformation supplies working context but does not check annotation accuracy. Code owns selection. No human admission, expected answer or improvement loop applies; ordinary prompt preparation.
- Immediate return: Compact string or empty string for missing input.
- Later read-back: inapplicable — this helper does not persist its output; callers independently read retained imageTags for later invocations.
- Delegated visibility: Selected fields enter categorization/enrichment prompts; people/objects/mood are not emitted as named fields by this helper.
- Selection predicate: Truthy named scalar fields, array OCR and tags; first 15 tags and first 200 joined OCR characters.
- Invalidation or expiry: inapplicable — recomputed current-call value, no helper cache.
- Activation or effect: Fixed omissions and truncation determine delivered context; effect on model judgment unobserved.
- Evidence limits: Parse fallback is raw truncation; no semantic preservation guarantee for arbitrary malformed types or truncation across a sentence.
- implementation conclusion status: wired
- operation conclusion status: uninspected
SRC-1, lib/image-context.ts:
if (parsed.style) parts.push(
Style: ${parsed.style}) ---lib/image-context.tsif (Array.isArray(parsed.tags) && (parsed.tags as unknown[]).length) parts.push(
Visual tags: ${(parsed.tags as string[]).slice(0, 15).join(', ')}) ---lib/image-context.tsreturn parts.join(' | ') ---
lib/image-context.ts
Concrete implementation deduction: {"style":"chart","tags":["bitcoin"],"people":["Ada"]} becomes Style: chart | Visual tags: bitcoin; the people field is omitted. This is field selection/reformatting, not a new inference that the chart concerns bitcoin, nor acceptance that Ada appears. No execution was needed to derive this fixed transformation from the inspected branches. Callers may retain original imageTags even though this particular context drops the field.
EPI-RTE-semantic-tags
Label: Semantic metadata generation and admission Part of: RT-RTE-enrich-categorize
Separate material part because generated semantic metadata has its own parser, writer and later consumers. The model receives bounded bookmark text, image context and selected entities. parseResponse extracts a JSON array, coerces IDs/fields to strings and drops empty IDs; it does not validate semantic associations. In the ordinary per-bookmark pipeline, code selects results[0] and writes its tags/meta to the current bookmark if tags are nonempty. It does not compare returned ID to bm.id at that point. The bulk helper instead constructs a resultMap keyed by ID and selects the matching current bookmark. This countercase limits the identity weakness to the actual caller rather than asserting it for every helper. Software admits results; no per-result human approval or expected-answer oracle. Open annotation mode. Trivial short text without image tags gets []; failed ordinary enrichment otherwise leaves tags unset. Null tags preserve stage eligibility, not endpoint reselection: the endpoint first selects enrichedAt=null unless explicit IDs or force override it. The bookmark is still queued for categorization after enrichment failure; category admission can independently set enrichedAt. A later ordinary invocation then skips that row despite null semanticTags. Explicit-ID or force selection can recover the missing enrichment; force also clears empty markers, not all successful output. The separate bulk helper selects semanticTags=null independently of enrichedAt, so its retry behavior does not establish retry through the shipped endpoint.
- Immediate return: EnrichmentResult array or empty array/error handled by caller; pipeline progress counts attempts/effects, not truth.
- Later read-back: Stored semanticTags/enrichmentMeta feed category prompts, search eligibility/reranking and CLI detail; prior tags can shape category suggestions via sampled metadata.
- Delegated visibility: Text sliced to 500 characters, compact image context, bounded hashtags/mentions and tools; models do not receive the entire imported record.
- Selection predicate: Endpoint first selects explicit bookmarkIds, else all rows for force, else enrichedAt=null. Only within that selected set does the enrichment stage test missing semanticTags and triviality. The separate bulk helper selects semanticTags=null with cursor pagination, without an enrichedAt gate. Parser accepts nonempty returned IDs and arrays coerced to strings; ordinary writer requires first result's nonempty tags.
- Invalidation or expiry: No correctness/version TTL identified. Null semanticTags permits another stage attempt only if the endpoint reselects the row: ordinary reselection requires enrichedAt=null, while successful categorization can set enrichedAt even after enrichment failed. Explicit IDs or force bypass that reselection gate; empty-array markers require force clearing in the pipeline. The bulk helper's null-tag selector is a distinct retry path, not a guarantee of endpoint recovery.
- Activation or effect: Durable metadata write and downstream prompt/index wiring; compliance, accuracy and benefit unobserved.
- Evidence limits: Model sentiment/people/company associations unverified; no actual response demonstrates non-entailment or faithfulness; caller ID policies differ.
- implementation conclusion status: wired
- operation conclusion status: uninspected
SRC-1, lib/vision-analyzer.ts:
- people: named people mentioned or shown (max 5, empty array if none)
- companies: company/product/tool names explicitly referenced (max 8, empty array if none) ---
lib/vision-analyzer.tssentiment: String(item.sentiment ?? 'neutral'), ---
lib/vision-analyzer.ts
SRC-1, app/api/categorize/route.ts:
const result = results[0] if (result?.tags.length) { await prisma.bookmark.update({ where: { id: bm.id }, ---
app/api/categorize/route.ts
The endpoint's outer selection precedes the missing-tag stage gate (SRC-1):
const unprocessed = await prisma.bookmark.findMany({ where: { enrichedAt: null }, ---
app/api/categorize/route.ts
Enrichment failure does not prevent subsequent queue admission:
// Queue for categorization catPending.push(bm.id) ---
app/api/categorize/route.ts
The category writer updates the selection timestamp without testing semanticTags:
prisma.bookmark.updateMany({ where: { id: { in: bookmarkIdsToUpdate } }, data: { enrichedAt: now }, ---
lib/categorizer.ts
The contrasting bulk helper uses a different outer selector (SRC-1):
const rows = await prisma.bookmark.findMany({ where: { semanticTags: null, ...(cursor ? { id: { gt: cursor } } : {}), ---
lib/vision-analyzer.ts
Its returned-ID lookup also differs:
const resultMap = new Map(results.map((r) => [r.id, r]))
for (const b of batch) { const result = resultMap.get(b.id)---
lib/vision-analyzer.ts
EPI-RTE-content-withdrawal
Label: Collection clearing and category deletion
Distinct from RT-RTE-category-admission, which describes creation/manual assignment, and RT-RTE-enrich-categorize, which upserts rather than retracts omitted assignments. HTTP caller requests deletion; code owns transaction/category lookup. Clear deletes all BookmarkCategory, MediaItem, Bookmark and Category rows transactionally. Category DELETE checks slug existence then deletes the category; schema cascade removes its membership links. No content critic or truth oracle judges the removed content. Mode is caller-directed maintenance, not an evaluation. No rollback history implemented in these handlers; reimport/recreation is a separate path. The clear handler does not cancel a running pipeline, rebuild FTS, clear search result caches or delete exported notes. Search cache can return a previously hydrated response until TTL; fresh DB reads cannot find deleted rows. Deleting defaults can be temporary because pipeline seeding recreates them. These limits prevent claiming immediate universal withdrawal.
- Immediate return: success or error for clearing; category deleted/slug/name, 404 or error for category deletion.
- Later read-back: Later uncached database reads reflect removal; prior result cache and external exports can retain old content.
- Delegated visibility: HTTP caller receives acknowledgment; deletion supplies no new model prompt directly.
- Selection predicate: All collection/category rows for clear; existing Category.slug for single category deletion.
- Invalidation or expiry: Database deletion persists unless reimport/reseed/recreation; independent five-minute search-result TTL remains.
- Activation or effect: Database deletion and downstream read exclusion wired; no observed withdrawal run.
- Evidence limits: No target execution, remote-vault deletion or in-flight concurrency guarantee; no evidence-consuming acceptance/rejection of proposition truth.
- implementation conclusion status: wired
- operation conclusion status: uninspected
SRC-1, app/api/bookmarks/route.ts:
await prisma.$transaction([ prisma.bookmarkCategory.deleteMany({}), prisma.mediaItem.deleteMany({}), prisma.bookmark.deleteMany({}), prisma.category.deleteMany({}), ]) ---
app/api/bookmarks/route.ts
SRC-1, app/api/categories/[slug]/route.ts:
await prisma.category.delete({ where: { slug }, }) ---
app/api/categories/[slug]/route.ts
Cache and export persistence countercases are see RT-RTE-search-content and RT-RTE-cli-export; default reseeding is see RT-RTE-category-admission. These supplied records bound consequential consumers rather than treating database deletion as complete withdrawal.
Claims
EPI-CLM-tags-reliability
Label: Search prompt tag reliability
SRC-1, app/api/search/ai/route.ts, doctrine/design: the search prompt describes precomputed AI tags as highly reliable and instructs the reranking model to check them. This is a distinct downstream warrant claim from RT-CLM-category-policy, which asks the categorization model to trust aiTags heavily. The shared origin of tags does not make these different consumer instructions one referent. Search prompt delivery is implemented; reliability is not established by the generation/parsing route or supplied run evidence.
- Check ALL fields — the ai_tags field contains pre-computed semantic context and is highly reliable ---
app/api/search/ai/route.ts