CodeForPhilly / CodeForPhilly/codeforphilly-ng

boot: reconcile fast-forward does not re-open the store snapshot, so in-memory state is built from the pre-reconcile tree

オープン
#160 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
TypeScript
スター
1
フォーク
1
平均マージ
5日 3時間
マージ済み PR(30日)
9

説明

## What

`buildApp` registers the plugins in this order: `store` (opens the gitsheets public store; each Sheet caches a `dataTree` snapshot at open time) → `reconcile` (fetch + fast-forward/rebase against `origin/`) → `services` (builds `InMemoryState` + FTS from `fastify.store.public`).

When the local bare clone is behind origin at boot, `reconcile` fast-forwards the branch, but nothing calls `Store.swapPublic` afterwards. `services` then builds the in-memory state from the Sheet snapshots captured before the fast-forward. Records that arrived in the fast-forward are invisible until the next hot-reload webhook or a restart.

The hot-reload path (`reloadInMemoryStateAndFts`) already handles this correctly by re-opening the public store after reconcile. The boot path skips that step.

## Why it hasn't bitten

Production pods bare-clone the data repo on every boot (`emptyDir` volume), so the clone is in sync with origin by the time `reconcile` runs and the outcome is `in-sync`. The gap only shows when a clone is reused across boots: local dev, and tests that seed the remote after creating the rig (see the re-import test in `apps/api/tests/internal-reload.test.ts`, which works around it with an explicit `git fetch origin main:main` before boot).

## Fix sketch

In the `reconcile` plugin (or a small step between it and `services`), when the outcome is anything other than `in-sync`/`fetch-failed`, re-open the public store and `fastify.store.swapPublic(freshPublic)` before `services` reads it. Or reorder so the store opens after reconcile; `reconcile` only needs the repo path and the lock, not the Sheet handles.

Found while working on the hot-reload stale-indices fix (`fix/hot-reload-stale-indices`); out of scope there.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

Start with buildApp's store → reconcile → services registration and compare it with reloadInMemoryStateAndFts. Read apps/api/tests/internal-reload.test.ts, especially the re-import test and its pre-boot fetch workaround. Done means a reused clone produces in-memory state and FTS containing records introduced by the reconcile before services initialize.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
git, typescript
領域
api, backend, search
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
58/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。