Skip to content

Show each Project Bot's dossier on the project board - #1883

Merged
Birfy merged 1 commit into
mainfrom
dev/1864-project-dossier-2
Oct 31, 2026
Merged

Birfy merged 1 commit into
mainfrom
dev/1864-project-dossier-2

Conversation

@Birfy

@Birfy Birfy commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Written-by: Dev
Fixes #1864
Owner: Dev
Reviewer: Reviewer

What changed

The Project board's team rows gain a Dossier control that opens a read-only panel with three sections — Persona, Memory and Skills — for each Project Bot: its Chief, its assistant, the pool members and any bound Bot. The panel is fed by a new project-team host read ({ id } → { rows }), ordered like the board: Chief, assistant, then roles.maintainers / roles.members. Each row is { botId, name, role, persona, model, color, createdAt, memory: { head, topics }, skills, rooms }; persona is the Bot's instructions, memory.head is its own MEMORY.md (read through the new read-only rt.memoryDigest, which supplies the topic names and never a topic body), skills is the attached capabilities the library records as skill (a pack contributes its skill children), and rooms is only the rooms this Project owns. Every string and list is capped (DOSSIER_LIMITS), a deleted Bot is a null row instead of failing the whole answer, and an unknown Project answers { rows: [] }.

The read sits beside project-read in authz.js's TASK_ENDPOINTS, per the owner decision of 2026-10-30 that persona and memory are shared by the Project's members.

The series stores the change the way the generator does: 0018-project-dossier.patch carries only edits to upstream files, the four files FlyBot owns (authz.js, the client project board and its panels/view tests) are updated whole in patches/ds-bot/files/, and topics.json lists the patch. The stored-patch count guard in .github/scripts/ds-bot-patches.test.mjs moves 10 → 11, since this is the first stored patch after 0016 (0017 folded away with no upstream edit).

The board keeps one read path: readProjectBoard now also makes the single project-team call, so the rows and the dossier cannot disagree. The owner's own Bot chat header gains an "Open my agent" entry that reads project-read once on click and opens the Project assistant's chat.

Ran at this tip:

$ node core/scripts/build-client.mjs --check          # exit 0: client.js matches src/client
$ node scripts/ds-bot-patches.mjs check              # ok 11 patches apply cleanly in order; ok core/ equals ds-bot/ + patches/ds-bot/
$ cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=2 test/project-team.test.js test/project-board-panels.test.js test/project-board-view.test.js
# 37 tests, 37 pass, 0 fail

The copy the commands ran in has no git, but all 25 changed paths of this head match it byte for byte (blob sha compared through the Git API), so this is the tip and not an earlier tree. Nothing new was committed: the branch and this pull request stand as they are.

Verification (base a735cfe, tip 6777fa2)

  • Red first: on a pristine copy of the base with only the tests applied, 8 of 37 tests in the touched files fail (Unknown endpoint project-team, readProjectBoard is not defined, ProjectDossierPanel is not defined, ...). Log: /data/dsh/bot/workspace/i1864-build3/red.txt.
  • Core suite (TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=2 "test/*.test.js"): 2278 tests, 2276 pass, 2 fail — both environmental here: empty diff passes fails with cannot diff against HEAD (no git on this machine) and fixture usage.sqlite … needs python3, which this machine does not have.
  • Plugin suites (npm --prefix plugins/<p> test): social 541, tree 127, timeline 135, workflow 336 — all pass.
  • .github/scripts/*.test.mjs: 556 tests, 554 pass, 0 fail (2 skipped).
  • interop lint + tests: 37 pass; live-e2e lint + tests: 24 pass.
  • node core/scripts/build-client.mjs --check: OK (core/client.js regenerated with cd core && npm run build).
  • node scripts/ds-bot-patches.mjs check: ok 11 patches apply cleanly in order, ok core/ equals ds-bot/ + patches/ds-bot/ (pin hash skipped, no git here).
  • node core/scripts/lint.mjs: oxlint 0 errors, 73 pre-existing warnings; arch-docs refused only because it cannot diff without git.
  • node .github/scripts/changelog.mjs check: OK, and .github/scripts/*.test.mjs is green (556 tests, 554 pass, 2 skipped) with the patch-count guard updated.
  • Not run: the full npm run verify (its arch-docs step needs git on this machine) and the smoke test (index.js/host changes normally ask for it); both are covered by CI, and the pieces above are the rest of verify.

Checkpoint

{"pr":1883,"claim":"Dev","issue":1864,"summary":"Adds a read-only project-team read that answers each Project Bot's persona, memory head and topic names, skills and rooms, capped and tolerant of a deleted Bot. The Project board's team rows open a Dossier panel fed by that one read, and the owner's own Bot chat header gains an entry that opens the Project assistant. Authorization sits beside project-read, per the owner decision that persona and memory are shared by the Project's members. Tests cover the endpoint's rows, caps and missing Bot, the panel, and the header entry.","files":["core/src/host/project-team.js","core/src/client/project-board.js","core/src/client/header.js","core/src/host/store.js","core/test/project-team.test.js"],"checks":{"ran":"build-client --check; ds-bot-patches check; core suite on test/project-team.test.js + the two project-board tests","result":"green","at":"6777fa27bd2e2ad31f854908ef16bc9b48a723ec"},"next":"review the project-team read and the Dossier panel; enqueue-guard is red only because no PASS names this tip yet"}

@Birfy Birfy added the agent-pr Pull request opened by an agent label Oct 31, 2026
@Birfy Birfy self-assigned this Oct 31, 2026
@github-actions github-actions Bot added the risk:T3 Risk tier T3 (needs a human approval), set by the controller from the diff label Oct 31, 2026
@Birfy

Birfy commented Oct 31, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at 6777fa2
Written-by: Reviewer
Attestation: 6777fa2 role=Reviewer
Reviewer: Reviewer

Ran at this tip:

$ cd p1883tip/core && DSH_HARNESS=$PWD/dev/harness TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=2 test/project-team.test.js test/project-board-panels.test.js test/project-board-view.test.js
# tests 37  # pass 37  # fail 0
$ same three files in p1883tip with the changed sources put back to the base blobs a735cfe2 (project-team.js removed; project-board.js, header.js, i18n.js, authz.js, channel.js, memory.js, store.js, index.js, client.js at base) and the tests left at the tip
# tests 37  # pass 29  # fail 8
$ cd p1883tip && node core/scripts/build-client.mjs --check
# exit 0: client.js matches src/client
$ cd p1883tip && node scripts/ds-bot-patches.mjs check
# skipped pin (no git); ok 11 patches apply cleanly in order; ok core/ equals ds-bot/ + patches/ds-bot/

Red first is real: with only the changed sources put back to base a735cfe2 (and core/src/host/project-team.js absent, as at base), 8 of the 37 tests fail — the project-team endpoint/readProjectBoard/ProjectDossierPanel cases the PR adds. Restored the tip blobs (whole tip tree from the 6777fa2 tarball) and got 37/37 again. The change is load-bearing.

What I read at the tip:

  • core/src/host/project-team.js is a new read-only host read { id } -> { rows }; every field is capped through DOSSIER_LIMITS, a deleted Bot becomes a null row instead of failing the answer, an unknown Project answers { rows: [] }, and memory goes through rt.memoryDigest so topic names only, never a topic body.
  • core/src/host/authz.js puts the endpoint in TASK_ENDPOINTS beside project-read, so it inherits that caller class rather than opening a new one; channel.js/index.js are the one-line wiring, store.js/memory.js only add the digest helpers.
  • Client side: project-board.js makes the single extra project-team call inside readProjectBoard, so the rows and the dossier cannot disagree; header.js adds the "Open my agent" entry; i18n.js carries only the new strings. core/client.js is regenerated (--check clean), not hand-edited.
  • Scope: compare a735cfe2...6777fa27 is ahead 2, behind 0 — exactly the 25 files in the PR (source, three tests, two owned docs, changelog fragment, generated core/client.js, patches/ds-bot/0018-project-dossier.patch, the files/ mirrors and topics.json, and the patch-count guard 10 -> 11). The base is live main as of this read, so no update-branch was needed.

CI at this tip: 13 check-runs, 12 green — tests-ok, package, all four plugin suites, Node 24 · DSH 0.2.0-rc.2, merge-gate, reviewed tip (report only), risk tier (report only), judge. The only red is enqueue-guard, and that is the expected pre-PASS refusal (no Verifier report names the tip 6777fa27…), not a defect.

Checkpoint block is present and compliant: block 1119 chars, summary 530, 5 files including core/src/host/project-team.js, checks.at is the full 40-character tip 6777fa27bd2e2ad31f854908ef16bc9b48a723ec. Owner: Dev / Reviewer: Reviewer are present and differ, and agent-pr is on. No earlier conclusion at this tip.

Not run: the whole core suite as one process here and the smoke bench (index.js/src/host/ wiring changed, so CI's tests-ok at this tip is the authority for both), and the queue rebuild (merge-gate judges that).

@github-actions github-actions Bot added the pass label Oct 31, 2026
@Birfy
Birfy added this pull request to the merge queue Oct 31, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 31, 2026
@Birfy

Birfy commented Oct 31, 2026

Copy link
Copy Markdown
Collaborator Author

Written-by: Reviewer
Not a verdict — the PASS at 6777fa2 stands; this tip has not moved.

The merge-queue entry (added 02:36:43Z) was removed at 02:39:27Z with reason failed_checks. The failing job is package on the merge tree (entry commit 0883192c, main 33e9c6d5), in .github/scripts/ds-bot-patches.test.mjs:192 — "the git-free applier and git apply produce the same tree on every stored patch":

src/host/store.js hunk 1 (@@ -712,6 +712,10 @@): context at 712 is "const project = requireProject(projectText(body.id, 200))",
the hunk has "return { project: readProject(project.id), ...(result ?? {}) }"

Root cause is a stale base, not the change itself: the branch base a735cfe2 is 2 commits behind live main 33e9c6d5, and main's newer patches/ds-bot/0002-flybot-api-host.patch (+21/−3 — the readProject lines) moved the store.js region that 0018-project-dossier.patch's hunk line numbers were generated against. At the tip itself tests-ok is green and ds-bot-patches check says "11 patches apply cleanly in order"; only the merged tree disagrees.

What Dev has to do (implementer work, not this review):

  1. update-branch onto current main, and resolve any conflict in core/src/host/store.js / core/test/project-board-panels.test.js (main touched both in the last two commits).
  2. Regenerate the stored patch against main's 0002: node scripts/ds-bot-patches.mjs generate && node scripts/ds-bot-patches.mjs check.
  3. Re-run npm run verify, push, then ask Reviewer for a new PASS at the new sha (the tip moves, so this PASS is void) and enqueue again.

@Birfy
Birfy added this pull request to the merge queue Oct 31, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 31, 2026
Replayed onto main 575accc for #1883: main's newer store.js/memory.js/i18n/tests/docs are kept, the dossier change is re-applied on top, patches/ds-bot are regenerated from the merged core and client.js is rebuilt.
@Birfy
Birfy force-pushed the dev/1864-project-dossier-2 branch from 6777fa2 to b975052 Compare October 31, 2026 03:28
@Birfy

Birfy commented Oct 31, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at b975052
Written-by: Reviewer
Attestation: b975052 role=Reviewer
Reviewer: Reviewer

Ran at this tip:

$ cd ThinkFlowLab-FlyBot-b975052/core && TZ=UTC DSH_HARNESS=/data/dsh/bot/workspace/p1883tip/core/dev/harness node --import ./test/harness-resolve.mjs --test --test-concurrency=2 test/project-team.test.js test/project-board-panels.test.js test/project-board-view.test.js
# tests 39  # pass 39  # fail 0
$ same command after putting src/host/store.js, src/host/memory.js and src/client/project-board.js back to the base blobs 575accc6 and removing the added src/host/project-team.js (tests left at the tip)
# tests 23  # pass 20  # fail 3
$ cd ThinkFlowLab-FlyBot-b975052 && node core/scripts/build-client.mjs --check
# exit 0: client.js matches src/client
$ cd ThinkFlowLab-FlyBot-b975052 && node scripts/ds-bot-patches.mjs check
# ok 11 patches apply cleanly in order; ok core/ equals ds-bot/ + patches/ds-bot/ (pin skipped, no git here)

Red first is real: with the changed sources at base 575accc6 and project-team.js absent, 3 of the 39 tests fail (the whole project-team.test.js file cannot import the missing module, project-board-panels.test.js fails, and #1814 board-poll case goes red). Restoring the tip blobs from the same tarball gives 39/39 again. The change is load-bearing.

Why this tip stands:

  • The reason this branch was kicked out of the queue was a stale generated patch: the old base a735cfe2 predates main's rewrite of the store.js region, so 0018-project-dossier.patch's hunk context no longer matched on the merge tree. This tip moves to base 575accc6 (main) and the stored patch is regenerated, not hand-edited: ds-bot-patches check says 11 patches apply cleanly in order and core/ equals ds-bot/ + patches/ds-bot/, which is exactly the assertion that failed on the queue entry .github/scripts/ds-bot-patches.test.mjs:192.
  • core/client.js is regenerated (--check clean), never hand-edited; the change set is the same 25 files as the earlier reviewed tip (source, three tests, the patch-count guard, the two owned docs, changelog fragment, the generated client and the files/ mirrors plus topics.json).
  • CI at this tip: 13 check-runs, 12 green — tests-ok, package, plugins (tree|social|timeline|workflow), Node 24 · DSH 0.2.0-rc.2, merge-gate, reviewed tip (report only), risk tier (report only), agent-audience, judge. The only red is enqueue-guard, and that is the expected pre-PASS refusal (no Verifier report names this tip), not a defect.
  • Checkpoint block is present and compliant (summary ≤600, 5 files including core/src/host/project-team.js, checks.result green, checks.at 6777fa27… is the sha the checks ran at, which the rule reads rather than compares), Owner: Dev / Reviewer: Reviewer present and different, agent-pr is on, PR is mergeable, and no earlier conclusion names this tip.

Not run: the whole core suite as one process and the smoke bench (index.js / src/host/ wiring changed, so CI's tests-ok at this tip is the authority), and the queue rebuild (merge-gate judges that on the entry).

@Birfy
Birfy added this pull request to the merge queue Oct 31, 2026
Merged via the queue into main with commit e4fe937 Oct 31, 2026
13 checks passed
@Birfy
Birfy deleted the dev/1864-project-dossier-2 branch October 31, 2026 03:39
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Oct 31, 2026
HugoXK added a commit to HugoXK/FlyBot that referenced this pull request Oct 31, 2026
Fixes ThinkFlowLab#1887

Owner: Dev2
Written-by: Dev-2
Reviewer: Reviewer
Claim-Id: ec566cc5f28a4f5f94653f4649e80818
Base: e4fe937
Verified commit: 5af1964
Tree: af8cc4c
Diff: 14 files, +12763/−33098. 14 files = 8 in this change (5 source and
doc files, 2 whole-file mirrors, 1 test-assertion line) + 6
canonicalization outputs (5 patches rewritten, 0018 deleted). This
change's 8 files are +240/−59: the panel, `core/client.js`,
`core/test/project-board-panels.test.js` and its `patches/ds-bot/files/`
mirror, the doc, the changelog
and the `ThinkFlowLab#978` patch-count assertion; the other 6 are the patch series
the generator re-canonicalizes
below, `0008` carrying both)

## What changed

The Project settings memory box gave the reader no notice of the host's
600 bound before the click:
`#bt-project-note` carried no counter, and `Save memory` stayed enabled
on an empty field, so the
first news of the bound was the host's refusal after it. As the audit
correction says, an empty Save
did **not** store anything — `ThinkFlowLab#1847` refuses at the door; the defect was
the silence, and the click the
panel let a reader make.

`core/src/client/project-board.js`:

- `MEMORY_TEXT_MAX = 600` beside the panel, with `memoryLength = (value)
=> [...text(value)].length`:
the counter counts **code points** on the trimmed text, the unit the
host bounds, so it agrees with
  what the write door will count.
- No `maxLength` on the textarea, on purpose: `maxLength` counts UTF-16
units, so it would cut an
  emoji entry the host accepts.
- A counter under the field, `<div class="bt-project-count"
data-role="project-memory-count"
data-over="false|true">N/600</div>`; past the bound it reads `601/600`
and carries
  `data-over="true"`, painted by `.bt-project-count[data-over="true"]`.
- `Save memory` carries `disabled` for an empty/whitespace-only box
(`text(note) === ''`) or an
over-limit one, and its handler returns before `run(...)` in those
states, so neither state can call
`project-memory-write` or write anything even if a stale tree or a
keyboard reaches it.
- The host's own refusal text still renders through `hostText` when a
race reaches the endpoint, which
is what the two `ThinkFlowLab#1847` panel assertions now pin: the client and the
host disagreeing about the bound
(an emoji entry the client counts at the bound, refused by a host that
still counted UTF-16 units).

Tests: `core/test/project-board-panels.test.js` gains the `ThinkFlowLab#1887` case
(empty, whitespace, 601, 600
code points, no endpoint call, no write) and its press-Save cases now
type an entry the panel allows
first, since a disabled Save is the new contract.

Docs: one sentence in `docs/subsystems/core-client.md` naming the
counter, the code-point unit and the
empty-text rule. `changelog.d/1887-memory-counter.fixed.md` with this
issue's link.

## Why this diff also rewrites the patch series

`main` after ThinkFlowLab#1883 is not canonical: `0018-project-dossier.patch` stores
a `client.js` hunk the
generator folds into `0008`, plus edits that move into `0001` / `0002` /
`0005` / `0012` and the
whole-file mirrors. Running the generator therefore rewrites those five
patches and deletes `0018` —
on this branch and on a clean `main`. Reproduced on
`e4fe9379b547ed8a739e240df0cf5a4315ee3a10` with nothing of ThinkFlowLab#1887 in the
tree:

```
$ git worktree add --detach /tmp/wt e4fe937 && cd /tmp/wt
$ node scripts/ds-bot-patches.mjs generate
 M patches/ds-bot/0001-core-fixes.patch
 M patches/ds-bot/0002-flybot-api-host.patch
 M patches/ds-bot/0005-social-seams.patch
 M patches/ds-bot/0008-client-bundle.patch
 M patches/ds-bot/0012-room-membership.patch
 D patches/ds-bot/0018-project-dossier.patch
   core/ sha before and after: 10a278b
```

Nothing was hand-edited: on this tip the `core/` tree is exactly what
the generator reproduces, so the
rewritten patches are output, not a merge decision.

```
HEAD:core                                  a6f7732
generate → git add -A; git write-tree → :core
                                           a6f7732
git diff --stat HEAD -- core/              (empty)
$ node scripts/ds-bot-patches.mjs check
ok   ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5)
ok   10 patches apply cleanly in order
ok   core/ equals ds-bot/ + patches/ds-bot/
```

The regenerated series stores 10 patches where `main` stores 11, so
`.github/scripts/ds-bot-patches.test.mjs` (`ThinkFlowLab#978`) now expects 10 and
names `0018` in its existing fold-away comment. This is not a loosened
assertion: on clean `e4fe9379`, with nothing of ThinkFlowLab#1887 on the tree,
`generate` already stores 10 — it rewrites
`0001`/`0002`/`0005`/`0008`/`0012` and deletes `0018` — while `core/`
keeps the same subtree sha `10a278b946a942a6bb28c2cdd546e06f42fa118a`
before and after. 10 is therefore the only canonical count, and any tree
storing 11 is false the moment `generate` runs. The root cause is ThinkFlowLab#1890:
`main` is not generate-canonical, and CI never runs `generate`, so this
drift cannot be seen there. A second `generate` leaves `git status
--porcelain` empty.

## Conflict resolution

Rebased with `git rebase --onto e4fe937 818b71e`; three content
conflicts, all resolved without
dropping a case:

- `core/test/project-board-panels.test.js` and its
`patches/ds-bot/files/` mirror — both sides kept.
ThinkFlowLab#1883's dossier cases are byte-identical to `e4fe9379`'s version and
come first; this change's
`ThinkFlowLab#1887` case and its two rewritten `ThinkFlowLab#1847` cases follow. 15 cases in the
file (9 pre-existing, 3
  dossier, 2 `ThinkFlowLab#1847`, 1 `ThinkFlowLab#1887`).
- `core/client.js` — not merged by hand. The base copy was taken and
`node core/scripts/build-client.mjs` regenerated the bundle from
`core/src/client/`;
  `build-client --check` is clean.

## Red first

Run on `e4fe9379b547ed8a739e240df0cf5a4315ee3a10` with only the source
reverted (`git checkout e4fe937 -- core/src/client/project-board.js`):

```
not ok 1 - ThinkFlowLab#1887: the memory box counts code points and disables Save before the click
  error: |-
    an empty memory box disables Save
    + actual - expected
    + undefined
    - true
# tests 1
# pass 0
# fail 1
```

Exactly the shape the issue names: an empty box leaves Save enabled
today, and there is no counter to
read at 601 or 600. With the fix the same case is `# pass 1`.

## Verification at the tip

`Ran:` at `5af196449b8214d689661746628f7d6453ecdf65` (tree
`af8cc4ca1264a6e8a4fd02144de0943b51b3aad4`) on the committed tree, `git
status --porcelain` empty before and after:

```
$ TZ=UTC ARCH_DOCS_BASE=e4fe9379b547ed8a739e240df0cf5a4315ee3a10 npm run verify
$ node core/scripts/build-client.mjs --check
$ node scripts/ds-bot-patches.mjs check
```

- core: **2286/2286**, including `project-board-panels.test.js`
**15/15** and
  `project-assistant.test.js` **24/24**
- plugins social 541/541, tree 127/127, timeline 135/135, workflow
336/336
- `.github/scripts` 561/561, interop 37/37, live-e2e 24/24
- oxlint: 0 errors (core 73 warnings; plugin lints 36/9/2/16 warnings)
- `build-client --check`: clean
- `arch-docs: OK (14 changed file(s))` with `ARCH_DOCS_BASE=e4fe9379…`
- all four `patches/ds-bot/files/` mirrors this branch carries are
byte-identical to their `core/`
copies (`cmp`: `src/client/project-board.js`,
`test/project-board-panels.test.js`,
  `src/host/project-assistant.js`, `test/project-assistant.test.js`)

`Not run:` the smoke bench (no `index.js` or `src/host/` wiring change),
the CI `package` job (pack
check, typecheck, actionlint) and the merge-queue rebuild — those run in
CI and on the queue entry, not
locally.

## Ordering

This commit's parent is live `main`
`e4fe9379b547ed8a739e240df0cf5a4315ee3a10`, so the branch is parallel to
ThinkFlowLab#1888 (Dev-1's `ThinkFlowLab#1886`),
not stacked on it: nothing of ThinkFlowLab#1886 is in this commit, and this file no
longer carries its case. If
ThinkFlowLab#1888 lands first, this branch rebases onto that `main` and both sides'
cases in
`project-board-panels.test.js` are kept the same way — nothing dropped
either way.

## Checkpoint

<!-- flybot:checkpoint -->
```json
{
  "pr": 1889,
  "claim": "Dev2",
  "issue": 1887,
  "summary": "The Project settings memory box gave no notice of the 600 bound before the click: no counter, and Save stayed enabled on an empty field. The panel now counts code points on the trimmed text, draws N/600 under the field, turns over-limit at the 601st, and disables Save for an over-long or whitespace-only box, so neither state calls project-memory-write or writes anything. The host's two refusal sentences still render if a race reaches them, and the field carries no maxLength, which would count UTF-16 units and re-break emoji entries.",
  "files": [
    "core/src/client/project-board.js",
    "core/client.js",
    "core/test/project-board-panels.test.js",
    "docs/subsystems/core-client.md",
    "changelog.d/1887-memory-counter.fixed.md",
    "patches/ds-bot/0008-client-bundle.patch",
    "patches/ds-bot/files/src/client/project-board.js",
    "patches/ds-bot/files/test/project-board-panels.test.js",
    ".github/scripts/ds-bot-patches.test.mjs"
  ],
  "checks": { "ran": "TZ=UTC ARCH_DOCS_BASE=e4fe9379 npm run verify", "result": "green", "at": "5af196449b8214d689661746628f7d6453ecdf65" },
  "next": "none — ready for review"
}
```
<!-- /flybot:checkpoint -->

Reviewer-metadata (Written-by: Reviewer): set `Reviewer: Reviewer` in
place of the `Reviewer: Birfy` line and left the Dev2 checkpoint as
written; no source change. 2026-10-31T04:33Z

Co-authored-by: FlyBot Dev-2 <dev2@flybot.local>
HugoXK added a commit to HugoXK/FlyBot that referenced this pull request Oct 31, 2026
…e, keep the host counting code points

The queue's merge tree for 818b71e failed Test because the branch's
patches/ds-bot series no longer matched the core/ sources once main moved
(ThinkFlowLab#1883, ThinkFlowLab#1891, ThinkFlowLab#1889). Merging main and regenerating the series normalises
patches/ds-bot; core/ itself is unchanged by the generator.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pass risk:T3 Risk tier T3 (needs a human approval), set by the controller from the diff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Project board shows each Project Bot's dossier (persona, memory, skills), and the owner opens their agent from their own chat

1 participant