Skip to content

docs(goal): correct four stale status statements for merged capabilities - #181

Merged
waterbro-8 merged 5 commits into
bytefolk:mainfrom
sun-970:fix/goal-md-stale-status-179
Sep 17, 2026
Merged

waterbro-8 merged 5 commits into
bytefolk:mainfrom
sun-970:fix/goal-md-stale-status-179

Conversation

@sun-970

@sun-970 sun-970 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #179.

GOAL.md §5 and §6 contain four status statements that list capabilities as missing when they are already merged and reachable on main. This PR corrects them to match what the code actually supports.

Changes

§5 — 现状与愿景的偏差 table

  • 跨设备恢复: Separate merge_conservative (done, merge.go + 0023_workspace_import_merge.sql) from 增量同步 and 断点上传 (not done). The old wording made all three look missing when only two are.
  • 人类可视化: correction/supersede relations are merged (0022_memory_relations.sql, relation.go); only audit history remains open.
  • 数据可移植性: merge_conservative import is merged; update "当前服务只支持 fresh restore" to reflect that merge is now supported.

§6 — 近期优先级

Evidence

Each correction is backed by source-level evidence (file presence + migration content) as documented in #179. No runtime verification was performed; see issue's "Evidence level: E2 — source-level" note.

Test plan

  • Review each corrected line against the cited source files.
  • Confirm §5 rows now separate done from not-done within each capability.
  • Confirm §6 checkboxes match the merged PR list.

@PeterGuy326

Copy link
Copy Markdown
Collaborator

HOLD — this is a docs-only correction and no introduced code defect was found in the bounded pass, but there is no formal review or CI result on current head e26373fdc4723e427d2571ea9c5dda63db5118c2. Please record the source/merged-PR evidence for each corrected status line and obtain a non-author review before merge.

@PeterGuy326 PeterGuy326 changed the title docs(GOAL): correct four stale status statements for merged capabilities docs(goal): correct four stale status statements for merged capabilities Sep 10, 2026
@PeterGuy326

Copy link
Copy Markdown
Collaborator

Current-head CI approval readback (2026-09-10)

Head: e26373fdc4723e427d2571ea9c5dda63db5118c2. The original pending-approval runs on this head have been approved and real check-runs now exist (18 at this snapshot). No old-head run was approved. Auto-merge remains disabled; this is not a code approval or merge-ready declaration.

Failures at this snapshot:

The title scope GOAL violated the lowercase Conventional Commit pattern. Changed it to docs(goal) without touching code; the newly triggered PR Policy run 34435739516 was also approved and is green. The old attempt failure above is historical metadata evidence.

- §5 跨设备恢复: separate merge_conservative (done) from 增量同步 and
  断点上传 (not done), so one clause cannot make the other two look
  shipped.
- §5 人类可视化: correction/supersede relations are merged
  (0022_memory_relations.sql, relation.go); only audit history remains.
- §5 数据可移植性: merge_conservative import is merged (merge.go,
  0023_workspace_import_merge.sql); update "fresh restore only" claim.
- §6 P1: split merge_conservative (checked) from 增量包/断点上传
  (still open).
- §6 P2: check off correction/supersede, 导入历史 and 权限管理界面
  (all shipped via PRs bytefolk#90/bytefolk#95, bytefolk#102, bytefolk#100).

Fixes bytefolk#179.
@sun-970
sun-970 force-pushed the fix/goal-md-stale-status-179 branch from e26373f to 4a25bd2 Compare September 10, 2026 08:35
@waterbro-8

Copy link
Copy Markdown
Collaborator

Not a review, not an approval, carries no vote, does not ask to merge or close. No write action taken here: no review submitted, no Update branch, no label or assignee change, nothing closed, no push. Permission readout for bytefolk/mem at 2026-09-10T10:03:22Z: {"admin":false,"maintain":false,"pull":true,"push":true,"triage":true}.

First evidence post on this head. PeterGuy326's two comments here (5606663722 HOLD, 5612902610 CI readback) are against the previous head e26373fdc4723e427d2571ea9…; the current head is 4a25bd25f63c22b70a183bfd398a4aefbdf04c35. I read the four claims this PR makes against the code rather than against prose.

1. 负责人

  • Author sun-970. assignees: [], requested_reviewers: ['PeterGuy326','Bindy-lbb','waterbro-8'] — so this PR still has no named human taker.
  • Not me as reviewer: I have no code in this diff and I am on the requested-reviewer list, so a vote from here is not the independent one this repo's own wording asks for. Posting evidence only.
  • Not me as closer either: maintain/admin are both false above.

2. Provenance of what I read

main tip is 87db0dfe0507be2190fe2fdcce0e267be8224f4d (committer date 2026-09-10T07:25:59Z), which is also this PR's base — compare gives ahead 1 / behind 0, so the PR is already on current main.

I unpacked that exact commit and pinned it: git init + git add -A + git write-tree9057bda0c177f390269c9afa1961d4bdfa89d175, equal to git/commits/87db0dfe…'s .commit.tree.sha. So every file:line below is byte-identical to what is on main, not a reconstruction.

The diff itself is one file, GOAL.md +6/−5 — three capability-table rows and two checklist flips. It touches no code, so there is nothing in it that can regress.

3. 逐条核 — two claims fully hold, one holds only at the service layer, one is compound

Claim: merge_conservative 已实现 (rows 跨设备恢复 and 数据可移植性, plus the P1 [x]). True at the server, and not reachable from either client in this repo — which matters because the row's own neighbour is layer-explicit ("实现 API / CLI / Web 的 …").

  • Server side, real: server/internal/workspacetransfer/merge.go, wired at import.go:67 and :160, persisted by server/internal/db/migrations/0023_workspace_import_merge.sql, accepted over HTTP at server/internal/api/handlers_workspace_transfer.go:169-180, and advertised in capabilities at server/internal/api/handlers_workspace.go:53-57 (workspace_restore_modes = fresh, merge_conservative).

  • The Go client refuses it — server/internal/apiclient/workspace_transfer.go:129-131:

    if mode != WorkspaceRestoreModeFresh {
        return nil, fmt.Errorf("unsupported workspace restore mode %q", mode)
    }

    and the constant's own doc comment at :21-22 reads: "WorkspaceRestoreModeFresh is the only restore mode currently implemented by memd. Additional modes must not be advertised before they are real." That second sentence is a self-imposed rule, and handlers_workspace.go:56 is now on the other side of it.

  • The CLI says it out loud — server/cmd/mem/cmds_workspace.go:113-117:

    if mode != apiclient.WorkspaceRestoreModeFresh {
        return fmt.Errorf(
            "--mode must be %q; merge restore is not implemented",
            apiclient.WorkspaceRestoreModeFresh,
        )
    }

    with the flag help at :166-170 reading "restore mode (fresh only)".

  • The Web UI tells the user merge does not exist — web/src/lib/workspace-transfer.ts:375 hard-codes query: { mode: 'fresh' }, the import gate at web/src/pages/TransferPage.tsx:788-790 requires supportsFresh, and the contract strip renders transfer.contract.merge (:263-265) as 'transfer.contract.noMerge'不支持合并 / merge unavailable (web/src/i18n/index.tsx:735), next to 仅空工作区 / empty workspace only (:734), while the mode cell at :253-256 renders the literal string 'fresh' even though capabilities handed it two modes.

So after this PR merges, GOAL.md will say 合并已完成 in the same repository whose transfer screen says 不支持合并. The stale statement this PR fixes is not the only stale statement about merge.

Claim: correction/supersede 关系已实现 + 不可变 (row 人类可视化, and part of the P2 [x]). Holds, and the immutability wording is defensible: server/internal/memory/relation.go:43 "one immutable edge", :56 the write contract, :105 the atomic insert, idempotent via ON CONFLICT (workspace_id, source_id, target_id, relation_type) DO NOTHING at :179, cycle prevention over the supersedes/corrects DAG at :408-424, recall filtering via IsSuperseded :328 and :348-363. There are exactly two UPDATE memory_relations statements in the tree (relation.go:381, lifecycle.go:700) and both are forget-path redaction of actor metadata (actor_user_id = NULL, actor_token_id = NULL, reason = '') — neither rewrites an edge's endpoints or type, so 不可变 is the right word for the semantics. Web surface exists too: web/src/components/memory/MemoryRelationsPanel.tsx, CreateRelationDialog.tsx.

Claim: 导入历史已实现. Holds end to end: server/internal/workspacetransfer/history.go, web/src/pages/TransferPage.tsx:634/:720/:829 with component tests in web/src/pages/TransferPage.history.test.tsx. One honest limit worth knowing, not a defect in this PR: the card only renders under capabilities.permissions.workspace_import (:828-829) and the mock backend states the constraint plainly — workspace import history requires an unrestricted owner/admin token (web/src/mocks/handlers.ts:986).

Claim: 更完整的权限管理界面 (the third sub-clause of the same P2 item). Holds: web/src/pages/PermissionsPage.tsx, 449 lines, routed at /permissions (web/src/routes/router.tsx:45), covering token list/revoke and grant list/revoke.

The shape to note is that this P2 line is one checkbox carrying three sub-claims, and marking the compound [x] is an all-or-nothing act. Three of the four things I checked are solidly in main; the merge claim is the one whose client half is missing, and it sits on the P1 line, so this specific [x] is not exposed to it.

Where the PR is correctly conservative, so this doesn't read as one-sided: it keeps 尚缺完整审计历史 in the 人类可视化 row, keeps 增量同步/断点上传 as missing in both rows it edits, and splits rather than clears the P1 line (- [ ] 实现 merge_conservative、增量包、断点上传与完整本地同步盘体验。- [x] 实现 merge_conservative。 + - [ ] 实现增量包、断点上传与完整本地同步盘体验。). I checked that remainder and it holds for the layer that row is about: there is no memory-level audit-history surface — no memory_versions / memory_audit / audit_events relation anywhere in server/internal (grep over *.go and *.sql returns nothing), no audit page among the 14 files in web/src/pages/, and the only 可审计记录 / Auditable records string in the Web is a list header (web/src/components/memory/MemoryList.tsx:70, web/src/i18n/index.tsx:495), not a history view. The audit trails that do exist are about other subjects — mem generation events is "the append-only generation audit trail" for indexer rebuilds (server/cmd/mem/cmds_generation.go:119), and durable-context allowlist revokes keep a preserved audit row (web/src/i18n/index.tsx:984, :1006) — so nobody should read my "no audit surface" as "none in the repo".

4. 修复 commit

None is owed to this diff: it contains no code and no false statement in the strict sense — merge_conservative is implemented server-side. What is left over is a set change, and it belongs to the merge feature's author, not to a docs PR: three client-side statements (apiclient/workspace_transfer.go:21-22 + :129, cmds_workspace.go:113-117/:166-170, workspace-transfer.ts:375 + TransferPage.tsx:253-265) that contradict the capability the server already advertises. That is why I am not filing it as a finding against #181.

5. 回归 / CI 证据 on the exact current head 4a25bd25f63c22b70a183bfd398a4aefbdf04c35

  • commits/<head>/check-runs0 records. actions/runs?head_sha=<head>4 runs, all completed / action_required, attempt 1: 34455990495 CI, 34455990489 PR Policy, 34455990520 ByteFolk Security Baseline, 34455990494 Validate Agent memory.
  • action_required produces no check-run, so the zero above means "never approved to run", not "no workflows exist". No CI evidence for this head can come from me: approving a held run has no API (GET .../actions/runs/<id>/approve → 404, the route does not exist), it is Web-UI only and needs maintain/admin, both false in §1.
  • mergeable = true, mergeable_state = blocked; pulls/181/reviews is empty.
  • What is executed evidence for claim 1's server half, independent of this PR's CI: on main 87db0dfe0507, the Validate Agent memory workflow's PostgreSQL integration leg ran this test and it passed. Job 102783103735 (success, 2026-09-10T07:27:35Z) log line 601 onwards: --- PASS: TestWorkspaceTransferMergeConservativePostgres (0.20s) with all five sub-tests green — empty_target_equivalence, populated_target_keeps_local_edits, replay_idempotency, restore_mode_mismatch_fails_closed, conflict_budget_aborts_merge. The chain that makes it run rather than skip is explicit, not inferred: memory-validation.yml:137 names the job, :141 sets MEM_TEST_DB to …/mem_integration_test (so the _test-suffix refusal at transfer_merge_integration_test.go:45-50 is satisfied), :169 calls ./scripts/verify.sh integration, and scripts/verify.sh:349-352 runs go test -v -run '^(…|TestWorkspaceTransferMergeConservativePostgres|…)$'. That log has 196 === RUN lines and 0 SKIP.
  • One caveat about where that proof had to come from, because it is easy to grab the wrong log: the CI workflow's own Go job (102783103744, also success) cannot answer "did this test run or skip". It runs go test without -v (ci.yml:132), and I measured locally that non-verbose go test ./... prints neither === RUN nor --- SKIP for a skipping test — a skip and a pass produce identical output there. The package does show ok …/workspacetransfer 1.931s in that log, which is consistent but not load-bearing; the load-bearing line is the verbose one above.

6. 剩什么、归谁

Two things for the author to decide, and I will not do either on his branch (别平行重复改):

  1. Whether merge 已完成 should be layer-marked — e.g. 服务端已实现,CLI 与 Web 仍限 fresh — which costs one word and removes the contradiction with the on-screen 不支持合并, or whether the follow-up is a separate code change that brings the clients to the capability the server already advertises.
  2. Whether apiclient/workspace_transfer.go:21-22's own rule ("Additional modes must not be advertised before they are real") should be retired in the same breath as :129, since as written it now forbids the advertisement handlers_workspace.go:56 makes.

The merge-targeting part of this is not #181's scope and should not delay it. PeterGuy326 asked for the CI runs; that is the blocking item, and it needs someone with maintain/admin in this repo.

@PeterGuy326

Copy link
Copy Markdown
Collaborator

This PR cannot merge, and it is not a review problem

Recording this so nobody waits on an approval that would not help.

mergeStateStatus is BLOCKED because a required status context never reports. The blocker is structural, not social.

Mechanism

main's branch protection requires these contexts (mem): CodeQL (go), CodeQL (javascript-typescript), CodeQL (python).

.github/workflows/bytefolk-security.yml declares the job that emits them:

  codeql:
    name: CodeQL (${{ matrix.language }})
    if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}

This PR's head is sun-970/mem — a fork. So head.repo.full_name == github.repository is false, the guard is false, and the job is skipped.

When a matrix job is skipped by a job-level if:, GitHub never expands the matrix, so the check run is published under the literal un-interpolated string:

CodeQL (${{ matrix.language }})   COMPLETED   SKIPPED

That context name matches none of the three required ones. The required contexts are therefore never satisfied — not "failing", but absent, which branch protection treats as pending forever.

Confirmation by contrast

Same-repo PRs in this repository report all four contexts normally. mem #165 and #188, both merged 2026-09-10:

CodeQL (go)                    COMPLETED  SUCCESS
CodeQL (python)                COMPLETED  SUCCESS
CodeQL (javascript-typescript) COMPLETED  SUCCESS
CodeQL                         COMPLETED  SUCCESS

This PR's rollup contains one CodeQL entry, the literal CodeQL (${{ matrix.language }}) SKIPPED, and none of the three required names.

What will not fix it

  • Approvals. Every other requirement can be satisfied and this one still blocks.
  • Update branch / merging main in. The head is up to date with main already; the guard evaluates the head repo, not the head commit. There is no commit that makes a fork head pass this if:.
  • Auto-merge. It waits for CLEAN and will never see it. (Where I had armed auto-merge on this PR I have now disarmed it, so it is not sitting there misleading anyone.)
  • Re-running workflows. A skipped job re-skips.

What will fix it

The guard is a defensible security choice: the codeql job requests security-events: write to upload SARIF, and GitHub does not grant write tokens to pull_request runs from forks, so the upload would fail. Skipping beats failing. The defect is the combination — requiring a context that the workflow is designed to withhold from fork PRs.

Available resolutions, in rough order of how much they preserve the current security posture:

  1. Re-point the work onto a branch inside bytefolk/mem. Works today, needs no policy change, and is available to anyone with write access. Authorship is preserved via Co-authored-by. This is the only option that is not an owner decision, and it is what I would do for a member-authored PR.
  2. Keep the guard, and add a companion job that reports the required contexts as a successful no-op when the real scan is skipped. This clears the deadlock but makes the context mean "scanned, or skipped because fork" — which weakens what the green tick asserts. I would not choose this without saying so out loud in the workflow.
  3. Drop the CodeQL contexts from required status checks and rely on push-to-main and scheduled scanning. Simplest, and genuinely weakens the pre-merge gate.
  4. Change the guard to use pull_request_target so fork PRs get a write token. This is the one option I would argue against outright: it hands elevated permissions to a workflow run over attacker-influenced code, and the org's own PR bodies elsewhere explicitly reject granting extra permissions to make a check pass.

Option 1 is a mechanical fix the author or any maintainer can do. Options 2–4 are owner decisions that affect all twelve repositories, because bytefolk-security.yml is the org template — the identical guard sits at line 36 in roleweave and digital-employee as well as here.

Scope of the same trap, org-wide

Every open fork PR in a repository that requires a CodeQL context is permanently unmergeable:

PR Head repo Required CodeQL contexts
mem #125 waterbro-8/mem go, javascript-typescript, python
mem #172 sun-970/mem go, javascript-typescript, python
mem #181 sun-970/mem go, javascript-typescript, python
roleweave #226 PeterGuy326/org-workbench javascript-typescript
digital-employee #250 PeterGuy326/digital-employee javascript-typescript

digital-employee-quickstart, platform, context, ordane and .github require no CodeQL context, so fork PRs there are unaffected.

Worth naming the consequence for external contributors specifically: sun-970 is not an org member, so option 1 is not available to them at all. Under the current configuration a non-member cannot get any PR merged into mem, roleweave, digital-employee, doc or design-system, no matter how good the change is. That is a contributor-onboarding defect independent of whatever anyone thinks of the CodeQL gate, and it is the part I would escalate first.

I have not changed any branch protection, ruleset or workflow file, and I am not opening a PR against the template unilaterally — the same reasoning that made me leave bytefolk-scorecard.yml alone applies here.

@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.

APPROVE — all four corrected statements verify against current main

Docs-only (GOAL.md, 4 statements + 2 checkboxes), no code path touched. Since the entire
value of this file is that it does not overstate, I re-derived each new claim against 3c13f04
rather than taking the diff's word for it.

GOAL.md now claims Evidence on main Landed
merge_conservative 已实现 server/internal/workspacetransfer/merge.go, migration 0023_workspace_import_merge.sql, transfer_merge_integration_test.go, surfaced in web/src/lib/workspace-transfer.ts + web/src/lib/types.ts 36527fe (#98), 2026-08-19
correction/supersede 关系已实现 migration 0022_memory_relations.sql, handlers_memory.go, web/src/components/memory/MemoryRelationsPanel.tsx + CreateRelationDialog.tsx 48efd39 (#90), 2026-08-07
P2: 导入历史 server/internal/workspacetransfer/history.go, web/src/pages/TransferPage.tsx + TransferPage.history.test.tsx
P2: 更完整的权限管理界面 web/src/pages/PermissionsPage.tsx (+ test), web/src/lib/permissions.ts 2caa8e3 (#100), 2026-08-19

So GOAL.md was roughly a month stale when this PR was opened, and every replacement
statement is true at the head you are asking to merge.

The negative half also holds. You left 增量包 / 断点上传 / 本地同步盘 unchecked. I grepped for
resumable / multipart / chunked upload and for incremental or delta bundles across server/
and web/src: every resumable hit belongs to durablecontext (context continuation, not
upload), and there is no incremental-bundle implementation. Correctly left unchecked.

CI

At head 4a25bd25 all 4 workflow runs on bytefolk/mem are completed/success (CI,
Validate Agent memory, ByteFolk Security Baseline, PR Policy) and all 17 check-runs are
green, including Conventional title and linked issue. The only blocker is
mergeable_state=behind — please sync with main before merge so the green is re-proven on the
merge result.

Provenance

Diff read plus a per-claim grep of main (3c13f04) and git log dating of each cited file.
Nothing executed; no Go/Node tests run locally.

waterbro-8 added a commit that referenced this pull request Sep 17, 2026
## What this changes

One line deleted from `.github/workflows/bytefolk-security.yml` — the
`if:` guard on the `codeql` job. Nothing else in the file or the
repository changes.

```diff
   codeql:
     name: CodeQL (${{ matrix.language }})
-    if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
     runs-on: ubuntu-24.04
```

Blob size goes 1988 -> 1867 bytes. The deleted line is exactly 121 bytes
including its newline, so the arithmetic accounts for the whole delta:
no whitespace, reordering or annotation change rode along.

## Why

The guard's second clause compares the head repository to the base
repository. It is false for every fork pull request, so the `codeql` job
is skipped.

GitHub does not evaluate a job's `name:` expression when the job is
skipped by its `if:` guard. The skipped job publishes the raw template
string as its check name, so fork PRs in this repository report a check
literally named `CodeQL (${{ matrix.language }})`, which matches none of
the three required contexts `CodeQL (go)`, `CodeQL
(javascript-typescript)` and `CodeQL (python)`.

This is not hypothetical. Two fork PRs by `@sun-970` were measured
through `GET /repos/bytefolk/mem/commits/{sha}/check-runs` after their
first-time workflow runs were approved:

| PR | head | total | success | failed | skipped |
| --- | --- | --- | --- | --- | --- |
| #172 | `a29e9163` | 17 | 16 | 0 | 1 |
| #181 | `4a25bd25` | 17 | 16 | 0 | 1 |

The single skip in each is `CodeQL (${{ matrix.language }})`. Both are
otherwise fully green and both report `mergeable: true`, yet neither can
ever merge: the three CodeQL contexts are required and nothing the
contributor does produces them. The un-interpolated name is a symptom of
the skip, not a separate defect — on `bytefolk/digital-employee#250` the
same expression interpolated to `CodeQL (javascript-typescript)` as soon
as the job actually ran.

## Why deleting the guard rather than adding a `codeql-fork` job

`bytefolk/digital-employee#250` solved this by adding a second job with
the inverted guard. That job is identical to the baseline `codeql` job
apart from the guard and the language matrix, so a second lane
duplicates roughly 37 lines to express what deleting one line already
says.

The guard is also provably redundant for every trigger other than a fork
PR:

- `push`, `schedule`, `workflow_dispatch` — the first clause
`github.event_name != 'pull_request'` is already true.
- Same-repository `pull_request` — the second clause is already true.
- Fork `pull_request` — the job was skipped; it now runs. **This is the
only behavioural change.**

## Evidence that CodeQL actually works on a fork `pull_request` run

`bytefolk/digital-employee#250` is a fork PR (head
`PeterGuy326/digital-employee:feat/issue-245-memory-config`, sha
`abb2d58b29710927742c828a510c419c7c53efb8`). Its `codeql-fork` job
concluded `success` — check runs `102757987331` (84s) and `102757703884`
(86s).

That job declares `permissions: security-events: write` and contains
**no** `continue-on-error` on the job or on any step. A `success` job
conclusion therefore means every step succeeded, including `Analyze` —
and `github/codeql-action/analyze` fails with HTTP 403 when
`security-events: write` is absent. So SARIF upload from a fork
`pull_request` run is confirmed, not assumed.

Fork `pull_request` runs still receive no secrets and read-only
`contents`. All ByteFolk repositories are public.

## Tradeoff, stated plainly

After this change, fork PRs build untrusted code in a job holding
`security-events: write`. The run still has no secrets and read-only
`contents`, and every other required check in this repository (`Go`,
`Worker`, `Web`, `PostgreSQL integration`, `Web memory and transfer
acceptance`, `HTTP, CLI and MCP lifecycle`, `Workflow, scripts and
Compose`) already builds that same untrusted code, so this adds no new
class of exposure. It is the posture GitHub's own default CodeQL setup
takes for public repositories.

The alternatives were considered and rejected:

- `pull_request_target` would hand a write-scoped token to a workflow
run over attacker-influenced code.
- Self-reporting the three contexts through the Statuses API would
fabricate a required check that never ran.
- Granting contributors organization membership does not help at all:
the guard compares repositories, not author identity.

## What this does not touch

- No `permissions:` block changes. The job keeps exactly `contents:
read`, `actions: read`, `packages: read`, `security-events: write`.
- No required status context, branch protection rule or ruleset is
weakened or removed.
- No action SHA, trigger, matrix entry, step or job other than the
deleted line.
- The pinned `# v4.37.4` annotations are deliberately left alone. They
are the subject of bytefolk/.github#32 and #203, and this PR must stay
disjoint from them.

## Interaction with #203

#203 edits this same file, but only the three `github/codeql-action/*`
annotation lines at 58, 65 and 68, plus `bytefolk-scorecard.yml`. This
PR deletes line 36. The hunks do not overlap, so the two 3-way-merge
cleanly in either order. Neither needs rebasing because of the other.

## Checks

`Workflow, scripts and Compose` runs `actionlint` over every workflow.
Deleting a job-level conditional cannot introduce an actionlint finding;
the resulting YAML keeps `name`, `runs-on`, `timeout-minutes`,
`permissions`, `strategy` and `steps` on the `codeql` job. The release
pin validators in that job (`validate_release_action_pins.sh`,
`test_release_guards.sh`, `test_release_helpers_compat.sh`) all hardcode
`release.yml` and never read this file.

This branch is same-repository rather than a fork, so the PR's own three
CodeQL contexts can go green here — otherwise the fix could not
demonstrate itself.

## Follow-up

The identical guard sits in
`bytefolk/.github/workflow-templates/bytefolk-security.yml`, which is
where every consumer copied it from. A separate template PR is filed so
the fix propagates instead of regressing on the next template sync. Any
consumer that added its own `codeql-fork` lane (`digital-employee`, via
#250) must delete it once the template changes, otherwise two jobs
publish the same check name.

After this merges, #172 and #181 need a branch update rather than a
plain re-run: for `pull_request` events GitHub takes the workflow YAML
from the merge ref, while a re-run replays the workflow version captured
when the run was created. Both are already `state: behind` under
`strict: true`, so they need the update regardless.

Refs bytefolk/.github#35

Co-authored-by: 勒布朗-詹姆斯 <2986253039@qq.com>
@waterbro-8
waterbro-8 merged commit 0a0b55f into bytefolk:main Sep 17, 2026
20 checks passed
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.

docs(GOAL): four status statements list capabilities that are now merged and reachable

3 participants