Migrate Gaal implement/review/revise to the local gaal watch; keep mechanical workflows on Actions
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 8/100
- Issue type
- Refactor
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- github-actions, shell
- Domain
- ci-cd, developer-experience
Research direction
Start with the workflows in .github/workflows/ (gaal-agent.yml, pr-review.yml, pr-revise.yml, issue-triage.yml) and the scripts they call, including pr-replay.sh and publish-policy.sh. The work is a maintainer-run change that gates those jobs on the GAAL_ENGINE variable, adds a diff-only fork-PR review path, and adds .gaal/project.yml. Done when the acceptance criteria in the issue hold, with the mechanical workflows unchanged.
Written by the indexing model from the issue text.
Description
Goal
Move OfflineCV's memory-heavy Gaal steps (implement, review, revise) from the GitHub Actions workflows to the standalone gaal (116-Ideas/gaal) running gaal watch locally. There they get okfmem and CodeGraph. Mechanical workflows stay on Actions, which is free on this public repo.
Contributors must see no change: the same gaal label, the same /gaal commands, and the same review → revise loop.
Why
The Actions Gaal runs every LLM step without the repo's durable memory or a code graph. The review standards, verification rules and parser gotchas live in okfmem (the review-process, verification and parser lanes) and exist only locally. That memory must not go into an Actions run on this repo, because a public repo's claude-code-action output is not safe to publish (unmasked transcript, token inherited by subprocesses). So the steps that need it have to run locally.
Placement
| Workflow | LLM | Memory value | After the migration |
|---|---|---|---|
ci, deploy-pages, promote-release, stale-claims, moderate-comments |
no | none | Actions, unchanged |
pr-auto-triage |
no | none | Actions, unchanged |
pr-auto-rebase |
conflicts only | low | Actions, unchanged. The gaal profile sets rebase.unlinked_prs: false so the watch does not rebase the same PRs too (116-Ideas/gaal#328) |
issue-triage |
yes | low | Actions, unchanged (it must handle outsiders' issues). Its auto-gaal handoff now starts the local watch instead of gaal-agent.yml |
gaal-agent (implement, /gaal commands) |
yes | high | Local watch |
pr-review |
yes | high | Local watch for trusted PRs. Fork PRs get a diff-only Actions review (below) |
pr-revise |
yes | high | Local watch |
Plan
-
Prerequisites (in 116-Ideas/gaal):
- 116-Ideas/gaal#161: scope headless runs' writes to the checkout. A local run on a public repo still reads outsiders' comments, and
$HOMEholds okfmem and the gaal keys. - 116-Ideas/gaal#522: per-step placement plus the memory boundary.
- 116-Ideas/gaal#161: scope headless runs' writes to the checkout. A local run on a public repo still reads outsiders' comments, and
-
Onboard. Run
gaal onboardto write.gaal/project.yml, with okfmem and CodeGraph on,placementper the table,rebase.unlinked_prs: false, and gates matchingnpm run verify:quick/verify. -
Cutover switch. Add a repo variable
GAAL_ENGINE(actions|local). Gate thegaal-agent,pr-review(trusted path) andpr-revisejobs onvars.GAAL_ENGINE != 'local', so the two systems never both act on one label or PR. Rollback is flipping the variable back. -
Fork PR review. Add a diff-only review path to
pr-review.ymlfor fork PRs:- It reads the diff and files through the API and posts a COMMENT review.
- There is no checkout of PR code and no install.
- No okfmem is involved.
This is what #1192 (a contributor's fork PR) lacked: it got no bot review at all.
-
Trial. Set
GAAL_ENGINE=localand run a week of real issues through the watch. Compare against the Actions Gaal: review rounds to converge,needs-humanrate, and wall-clock delay from label to PR. 116-Ideas/gaal#441 gives the CodeGraph token numbers. -
Remove. After the trial, delete the gated jobs and the scripts only they use. Keep
pr-replay.sh, whichpr-auto-rebasestill uses.
Acceptance criteria
-
.gaal/project.ymlis onmainwith okfmem and CodeGraph on, the placement above, andrebase.unlinked_prs: false. - With
GAAL_ENGINE=local, agaal-labelled issue is implemented, reviewed and revised by the local watch, and no Actions Gaal job runs on it. - With
GAAL_ENGINE=actions(or unset), behaviour is exactly today's. - A fork PR gets a diff-only bot review that checks out no PR code. A test or a dry run shows no secret is present in the job that reads PR content.
- No mechanical workflow in the table changed behaviour.
- The okfmem tooling lane and
CLAUDE.md/docs/CONTRIBUTING-PROCESS.mdsay which system runs which step.
Out of scope
- Moving mechanical workflows to the local watch.
- Bot approval of PRs. Approval stays human, except for the classes
pr-auto-triagealready handles.
Changes under .github/ can't be published by the Actions Gaal (publish-policy.sh), so this is a maintainer-run change, labelled needs-human to keep triage from handing it to Gaal.
- Dominant language
- TypeScript
- Stars
- 11
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Getting set up
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from offlinecv/OfflineCV
-
fix(heuristics): unit number before a Saint-named city drops "St." from the locationPossibly taken @gaal-agent claimed this 9 days ago. Openbug gaal ux:parsing
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
-
Parser: achievement year lost on re-import when '· YYYY' wrapped to its own linePossibly taken @gaal-agent claimed this 4 days ago. Openbug gaal ready-for-agent ux:parsing
Difficulty 3/5 1-2 days Newbie friendliness 25/100
-
Export: auto-bolded metric bullets extract one word per line in stream-order parsers (pypdf/Drive)Possibly taken @gaal-agent claimed this 4 days ago. Openbatch:export-standards bug gaal ready-for-agent ux:edit-export
Difficulty 3/5 1-2 days Newbie friendliness 25/100
-
bug duplicate improvement
Difficulty 3/5 Half a day Newbie friendliness 66/100
-
Return legs from /download/ to /: Fix now lands on the missing field, and a bfcache miss keeps the résuméPossibly taken @s-annam claimed this 10 days ago. Openimprovement ready-for-agent ux:flow
All issues in offlinecv/OfflineCV
Similar issues
-
backend priority:P3 privacy-fix
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
bug desktop v3 windows
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
esengine/DeepSeek-Reasonix#13697 · 1 comment ·
Maintainers usually reply within 1 day
-
area:security documentation effort:S priority:P2
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
Maintainers usually reply within 1 day
-
app:web meta:ops
Difficulty 2/5 Half a day Newbie friendliness 78/100
osu-tournament-rating/otr#1113 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100