Skip to content

feat(intelligence): add Evidence-Weighted Trust Lens#3000

Open
aashir-athar wants to merge 1 commit into
tinyhumansai:mainfrom
aashir-athar:feat/evidence-trust
Open

feat(intelligence): add Evidence-Weighted Trust Lens#3000
aashir-athar wants to merge 1 commit into
tinyhumansai:mainfrom
aashir-athar:feat/evidence-trust

Conversation

@aashir-athar
Copy link
Copy Markdown
Contributor

@aashir-athar aashir-athar commented May 30, 2026

Summary

Adds a new read-only "Trust" tab to the Intelligence view. The 20 shipped intelligence lenses all read the (subject, predicate, object) triple structure or its document provenance. None of them makes evidenceCount — the field that measures how many times an assertion has been independently corroborated — the primary signal.

This one does.

Three orthogonal-to-everything-shipped outputs

  • Trust Quotient per entity = W(x) / D(x) — the mean evidence per relation an entity is involved in. A prolific entity with many single-witness facts has low TQ; a quiet entity whose few relations are heavily corroborated has high TQ. Degree alone (centrality, k-core) cannot express this.
  • Evidence Gini = inequality of evidence concentration across entities, via the closed form Σ_i (2i − n − 1)·w_i / (n·Σw) on sorted entity weights — one integer-weighted sum, one division, no float-associativity hazard.
  • Under-corroborated worklist = relations whose evidence falls below max(1, floor(median_positive_evidence / 4)) — a curator's review queue.

Plus Predicate Reliability Index per predicate and a degraded: true banner when every relation has evidenceCount = 1 (the field was never populated meaningfully), so the UI can show an empty-state instead of misleading the user with a constant TQ everywhere.

Provenance & design discipline

Picked by the loop-21 judge-panel design workflow (4 fresh angles — chunks / evidence / composite / completion — × 3 independent judges + synthesis). Weighted score 8.633 / 10, beating Chunk Corroboration Atlas (8.083), Inferred Edges (8.342), Attention Quadrants (7.767). All eight synthesis-stage refinements applied during build (Number coercion, n<2 guard, multigraph SUM policy, index-pick median, degraded flag, etc).

Two engine bugs were caught during the build: the Gini denominator was using totalEvidence instead of the sum of entity weights (= 2·totalEvidence) — fixed; and a JS default-parameter quirk in the test helper that ate the undefined argument — fixed to use null.

The subsequent adversarial review caught 2 minors (9 raw → 2 confirmed) — an empty-string namespace rendering as () in the UI (fixed: tightened guard to .length > 0) and a self-loop comment that framed the dual-credit as edge-case rather than the general undirected-degree rule (reframed).

Engine design (pure, deterministic — no React/RPC/clock/RNG)

  • evidenceCount coerced via Number(...) (handles string-encoded JSON numerics, scientific notation) then sanitised: non-finite/NaN/non-positive → 0; positive values floored to integers so all subsequent sums are exact integer arithmetic.
  • Multigraph collapse: the same (namespace, s, p, o) tuple appearing multiple times SUMS evidence; counts as one distinct relation.
  • Entity identity = (namespace, name) — orthogonal to Entity Duplicates (Develop #8). A name appearing in two namespaces is two rows.
  • Median for the under-corroboration threshold uses index-pick (lower middle on even-sized sets), never the arithmetic mean — preventing float drift.
  • Guards: globalGini = 0 when entityCount < 2 OR Σw === 0 (OR, not AND — && would crash on an all-NaN graph).

Zero new core surface

Composes the already-shipped memoryGraphQuery / memoryListNamespaces JSON-RPC wrappers. Container/presentational split with a monotonic request-token race guard for load-on-mount; i18n across all 13 locales; aria-hidden on the decorative glyph paired with an sr-only "points to" for screen-reader semantics.

Test plan

  • vitest — 34 tests (engine: 4 design-pick hand fixtures + Gini equality/max-inequality/all-zero/guards + threshold index-pick + multigraph evidence SUM + namespace orthogonality + sanitisation (NaN/Infinity/negative/null/string/scientific notation/fractional) + degraded mode + order-independent byte-identical output — plus api facade, panel metric tiles + trust ranking + predicate reliability + worklist + degraded banner + no-worklist caption, container load/namespace-requery/error)
  • tsc --noEmit — clean
  • eslint — 0 errors
  • prettier --check — clean
  • i18n coverage gate — EXIT 0, no missing/extra/drifted keys across 13 locales

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a new "Trust" tab to the Intelligence page displaying an evidence-weighted trust lens.
    • Displays trust quotient rankings, predicate reliability metrics, and global evidence indicators.
    • Includes an under-corroborated worklist highlighting relations with low evidence counts.
    • Namespace selector for filtering trust analysis by data source.
    • Error handling with retry functionality.
  • Internationalization

    • Added support for 13 languages (English, Arabic, Bengali, German, Spanish, French, Hindi, Indonesian, Italian, Korean, Polish, Portuguese, Russian, and Chinese Simplified).

Review Change Stack

@aashir-athar aashir-athar requested a review from a team May 30, 2026 01:13
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 30, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e478ec13-0f34-4e87-a58b-413a0791f6db

📥 Commits

Reviewing files that changed from the base of the PR and between 38ccc5d and 0e32bec.

📒 Files selected for processing (23)
  • app/src/components/intelligence/EvidenceTrustPanel.test.tsx
  • app/src/components/intelligence/EvidenceTrustPanel.tsx
  • app/src/components/intelligence/EvidenceTrustTab.test.tsx
  • app/src/components/intelligence/EvidenceTrustTab.tsx
  • app/src/lib/i18n/ar.ts
  • app/src/lib/i18n/bn.ts
  • app/src/lib/i18n/de.ts
  • app/src/lib/i18n/en.ts
  • app/src/lib/i18n/es.ts
  • app/src/lib/i18n/fr.ts
  • app/src/lib/i18n/hi.ts
  • app/src/lib/i18n/id.ts
  • app/src/lib/i18n/it.ts
  • app/src/lib/i18n/ko.ts
  • app/src/lib/i18n/pl.ts
  • app/src/lib/i18n/pt.ts
  • app/src/lib/i18n/ru.ts
  • app/src/lib/i18n/zh-CN.ts
  • app/src/lib/memory/evidenceTrust.test.ts
  • app/src/lib/memory/evidenceTrust.ts
  • app/src/pages/Intelligence.tsx
  • app/src/services/api/evidenceTrustApi.test.ts
  • app/src/services/api/evidenceTrustApi.ts
💤 Files with no reviewable changes (19)
  • app/src/lib/i18n/bn.ts
  • app/src/lib/i18n/ar.ts
  • app/src/lib/i18n/id.ts
  • app/src/lib/i18n/it.ts
  • app/src/lib/i18n/hi.ts
  • app/src/lib/i18n/de.ts
  • app/src/services/api/evidenceTrustApi.ts
  • app/src/lib/i18n/es.ts
  • app/src/lib/i18n/zh-CN.ts
  • app/src/lib/i18n/ko.ts
  • app/src/pages/Intelligence.tsx
  • app/src/lib/i18n/fr.ts
  • app/src/lib/i18n/pt.ts
  • app/src/lib/i18n/ru.ts
  • app/src/lib/i18n/pl.ts
  • app/src/lib/i18n/en.ts
  • app/src/services/api/evidenceTrustApi.test.ts
  • app/src/lib/memory/evidenceTrust.ts
  • app/src/lib/memory/evidenceTrust.test.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • app/src/components/intelligence/EvidenceTrustTab.test.tsx
  • app/src/components/intelligence/EvidenceTrustPanel.tsx
  • app/src/components/intelligence/EvidenceTrustPanel.test.tsx
  • app/src/components/intelligence/EvidenceTrustTab.tsx

📝 Walkthrough

Walkthrough

This PR introduces an Evidence-Weighted Trust lens for the Intelligence page. It adds a deterministic trust computation engine that collapses multigraph duplicates, sanitizes evidence, aggregates entity trust quotients and predicate reliability, calculates global Gini coefficients, detects under-corroborated relations, and flags degraded states. A container component manages loading and namespace selection, delegating UI to a presentational panel that renders metrics, entity rankings, predicate lists, and worklists.

Changes

Evidence-Weighted Trust Lens

Layer / File(s) Summary
Trust computation engine and tests
app/src/lib/memory/evidenceTrust.ts, app/src/lib/memory/evidenceTrust.test.ts
computeEvidenceTrust validates input, sanitizes evidence (NaN/Infinity/negative → 0, floors fractional), collapses multigraph duplicates by summing evidence, aggregates per-entity weight/degree and per-predicate weight/count, computes global Gini, derives under-corroboration threshold from median, sorts outputs deterministically, and detects degraded state. Tests cover edge cases, ranking, Gini calculation, threshold logic, evidence sanitization, multigraph collapse, namespace distinctness, and determinism.
API facade and tests
app/src/services/api/evidenceTrustApi.ts, app/src/services/api/evidenceTrustApi.test.ts
loadEvidenceTrust(namespace?) queries graph relations via RPC, logs namespace and count, returns computed result; loadNamespaces() returns available namespaces. Tests mock RPCs, verify namespace pass-through, transformation, and error propagation.
Container/tab component and tests
app/src/components/intelligence/EvidenceTrustTab.tsx, app/src/components/intelligence/EvidenceTrustTab.test.tsx
EvidenceTrustTab manages namespace loading and trust result fetching, uses monotonic request ID to ignore stale responses, conditionally renders namespace selector, delegates UI to EvidenceTrustPanel with result/loading/error/onRetry. Tests validate mount-time loading, namespace-change triggering reload, and error handling.
Presentational panel and tests
app/src/components/intelligence/EvidenceTrustPanel.tsx, app/src/components/intelligence/EvidenceTrustPanel.test.tsx
EvidenceTrustPanel renders loading skeleton, error with optional retry, empty state, degraded banner, metric tiles (clamped Gini %, entity count, total evidence), entity trust-quotient ranked table with relative-width bar, predicate reliability list, and under-corroborated worklist with evidence labels. Tests cover all UI states and metric/worklist rendering.
Page integration
app/src/pages/Intelligence.tsx
Imports EvidenceTrustTab, extends IntelligenceTab union to include 'trust', adds tab descriptor with memory.tab.trust label, renders component when activeTab is 'trust'.
Translations
app/src/lib/i18n/en.ts, app/src/lib/i18n/ar.ts, app/src/lib/i18n/bn.ts, app/src/lib/i18n/de.ts, app/src/lib/i18n/es.ts, app/src/lib/i18n/fr.ts, app/src/lib/i18n/hi.ts, app/src/lib/i18n/id.ts, app/src/lib/i18n/it.ts, app/src/lib/i18n/ko.ts, app/src/lib/i18n/pl.ts, app/src/lib/i18n/pt.ts, app/src/lib/i18n/ru.ts, app/src/lib/i18n/zh-CN.ts
Adds memory.tab.trust label and evidenceTrust.* translation blocks across all supported languages, providing UI labels, metric names, loading/error/empty state text, namespace/worklist messaging, and evidence format strings.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • graycyrus
  • sanil-23

Poem

🐰 A rabbit hops through evidence trees,
Computing trust with Gini's ease,
Worklists tagged where doubts appear,
Namespaces sorted crystal clear—
The Truth Lens blooms in many tongues! 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'feat(intelligence): add Evidence-Weighted Trust Lens' directly and clearly describes the main change: adding a new Evidence-Weighted Trust feature to the Intelligence view, which aligns with all file modifications across components, business logic, internationalization, and API layers.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot added feature Net-new user-facing capability or product behavior. memory Memory store, memory tree, recall, summarization, and embeddings in src/openhuman/memory/. working A PR that is being worked on by the team. labels May 30, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/src/components/intelligence/EvidenceTrustTab.tsx`:
- Around line 44-46: In the EvidenceTrustTab component, replace the then/catch
promise chain calling loadNamespaces().then(setNamespaces).catch(() =>
setNamespaces([])) inside the useEffect with an async function: define an async
inner function (e.g., async function fetchNamespaces()), await loadNamespaces()
inside a try block and call setNamespaces(result), and in the catch block call
setNamespaces([]); then invoke fetchNamespaces() from the useEffect so behavior
and fallback remain identical while using async/await.

In `@app/src/services/api/evidenceTrustApi.ts`:
- Around line 14-19: The debug log in loadEvidenceTrust currently prints the raw
namespace and a free-form message; change the log call (variable log) to use a
stable grep-friendly prefix `[rpc]` and structured correlation fields instead of
the raw namespace value — e.g., include method="loadEvidenceTrust" and
namespaceProvided=(namespace != null) along with relations.length; update the
log invocation after the memoryGraphQuery call to emit those fields and remove
the verbatim namespace to avoid leaking PII.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0f675e2b-8723-401b-a518-518386203d74

📥 Commits

Reviewing files that changed from the base of the PR and between b008a0e and e4cb84c.

📒 Files selected for processing (23)
  • app/src/components/intelligence/EvidenceTrustPanel.test.tsx
  • app/src/components/intelligence/EvidenceTrustPanel.tsx
  • app/src/components/intelligence/EvidenceTrustTab.test.tsx
  • app/src/components/intelligence/EvidenceTrustTab.tsx
  • app/src/lib/i18n/chunks/ar-1.ts
  • app/src/lib/i18n/chunks/bn-1.ts
  • app/src/lib/i18n/chunks/de-1.ts
  • app/src/lib/i18n/chunks/en-1.ts
  • app/src/lib/i18n/chunks/es-1.ts
  • app/src/lib/i18n/chunks/fr-1.ts
  • app/src/lib/i18n/chunks/hi-1.ts
  • app/src/lib/i18n/chunks/id-1.ts
  • app/src/lib/i18n/chunks/it-1.ts
  • app/src/lib/i18n/chunks/ko-1.ts
  • app/src/lib/i18n/chunks/pt-1.ts
  • app/src/lib/i18n/chunks/ru-1.ts
  • app/src/lib/i18n/chunks/zh-CN-1.ts
  • app/src/lib/i18n/en.ts
  • app/src/lib/memory/evidenceTrust.test.ts
  • app/src/lib/memory/evidenceTrust.ts
  • app/src/pages/Intelligence.tsx
  • app/src/services/api/evidenceTrustApi.test.ts
  • app/src/services/api/evidenceTrustApi.ts

Comment on lines +44 to +46
loadNamespaces()
.then(setNamespaces)
.catch(() => setNamespaces([]));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify no promise-chain usage remains in this component.
rg -n '\.then\s*\(|\.catch\s*\(' app/src/components/intelligence/EvidenceTrustTab.tsx

Repository: tinyhumansai/openhuman

Length of output: 138


Replace promise chaining with async/await in EvidenceTrustTab effect.

app/src/components/intelligence/EvidenceTrustTab.tsx still uses loadNamespaces().then(...).catch(...); convert the useEffect to async/await while preserving the setNamespaces([]) fallback.

♻️ Proposed fix
-  useEffect(() =&gt; {
-    // Namespaces are optional UI sugar; a failure to list them must not block
-    // the trust view, so swallow that error specifically.
-    loadNamespaces()
-      .then(setNamespaces)
-      .catch(() =&gt; setNamespaces([]));
-    void load('');
-  }, [load]);
+  useEffect(() =&gt; {
+    // Namespaces are optional UI sugar; a failure to list them must not block
+    // the trust view, so swallow that error specifically.
+    const run = async (): Promise&lt;void&gt; =&gt; {
+      try {
+        const nextNamespaces = await loadNamespaces();
+        setNamespaces(nextNamespaces);
+      } catch {
+        setNamespaces([]);
+      }
+      await load('');
+    };
+    void run();
+  }, [load]);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/components/intelligence/EvidenceTrustTab.tsx` around lines 44 - 46,
In the EvidenceTrustTab component, replace the then/catch promise chain calling
loadNamespaces().then(setNamespaces).catch(() => setNamespaces([])) inside the
useEffect with an async function: define an async inner function (e.g., async
function fetchNamespaces()), await loadNamespaces() inside a try block and call
setNamespaces(result), and in the catch block call setNamespaces([]); then
invoke fetchNamespaces() from the useEffect so behavior and fallback remain
identical while using async/await.

Comment on lines +14 to +19
const log = debug('evidence-trust:api');

/** Fetch graph relations for a namespace (or all) and compute trust metrics. */
export async function loadEvidenceTrust(namespace?: string): Promise<EvidenceTrustResult> {
const relations = await memoryGraphQuery(namespace);
log('loadEvidenceTrust namespace=%s relations=%d', namespace ?? '(all)', relations.length);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Avoid logging raw namespaces and add a grep-friendly RPC prefix.

Line 19 logs the namespace verbatim and uses a free-form message. Please switch this to a stable [rpc] prefix with correlation fields and avoid emitting the raw namespace value; a boolean like namespaceProvided plus the RPC method name is enough here.

♻️ Proposed fix
 const log = debug('evidence-trust:api');
 
 /** Fetch graph relations for a namespace (or all) and compute trust metrics. */
 export async function loadEvidenceTrust(namespace?: string): Promise<EvidenceTrustResult> {
   const relations = await memoryGraphQuery(namespace);
-  log('loadEvidenceTrust namespace=%s relations=%d', namespace ?? '(all)', relations.length);
+  log(
+    '[rpc] method=memoryGraphQuery namespaceProvided=%s relationCount=%d',
+    namespace !== undefined,
+    relations.length
+  );
   return computeEvidenceTrust(relations);
 }

As per coding guidelines, **/*.{rs,ts,tsx} must "Use stable grep-friendly log prefixes ([domain], [rpc], [ui-flow]) and correlation fields (request IDs, method names, entity IDs)" and "Never log secrets or full PII in debug logs; redact sensitive information".

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const log = debug('evidence-trust:api');
/** Fetch graph relations for a namespace (or all) and compute trust metrics. */
export async function loadEvidenceTrust(namespace?: string): Promise<EvidenceTrustResult> {
const relations = await memoryGraphQuery(namespace);
log('loadEvidenceTrust namespace=%s relations=%d', namespace ?? '(all)', relations.length);
const log = debug('evidence-trust:api');
/** Fetch graph relations for a namespace (or all) and compute trust metrics. */
export async function loadEvidenceTrust(namespace?: string): Promise<EvidenceTrustResult> {
const relations = await memoryGraphQuery(namespace);
log(
'[rpc] method=memoryGraphQuery namespaceProvided=%s relationCount=%d',
namespace !== undefined,
relations.length
);
return computeEvidenceTrust(relations);
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/services/api/evidenceTrustApi.ts` around lines 14 - 19, The debug log
in loadEvidenceTrust currently prints the raw namespace and a free-form message;
change the log call (variable log) to use a stable grep-friendly prefix `[rpc]`
and structured correlation fields instead of the raw namespace value — e.g.,
include method="loadEvidenceTrust" and namespaceProvided=(namespace != null)
along with relations.length; update the log invocation after the
memoryGraphQuery call to emit those fields and remove the verbatim namespace to
avoid leaking PII.

@aashir-athar aashir-athar force-pushed the feat/evidence-trust branch from e4cb84c to 38ccc5d Compare May 30, 2026 01:23
A new read-only "Trust" tab. The 20 shipped lenses all read the
(subject, predicate, object) triple structure or its document provenance.
None of them makes `evidenceCount` — the field that measures how many
times an assertion has been independently corroborated — the PRIMARY
signal. This lens does.

Three orthogonal-to-everything-shipped outputs:
  - TRUST QUOTIENT per entity = mean evidence per relation; separates a
    prolific entity with many single-witness facts from a quiet entity
    whose few relations are heavily corroborated.
  - EVIDENCE GINI = inequality of evidence concentration across entities
    (closed-form on sorted entity weights — one integer-weighted sum, one
    division; no float-associativity hazard).
  - UNDER-CORROBORATED WORKLIST = relations whose evidence falls below
    max(1, floor(median_positive_evidence / 4)) — a curator's review queue.
Plus Predicate Reliability Index per predicate and a `degraded:true`
banner when every relation has evidenceCount = 1 (the field was never
populated meaningfully).

Picked by the loop-21 judge-panel design workflow (4 fresh angles ×
3 judges + synthesis): weighted score 8.633/10, beating Chunk
Corroboration Atlas, Inferred Edges, and Attention Quadrants.

Engine (pure, deterministic — no React/RPC/clock/RNG):
- evidenceCount coerced via Number(...) then sanitised (non-finite/NaN/
  non-positive -> 0; positive floored to integer),
- multigraph collapse: same (namespace, s, p, o) tuple appearing
  multiple times SUMS evidence; one distinct relation,
- entity identity = (namespace, name) — orthogonal to Entity Duplicates,
- median for the under-corroboration threshold uses INDEX-PICK (lower
  middle on even sets), never the arithmetic mean — preventing float
  drift,
- empty-graph and all-zero-evidence guards: globalGini = 0 when
  entityCount < 2 OR sum-of-entity-weights === 0,
- all the synthesis-stage refinements applied (Number coercion, dedup
  before exclusivity, degraded flag, fixed-decimal output rounding,
  threshold exposed in summary).

Adds ZERO new core surface: composes the already-shipped
memoryGraphQuery / memoryListNamespaces wrappers. Container/
presentational split with a monotonic request-token race guard for
load-on-mount; i18n across all 13 locales; aria-hidden on the decorative
→ glyph paired with an sr-only "points to".

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@aashir-athar aashir-athar force-pushed the feat/evidence-trust branch from 38ccc5d to 0e32bec Compare May 30, 2026 12:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Net-new user-facing capability or product behavior. memory Memory store, memory tree, recall, summarization, and embeddings in src/openhuman/memory/. working A PR that is being worked on by the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant