-
Notifications
You must be signed in to change notification settings - Fork 2
Comparing changes
Open a pull request
base repository: memcode-ai/memcode
base: main
head repository: memcode-ai/memcode
compare: audit-fixes
- 7 commits
- 29 files changed
- 1 contributor
Commits on Sep 13, 2026
-
deps: clear the two dependency advisories
grpc v1.82.0 (GO-2026-6061) and x/text v0.38.0 (GO-2026-5970), both indirect, both with fixes available. These ship regardless of which Go toolchain builds the release, unlike the stdlib advisories govulncheck also reports, which the CI toolchain already covers.
Configuration menu - View commit details
-
Copy full SHA for f797ad2 - Browse repository at this point
Copy the full SHA f797ad2View commit details -
vxui: the permission mode actually persists now
config.Mode has always documented itself as "persisted when the user cycles it", and cmd/interactive.go has always READ it at startup. Nothing ever wrote it back, so Shift+Tab and /mode silently reset on every restart — a setting that quietly forgets, which is the hardest kind of bug to notice. Both entry points now route through one setMode that changes the session and saves the config together, with a guard test that fails if a third call site skips the save.
Configuration menu - View commit details
-
Copy full SHA for bf39a40 - Browse repository at this point
Copy the full SHA bf39a40View commit details -
config: a pin that cannot be recorded says so
ResolvePin promised the seed was "persisted to BOTH stores before returning, so this is the only run that ever consults default_model". Both writes discarded their errors, and the user-store writer dropped four without returning anything. Best-effort persistence is right and stays: failing to remember a preference must never fail the operation. But silence was wrong. If neither store is writable, every run re-seeds from default_model, and because that value legitimately changes as models are added and retired, a user's model can drift between releases while everything here believes the pin is stable. ResolvePinSeeded reports that case so the caller can say it once; ResolvePin keeps the old signature for callers that cannot act on it.
Configuration menu - View commit details
-
Copy full SHA for cb32b93 - Browse repository at this point
Copy the full SHA cb32b93View commit details -
test: cover the webhook token verifier and the explore helpers
webjwt is the single verifier for platform-signed inbound webhook tokens (Bot Framework, Google Chat) and had no tests at all. "Fails closed" is a claim worth proving on an authentication boundary, so this exercises each way a token can be wrong: expired, unexpiring, wrong issuer, wrong audience, unknown signing key, unknown kid, alg-none, HMAC against an RSA key set, unconfigured verifier, and an unreachable JWKS. It also pins the stated flood defense — 25 forged kids must not become 25 outbound fetches — and the Bot Framework metadata path. 87% coverage on a package that had none. explore covers the concurrency-cap resolution (0 means default, not zero readers) and the finding indenter.
Configuration menu - View commit details
-
Copy full SHA for 85c17db - Browse repository at this point
Copy the full SHA 85c17dbView commit details -
setsim: one Jaccard instead of three
The same function was written three times, in two map shapes, across prefs clustering, mood's repetition detector, and lesson dedup — and had already begun to diverge: the lessons copy had dropped a guard the other two kept. (Unreachable, as it happens, but divergence is the point.) A metric that decides whether two things are "the same" should have one definition and one set of tests. Generic over the value type so callers keep whichever set spelling they already use.
Configuration menu - View commit details
-
Copy full SHA for b2b0d41 - Browse repository at this point
Copy the full SHA b2b0d41View commit details -
clean: remove ten unreachable functions
Reachability analysis across the module, tests included, found ten functions nothing can call. All are in internal/ packages, so there are no external consumers to consider. The interesting group was three package-level wrappers in autonomy whose comment said "used by cmd" — cmd never used them. The methods they wrapped are live and stay. deadcode now reports nothing.
Configuration menu - View commit details
-
Copy full SHA for 4519d61 - Browse repository at this point
Copy the full SHA 4519d61View commit details -
docs: describe the system that exists
v0.29.0 removed automatic model routing. The code recorded that carefully, with a tombstone comment at every site explaining what went and why. The documents around the code were never given the same treatment, so they kept advertising the deleted system in the present tense. README - "Out of the box it uses cheap models for routine work and strong models when the task is hard or risky" described the deleted ladder. It was also the only false claim a prospective user reads before installing anything. Replaced with what is true and arguably the better pitch: one model, chosen by you, that does not change underneath you, with delegated work able to ride its own pin. - /plan no longer "gets a second model's review before you approve it" on its own; that review is a one-shot the user triggers from the approval card. ROUTING.md — rewritten. Every symbol it documented as current (decideLane, ResolveModel, SteerResolvedModel) has zero references in non-test code, and it carried its own warning that finding those names means something is stale. It now describes the pin chain, the two narrow exceptions (utility plumbing and infrastructure failure), why capability gaps refuse rather than substitute, and which error classes may walk a fallback chain. COMPACTION.md — the budget is window-relative (85% of learned capacity), not the ~45K constant this claimed. Worth correcting beyond accuracy: an absolute default is precisely what the current design rejects, so the stale number misrepresented a deliberate position as a tunable. The summarizer is the catalog's utility_model, not a forced Anthropic call. Two file headers contradicted correct comments lower in the same file: llm/lanes.go said Automatic selection prefers keyed vendors, and llm/resolve.go described steering as live policy while resolveHosted below it explained the deletion.
Configuration menu - View commit details
-
Copy full SHA for 9891bee - Browse repository at this point
Copy the full SHA 9891beeView commit details
This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
You can try running this command locally to see the comparison on your machine:
git diff main...audit-fixes