Skip to content

chore(web): refresh audited development dependencies - #192

Merged
waterbro-8 merged 1 commit into
mainfrom
codex/fix-web-audit
Sep 10, 2026
Merged

waterbro-8 merged 1 commit into
mainfrom
codex/fix-web-audit

Conversation

@PeterGuy326

Copy link
Copy Markdown
Collaborator

Requirement / goal

Refs #139 (CI baseline only; this PR does not expand the checkpoint bug scope). Restore the current mem Web audit gate by refreshing the lockfile entries with published fixes.

Scope

  • Refresh only web/package-lock.json.
  • Resolve the current main Web audit findings for js-yaml, Vitest/@vitest/mocker, and postcss-selector-parser.
  • No application code, server behavior, transcript format, or checkpoint implementation changes.

Validation ledger

  • PASS — npm ci
  • PASS — npm run audit (production and high-severity development gates)
  • PASS — npm run lint
  • PASS — npm run typecheck
  • PASS — npm run build
  • PASS — git diff --check

Known limitations

PeterGuy326 added a commit that referenced this pull request Sep 10, 2026
Copy the reviewed baseline lockfile from 11e02e2 without changing application code or dependency ranges. Refs #192.
PeterGuy326 added a commit that referenced this pull request Sep 10, 2026
Copy the reviewed baseline lockfile from 11e02e2 without changing application code or dependency ranges. Refs #192.
PeterGuy326 added a commit that referenced this pull request Sep 10, 2026
Copy the reviewed baseline lockfile from 11e02e2 without changing application code or dependency ranges. Refs #192.
@Bindy-lbb

Copy link
Copy Markdown
Collaborator

Review summary (verified independently)

  • Head SHA and base verified: base is current main tip, no rebase needed. CI confirmed 20/20 green independently.
  • Diff is isolated to web/package-lock.json (dependency refresh only) — sound as a standalone change, no conflicts with anything else in the stack.

Note for the stack: #189/#190/#191 currently base off this PR's branch (codex/fix-web-audit) rather than main, and that base pointer is not yet a real git-ancestor relationship (each of those branches independently duplicated this PR's lockfile change rather than descending from it). Once this PR lands, please explicitly retarget #189/#190/#191's base to main and re-verify with git merge-base --is-ancestor before merging any of them — this matches the squash-trap pattern from a prior incident where a stacked PR merged into an already-orphaned branch and never actually reached main.

@PeterGuy326

Copy link
Copy Markdown
Collaborator Author

Review follow-up — current head and dependency hold

@Bindy-lbb Thanks for the technical re-review. At 11e02e21ef2c3dbd2dae26e4376872e54e78ecb5, I rechecked all 20 checks as SUCCESS and reran, in a clean detached worktree (web/, macOS arm64, Node 26.7.0 / npm 11.19.0):

npm ci
npm run audit
npm run lint
npm run typecheck
npm run build
git diff --check

All exited 0; audit reports zero production and development vulnerabilities; tracked worktree is clean. This is author-side verification, not a human approval.

#189/#190/#191 are now Draft and their bodies explicitly document the invalid ancestry: their lockfile bytes equal this PR's, but this head is not their git ancestor. They must not merge into this feature branch. The sequence is: real non-author approval and merge this PR to main first; then retarget each dependent PR to main, integrate the actual new main without rewriting published history, verify ancestry, and require fresh CI/review on the resulting heads.

Please submit a formal GitHub review against this exact #192 head: approve only if your review finds no blocker, otherwise request changes. Your latest technical comment is useful evidence but no APPROVED review is currently recorded. No self-approval, bypass, or merge has been performed.

@waterbro-8 waterbro-8 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review: approved — this is the fix for the Web audit break, and it is the whole fix

Basis for this vote. I am a requested reviewer on this PR, I am not its author, and I am not the pusher of its head: pulls/192/commits reports author.user.login = PeterGuy326 and committer.user.login = PeterGuy326 on 11e02e21ef2c3dbd2dae26e4376872e54e78ecb5 (committed 2026-09-10T02:23:15Z). So this approval is independent of the author and is not invalidated by the last-push-approval rule. It is an independent human code-owner review, per #166's process.

Scope — verified, not read from the diff summary

Single file, web/package-lock.json, +50/−50. web/package.json is untouched. Parsed both committed trees entry by entry (434 package keys before, 434 after — nothing added or removed), and exactly 10 entries moved, every one of them dev: true:

  • vitest and the seven @vitest/{expect,mocker,pretty-format,runner,snapshot,spy,utils} packages: 4.1.10 → 4.1.11
  • js-yaml: 4.3.1 → 4.3.2
  • postcss-selector-parser: 6.1.2 → 6.1.4

All three are patch-level. lockfileVersion is still 3, the root name/version are still mem-web / 0.1.1, and the legacy dependencies tree section is byte-for-byte unchanged. No production dependency moves: the --omit=dev leg already reported found 0 vulnerabilities before this PR, and still does.

Why this is needed now

Two advisories were published on 2026-09-08, after the last CI round of every PR that currently reads green:

  • GHSA-82fw-gwwq-j7x9 (@vitest/mocker / vitest, moderate) — published_at 2026-09-08T20:46:45Z, first patched in 4.1.11
  • GHSA-2883-xcg3-v3hh (js-yaml, high) — published_at 2026-09-08T21:24:51Z, first patched in 4.3.2

Together with the older GHSA-w9m9-85wc-3x92 (postcss-selector-parser, low, 6.1.3), they make the second half of npm run auditnpm audit --audit-level=high — exit non-zero. This is a main-side breakage that every branch inherits, not a defect introduced by whichever PR happens to be red.

The pair of job logs on today's runners makes it unambiguous, because both jobs invoke the identical command on the identical step:

  • #193's Web (job 102753348999, run 34440163922, 2026-09-10T05:13:05Z) — found 0 vulnerabilities on the --omit=dev leg, then 4 vulnerabilities (1 low, 2 moderate, 1 high) on the full leg, naming those three GHSA ids, each followed by npm's own fix available via \npm audit fix`, and ##[error]Process completed with exit code 1.`
  • this PR's Web (job 102721020860, run 34429247843, 2026-09-10T02:23:36Z) — found 0 vulnerabilities twice, step success.

So the fix is proven differentially on GitHub-hosted runners against the live advisory DB, at a time after both advisories were published.

Why I believe it is exactly complete, and not merely sufficient

I reproduced the remediation locally from main rather than trusting that the PR matches npm audit fix:

npm audit fix --package-lock-only --registry=https://registry.npmjs.org

The resulting web/package-lock.json is byte-identical to the one committed here. Two independent fingerprints agree:

  • file sha256 a804edf8ae7c27353ff53e8ca619817a988b5802d39950c136ea250a9be07190 for both
  • git blob 28a95f0b2f19ddccfe0e4ad2e2a3b247fd82c2f2, which equals GET /repos/bytefolk/mem/contents/web/package-lock.json?ref=11e02e21ef2c….sha. main's is 103ae42a203bd4a7317d1ad8a5ceadb9d8db1882.

Re-auditing the fixed tree returns found 0 vulnerabilities / rc 0. Because npm audit fix is a deterministic resolver over this advisory set, "identical to its output" is the claim that nothing needed is missing and nothing extra was dragged in.

Current status read live

mergeable = true, base is main tip 2986fe38175f54d99f15dd38a498708c6ecd88cd (so not behind, no conflict), and all 20 checks on this head are completed / success at attempt 1 (taking the max check_suite.id per name, so no stale-round aggregation).

What I am not claiming

  • I did not re-run the whole Web test suite locally; I read its CI job logs. The audit step is the part I reproduced myself.
  • This PR does not touch the still-open Dependabot alerts for grpc (#74/#78/#79) or pypdf (#71/#72/#73), and does not change mem-web's version — that belongs to #193.
  • Merging this will not by itself turn the other red branches green: each branch that lacks this lock needs its base refreshed. Expect Web to stay red on those until then.
  • The remaining postcss-selector-parser note in #160 overlaps with one of the ten entries here; whichever lands first, the other becomes a no-op for that package and should be re-checked rather than merged mechanically.

Suggested merge method: squash, per this repository's configuration (allow_merge_commit=false, allow_rebase_merge=false).

@waterbro-8
waterbro-8 merged commit 87db0df into main Sep 10, 2026
20 checks passed
@waterbro-8
waterbro-8 deleted the codex/fix-web-audit branch September 10, 2026 07:26
waterbro-8 added a commit that referenced this pull request Sep 17, 2026
## Canonical requirement

Refs bytefolk/.github#32

- Canonical Issue URL: bytefolk/.github#32
- Consumed revision: R1
- No automatic close keywords: acknowledged

Decision reference: the initial R1 Issue body. It explicitly records
that local candidates preceded this prospective publication record; no
retrospective approval is claimed.

## Requirement trace

| REQ/AC IDs | Changed files / domain | Tests or review evidence |
|---|---|---|
| REQ-001 / AC-001 | 4 exact-pinned version annotations | Exact
expected-byte replacement PASS |
| REQ-002 / AC-002 | 2 files in bytefolk/mem | Repository inventory
PASS; aggregate 7 repositories, 13 files, 21 lines |
| REQ-003 / AC-003 | Existing workflow content and modes | Parsed YAML
and comment-stripped bytes identical |
| REQ-004 / AC-004 | Current-head CI and independent review | Local
independent replay recorded in the canonical R1 Issue linked above;
hosted CI collected on head `f464f686` (19 of 20 checks succeed, see
Validation); independent human review requested and still pending |

## File domains

`.github/workflows/bytefolk-scorecard.yml` (47);
`.github/workflows/bytefolk-security.yml` (58, 65, 68).

Prepared parent / merge base: `2986fe38175f54d99f15dd38a498708c6ecd88cd`
PR base at publication: `87db0dfe0507be2190fe2fdcce0e267be8224f4d`.
Since that baseline `main` advanced by six commits through `3c13f04e`
(#162, #160, #165, #188, #158, #204) — not only `web/package-lock.json`
as previously stated here. None of them touched `.github/workflows/`, so
the F9 workflow blobs and the PR diff are unchanged. The reviewed commit
and original parent are preserved.
Head: `f464f68636adc6bb5295c3818aa6654c46a3caad` — `d2a9ec5` plus one
non-forced `Merge branch 'main'` commit (`f464f686`) that brought the
branch up to `3c13f04e` so it is no longer `BEHIND`. Verified: `git
rev-parse d2a9ec5:.github/workflows/bytefolk-scorecard.yml` and
`...:bytefolk-security.yml` return the same blobs (`2058126c`,
`48a507e0`) as at `f464f686`, and `git diff main...f464f68` is still
exactly these 2 files, `+4/-4`. The comment-only payload is therefore
byte-identical to the reviewed commit and the equality proof above holds
on the current head.

## Scope and non-goals

Correct only `# v4.37.4` to `# v4.37.9` on CodeQL uses-lines pinned to
`cdf488f595d80d6e07e03d4674febd5ab45fa938`. The [official tag
object](https://api.github.com/repos/github/codeql-action/git/tags/a35ac6e6798d72df5475948b28efb89edc2e19ca)
resolves to that existing pin. Action SHAs, permissions, triggers,
steps, matrices, other pins, and runtime code are unchanged.

## Validation

- Exact commands: `ruby evidence/verify.rb --baseline` and `ruby
evidence/verify.rb --committed` from the retained review packet; `git
diff --check 2986fe3
d2a9ec5` from this repository.
- Observed counts/results: PASS 2/2 files and 4/4 replacements here;
aggregate PASS 13/13 files and 21/21 replacements. Baseline
intentionally exits 1 after detecting all 21 stale annotations;
committed verification exits 0.
- Check URLs: collected on head `f464f686` — 19 of 20 checks succeed.
The single failure is [`HTTP, CLI and MCP
lifecycle`](https://github.com/bytefolk/mem/actions/runs/34807101354/job/103861020551),
whose log is `pull access denied for minio/minio` at ~13s: a
container-image pull failure in an unrelated job. The same workflow was
green on `main` at `3c13f04e`, and the identical failure is present on
#198 and #199, so it is not caused by this comment-only change.
Root-cause tracking is separate and open.

The strict verifier checks the changed-file allowlist; exact old blobs
and line inventory; complete expected-byte replacement; absence of stale
target annotations; parsed YAML equality; comment-stripped byte equality
and SHA-256 digests; whitespace and unchanged modes; one commit with the
exact parent; and clean worktrees with no untracked files. All passed.
The independent replay is recorded in canonical R1. The verifier and
inventory are retained outside repository commits.

| ID | REQ/AC | Observable acceptance criterion | Command or manual
steps | Environment | Expected | Observed | Status |
|---|---|---|---|---|---|---|---|
| V1 | AC-001, AC-002, AC-003 | Exact annotations with executable YAML
unchanged | `ruby evidence/verify.rb --committed` | Ruby 2.6.10, Psych
3.1.0, isolated review packet | Exact scoped replacements and equality |
2/2 files; 4/4 lines; all invariants pass | PASS |
| V2 | AC-004 | Hosted checks on this exact head | Inspect this PR's
checks at `f464f686` | GitHub Actions | Applicable checks succeed | 19
of 20 succeed; `HTTP, CLI and MCP lifecycle` fails on `pull access
denied for minio/minio` (infra, unrelated job, also failing on
#198/#199, green on `main`) | PARTIAL |

## Security and compatibility

Documentation annotation only. No dependencies, permissions,
credentials, data flows, or runtime behavior change. The diff and commit
identity were inspected for public-safe content. No CHANGELOG entry or
behavior-documentation update is needed because only explanatory
comments change.

## Known limitations

Runtime suites, build, coverage, and dependency audits were not rerun
for this comment-only change; no runtime test result is claimed. Hosted
CI is separate from local equality proof. Two limits now apply: (1) the
strict verifier's `one commit with the exact parent` invariant describes
the reviewed payload commit `d2a9ec5`, not the current branch shape,
which carries two additional `Merge branch 'main'` commits; (2) this PR
is **not merge-ready yet** — repository `AGENTS.md` step 6 requires
passing CI *and* an approval from someone other than the author, and
`HTTP, CLI and MCP lifecycle` is red on the unrelated `minio` pull, so
the green-CI half is unmet until that infrastructure failure is fixed.

## Risk and rollback

Low-risk annotation correction. Roll back through an ordinary revert of
this single commit. There is no migration or release action.

## Product review handoff

- Implementation/publication owner: @PeterGuy326
- Automated pre-review result: independent local replay recorded in R1;
no human approval implied.
- Human final review: PENDING; no human review requested by this
publication.
- Merge ledger owner: @PeterGuy326
- Product reviewer: @PeterGuy326
- Milestone or release packet: N/A: bounded documentation annotation
maintenance
- Merge, CI, release, and model judgment do not accept or close the
Issue: acknowledged


## Maintenance update (2026-09-14, @waterbro-8)

Records written by the maintainer account, not by the implementation
owner:

- `f464f686 Merge branch 'main'` was pushed to this head branch
(non-forced, `main` at `3c13f04e` is an ancestor of the head) to clear
the `BEHIND` state this PR's own body said blocked merging. No workflow
file content changed: both blobs are identical to `d2a9ec5`.
- The stale facts above were corrected in place: the recorded head SHA,
the "Main advanced only `web/package-lock.json` in PR #192" claim, the
`NOT VERIFIED` hosted-CI rows, and the "this is a draft, not
merge-ready" note.
- This PR was marked ready for review and an independent review was
requested. The maintainer account that pushed the merge commit did
**not** approve it: `AGENTS.md` step 6 requires an approval from someone
other than the author, and a commit author on the head cannot supply
that approval for their own push. `@PeterGuy326` remains implementation
and merge-ledger owner.

Co-authored-by: 勒布朗-詹姆斯 <2986253039@qq.com>
waterbro-8 added a commit that referenced this pull request Sep 17, 2026
…cessor to #170) (#199)

## Tracking record and provenance

Refs #122 — bounded release-validation readiness, not publication or
completion
of the release issue. Canonical draft successor to #170. Original author
`sun-970` and maintainer commits are preserved in ancestry. #170 remains
open
with its original discussion and reviews; no original review is
transferred
as an approval of this candidate.

- Original/final source head:
`fa2c30cc693bc0ae1e679e7d108d59aef1bd4007`.
- Successor head: `260710d69a66f919520e5a4dccc3749335eb95fc`.
- Integration commit `896aedb0069f688db3c46702147cf9ea7e015ba9` has
normal
merge parents, in order: source
`fa2c30cc693bc0ae1e679e7d108d59aef1bd4007`
  and actual canonical main `2986fe38175f54d99f15dd38a498708c6ecd88cd`.
- Final successor tree: `5f1313f778ae2dc964c20d350b8829a365852100`.
- The integration merge was conflict-free. Its only tree additions over
source were main's
  unchanged `.github/workflows/bytefolk-security.yml` and
`.github/workflows/bytefolk-scorecard.yml`; source files remained exact
at
that integration commit. The subsequent `260710d` adds only the
separately
  authorized output-path safety fix and regressions described below.
- The lockfile retains #192 source
`11e02e21ef2c3dbd2dae26e4376872e54e78ecb5`
with its `cherry-pick -x` traceability. No original commit was
rewritten.

## Summary and acceptance criteria

CHANGELOG comparison links must use the exact preceding version and
release
endpoint. Missing predecessors fail closed; exact release-tag links
remain
valid. GNU/Linux checksum enumeration must process each basename
separately,
accept the correct six assets in a directory with spaces, reject an
empty set
with an explicit diagnostic, and emit no manifest for invalid input.

An independent preflight then reproduced a separate unchanged-baseline
gap:
an existing `mem-mcp-checksums.txt` symlink to a directory made `mv`
publish
the temporary manifest outside the asset directory. A later checksum
failure
did not undo that write. This was NOT introduced by the basename fix and
was
NOT fixed at original head `fa2c30cc`. This successor now rejects all
existing
manifest paths (including dangling symlinks) before hashing and
immediately
before publication, preserving existing paths and external data. Staging
still
uses randomized `mktemp`, not a predictable filename.

The canonical successor resolves the separate CI execution-path gate:
main
requires three CodeQL language contexts, but the existing workflow skips
fork
PRs. This same-repository candidate uses the existing allowed path
without
editing security permissions, fork restrictions, required checks or
tests.

Changed files against main: `CHANGELOG.md`,
`scripts/generate_release_checksums.sh`,
`scripts/test_release_guards.sh`,
`scripts/validate_release_version.sh`,
`scripts/test_release_checksum_output_safety.sh`,
`web/package-lock.json`. No security
workflow differs from main.

## Reproduction and attribution

On real GNU/Linux, base `7a194f1e` passes the release guards, while
pre-follow-up
`1624cf74` fails with GNU basename's `extra operand` error because `find
-exec
basename {} +` batches paths. The fix invokes basename once per path
with
`\;`. The new comparison regression fails against the base wildcard
validator
with `wrong compare base v0.0.0: command unexpectedly succeeded`.

The earlier macOS `find -printf` failure was not caused by the original
comparison-link patch: its checksum script was byte-identical to base.
[Public correction and
evidence](#170 (comment)).
Do not confuse the Bash compatibility suite's find stub with actual GNU
semantics; the full guard suite uses real GNU find/basename/sha256sum.

Output-safety negative controls: the new focused regression fails on
both
canonical main `2986fe38` and pre-safety integration head `896aedb0`
with
`symlink-directory: output publication changed existing data or created
an unexpected file`.
The fixed tree passes seven cases with path spaces:
symlink-to-directory,
symlink-to-file, dangling symlink, existing directory, existing regular
file,
an output symlink introduced during hashing, and a pre-existing
template-shaped
temporary symlink. File-content snapshots verify external data and
existing
outputs are preserved; the late-symlink case also verifies private
staging
cleanup. This is bounded path-safety validation, not a claim of atomic
defense
against a hostile process concurrently replacing paths after the final
check;
release staging must remain controlled by the release job.

## Validation ledger

Environment: isolated Linux aarch64, Linux 6.8, GNU find 4.9.0/coreutils
9.4,
Bash 5.2.21, Node 24.13.0/npm 11.6.2. The Node download is
checksum-verified.
Fresh exact Git bundle clone, two CPUs, GOMAXPROCS=2 and GOFLAGS=-p=1.

| Command/check | Expected | Actual |
| --- | --- | --- |
| `git merge-base --is-ancestor fa2c30c
HEAD` | Source ancestry retained | PASS |
| Diff source..integration commit excluding the two unchanged main
workflow additions | Source files exact before new safety fix | PASS,
empty diff |
| `git diff --stat 896aedb HEAD` | New
baseline safety fix only | PASS, four scoped files: generator, focused
tests, full-suite hook, changelog |
| Diff main..HEAD for all security/release/publish/policy/acceptance
workflows | No workflow changes | PASS, empty diff |
| Root: `bash scripts/test_release_guards.sh` | Comparison and
six-asset/empty-set guards fail closed | PASS, new comparison-link and
full guard PASS |
| `bash scripts/test_release_checksum_output_safety.sh` | Existing
output paths fail without external writes; random staging remains safe |
PASS, seven focused cases on final tree |
| `bash scripts/test_release_helpers_compat.sh` | Collection
compatibility | PASS |
| `bash scripts/test_validate_release_action_pins_compat.sh` | Official
action pin compatibility | PASS |
| `bash scripts/validate_release_version.sh 0.1.1` | Version surfaces
agree | PASS |
| `shellcheck scripts/generate_release_checksums.sh
scripts/test_release_checksum_output_safety.sh
scripts/test_release_guards.sh scripts/validate_release_version.sh` | No
shell diagnostics | PASS, ShellCheck 0.11.0 on macOS |
| From `web/`: `npm ci --registry=https://registry.npmjs.org
--fetch-timeout=45000` | Locked install | PASS, 401 installed packages |
| `npm run audit --registry=https://registry.npmjs.org` | Both unchanged
thresholds pass | PASS, zero vulnerabilities |
| `npm test` | Application regressions pass | PASS, 67 tests / 6 files |
| `npm run lint` / `npm run typecheck` / `npm run build` | Static
validation and build pass | PASS, existing large-chunk warning only |
| `git diff --check 2986fe3 HEAD` |
Clean diff | PASS |
| Canonical successor CI and CodeQL | All required named contexts
execute and pass | PENDING at draft creation; no all-green claim |

## Tests, coverage and known limits

The source-head
[CI](https://github.com/bytefolk/mem/actions/runs/34437665487)
and
[acceptance](https://github.com/bytefolk/mem/actions/runs/34437665500)
passed; CodeQL was skipped there and did not satisfy its required
contexts.
Those runs are source evidence, not the canonical successor's CI or
review.
Coverage percentage was not remeasured. The new output-path safety
regression
runs through the existing release-guard CI command; no job or check is
removed.

Full stock-macOS release-guard portability is not claimed: existing BSD
`wc -l` padding affects a row-count assertion. The full suite is
validated
with real GNU tools. The existing large-chunk build warning remains.
Windows,
browser, Go/process and database acceptance use unchanged CI. No
temporary
macOS Go executable is run; fixtures are disposable and create no real
release.

## Risk, rollback and review

Build/release-validation/dependency maintenance, no API/CLI/MCP
authorization,
storage or migration contract change. `[Unreleased]` documents the
behavior.
No custom repository secret is referenced by PR workflows; CodeQL uses
its
existing security-events upload permission. Release/npm publication and
Scorecard are not triggered by these candidate branches. No tag,
release,
original-PR closure, main merge, protection change or formal approval
occurs.
Rollback is to leave this draft unmerged; no deployed behavior changes.

Draft pending exact-head required CI and independent review. The Owner
relayed
an independent preflight PASS for the original comparison/enumeration
delta;
that preflight found the baseline output-symlink gap and does not cover
this
new safety commit. Fresh review of `260710d` remains required. Original
human-authored commits are retained; automated
assistance helped with maintainer remediation and validation evidence.

---------

Co-authored-by: liyuanyang <liyuanyang@users.noreply.github.com>
Co-authored-by: waterbro-8 <318569545+waterbro-8@users.noreply.github.com>
Co-authored-by: 勒布朗-詹姆斯 <2986253039@qq.com>
PeterGuy326 added a commit that referenced this pull request Sep 17, 2026
#198)

## Tracking record and provenance

Refs #122 — bounded CI/release-readiness follow-up, not completion or
publication
of that release. Canonical draft successor to #169, with the original
author's
`sun-970` commits and maintainer follow-ups retained unchanged in
ancestry.
The original PR stays open; its reviews and discussion remain
authoritative
history, not an approval of this successor.

- Original/final source head:
`5c3a4a75ab96bed4c046c0822ebc76a87f215cda`.
- Successor head: `5c3a4a75ab96bed4c046c0822ebc76a87f215cda`.
- Source and successor tree: `9d8a127375fd8e945113e06ae88983a1328b9fae`.
- Current canonical main: `2986fe38175f54d99f15dd38a498708c6ecd88cd`,
already
an ancestor. A normal merge reports `Already up to date`; no empty
commit,
  cherry-pick reconstruction, rebasing, or force push was used.
- The audited lockfile retains #192's provenance from
`11e02e21ef2c3dbd2dae26e4376872e54e78ecb5` (`cherry-pick -x` in
ancestry).

## Summary and acceptance criteria

The Web CI job must run its unit tests. Recognized transient npm audit
failures
may retry, but vulnerabilities, unknown errors, failed spawns, signals
and
timeouts must remain failures. Successful audit output must remain
visible,
including below-threshold findings. The Windows evidence helper must
complete
its report and preserve a nonzero audit exit status.

This successor changes no source file relative to #169's exact source
head.
It exists because the canonical security workflow skips the entire
CodeQL job
on fork PRs while main requires three language-specific CodeQL contexts.
A
same-repository candidate executes the existing supported path; no
security
workflow, permission, required check, audit threshold, or fork
restriction is
modified or waived.

Changed files against main: `.github/workflows/ci.yml`, `CHANGELOG.md`,
`scripts/test_win_audit_verify.mjs`, `scripts/win-audit-verify.bat`,
`web/audit-retry.mjs`, `web/audit-retry.test.mjs`, `web/package.json`,
`web/package-lock.json`, `web/vite.config.ts`.

## Validation ledger

Environment: isolated Linux aarch64, Linux 6.8, GNU find 4.9.0/coreutils
9.4,
Bash 5.2.21, Node 24.13.0/npm 11.6.2; checksum-verified official Node
archive.
Fresh Git clone from an exact local bundle, two CPUs, GOMAXPROCS=2 and
GOFLAGS=-p=1. Tests use disposable fixtures, not production data or
secrets.

| Command/check | Expected | Actual |
| --- | --- | --- |
| `git diff --exit-code 5c3a4a7 HEAD` |
Exact source tree | PASS, no differences |
| `git merge-base --is-ancestor 2986fe3
HEAD` | Current main included | PASS |
| From root: `bash scripts/test_release_guards.sh` | Release guards fail
closed | PASS |
| `bash scripts/test_release_helpers_compat.sh` | Collection
compatibility | PASS |
| `bash scripts/test_validate_release_action_pins_compat.sh` | Official
pinned actions and compatibility | PASS |
| `bash scripts/validate_release_version.sh 0.1.1` | Version surfaces
agree | PASS |
| From `web/`: `npm ci --registry=https://registry.npmjs.org
--fetch-timeout=45000` | Locked install | PASS, 401 installed packages |
| `npm run audit --registry=https://registry.npmjs.org` | Both unchanged
thresholds pass | PASS, zero vulnerabilities, both reports printed |
| `npm test` | Application and audit regressions pass | PASS, 104 tests
/ 7 files, including 37 audit regressions |
| `npm run lint` / `npm run typecheck` / `npm run build` | Static
validation and production build pass | PASS, existing large-chunk
warning only |
| `git -c
core.whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
diff --check 2986fe3 HEAD` | Clean
diff, intentional batch CRLF retained | PASS |
| Canonical successor CI and CodeQL | All required named contexts
execute and pass | PENDING at draft creation; no all-green claim |

## Tests, coverage and known limits

The original successful-report regression was red before the fix (1
failed /
36 passed). Existing exact-source [Web
CI](https://github.com/bytefolk/mem/actions/runs/34438230117/job/102747885693)
passed 104 tests including 37 audit regressions. Existing real
[Windows
CI](https://github.com/bytefolk/mem/actions/runs/34438230117/job/102747885554)
passed four native batch-helper regressions, including negative controls
for
both original defects. These are source-head evidence, not independent
review
or substitute results for the new canonical workflow execution.

Coverage percentage was not remeasured. A real-registry Windows audit
has not
been requalified; its helper tests use local npm.cmd fixtures. The
unchanged
five-second process fixture timeout reproduces on both pre-follow-up and
fixed
heads on the managed macOS host; Linux is the validated environment. The
existing large-chunk build warning remains. Full Linux process/database
and
browser acceptance, and native Windows execution, are delegated to
unchanged
CI; no temporary Go executable runs on macOS.

## Risk, rollback and review

Build/CI/dependency maintenance; no application API, CLI/MCP
authorization,
storage or migration contract changes. `[Unreleased]` already documents
the
behavior. The PR-triggered workflows reference no custom repository
secrets;
CodeQL retains only its existing security-events upload permission. No
release,
npm publication, Scorecard dispatch, tag, merge, or formal approval is
performed.
Rollback is to leave this draft unmerged; no deployed behavior changes.

Draft until the exact candidate has required CI plus independent review.
The
Owner reports independent review of the fix deltas is already in
progress;
this description does not represent that review as completed. Automated
assistance produced validation and the maintainer follow-up; the
original
human-authored history remains intact.

---------

Co-authored-by: liyuanyang <liyuanyang@users.noreply.github.com>
Co-authored-by: waterbro-8 <318569545+waterbro-8@users.noreply.github.com>
waterbro-8 pushed a commit that referenced this pull request Sep 17, 2026
)

## Linked draft successor — original #183 remains open

Refs #176.

## Current follow-up: `c0421168bd145077bf164f91c0d2b454a79760ef`

- Fixed the remaining exported MCP route enum: `tools/list` now includes
`lexical`. The in-process MCP regression reproduced the missing enum
before the fix and now verifies both schema and `tools/call` HTTP
forwarding. All 9 MCP tests pass on Linux; affected-package vet passes.
- Added a strict, populated PostgreSQL sequential-upgrade regression and
a DB-free embedded-migration continuity guard. Actual PostgreSQL 16.14 /
pgvector 0.8.2 advances 23 → 24, verifies lexical backfill and full
history, and accepts ordinary production startup afterward. No
`AllowMissing` option or migration renumbering.
- Cumulative source/base order is #194#197#195. #197 remains HOLD
for text-query planner acceptance; #195 remains HOLD behind it. See
`docs/MIGRATION_SEQUENCE.md` for deployment and existing-gap recovery
boundaries.
- Tests ran at `2f2e965b6794863d7f5a38a748262da4691beb35`; this final
head only corrects the documented verification command to
`scripts/verify.sh integration`. Fresh exact-head CI and independent
review remain required. The earlier evidence below is historical, not a
fresh-head approval.

Preserves @sun-970 / liyuanyang's complete authored chain through
`13ebe9efa6ba3c733199d374e8db3d107f598ca2` for #176. This draft makes
the bounded reviewed corrections accessible; it does not replace
independent review, CI, or human approval. Do not close #183 before a
replacement is verified and merged.

The original fork's Git-data write returned HTTP 404 and its repository
permissions report `push:false`. No ACL override was attempted. This
canonical branch preserves original commit identities and hashes. Added
blobs, trees, and commits were checked against local Git hashes; no
force update was used.

## Corrections

- `scripts/verify.sh`: expect migration 24, matching this branch's
lexical migration. The former expectation of 23 caused the PostgreSQL
validation failure.
- Refresh audited Web development dependencies, traceable to #192 commit
`11e02e21ef2c3dbd2dae26e4376872e54e78ecb5` via a separate `cherry-pick
-x` commit. Audit threshold unchanged.
- No additional search/ranking changes beyond original #183.

## Validation at head `3d885a8427e06fd7175011ef0188a06f32028a3f`

- PASS: migration to 24 on PostgreSQL 16.14 / pgvector 0.8.2 and
PostgreSQL 17.10 / pgvector 0.8.3.
- PASS: `TestLexicalSearchWithoutWorker`, five cases: lexical without
worker, text/auto fail closed, CJK trigram, path restriction. Go tests
cross-compiled for Linux and executed against real disposable PostgreSQL
with `GOMAXPROCS=2` and serial package builds.
- PASS: audited lockfile check; shared fix from #192 remains explicit,
not attributed to this feature.
- NOT CLAIMED: provider-backed vector retrieval or production benchmark
quality.
- REQUIRED: fresh CI on this exact head and independent review.
Original-head CI/review is not approval of this draft.

Original feature scope: model-free file-corpus lexical route, migration
0024, API/CLI/docs, managed-provider bypass. Scope excludes tokenizer,
generation lifecycle, and ranking redesign.
waterbro-8 pushed a commit that referenced this pull request Sep 17, 2026
) (#196)

## Linked draft successor — original #184 remains open

Refs #175.

Preserves @sun-970 / liyuanyang's authored chain through
`89bb12bdf2ae5edbdfa17260953ec6352ab9239f` for #175. Do not close #184
before a replacement is independently verified and merged. This draft
remains HOLD for live acceptance.

Source-fork Git-data writes returned HTTP 404, with repository
`push:false`; no ACL override was attempted. The canonical branch
preserves original commit hashes and identities. Added blobs, trees, and
commits were individually hash-verified; no force update was used.

## Bounded corrections

- Fail closed on ambiguous cross-workspace mappings, unknown result
paths, malformed responses, non-finite scores, and failed requests;
retain an error artifact and exit 2.
- Map the shipping folder `path` plus file `name`; do not silently
discard unknown hits or infer tenant identity from snippets.
- Vector mode sends `route=text`; lexical mode sends `route=lexical`
with null provider/model/dimension metadata. Do not claim `auto` is
lexical/vector hybrid.
- Reject structured-memory queries this file-search endpoint cannot
serve. Document the existing file-only `profile-text-v1` fixture as the
bounded corpus.
- Remove hostname collection and invented provider/index identity.
Configuration labels remain explicitly operator-declared, not
server-verified.
- Carry #192 audit remediation as a separate `cherry-pick -x` of
`11e02e21ef2c3dbd2dae26e4376872e54e78ecb5`; audit threshold unchanged.

## Validation at `651bec1679c50a9cd07cf77b27b5556c20e3273e`

- PASS: Python 3.11.14, `python3.11 -m unittest discover -s
benchmarks/recall/tests`: 39 tests, including the reproduced fail-closed
regressions and a loopback HTTP fixture.
- PASS: `python3.11 -m benchmarks.recall verify`: deterministic harness
and intentional leakage failure gate.
- PASS: Web audit with the explicit shared fix.
- NOT VERIFIED: real memd retrieval, actual embedding-provider quality,
real index selection, production latency, or full structured-memory
corpus acceptance. The HTTP handler is a fixture, not memd; its timing
is not live benchmark evidence.

## Exact remaining live prerequisites (no external provider authorized)

1. An isolated, authorized test deployment of real memd and its Worker,
with PostgreSQL/pgvector and ingest dependencies configured, plus a
token verified to belong to the test workspace. No existing user
deployment or provider credentials have been used.
2. Ingest all five synthetic files from
`benchmarks/recall/data/profile-text-v1/corpus.jsonl`, preserving their
full paths and contents, into that workspace. The producer is not an
ingestor. Confirm indexing completed and file/result identities match
the fixture.
3. For the bounded fixed-text experiment, use the same locally
available, explicitly selected 768-dimensional text embedding model for
corpus and query. Verify the corpus/provider metadata and which active
generation or fixed table the server actually uses. A label passed to
the producer proves none of these facts. No paid provider, external
endpoint, model download, or provider configuration was enabled by this
correction.
4. Execute all four file queries through real `/v1/search` with `--mode
vector`, retain sanitized rankings, then score with `run --rankings` and
record the exact memd head, actual model/dimension/index, environment,
and errors. An empty/error run does not satisfy live acceptance.
5. Model-free lexical is a separate optional real-server experiment
requiring #183's server capability (draft successor #194); it cannot
establish vector quality. Full v1 structured-memory acceptance remains
unsupported by this producer and must not be reported as passed.

Fresh exact-head CI and independent review/human approval remain
separate required gates. No fake or paid live run is substituted for the
missing evidence.
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.

3 participants