Repository navigation
Sync with cgwalters-forge/review main at 9e75b28 - #2
Conversation
…sections The five tabs overlapped (the same agents three times, the P0 lane twice, decisions as questions already in the queue) and each had its own shortcuts and refresh. One page of collapsible sections replaces them: Needs you (what truly waits on him, deduped, one action per row, questions answered in place), Agents, Changes, By priority (the full ranked queue with its filters, and the old triage under it) and Usage. Each shows a count, a few rows before "View all", and remembers its open state; only Needs you opens by default, and only while something waits. The page is built once and its sections are filled in place, so a poll never takes a half-typed answer away. The capture bar becomes an "Ask anything"-style box with a hook (chat.ts) for a future chat. The old tab routes are gone; the j/k/o/? keys, auto-next and refresh after an action work as before, and q/d/n/t/s jump to a section. Generated-by: AI (cherry picked from commit 28b11bf6945f37c749b1c9b07e3072ba0c09cbb4)
refreshDecisions is started from page load, the poll and the `r` key, so two reads could finish out of order and an older result overwrite newer decisions state. A slow cached-first read could likewise land after the live one. Add an in-flight guard like refreshOps': a call during a read does not start a second one, a forced call is remembered and re-runs once, and the cached-first result is dropped once the live read has applied. The sequencing lives in a small function so it can be unit tested. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37134275391/attempts/1 (cherry picked from commit 565e781e7ef626a48e9ef3431e1457253b626fd0)
The draft guard in paintNeeds (no redraw while an unsent answer exists, only a note) had no test, and needsSignature left out ages, so labels like "3h" never refreshed while nothing else changed. The guard decision is now a pure function that the DOM code calls, and the signature includes the age label so ages refresh without redrawing under a half-typed answer. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37138042014/attempts/1 (cherry picked from commit ce43dae7d885b310cf990ec63a475225f236b393)
The keyboard row walk filtered rows inside [hidden] containers in main.ts, and focusRow revealed hidden rows, but nothing pinned that behaviour: keys.test.ts covers the key map and homeview.test.ts covers View all in isolation. Move the row-walk filter and next/previous selection next to reveal() in homeview.ts so they can be tested on a DOM, and cover collapsed, expanded and re-rendered states. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37139684785/attempts/1 (cherry picked from commit faf082ae12b9024fc618cd26aa2633e43c20949c)
The one-page fold removed the tab bar from index.html, but showSignIn() still hid #nav, so a signed-out visitor (or an expired token) got "The app failed to start: index.html lacks #nav" instead of the sign-in form. The signed-in path never reaches this, which is why the render checks missed it. Generated-by: AI (cherry picked from commit 4dea2f9fd50288c290409525e0a9b34f759a448b)
The one-page app's "Needs you" listed ~130 rows (stale drafts, "Read" items, PRs already approved at head), while the coordinator's own list of what waits on the operator is about eight things. Classify each item by the concrete ask it holds (answer a question, review at the current head, promote or write text, escalate), rank by priority and ask age, and move everything else into a collapsed Watching section. Add the board's latest status update, active epics with progress, and agents on top, with Changes / By priority / Usage kept below, collapsed. An approved bot fork PR with an upstream and no /promote yet is a Decisions row with a Promote chip (Write text when its bot-meta records a human-text policy). Resign and rerun asks stay in Watching with their chip and reason, and approved PRs are no longer dropped from it. Review requests are still read only for the bot's own PRs, as before. Ask classification is covered by data-driven tests. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37147709338/attempts/1 Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37152242547/attempts/1 (cherry picked from commit 48e180969da61fdc9bd5b1b71dc88c160feff748)
A single-line capture box is too cramped for filing real issues from a phone. Focusing it (or pressing b) now expands it in place into a composer with title, autogrowing markdown body, Priority, Epic and label pickers and an optional Repo field. Epic filing creates a sub-issue of the chosen epic; the draft survives Esc via localStorage. Also adds tests that every id byId() looks up exists in index.html and that the signed-out screen renders, guarding against a repeat of the review#40 crash. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37153805553/attempts/1 (cherry picked from commit 493196e97db28f3ffab0f0fbd8e01d16fb24a517)
… client The operator wants a deeper architecture and UI comparison with Paperclip, a sidebar where a project is a project board, and an evaluation of Rust/WASM and Datastar clients. Capture that as a design document so the milestones can be picked off one at a time. Design only; no app code changes. Datastar needs a server rendering HTML fragments, which the static Pages app lacks, and a server-held token changes the "no new server storage" claim; the doc evaluates it as a conditional standalone option and recommends keeping TypeScript for the initial milestones. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37164872124/attempts/1 (cherry picked from commit 6caa024c324971aae0043740d7d6463ebc8e958c)
The operator's review queue mixes the bot's requests with ones from other humans, and they want to move their GitHub work off email onto the dashboard. Show open PRs requesting their review from non-bot authors, plus recent human mentions and review re-requests from the notifications API, ahead of the bot's own Decisions. Nothing new is stored: it is GitHub search plus notifications only. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37218402470/attempts/1 (cherry picked from commit 8d781ac8cb8f9750d24f553f27bbd071ac565f01)
The Agents section was driven by heartbeat data, so it counted claimed umbrella items as agents and missed agent.yml runs entirely. Read the runs live from the Actions API (running now, 24h totals, core-hours, tokens/cost when the title carries them) and count real agents only, with explicit per-section staleness. Also expose the same view model as JSON (a Copy state action in the page, and `npm run state -- --json` via the same modules) with a self-check listing each data source's fetch time, so the bot can check what the operator sees. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37246382759/attempts/1 (cherry picked from commit d717137ada4b016d70d5ab691b0448ed9d62e07e)
Usage was buried in a collapsed section, human requests appeared first and loaded by default, and the merged-change feed omitted agentic-job and agent-board. Put Claude weekly usage, reset and pace first, with explicit observation age; make From people a closed opt-in disclosure after Decisions and suppress its reads while closed; include both new projects in Changes. No backend or data store added. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37857900851/attempts/1 (cherry picked from commit 5558d1434491b8481ddf67cac8edea8cb1cff1bf)
Read Claude and OpenAI usage from the published pools so the dashboard shows the actual pace allowance, resets and held state. Keep unanswered questions visible directly below usage, ordered by Priority with blocked-item links and the existing answer forms. Document the future coordinator chat attachment. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37941797126/attempts/1 (cherry picked from commit 81f3c232ff8540e557ea4576bb28564af218be06)
On a phone the weekly usage took most of the first screen: a sentence per subscription plus bordered warning boxes for a stale observation or an over-pace pool, pushing the things that need an answer below the fold. The numbers that matter at a glance are how much is used and where the pace allows, so show each pool as one row with a thin bar, a tick at the pace and a short label, and keep the full sentence (exact percents, reset, observation time) in a per-pool expander. Over pace, held and stale are a colour and a word in the row, not a box. The usage is redrawn on every refresh, so the open expanders are carried across the redraw; otherwise one would close under the operator's finger. The operator also asked for the project status to come right after usage, so it moves up from below From people to above Decisions. Closes: #52 Generated-by: AI (cherry picked from commit d0915e151a2b46adb0cbb9d444540b76dd892599)
Some of the bot's open questions put the question in the issue title and write only context, Options: and Recommended: in the body (tracker#130 is one). The parser gave up at the missing Q: line, so such a question showed no choices at all and could only be answered in free text. Read the options from the whole body in that case. A body that does have a Q: line still counts only what follows it. postAnswer checks a picked letter against the same parse of the fresh issue, so the letters offered and the letters accepted stay the same. Generated-by: AI (cherry picked from commit 9a9a07b5a2d1836d905e294c167a50786a704d05)
The operator, on a phone: no easy way to answer from the page, the text hard to read, no quick A/B radio, and the priority filter lacking. The answer form was already there, but only when GitHub had named the token's login. That is read once at start, and any failure other than a 401 (offline, a timeout, the request abandoned while the phone suspended the page) was swallowed and never retried, so every card said "you are signed in as nobody yet" and offered no form for as long as the tab lived. Start from the login the cache was filled as with this very token, ask again at each poll, and until GitHub answers still offer the form, saying once over the rows that the answer posts as the token's owner. GitHub records who wrote the comment and the bot honours only the operator's, so the gate was never what protects anything. Someone confirmed to be another login still gets no form, and is told why once instead of on every card. For reading: a question now leads with what it asks, in the body font, with the issue's title under it and one small line for priority, the issue (a link to GitHub) and its age. The monospace reference line wrapped over three lines at 400px. The kind badge's column is dropped at phone width, the text box is two rows and 16px so a phone doesn't zoom into it, and the Answer pill goes where the form is the action. Decisions had no filter of its own; the one under "By priority" is in a section that starts closed and lists the whole queue. Chips over the rows filter them by priority with counts, remembered per browser. They hide rows as drawn rather than redraw, so a half-written answer is kept, and moving on after an answer stays within what is shown. Closes: #54 Generated-by: AI (cherry picked from commit 898a86071b6b68e967ef4ed354724b5b7eb1745f)
bot-heartbeat now publishes the praxis broker's Mistral counters in the bot-usage/v1 snapshot. They have no plan window, so there is no percent or pace: show a plain row of requests and tokens, labelled as since the broker started, rather than a bar. A snapshot without the key (an older broker) shows no row. Generated-by: AI (cherry picked from commit 18dfda5451219eeb2c1434547d060b6e3478282a)
diffview.ts renders the PR diff view but had no tests, unlike prview. Cover hunk and line rendering, line classes, rename and binary entries, collapsed large files, inline comment placement, context expansion and keyboard navigation between files, so later changes to the renderer have a safety net. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37346225014/attempts/1 (cherry picked from commit 0509f8c44282f886b495a75427390ce7b5cc5f3a)
The three views had no rendering tests although their data modules do, so a regression in escaping or in re-rendering would go unnoticed. Add jsdom tests in the style of needsview.test.ts for the empty state, a populated state, inert untrusted text and re-render equivalence. Generated-by: AI Agent-run: https://github.com/bootc-dev/cgwalters-devspace-sandbox/actions/runs/37355731140/attempts/1 (cherry picked from commit 99e7dcd8959d8374ca1364cdff32fd2d4c4495da)
The operator asked for a Mistral meter in the review UI, and until now Mistral was only a counters line, because the broker reports no window or limit for it. When the usage snapshot's `mistral` object has an `allowance` (`limit_usd`, `resets_at`, and either Mistral's own `spent_usd` or this month's per-model `models` tokens with `prices` per million tokens), the dashboard now draws a bar of the month's spend against that allowance and shows the time until it resets. Mistral's own spend figure is preferred. A figure worked out from tokens is labelled as an estimate, and marked "≥" when entries were left out. With no allowance, the counters show as before. The allowance, the reset and the prices all come from the snapshot the publisher writes, so the app has no constants for them (cgwalters-forge/review#57). Left undone: the publisher side (bot-heartbeat/broker in homegit) still has to send `allowance`. Until it does, the view keeps showing the counters. Verified with `npm run check` (typecheck, 1493 tests, build: exit 0), and the usage and dashboard tests again under `TZ=America/Los_Angeles` (exit 0). Self-review: 2 passes. The second found no blocker. It left open two nits: a malformed `spent_usd` silently falls back to the estimate, and duplicate model entries are summed rather than merged. Generated-by: AI (cherry picked from commit a7d2fed864dc68885bb7a389b4e47bcc3e6bae27)
Keeps actionlint, zizmor and the no-ubuntu-latest policy at the versions pinned once in the forge's shared actions repository instead of copying them here. The required ci job runs it through that repository's lint action, so a finding blocks a merge, and `just lint` runs it locally from a checkout of it. The three jobs on ubuntu-latest move to ubuntu-26.04, which the check demands, so the runner image changes only with a commit. Verified with `just lint` and `npm ci && npm run check`, both exit 0. (cherry picked from commit ef0bf2cdad79673ff8e4bee69f4946479f045c8b)
Adds an agentic review gate for this repository, built the same way as cgwalters-forge/actions#28. The org ruleset requires one approving review, and without this workflow only the operator can approve the bot pull requests here. Runs may edit `.github/` here only once this gate exists (tracker#563). The setup has four parts: - A thin caller of `cgwalters-forge/agentic-job/.github/workflows/review.yml@v0.1.0`. It has the same triggers and grants as in actions#28 and passes no secret. - The bounds files, with `repos` set to this repository. - agentic-job's v0.1.0 task file. It is byte-identical to the one at that tag. - A contract test in `test/`, which `ci` already runs through `npm run check`. **Repository variables needed** (copy them from agent-board): `AGENT`, `AGENT_MODEL`, `INFERENCE_URL`, `INFERENCE_AUDIENCE` and `AGENT_REAL_REVIEWS=true`. If `AGENT` is opencode or vibe, also `AGENT_CONFIG_REPO` and `AGENT_CONFIG_PATH`. `AGENT_RUNNER` is optional. Leave `AGENT_CONFIG` unset. **Also needed:** - Under Actions, turn on "Allow GitHub Actions to create and approve pull requests". - Admit this repository as a caller of review.yml@v0.1.0 in the broker and in the tailnet identity. - Add the ruleset approval rule. Verified: `node --test test/reviewgate.test.ts` (exit 0, 4 pass) and `npm run check` (exit 0). Left undone: - No Dependabot config. This repository has none, so newer agentic-job tags have to be taken by hand, and the comment in the workflow says so. - `merge.toml` and CODEOWNERS are left to the owner. - `ci.yml` and `pages.yml` still use `ubuntu-latest`. Changing that is out of scope here. Self-review: 1 pass, no blocker. It left open three things: - The test checks the shape of `repos` but not the repository name, so that no name is hard-coded. - The task file is not compared with agentic-job's copy at the tag. - The comment in `ci.yml` still says the `ci` job is the only required check. Generated-by: AI (cherry picked from commit 29667a0d8d04e33afee656a267663ade3833163f)
The operator wants to know whether shutting the interactive session down would stop anything (#64). The ops view now opens with a Controller panel. Each hosted piece, taken from src/github/controller.json rather than from constants, shows its last run with a link, its conclusion and when it ran. Dispatch lists its runs in flight by title, a workflow with no runs shows as "not built", and the session counts as present only while its heartbeat is fresh. The board scheduler's mode and start count come from the job's check-run annotations, not its log. The log redirects to blob storage, which the page's connect-src (api.github.com only) refuses. Until the tracker's schedule.cjs publishes its pass lines as a notice, that row says "mode not published" and links to the job. That tracker change, and the agentic-job#536 session job, are left. Verified: npm run check, exit 0 (tsc, 1514 tests, build). Three self-review passes ran. The third found the CSP blocker, which is fixed here. It left open six reads per refresh for dispatch's in-flight list (one per status, 30 each, with no marker when a list is cut off), and that the existing loadOps tests quietly hit the shipped config's paths. Generated-by: AI (cherry picked from commit aef9c68b95be386c1af7f354583be2121ae97516)
…dentials Add an off-by-default ACP chat pane with bounded Actions/publication discovery, explicit connection, streamed text, folded tools and plans. Repository-owned configuration confines prompts to its tailnet; enabling it generates the CSP connect-src addition wss://*.TAILNET.ts.net, requiring operator approval. Verified: node --test test/chat.test.ts (exit 0), npm run check (exit 0; 1,518 tests, typecheck and builds), git diff --check (exit 0). Tests use an in-memory mock WebSocket ACP transport, not a network server. Left: deployment configuration, live bridge/browser interoperability and phone-layout validation; no tailnet infrastructure or session writes changed. Follow-ups: discovery examines only the final comment page; broaden failure-path/auth integration and enabled-CSP tests. Self-review: two adversarial passes; the last found unbounded empty-chunk text nodes, fixed with a regression and checks rerun, without a third pass. The discovery-window and test-coverage follow-ups remain. Generated-by: AI (cherry picked from commit 42808e35fd3d7ff78229b62e442e07e3c42d0749)
Read tracker main's scheduler/census formats through an optional, bounded pasted-output reader, showing live epics, candidates with their epic, and unknown with raw text on format changes. Remove annotation reads tracker does not support without widening the API-only token boundary. Verified: `node --test test/controller.test.ts test/controller-output.test.ts` (exit 0, 25 tests), `npm run check` (exit 0, 1526 tests plus typecheck/build), and `git diff --check` (exit 0). Left: automatic retrieval is not implemented because summaries have no API and logs redirect outside the app's CSP; counts therefore require pasted output. The coordinator summary planned for tracker#572 slice 4 is documented, not guessed. Follow-up: real-browser paste/layout and route/sign-out coverage; refresh/teardown tests currently use DOM fixtures. Self-review: 2 adversarial passes; last left no blockers, only the integration-coverage nit above. Generated-by: AI (cherry picked from commit b4052611db512e76e0cfc3fbfc411e5aebd47634)
Add an off-by-default proposal panel that shows live target state and executes typed actions sequentially with the operator's own token, refusing stale proposals and recording partial results to prevent blind retries. Repository-owned configuration limits writers and target repositories. Verified: `node --test test/actions.test.ts` exit 0 (13 tests); `npm run check` exit 0 (typecheck, 1,531 tests, builds); `git diff --check` exit 0. Left: reconcile the provisional vendored contract with agent-board#71 before enabling; live GitHub writes and real phone-layout testing were not performed. Comment receipts are not atomic locks; non-PR mutations retain GitHub's read/write race. `just` was unavailable, so checks used the recipes' underlying commands. Self-review: 2 adversarial passes; last left no blockers, with warning-rendering, repository-casing and move-parent regression tests as follow-ups. Generated-by: AI (cherry picked from commit 9e75b28f499aa1b5357785915214c13483922c3c)
The commits before this one replay cgwalters-forge/review up to 9e75b28f499a with git cherry-pick -x, conflicts resolved to upstream's side with our identity values. Code they added outside those conflicts still names cgwalters' operator, bot, forge and devspace runner, mostly in test data that has to agree with config.ts, so the tests fail until here. Map it the same way the original identity commit did. The review gate's bounds now admit jmarrero-forge/review: they are read from this repository's base branch, and naming another repository there would refuse every run once the gate is set up here. The gate still calls cgwalters-forge/agentic-job at a release tag, and CI still uses cgwalters-forge/actions/lint: shared public code with no copy here. The design docs and the prototype are left as written, being history. Generated-by: AI
The identity commit derived the trailer from cgwalters' (his profile's #llms anchor), but this bot's PR bodies end with https://github.com/jmarrero-bot#llms, the operator config's generated_by_url. The app itself matches any Generated-by: line, so only the tests read the constant today; it should still name what the bot actually writes. Generated-by: AI
jmarrero-forge/jmarrero-devspace-sandbox doesn't exist (the runner is only bootc-dev's), so the news pane warned about it on every load. The tracker gets workflow PRs as the harness moves to agentic-job (tracker#17), and atomic-setup builds the bot machine's image, so their merges belong in the news too. The Theme order was cgwalters' board's. This board has no Theme field yet, so rank none and let the triage view sort themes by name and say the field is missing. Generated-by: AI
The controller panel read cgwalters' tracker, so it reported his scheduler as ours. Point it at the caller workflows tracker#20 adds to jmarrero-forge/tracker: poll.yml's poll and board jobs, and dispatch.yml. Until they exist the panel shows them as not built yet, which is true. The agent-board, usage and coordinator pieces are left out: there is no such job or workflow planned here (usage is published by bot-heartbeat on the bot's machine), and they would only ever read as not built. Generated-by: AI
jmarrero-bot
left a comment
There was a problem hiding this comment.
Review guide for head 8bb30339db: where to look closely and what is safe to skim. It is advice from the bot's reviewer and doesn't replace reading the diff; the review app walks it.
Sync with cgwalters-forge/review at 9e75b28: 25 upstream commits replayed with cherry-pick -x (18 patch-identical to upstream; the 7 that differ differ only in conflict hunks mapped to jmarrero values), then one identity commit for new tests and fixtures and three config commits (LLMS_TRAILER, NEWS_REPOS and TRIAGE_THEMES, controller.json). The app code is upstream's and was not re-reviewed line by line; the risk is in what acts outside the browser: the new review gate workflow (pull_request_target and issue_comment, calling cgwalters-forge/agentic-job@v0.1.0 with pull-requests and statuses write) and CI now running cgwalters-forge/actions/lint@main unpinned. Operator actions and chat stay off (empty action-config.json and chat-config.json); execution of actions checks the viewer is the configured operator. Tests and fixtures are mechanical renames and can be skimmed.
Hotspots
- look-closely · security —
.github/workflows/review.yml:1-27(af620ea): Runs on every PR (pull_request_target) and on /review comments once merged, handing pull-requests, statuses and id-token write to cgwalters' agentic-job at v0.1.0. Without the AGENT and INFERENCE repo variables it fails in its policy job on each PR; disable it with gh workflow disable right after merge until tracker#20 sets them up. - note · security —
.github/workflows/ci.yml:26(23bf36d): CI, which gates merges here, now runs cgwalters-forge/actions/lint at a moving ref (main), allowed by .github/zizmor.yml's ref-pin rule for cgwalters-forge/*. The job has contents: read only and no secrets, so the exposure is the gate's verdict, not a write. - note · security —
src/github/actions.ts:231-232(6b8c4ac): Operator actions execute only with the configured operator's own token; with the empty action-config.json the feature is off entirely. - note · logic —
src/github/controller.json:9-11(8bb3033): Points the controller panel at jmarrero-forge/tracker poll.yml and dispatch.yml, which do not exist until tracker#20; the panel reads them as not built. - note · logic —
src/github/config.ts:156-162(74e980a): Our own choice of news repositories, not upstream's: drops agentic-job and agent-board (no copies here) and adds tracker and jmarrero/atomic-setup. All listed repositories exist.
Safe to skim
test/fixtures/people.json: cgwalters to jmarrero rename in fixture datatest/fixtures/state-runs.json: fixture renametest/fixtures/agent-execution-context.json: fixture renamedocs/command-ui-design.md: upstream design doc, left as historytest/needs.test.ts: upstream tests with identity renamestest/needsview.test.ts: upstream tests with identity renamestest/homeview.test.ts: upstream tests with identity renamestest/state.test.ts: upstream tests with identity renames
|
Merged at 8bb3033 after green CI and an independent review (#2 (review)). Disabled the review workflow until tracker#20's variables and broker exist; re-enable with Generated-by: https://github.com/jmarrero-bot#llms |
Sync with cgwalters-forge/review main at 9e75b28f499aa1b5357785915214c13483922c3c (operator dashboard, ops pane, controller panel, chat, review gate), keeping jmarrero's identity values.
How: upstream's 25 commits since this copy's base (89c06ed) are replayed with
git cherry-pick -x, conflicts resolved to upstream's side with our identity values; then one commit maps cgwalters values in the new code and tests, and three small config fixes follow (LLMS_TRAILER, NEWS_REPOS/TRIAGE_THEMES, controller.json). A merge commit would keep upstream's SHAs, but bot-git check refuses merges, and rewriting main to upstream plus our commit needs a force-push. Next sync:git cherry-pick -x 9e75b28f499a..upstream/mainplus a re-run of the identity mapping. Between the replayed commits and the identity commit, new upstream tests still name cgwalters and may fail, so bisect from the identity commit on.Left as is: action-config.json and chat-config.json stay empty (operator actions and chat disabled). controller.json points at jmarrero-forge/tracker poll.yml/dispatch.yml (jmarrero-forge/tracker#20); until those exist the panel shows them as not built. The review gate (.github/workflows/review.yml) calls cgwalters-forge/agentic-job and needs the AGENT/INFERENCE repo variables from jmarrero-forge/tracker#20; without them it fails in its policy job on each PR, so consider disabling that workflow after merge until then. CI's lint step uses cgwalters-forge/actions/lint@main (public). Design docs and the prototype still name cgwalters (history).
Testing (4-core devspace, node:24 container):
npm ci && npm run check(tsc, 1539 tests pass, build) andjust lint(actionlint, zizmor, runner labels via cgwalters-forge/actions) at 8bb3033 on jmarrero-devspace-38750945054. The Pages workflow needs no secrets; the github-pages environment exists here and deployed main last on 10-03.Related: jmarrero-forge/tracker#21
Generated-by: AI