Skip to content

docs: technical memory architecture + landing page clarity - #30

Closed
UfukNode wants to merge 1 commit into
NousResearch:mainfrom
UfukNode:docs/technical-memory-architecture
Closed

docs: technical memory architecture + landing page clarity#30
UfukNode wants to merge 1 commit into
NousResearch:mainfrom
UfukNode:docs/technical-memory-architecture

Conversation

@UfukNode

Copy link
Copy Markdown

No description provided.

@UfukNode UfukNode closed this Feb 25, 2026
@UfukNode UfukNode reopened this Feb 25, 2026
@UfukNode UfukNode closed this Feb 25, 2026
h4x3rotab pushed a commit to Clawdi-AI/hermes-agent that referenced this pull request Apr 10, 2026
Adds a Knowledge tab alongside the existing Memory tab under /memory.
The knowledge browser renders markdown wiki pages from ~/.hermes/knowledge/
with support for:

- YAML frontmatter parsing (title, type, domain, status, tags)
- Directory-based navigation with folder tree sidebar
- [[wikilink]] resolution as clickable in-app navigation
- Backlinks ('Pages that link here')
- Full-text search across all wiki pages
- Tag filtering
- Metadata display (type, domain, status, created/updated)
- Graph view dialog showing page connections
- 'Ask agent about this' button linking to chat
- Graceful empty state when no knowledge directory exists

Server side:
- src/server/knowledge-browser.ts — wiki scanner, frontmatter parser,
  wikilink extractor, graph builder
- 4 API routes: /api/knowledge/list, /read, /search, /graph

Frontend:
- src/routes/memory.tsx — tabbed layout (Memory | Knowledge)
- src/screens/memory/knowledge-browser-screen.tsx — full browser UI

Knowledge tab works independently of gateway capabilities (reads local
filesystem directly). No new dependencies added.

Closes NousResearch#30
ashneil12 referenced this pull request in ashneil12/vanilla-hermes-agent May 18, 2026
)

When the WebUI's model picker sets the active provider to
"venice" (or "crof", "bankr", "cometapi"), the agent's
resolve_provider_client() looked up the slug in
PROVIDER_REGISTRY, failed to find it, and raised:

  "Provider 'venice' is set in config.yaml but no API key
   was found. Set the VENICE_API_KEY environment variable..."

VENICE_API_KEY WAS set in env — the failure was because
the agent had no idea which env var or base URL to use for
"venice" as a slug. PROVIDER_REGISTRY entries for the other
OpenAI-compatible aggregators (Z.AI, MiniMax, Mistral, etc.)
already existed; Venice/CrofAI/Bankr/CometAPI just hadn't
been added in the upstream code.

Adds four api_key-auth entries mirroring the existing
OpenAI-compat ones:
- venice → https://api.venice.ai/api/v1 + VENICE_API_KEY
- crof → https://crof.ai/v1 + CROF_API_KEY
- bankr → https://gateway.bankr.bot/v1 + BANKR_API_KEY
- cometapi → https://api.cometapi.com/v1 + COMETAPI_API_KEY

Companion to the WebUI side (PRs #26/#27/#29/#30/#32/#33)
which made these providers discoverable in the model picker
with their live /v1/models catalogs.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
dmascord added a commit to dmascord/hermes-agent that referenced this pull request Jun 6, 2026
jarvis-stark-ops pushed a commit to 1Team-Engineering/hermes-agent that referenced this pull request Jun 10, 2026
…on + dispatcher-only lookup

Second self-review found one BROKEN issue and one WEAK adversarial
concern. Both addressed.

## BROKEN #7 — same-tenant cross-umbrella collision

Two goal_mode umbrellas sharing a tenant (the common marvel-swarm-*
case) would both look up integrative reviews by the same title prefix +
tenant. Umbrella B's archive could find umbrella A's review and either
falsely unblock (if A was approved) or falsely block (if A was in
flight).

Fix: embed `umbrella_id` in the review title:
``Integrative architectural review (v6.7 NousResearch#30) for <umbrella_id>``
Lookup uses a per-umbrella LIKE pattern via two new helpers:
`_v6_7_integrative_title_for(umbrella_id, round)` and
`_v6_7_integrative_title_pattern(umbrella_id)`. Tenant is no longer
load-bearing for isolation — the title is unique per umbrella.

## WEAK #8a — manual fake-review bypass mitigated

A worker with kanban write access could create a task with the right
title, mark it done with `result = "verdict: approve"`, and unblock
the umbrella. Now the lookup query also filters
`created_by = 'dispatcher'`, so hand-crafted fake reviews are
ignored. This isn't a complete defense (a worker who can write
arbitrary `created_by` values could still spoof) but defense in depth
that catches the common case.

## Tests

3 new tests added (30 total, up from 27):
- TestCrossUmbrellaIsolation.test_two_umbrellas_same_tenant_have_separate_reviews
- TestCrossUmbrellaIsolation.test_approving_one_umbrella_does_not_unblock_another
- TestFakeReviewMitigation.test_lookup_requires_created_by_dispatcher

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jarvis-stark-ops added a commit to 1Team-Engineering/hermes-agent that referenced this pull request Jun 10, 2026
…ousResearch#30)

archive_task gates JARVIS goal-mode umbrella archives behind a final
T'Challa integrative architectural review. When all per-block reviews
are terminal and ≥1 build child + ≥1 review child exist, the
dispatcher spawns a PEER task (not child — that caused a deadlock in
the first attempt) assigned to tchalla with the 4-item review scope:
end-to-end request trace, page render trace, adversarial enumeration,
error-path audit.

Strict line-anchored verdict parser (^verdict: approve|reject). Reject
verdict triggers re-spawn with :rN suffix the next archive call.
Per-umbrella title isolation prevents same-tenant cross-umbrella
collision. created_by='dispatcher' filter mitigates fake-review
bypass.

Closes hermes-jarvis#30. Context: hermes-jarvis#61. 30 tests after
three self-review passes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jarvis-stark-ops added a commit to 1Team-Engineering/hermes-agent that referenced this pull request Jun 11, 2026
…h#79) (#19)

* feat(kanban): v6.8 Part 4 — umbrella keep_running until reviewers spawn (NousResearch#79)

The 2026-06-10 v6.7 validation chain caught this orchestration bug:
JARVIS umbrella spawned Pepper + Friday from the umbrella, then
called kanban_complete on itself before any reviewer was queued. The
umbrella showed as done with build-only descendants; Kaipo had to
manually spawn Tony / Tchalla / Vision to continue the chain.

Closes hermes-jarvis#79.

## What this PR adds

New gate ``verify_umbrella_review_coverage`` that fires when a
goal_mode umbrella calls kanban_complete. The gate walks the
umbrella's transitive descendants (reusing _v6_7_walk_descendants
from NousResearch#73 so chained shapes count). If no review-role descendant
exists anywhere in the subtree, the gate rejects.

Two violation messages:

1. ``no descendants at all`` — pathological goal-mode umbrella that
   never decomposed. The orchestrator misfired.
2. ``build-role descendants but NO review-role descendants`` — the
   exact 2026-06-10 case. Message points the operator to spawn
   tony/tchalla/vision now via kanban_create --parent <build-id>.

Opt-out: ``metadata={"x_no_review_needed": "<≥20-char reason>"}``
for legitimate cases (e.g. pure status-ack umbrellas). Standard
v6.7/v6.8 opt-out conventions — emits completion_opt_out_used
audit event with verbatim reason; bool/short strings rejected.

## Relationship to v6.7 NousResearch#30

- NousResearch#30 (integrative review at archive): fires at ARCHIVE time, spawns
  Tchalla after a chain settles.
- NousResearch#79 (this PR): fires at COMPLETE time, forces JARVIS to spawn
  reviewers BEFORE marking itself done.

Together they catch the empty-chain failure mode at both ends of the
lifecycle.

## Tests

12 new tests:

TestUmbrellaReviewCoverage (7) — non_goal skips, review descendant
passes, only-build rejects with helpful message, no-descendants
rejects with different message, tchalla/vision also satisfy, opt-out
bypasses.

TestUmbrellaReviewCoverageIntegration (5) — end-to-end via
complete_task: build-only blocks, adding chained tony unblocks
(closes NousResearch#73 + NousResearch#79 together), x_no_review_needed passes, short opt-out
rejected, non-goal_mode tasks unaffected.

135 in test_kanban_completion_gates.py pass. 231/231 across full
v6.7+v6.8 + adjacent regression set, zero failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(kanban): self-review fixes for v6.8 Part 4 umbrella gate (NousResearch#79)

Three findings from the independent code review on PR #19:

1. Scope tightening: verify_umbrella_review_coverage now requires
   umbrella_assignee in ORCHESTRATION_ROLES (jarvis/pepper/banner).
   A goal-mode worker like Friday is out of scope — only orchestrators
   own umbrella-decomposition discipline. Was over-applying.

2. Empty-assignee message correctness: has_non_review_descendant is
   now bool(descendants), not the unset has_non_review flag. Prevents
   the "no descendants at all" message lying when descendants exist
   but all have empty assignees. Also added break after first review
   match for early termination.

3. Opt-out rename: x_no_review_needed → x_umbrella_no_review across
   gate messages, kanban_db opt-out validation, accepted_opt_outs
   audit entry, and tests. Avoids future collision with
   x_no_reviewer_fields (reviewer-field opt-out).

Plus 8 new unit tests covering the scope tightening (friday/tony
skipped, empty-assignee skipped, pepper/banner in scope, case-
insensitive matching) and edge cases the reviewer flagged
(blocked-status review counts, deep transitive review, multi-children
multi-reviews).

Module docstring updated: was "Three gates ship today (Tranche 1
of v6.7)" — now reflects the v6.7+v6.8 gate roster (5 gates,
closing 7 issues).

All 144 gate tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Jarvis <jarvis@Kaipos-Mac-mini.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
whichguy added a commit to whichguy/hermes-agent-1 that referenced this pull request Jul 4, 2026
…h#33 adopted; journal + v1.3.4

ATTEMPTED:
- Ran the pre-registered NousResearch#32 gate (objective outcome harness, n=34 = 20 micro + 14 agentic, K=3,
  all-deepseek, --max-rounds 1, --strict-preflight; 170 cells / 52 min; raw
  ~/.hermes/outcome_eval_32.json) and applied the ADOPT rule mechanically. Journaled the verdict
  both ways across README §6, design-decisions (§First-order candidate source NousResearch#32 + §Discrimination
  preflight NousResearch#33), evsi-validation-findings (pre-registered rule quoted verbatim, incl. the efficiency
  ceiling), and the nbq-improve backlog. Bumped nbq 1.3.3 -> 1.3.4 (negative result, no default flip).

WHY:
- NousResearch#32 tested the NousResearch#28 successor hypothesis: the residual P4 gap over the naive zeroshot arm is
  generation altitude, not the value judge. First cost-aware gate: efficiency (wall/tokens/calls)
  measured alongside Δresult, with a pre-registered 10%-added-wall ceiling that vetoes even a result win.

RESULT:
- NousResearch#32: NO ADOPT. Per-arm pass vs baseline 0.460 -- nbq +0.083 (9W/4L, un 74%, 25.0s/20221tok/38.3c);
  nbq-firstorder +0.132 (7W/3L, un 78%, 29.2s/23944tok/45.4c); zeroshot +0.274 (15W/1L, p=0.0005,
  un 31%, 5.9s/154tok/1c). Paired nbq-firstorder vs nbq: Δ+0.049 > 0 but 6W/6L/22-tie (broad-win
  guard fails); unanswerable 77% (>50%); lens-payoff regression (log-clean 0.67->0.33); +16.8% wall
  (>10% ceiling). All four adopt conditions fail. Altitude has signal (mean beat plain nbq) but did
  NOT close the gap -- zeroshot still dominates at ~1/5 wall, ~1/150 tokens; the residual gap is
  ANSWERABILITY. firstorder stays built, off-by-default. NousResearch#30 answerability weighting re-opened
  (its condition, unanswerable >50%, is now met).
- NousResearch#33: PASS/adopted as opt-in instrument -- discrimination_preflight fast 8/8, deepseek 8/8.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
whichguy added a commit to whichguy/hermes-agent-1 that referenced this pull request Jul 4, 2026
…retro probe

ATTEMPTED: First real use of the nbq-improve protocol (iteration two) — a conditional
full lap. Built a zero-model-call retro probe (evals/probe_answerability.py + 5 tests)
to gate whether to build NousResearch#30 answerability weighting, testing NousResearch#30's premise against the
existing objective corpus (outcome_eval_32.json: per-question EVSI meta.q_values,
answerability qa[].revealed, outcome frac).

WHY: NousResearch#32 pinned the residual P4 gap on answerability (unanswerable 77% > 50%), re-opening
NousResearch#30. Rather than build first, probe the premise for free: do kept high-EVSI *unanswerable*
questions cause objective failure? The cheapest falsifying test uses data we already have
— zero new model calls.

RESULT: PARK (premise NOT supported, n=34). top1_unans x fail r=+0.052, SE=0.177, does not
clear SE (no association); any_unans x fail r=-0.112, base rate 0.971 => DEGENERATE
(near-universal unanswerability => no answerable-question contrast to steer toward) +
wrong-direction; tertiary n_unans x frac r=-0.219 (weak whiff only). Delta-result: none
(no NousResearch#30 build; conditional gate honored in commit order). Delta-cost: zero (probe is
offline). Verdict per the pre-registered rule (quoted verbatim in
evsi-validation-findings.md): PARK. NousResearch#30 re-open now requires a higher-contrast corpus
(candidate 2/3) plus a non-self-rated mechanism (batched strict-simulator answer/refuse
probe, designed + parked in prereg-iteration-two.md item B, unbuilt). Methodology banked:
cost is multi-dimensional — verdict-rubric.md now requires a per-axis ceiling (wall,
tokens, calls), any bust vetoing a result win. Suite 206 -> 211 green.
next-best-questions 1.3.4 -> 1.3.5; nbq-improve 1.0.0 -> 1.0.1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
whichguy added a commit to whichguy/hermes-agent-1 that referenced this pull request Jul 4, 2026
…nt != state

ATTEMPTED: Built an opt-in nbq-reach-investigate arm in outcome_eval.py (a fixture-aware
mock_investigator resolving strict-unanswerable questions from observable state,
leakage-guarded) + 6 tests + a --arm flag on probe_answerability.py. Gated on the agentic
bank (n=14) to test candidate 3: does resolving reach questions via an investigator lift
objective pass and create the answerability<->pass contrast NousResearch#30 needs?

WHY: Iteration two parked NousResearch#30 because unanswerability was near-universal with no
answerable-question contrast. Candidate 3 was the route to build that contrast — route reach
questions to a (mocked) investigator that turns unknowns into observables.

RESULT: NO ADOPT. 0 investigator resolutions across all 42 rows — the mock never fired (it
works on observable questions; the build smoke resolved one). nbq's high-EVSI questions are
about INTENT (which reading, crash-vs-fallback, detail level), and an investigator observes
STATE, not intent. Unanswerable ROSE (78.6%->81.0%). The +0.100 arm-mean gap (baseline 0.351 /
nbq 0.301 / reach 0.401) is unpaired sampling variance: 0/14 tasks shared questions across
arms. NousResearch#30 did not un-park (all 14 tasks frac<1.0 => fail has zero variance => probe r=0.000).
Delta-cost: 0 incremental (0 resolutions). THE FINDING: intent != state — the valuable
clarifications are unobservable by any hop, answerable only by the user, so the
answerability/reachability lever is a dead-end; value is in the unobservable intent questions.
Route forward = candidate 2 (nbq->relentless, real user answers intent). Methodology banked to
verdict-rubric.md: paired-design validity (test the answering, hold questions fixed).
Suite 211->217 green. next-best-questions 1.3.5->1.3.6; nbq-improve 1.0.1->1.0.2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
whichguy added a commit to whichguy/hermes-agent-1 that referenced this pull request Jul 4, 2026
… learning even without code)

ATTEMPTED: Codify into verdict-rubric.md's commit-message contract that git history is the
experiment log: every lap commit cites the key git references its learning chains from, and the
thesis+lesson are committed EVEN WHEN the experimental code is not kept.

WHY: Per jim — commit history is the durable log. A negative result or a discarded experiment must
not vanish because its code didn't ship; the learning and its provenance (prior SHAs) must persist in
git even when the code does not.

RESULT: verdict-rubric.md commit-message contract extended (code-optional, learning-required; cite
prior-lap SHAs). nbq-improve 1.0.2->1.0.3. This commit is the first to cite the chain it builds on:
  lap one   nbq 1.3.3->1.3.4 (baseline 9e15281)
  lap two   canonical 2305998, hub 8165e32  (NousResearch#30 answerability PARKED; cost-is-multidimensional)
  lap three canonical 1d0291b, hub a52ac40  (reach->investigate NO ADOPT; intent != state)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Soju06 added a commit to Soju06/hermes-agent that referenced this pull request Jul 16, 2026
Soju06 added a commit to Soju06/hermes-agent that referenced this pull request Jul 16, 2026
ethenotethan added a commit to ethenotethan/harness that referenced this pull request Aug 4, 2026
…sResearch#30)

The artifact tool whitelisted a fixed set of render dialects; HTML wasn't
one, so the agent couldn't maintain an HTML-document artifact (a custom
dashboard or styled report the structured kinds can't express). The gateway
store already handles unknown kinds correctly — merge_content defaults to
replace, which is exactly right for a whole HTML doc — so this only unblocks
the tool surface:

- Add "html" to VALID_KINDS and both schema enums.
- Describe the kind: content is raw HTML (not JSON), no per-kind merge, so
  always write the complete document (get-before-write still applies).

The native client renders it in its existing WKWebView-backed artifact view.

Test: extend test_agent_tool_surface with an html set/get round-trip.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Meraniya pushed a commit to Meraniya/hermes-agent that referenced this pull request Aug 6, 2026
NousResearch#30)

* feat(memory): memgw provider — Memory Gateway hybrid recall as default

New plugins/memory/memgw/ MemoryProvider that connects Hermes to the
self-hosted Memory Gateway over Streamable-HTTP MCP:
- memgw_recall / memgw_retain / memgw_reflect tools
- background prefetch (recall|reflect), non-blocking sync_turn
- on_delegation -> Experience capture, on_session_end summary
- circuit breaker + threaded event loop (mirrors mem0/hindsight patterns)
- cloud (Bearer) or local (keyless) mode
- set as Hermes default memory.provider (degrades to built-in if unavailable)
- 13 tests passing, ruff clean; provider discovered + loads via plugin system

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(memory/memgw): address Codex PR NousResearch#30 review findings

- is_available() now checks for the mcp package before returning True,
  preventing ModuleNotFoundError on activation when credentials are set
  but the extra was never installed (P2)
- pin pip dep to mcp>=1.26.0,<2 in plugin.yaml, matching the audited
  version in pyproject.toml (P2)
- clear DEFAULT_CONFIG memory.provider so fresh installs don't default
  to an external provider the user hasn't configured (P1)
- add on_session_switch() to clear _prefetch_result on session rotation
  so stale prefetch from a prior session can't bleed into a new one (P2)
- pass user_id in all gateway calls (recall/write/reflect) when running
  in a multi-user gateway context, enabling server-side user scoping (P1)
- remove the blocking join on the previous sync thread from sync_turn()
  so the turn path is never delayed by a slow/hung prior sync (P2)
- track delegation threads in _delegation_threads list and join them in
  shutdown() so on_delegation writes aren't silently killed on exit (P2)
- raise RuntimeError in _unwrap() when isError=True so circuit-breaker
  records the failure and tool calls surface the error to the model (P2)
- guard _ensure_loop() with _loop_lock to prevent concurrent first-calls
  from racing and leaking a loop thread (P2)

* fix(memgw): address Codex review — scoping, session/writer safety, MCP errors

Addresses the 6 live findings on PR NousResearch#30:
- multi-user scoping: recall/write/reflect payloads now include user_id
  (_user_scope) so gateway sessions don't share one namespace
- MCP client: _unwrap raises on CallToolResult.isError so tool-level failures
  don't reset the circuit breaker as successes
- is_available checks the optional mcp dependency is installed
- prefetch: monotonic generation guard so a slow older worker can't overwrite a
  newer result; on_session_switch clears + invalidates in-flight prefetch
- sync writers tracked in a list; shutdown joins all (not just the last) so an
  in-flight retain isn't dropped
- delegation threads tracked + reaped
- doc: README explains the deliberate bundled-plugin exception (personal default
  for this fork; degrades to built-in when mcp/key absent)
- +4 tests (scoping, session-switch invalidation, stale-prefetch guard)
  17 memgw tests pass, ruff clean

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Meraniya pushed a commit to Meraniya/hermes-agent that referenced this pull request Aug 6, 2026
… — Codex PR NousResearch#30 review (NousResearch#31)

Two chatgpt-codex-connector[bot] review comments on PR NousResearch#30 that still applied
to current main (the other 13 were already addressed in the merged PR):

1. client.py NousResearch#13 — Cancel timed-out MCP calls: _run_sync now cancels the
   concurrent.futures.Future on timeout before re-raising, so a stalled MCP
   endpoint doesn't leave a pending HTTP session running on the shared
   background loop after the caller has given up / opened the breaker.
2. __init__.py NousResearch#15 — Parse the host before allowing keyless local mode:
   is_available() now urlparse's the URL and requires an exact loopback host
   (localhost/127.0.0.1/::1) instead of a substring match, so a URL like
   'https://localhost@example.com/mcp' (host=example.com) is no longer trusted
   as local keyless mode.

Adds regression tests: test_memgw_client_timeout.py (cancel-on-timeout fails
against pre-fix client) + TestKeylessLocalModeHostParsing (3/4 fail pre-fix).

Deferred (already fixed in merged PR NousResearch#30): MCP dep import check, MCP dep pin,
loop lock, isError handling, stale-prefetch generation, sync/delegation thread
tracking + shutdown join, session-switch prefetch invalidation, no join on
turn path, default provider unset.
Deferred (complex, needs interface change): NousResearch#3/NousResearch#4 per-turn user_id refresh for
shared gateway sessions — sync_turn/prefetch only receive session_id, not
user_id, so threading identity through requires a MemoryProvider interface
change; NousResearch#1 in-tree placement is an architectural call (AGENTS.md says existing
in-tree providers stay).
Meraniya pushed a commit to Meraniya/hermes-agent that referenced this pull request Aug 6, 2026
…odex P1) (NousResearch#33)

* fix(memgw): pass user_id per-call to prevent cross-user memory scoping in shared gateway sessions

Closes the remaining open P1 Codex finding from the PR NousResearch#30 review chain.

In shared gateway sessions (thread_sessions_per_user=False), multiple users
share a cached AIAgent instance. _user_id was stored once at initialize() time
and reused by _user_scope() for all subsequent sync_turn/queue_prefetch calls,
routing User B's memories into User A's gateway namespace.

Fix: propagate user_id as an optional keyword argument through the full call chain:
  run_agent._sync_external_memory_for_turn
    -> MemoryManager.sync_all / queue_prefetch_all
      -> MemoryProvider.sync_turn / queue_prefetch (base interface updated)
        -> MemGatewayProvider._user_scope(user_id) -- per-call override wins,
          falls back to self._user_id for non-gateway single-user sessions

_user_scope() now accepts an explicit uid that takes priority over the cached
self._user_id, so every background write and prefetch is scoped to the user
who actually triggered the turn, not the user who first initialized the session.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NFLEjSSx3Wr2j4D3v4HNN4

* fix(ty): add user_id kwarg to queue_prefetch/sync_turn overrides

The base class MemoryProvider now declares user_id as a keyword-only
default arg on both queue_prefetch and sync_turn. Seven providers and
one test stub that override these methods were not updated in PR NousResearch#33,
causing ty to report invalid-method-override (17 new diagnostics).

Add user_id: str = "" to each override; providers that do not use
multi-user scoping can safely ignore it.

Also bound pytest-timeout in [dependency-groups] per supply-chain
policy: >=2.4.0,<3.

* chore: regenerate uv.lock after pytest-timeout upper-bound pin

The previous commit added <3 upper bound to pytest-timeout per repo
supply-chain policy, but did not regenerate uv.lock. Running
`uv lock` updates the lockfile to reflect the new constraint.

* fix(ty): add user_id keyword arg to retaindb overrides

The base MemoryProvider.sync_turn and .queue_prefetch gained user_id: str = ""
as a keyword-only default, but these overrides were missed in the previous
commit. Fixes 5 remaining invalid-method-override ty warnings.

* fix(ty): add user_id keyword arg to mem0 overrides

The base MemoryProvider.sync_turn and .queue_prefetch gained user_id: str = ""
as a keyword-only default, but these overrides were missed in the previous
commit. Fixes 5 remaining invalid-method-override ty warnings.

* fix(ty): add user_id keyword arg to agent overrides

The base MemoryProvider.sync_turn and .queue_prefetch gained user_id: str = ""
as a keyword-only default, but these overrides were missed in the previous
commit. Fixes 5 remaining invalid-method-override ty warnings.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
mansonyu2000 pushed a commit to mansonyu2000/hermes-agent that referenced this pull request Aug 10, 2026
… Sprint NousResearch#30

evidence: none
verified:
- zentao story list --product=11 → 4 stories (NousResearch#117-120)
- zentao task list --execution=30 → 13 tasks (NousResearch#45-57)
- http://pm.test.com/zentao/story-browse-117.html

Changed:
- .zentao/mapping.json: winpeek#6 → peeka数字机器人NousResearch#11, SCRUM NousResearch#29, Sprint NousResearch#30
- tasks/mim-chat-v1-*: updated zentao IDs NousResearch#32-44 → NousResearch#45-57
- tasks/README.md + CLAUDE-module.md: zentao URLs/commands

Co-Authored-By: Claude <noreply@anthropic.com>
bri12afdsarker96-lgtm pushed a commit to bri12afdsarker96-lgtm/hermes-agent-mercury that referenced this pull request Aug 12, 2026
P3-M1 合入列车阶段 4:
- fork PR #4 base 已由 GitHub API 从 feature/p3-m1-provider 改为 main
  (main 现含阶段 2 rebrand merge e3121a2 + 阶段 3 provider merge 7f9d1c9)
- HA @ pinned SHA 由 PR NousResearch#30 旧 HEAD ad44bd11 改为阶段 1 真实 merge SHA
  a3ef38298e6a42a88ec93d75af88b4027f7febbe(HA 默认分支
  claude/hermes-desktop-multi-ai-phone-aiw5mr 新 HEAD)

仅改 pin / provenance 相关位置(Codex 硬约束):
- .github/workflows/p3-m1-mcp-seven-step.yml: env HERMES_AI_PIN_SHA +
  actions/checkout ref(两处 SHA)
- tests/native_mcp/test_seven_step_via_registry.py: module docstring
  Prereq 段 SHA 说明(1 处)
- docs/p3-m1-mcp-seven-step-fork.md: Scope 段(PR NousResearch#30 已 merged @ merge SHA)
  + Codex E 表 Step 1 说明(`importlib.metadata` 断言 + `git rev-parse HEAD`
  硬闸,删除旧的 `pip show grep` 描述)+ 关联 PR 堆叠段(阶段 2/3/1 merge
  SHA 全部记录)

七步测试逻辑零改动。生产代码零改动。uv.lock/pyproject.toml 零改动。

本地: 1 passed in 5.06s。Secret 扫净。等专用 push+PR CI + umbrella CI +
原三审计 Agent 只读复审 base 变化和 SHA pin 变化。
bri12afdsarker96-lgtm added a commit to bri12afdsarker96-lgtm/hermes-agent-mercury that referenced this pull request Aug 12, 2026
P3-M1 合入列车阶段 4。fork 自己生产路径 config.yaml →
tools/mcp_tool.py::discover_mcp_tools() → 两 stdio server →
tools/registry.py::registry.dispatch("mcp__<server>__<tool>", args) 完成
真实七步链路,含 tenant/thread 权威源锁定、strip_sources C4、send_reply 幂等、
严格 shutdown 与后台 mcp-event-loop 线程硬门。

HA @ pinned merge SHA a3ef38298e6a42a88ec93d75af88b4027f7febbe(阶段 1
HA PR NousResearch#30 merge commit)via actions/checkout + HERMES_AI_TOKEN
(fine-grained PAT,仅 HA Contents: Read-only)+ persist-credentials: false
+ Verify HEAD == HERMES_AI_PIN_SHA 硬闸。

依赖全部由 fork uv.lock 锁定:mcp==1.28.1 / httpx==0.28.1 /
websockets==15.0.1 只断言不重装。

CI (HEAD 1c23846):
- 专用 push run 31611539996 GREEN
- 专用 PR run 31611537510 GREEN(tests=1 passed=1 skipped=0 failures=0 errors=0)
- umbrella CI 31611538177 attempt 2 GREEN(含 12/12 Python slices +
  Review label gate + All required checks pass 全 success)

3 原审计 Agent 对 base+pin 变化只读复审全部 PASS · blockers []。
ci-reviewed 标签由 Codex 授权添加,触发 Review label gate GREEN。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants