Skip to content

feat: GitHub Intelligence & Technical Architecture Expert - #57

Closed
ygd58 wants to merge 13 commits into
NousResearch:mainfrom
ygd58:main
Closed

feat: GitHub Intelligence & Technical Architecture Expert#57
ygd58 wants to merge 13 commits into
NousResearch:mainfrom
ygd58:main

Conversation

@ygd58

@ygd58 ygd58 commented Feb 26, 2026

Copy link
Copy Markdown
Contributor

🚀 Moving beyond Notion: GitHub Architecture Expert

After the feedback that basic Notion tools were already covered, I decided to pivot to a much more critical challenge for developers: Repository Intelligence.

What this PR introduces:

  • Deep Repo Scanning:Hermes can now fetch the entire file tree of any GitHub repository to understand its architecture.
  • Code Contextualization:The agent can read specific source files on the fly to explain "how things work" to the user.
  • Technical Architect Mode:This turns Hermes from a simple assistant into a Technical Lead that can help developers onboard into new codebases instantly.

I'm excited to contribute this "Intelligence" layer to the ecosystem. Ready for review!

Adds a function to fetch model metadata from Hugging Face.
Added operational guidelines for Hugging Face model expertise.
This function executes a Python code snippet in a secure subprocess, capturing output or errors. It includes error handling for timeouts and system errors.
Added operational guidelines for the Autonomous Code Verification Skill.
This skill enables Hermes to autonomously extend its own capabilities by writing new Python tools from scratch, testing them, and registering them without human intervention.
This script fetches current weather data for any city using the Open-Meteo API without requiring an API key. It includes geocoding functionality to convert city names to geographic coordinates.
This file contains a suite of tests for the weather tool, checking various scenarios including valid and invalid city inputs, temperature units, and response structure.
Added documentation for the Adventure Log and self-tool building capabilities of Hermes Agent, including installation instructions and test results.
Introduced a self-tool builder skill for Hermes that enables autonomous tool creation, testing, and registration without human intervention. Includes demo tools and tests.
@ygd58 ygd58 closed this Feb 26, 2026
@andrueandersoncs

Copy link
Copy Markdown

Starting work on issue #57.

Branch: auto/issue-57-surface-longitudinal-rationale-alongside-today-d
Worktree: /Users/andrue/.hermes/worktrees/vantage/issue-57-surface-longitudinal-rationale-alongside-today-d

@andrueandersoncs

Copy link
Copy Markdown

Completed ✅

What changed:

  • New lib/longitudinal-rationale.ts module with deriveLongitudinalRationale() — inspects cross-week adherence history + progress signals and returns a one-line plain-language context sentence
  • Priority-ordered pattern detection: missed-workout pattern → off-plan meal pattern → repeated friction → weight progress trend → strong adherence
  • TodayPlan extended with longitudinalRationale: LongitudinalRationale | null
  • deriveTodayPlan() accepts optional adherenceHistory + progressSummary params
  • TodayScreen loads both signals at mount via useMemo and passes them into deriveTodayPlan()
  • Rationale renders as a small muted line below the ranked directive rationale inside the directive card, hidden when null

Verification:

  • ✅ All 283 tests pass (npm test) including 12 new tests in lib/longitudinal-rationale.test.ts covering all signal branches, edge cases (empty history, sub-threshold), and integration with deriveTodayPlan()
  • npm run build compiles cleanly — no TypeScript errors
  • ✅ Deployed to Railway: https://vantage-production-b8d9.up.railway.app
  • ✅ Dogfood QA: page loads correctly, existing directive display intact, rationale element correctly absent for a new user (graceful degradation), no JS errors in rendered HTML

Shipped in: 223a2ca (main)

Acceptance criteria met:

  • Rationale derived from real adherence/progress signal data ✅
  • Rationale shown only when history is detected (≥ 2 weeks, threshold met) ✅
  • No rationale when insufficient history ✅
  • Existing directive display unchanged ✅

Meraniya pushed a commit to Meraniya/hermes-agent that referenced this pull request Aug 6, 2026
NousResearch#57)

* feat(config): interprocess write lock — eliminate watchdog TOCTOU race

- Add config_write_lock() exclusive OS file lock (fcntl.flock / msvcrt)
- Add config_read_lock() shared lock for external readers (e.g. watchdog)
- Extract _write_config_to_disk() to avoid re-entrant lock deadlock
- Wrap save_config() write+seal in exclusive lock — zero race window
- Update verify_config_integrity(locked=False) with optional locked kwarg
- Add restore_config() safe helper: lock → backup → save → reseal
- Tests: 17 cases covering lock lifecycle, integrity, and restore

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

* fix(config): ruff lint fixes for config write lock

* fix(config): replace deprecated datetime.utcnow() with timezone-aware now()

* fix(config): pre-declare fcntl/msvcrt types to satisfy type checker

* fix(config): use ty-compatible type-ignore on conditional platform imports

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
Meraniya pushed a commit to Meraniya/hermes-agent that referenced this pull request Aug 6, 2026
…writes (NousResearch#82)

save_config()/restore_config() already keep the local .sha256 sidecar in
sync (PR NousResearch#57), but the *external* git-backed baseline used by
`hermes config verify` (PR NousResearch#67) was only ever updated by an explicit
`hermes config seal`. Any authorized write through save_config() — model
scanner, /model command, platform setup flows via
write_platform_config_field() — desynced that baseline, so the Config
Integrity Watchdog cron job flagged the legitimate change as tampering:
"Hermes Config Integrity Failure! The configuration hash does not match
the sealed baseline." This is the same scanner/watchdog TOCTOU conflict
documented in docs/plans/2026-07-02-scanner-watchdog-conflict-resolution.md,
just recurring one layer over in the newer git-backed mechanism.

_write_config_to_disk() now also calls the config-integrity-watchdog
skill's seal() (quietly) whenever $HERMES_DOTFILES_DIR is configured,
keeping the git-backed log current on every authorized write. Extracted
_find_core_module() (returns None instead of exiting) so this can
opportunistically no-op on machines without the watchdog set up.
restore_quick_snapshot() in backup.py gets the same treatment for
config.yaml restores from a quick snapshot.

Co-authored-by: Test <test@test.com>
nekwo added a commit to nekwo/hermes-agent that referenced this pull request Aug 17, 2026
…ecome one spine

Nine investigation plans, two scout inventories, and a week of landed work
now have a single sequencing authority: Plan EG, seven phases from "stop
active damage" to the readability sweeps, every stage graded against the
eight properties distilled from this week's failures.

What it decides, rather than restates:
- Stage zero is HC-H1 alone — the live-store test leak is the only defect
  still actively writing the operator's runtime, so it outranks everything.
- The centerpiece is the operator's stat-fingerprint persisted core (EG-3.1,
  NEW): BW-H1's event-offset key stays refused for cause; the fingerprint
  extends serve.py:401, serves labeled-stale on mismatch, writes back after
  every build, and carries a shadow-validation window so a missed input is
  a receipt, not a silent authoritative lie.
- The convergences are carried, not reopened: one build with three logged
  waits (settled), one prewarm fix adopted once (HY-H2 = HC-H3 -> EG-3.2),
  and the fourth-build divergence resolved by ordering attribution (EG-2.1)
  before the fix (EG-3.3).
- Dead code splits into Class A (reaped before the stages: the
  --expect-revision lowerings, the usage-lane fall-through, the test-only
  fold copies) and Class B (reaped after their proving stage per NousResearch#42: the
  argv write arms, the NDJSON stream child behind the NousResearch#57 sink fix and the
  Hazard-A poll fix, the disk-cache boot paint) — with a keep-list so
  actor-restore, the mass-archive tripwire, and the rpc kill switch stop
  being deletion candidates.
- Two more NEW stages close named holes the sources left unowned: EG-4.0
  owns the laneAbsent window that blocks TC-3's exit, and EG-6.6 hoists the
  three-copy class-key fence into the store — readability with a named
  defect class, per the operator's bar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
nekwo added a commit to nekwo/hermes-agent that referenced this pull request Aug 17, 2026
… sink (NousResearch#57)

The office push lane could DROP a promoted batch with neither a patch nor a
resync. `patch_coverage` owns which entities may promote; the sink's scope test
was a private restatement of the id scheme that knew only `office_actor` and a
slash-prefixed id. WV-H3 (2026-08-16) widened the first vocabulary and not the
second, and `office_surface`'s id is the BARE workspace id — so a folder-only
frame failed BOTH conjuncts and took the bare `return`, violating this module's
own rule that a resync is recoverable and a dropped change is not. Reachable on
every folder rename with no actor write in the same ~450ms coalescing window;
masked because a mixed batch is forwarded whole, and because the argv `harness
stream` child still folds the same batch for the launcher.

So the scope parser moves to the module that owns the id scheme it reads
backwards:

- `state_patches.office_patch_scope(patch) -> workspace_id | None`, beside the id
  builders. `office_actor` splits on the FIRST `/` exactly as
  `office_actor_patch_id` joins on it (which is also what keeps `ws_pilot_2` out
  of `ws_pilot`'s scope); `office_surface` IS the bare workspace id; everything
  else, and any id that cannot be placed, is None. None is not "every
  workspace" — a persona row is forwarded INSIDE an in-scope frame and never puts
  one in scope;
- the sink's in-scope test and `_delta_touches_workspace`'s `state.patched` arm
  both call it. The resync twin carried the identical fork and was saved only by
  the `office.*` arm catching the paired domain event next door; saved by a
  neighbour is not an invariant, and the twin that had no neighbour lost the
  change outright. `prefix` is gone from both, so there is no second spelling
  left to drift. Forward-whole (V6) semantics unchanged.

After this a batch the coverage authority promotes is by construction FORWARDED
or RESYNCED, never dropped. No wire change, no event registered, no contract
hash or SNAPSHOT_CONTRACT_VERSION moved, no fixture regenerated — the launcher
fold already handles `office_surface` (WV-L3) and the cross-repo golden exists.
`OFFICE_FOLD_ENTITIES` is deliberately NOT widened: it is the server-side
fail-open default for a client that declared nothing, and widening it would
declare on behalf of every un-updated launcher in the field.

Tests (+5). Witness 1 — delivery (test_serve_rpc_office_subscribe.py 69 → 73):
- a folder-only frame is FORWARDED: its single row is mirrored off the committed
  `patch_office_surface.json`, and the expected `changed.folders` is read out of
  that golden rather than restated here;
- another workspace's folder change sends nothing — the second driven value, so
  neither drop-all nor forward-all passes the pair;
- the demoted-delta twin gains both halves as params: this workspace's bare-id
  folder row resyncs, another workspace's does not.

Witness 2 — authority → scope, in a DIFFERENT file, beside the existing
partition gate (test_stream_patch.py 19 → 20): every office entity enumerated
from `patch_coverage`'s OWN namespace must be placed into a workspace by
`office_patch_scope` under at least one id shape. That is the half that catches
the next WV-H3 — covering a new office entity without teaching the scope function
reds here even though no sink test for that entity exists yet — and the id shape
is left open on purpose, since the two live entities already use different ones.

Killing mutations run and reverted:
- `office_actor`-only sink predicate restored -> the folder-only test reds with
  "ValueError: not enough values to unpack (expected 1, got 0)": the mutant emits
  NOTHING, so every probe is on the content of a message it never constructs.
  Witness 2 stays GREEN, which is the point of having two;
- second-order: that mutant emitting a RESYNC instead of dropping -> reds too,
  "assert 'runtime.office.resync' == 'runtime.office.patch'" (a resync carries a
  different method and no `patches`), plus three addressed-not-broadcast tests;
- every `office_surface` row scoped in (forward-all) -> "another workspace's
  folder change" reds on the extra `runtime.office.patch`;
- the `office_surface` arm dropped from `office_patch_scope` (RD-H1's own
  predicate mutant) -> reds all three: sink delivery, the resync twin
  ("IndexError: list index out of range"), and witness 2 with "'office_surface'
  can be promoted by patch_coverage but office_patch_scope places no id shape of
  it into a workspace";
- the twin arm alone reverted to `office_actor`-only -> only the twin param reds,
  while every sink test stays green.

325 tests green across the subscribe, live-hub, stream-patch, office state-patch,
fold-negotiation, socket-lane and office RPC suites; 92 more across the
contract-version, event-registration and dead-symbol gates confirm nothing moved.

PENDING, and not this commit's to run: RD-H1's LIVE acceptance step — one real
folder gesture arriving on the push lane on the operator's runtime — is the
orchestrator's, and gates Plan C's TC-4 stream-child deletion together with R0-a.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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