mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
fix(sync): wire org skill pull into the runtime; scrub internal jargon
Two defects found by manual testing on the branch.
1. ORG SYNC NEVER RAN. The org pull/mirror/gating machinery was fully
implemented and unit-tested but had ZERO runtime callers —
maybe_pull_org_skills() was referenced only inside a comment, and
`hermes sync` had no org path at all. Every code path fell through to
personal sync (refs/user/<sub>/), so org skills never loaded and the
feature looked like 'everything syncs to my personal org' even with a
valid org token. The unit tests could not catch this: they invoked the
functions directly, which is exactly the gap they left open.
- cli.py session startup now calls maybe_pull_org_skills() alongside the
personal maybe_pull_skills(), fail-quiet.
- Auto-pull is gated on real org membership: resolve_org_identity()
requires an org role on the token, only issued for multi-member orgs,
so a solo account never reaches the network.
- `hermes sync pull` refreshes the org mirror too (one pull, both
surfaces) and reports what it refreshed.
- `hermes sync status` exposes org_available/org_id/org_role/org_skills
plus a plain-language summary, so a user can tell whether the org
workflow applies instead of it being invisible.
2. INTERNAL JARGON LEAKED TO USERS. Help text and errors exposed internal
milestone/spec coordinates: 'Propose a skill ... (M2)', 'Personal skill
sync (HSP/1)', 'DEV-PHASE gate closed: your token lacks
tool_gateway_admin', 'contract §4.3', and an inert message describing our
internal personal-vs-multi-member design split. All rewritten in user
language. Feature-local comments/docstrings lost their internal
coordinates (§N, M1/M2, design.md, PR numbers) while keeping the
explanatory prose. Pre-existing issue references elsewhere in the tree
were deliberately left untouched.
Tests: 4 new guards, including two that assert the CALL SITES exist so the
org pull cannot silently become dead code again (verified failing when the
wiring is removed) and one that fails if user-facing help leaks jargon.
344 passed across the sync/skills/prompt suites.
Verified against live staging with a real org token: sync status reports
org_available=true, org_role=OWNER; sync pull performs the org refresh; the
.active_org marker is written with the org id from the token.
This commit is contained in:
parent
78598d091a
commit
797c52b571
7 changed files with 201 additions and 68 deletions
18
cli.py
18
cli.py
|
|
@ -13355,15 +13355,25 @@ class HermesCLI(CLIAgentSetupMixin, CLICommandsMixin, CLIBillingMixin):
|
|||
except Exception:
|
||||
pass
|
||||
|
||||
# HSP skill sync — best-effort periodic pull, piggy-backing on the
|
||||
# curator tick. Inert unless the DEV-PHASE gate is open
|
||||
# (tool_gateway_admin) and a sync base URL is configured; swallows all
|
||||
# errors so it never blocks CLI startup.
|
||||
# Skill sync — best-effort periodic pull, piggy-backing on the
|
||||
# curator tick. Inert unless the access gate is open and a sync base
|
||||
# URL is configured; swallows all errors so it never blocks startup.
|
||||
try:
|
||||
from tools.skills_sync_client import maybe_pull_skills
|
||||
maybe_pull_skills()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Org-shared skills — pull the organisation's approved set into the
|
||||
# read-only mirror. Gated on real org membership: resolve_org_identity
|
||||
# requires an org role on the token, which is only issued for
|
||||
# multi-member organisations, so a solo account never reaches the
|
||||
# network here. Fail-quiet, exactly like the personal pull above.
|
||||
try:
|
||||
from tools.skills_sync_client import maybe_pull_org_skills
|
||||
maybe_pull_org_skills()
|
||||
except Exception:
|
||||
pass
|
||||
if self.preloaded_skills and not self._startup_skills_line_shown:
|
||||
skills_label = ", ".join(self.preloaded_skills)
|
||||
self._console_print(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue