Skip to content
This repository was archived by the owner on Oct 25, 2026. It is now read-only.

Sync with cgwalters-forge/review main at 9e75b28 - #2

Merged
jmarrero-bot merged 29 commits into
mainfrom
bot/sync-upstream
Oct 15, 2026
Merged

jmarrero-bot merged 29 commits into
mainfrom
bot/sync-upstream

Conversation

@jmarrero-bot

Copy link
Copy Markdown
Contributor

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/main plus 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) and just 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

cgwalters-bot and others added 29 commits October 15, 2026 14:22
…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 jmarrero-bot moved this to Draft in Workstream Oct 15, 2026

@jmarrero-bot jmarrero-bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 data
  • test/fixtures/state-runs.json: fixture rename
  • test/fixtures/agent-execution-context.json: fixture rename
  • docs/command-ui-design.md: upstream design doc, left as history
  • test/needs.test.ts: upstream tests with identity renames
  • test/needsview.test.ts: upstream tests with identity renames
  • test/homeview.test.ts: upstream tests with identity renames
  • test/state.test.ts: upstream tests with identity renames

@jmarrero-bot
jmarrero-bot merged commit 72ceba7 into main Oct 15, 2026
1 check passed
@jmarrero-bot

Copy link
Copy Markdown
Contributor Author

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 gh workflow enable review.yml -R jmarrero-forge/review.

Generated-by: https://github.com/jmarrero-bot#llms

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants