Repository navigation
Upstream divergence inventory: 402 ahead / 896 behind (v7.1.2 -> v10.3.0) — PR audit, risk table, resync options #267
Description
Context
User mandate 26/09 ("pérennisation upstream"), coordinator GO 19:09Z (grains a+b, carrier po-2025). Deliverable = divergence risk table + owner-arbitration list, feeding the resync-strategy arbitration (c).
Facts, measured from the hub clone: merge-base 980ea089 (2026-05-09, v7.1.2); 402 commits ahead / 896 behind; upstream now at v10.3.0 (2026-09-24), with three breaking majors (8.0, 9.0, 10.0) and 10.x releases every 1-3 days through September.
(a) The 402, classified by path footprint
| Class | Count | Upstream-relevant? |
|---|---|---|
Carries packages/** (core) |
181 | yes — the only part that matters for resync |
Fleet-only paths (scripts/, docs/reference/, docs/deployment/, .claude/, .env.sidecar.example) |
106 | no (individual scripts could be offered as optional tooling) |
| Root docs / CLAUDE.md decision records | 35 | no (fleet knowledge layer) |
| Merge commits | 80 | — |
Core-commit themes (by subject): stream/SSE robustness ~57 (never-hang family, S4 index-mapping, finalize, first-event watchdog) · failover/budget ~30 · tool handling ~23 · capture ~19 · thinking dialects ~14 · openai-ingress ~13 · relay ~12 · GLM ~12.
(b) Upstream PR audit — all 21 PRs ever opened against MadAppGang/claudish
0 merged as-is. 1 open. 20 closed — but Read-Body changes the reading completely:
- 5 opened against the wrong repo by mistake (feat(failover): role-as-failover-step - a cascade step can delegate to another role #274, feat(scripts): qwen monthly-credit guard — two-point calibration, now calibrated live (P0 71.4% → P1 41%) #260, Hub strips images silently: vision agents answer blind (glm-4.6v, glm-5.3-flash) -- catalog fail-closed + dead vision proxy #222, fix(proxy): pin the native lane to the configured role model #218, chore: ignore Python bytecode from the scripts/ analysis organs #147) — the known
gh pr createtargets-the-parent trap, hit five times. Process fix candidate. - 4 self-closed as superseded/reshaped (fix(parsers): invalid_prompt policy refusals — anthropic-sse + openai-sse lanes, counting marker #137, feat(capability): wire the negotiated capability vocabulary (#83) #135, fix(failover): per-session dwell — one conversation, one provider switch per dwell (#91 point 4) #128, fix(scripts): forward -Recreate through the standalone drain path #125 — fix(scripts): forward -Recreate through the standalone drain path #125 after the owner asked for header names we could not produce without a Max sub).
- 11 closed by the owner (erudenko) who reimplemented the change himself, always with credit: Invoke-GitBounded REPLACES the global git config, so untracked-only(N) is inflated where a global excludesFile exists #184→fix(scripts): invert relaunch-preflight execute — a GUI-up invocation is a false green (#205) #207 (v7.58.0), fix(watchdog): let git answer under SYSTEM — scoped safe.directory via GIT_CONFIG_GLOBAL (#182) #183→compress-captures: a second producer destroys the first machine's day in the shared off-site namespace #201, feat(scripts): persist docker container lifecycle events — collector, no actuator (#169) #180→fix(scripts): invert relaunch-preflight execute — a GUI-up invocation is a false green (#205) #207, fix(failover): a 429 naming a window is a burst even in quota vocabulary #143→Detect the Docker Desktop forwarder wedge and tell it apart from a hub hang — detection only, no actuator #172 ("branch had gone conflicting"), isQuotaExhaustion matche "quota" nu : un 429 par-minute arme le switch hebdomadaire #140→PROVENANCE reads 'unversioned (exit 128)' under SYSTEM: git refuses the operator-owned tree (dubious ownership) #182, feat(scripts): compaction telemetry across lanes (#89) #134→feat(tokens): split prompt_tokens into the three input counters (S4-c — la table S4-b est épuisée) #179, fix(failover): grow the arm TTL while the wall holds (#91 point 3) #127→fix(scripts): relaunch preflight reads high-bit HRESULTs as [long]; already-running task becomes SKIPPED #200 ("the fixtures are what made it possible"), fix(failover): factual notices + enumerate remaining fallbacks (doctrine 2026-08-23) #126→228db3c, drain.ps1: standalone (-File) path cannot recreate — -Recreate degrades to a plain docker restart #124/fix(never-hang): bound the first-useful-event deadline — keep-alive-only streams no longer hold hub slots ~900s #123 fixed on main, docs(sidecar): an armed cascade lives in no env file, so a recreate destroys it #142 close-never-fired, feat(capability): negotiated capability vocabulary module + design spec (#83) #133 answered by other means. One unexplained: feat(scripts): harness block detection beyond messages[0] (#23 L1) #138 (closed, zero comments).
Owner's standing pattern: he does not maintain fork PRs; he absorbs findings and reimplements them in his own architecture, crediting the finder. On #184 he re-verified our premise himself, apologized for a premature close, asked us to send the fix, then built it anyway and apologized for the reversal ("The finding is yours and the commit says so"). Implication: the contribution currency upstream is precise findings + fixtures, not long-lived PRs.
The one live thread: #237 (Fable version-independent mapping) — open since 09-11, zero owner response (only the Claude bot review-disabled comment). Last genuine upstream contribution attempt.
Key negative finding: the findings->upstream pipeline stopped mid-September. None of the September core work (S4-a/b, never-hang corpus re-check, #108 first-event watchdog, #170 pre-visible re-forward, policy-refusal retry, OpenAI ingress, #262 sanitizer, #264 anti-revisit) has been offered upstream.
Risk table
| # | Risk | Evidence | Severity |
|---|---|---|---|
| R1 | Rebase-based resync can never converge | Upstream 10.x every 1-3 days vs our fleet-release cadence; #143 already closed for conflicts; 3 breaking majors since fork | Critical |
| R2 | Duplicate implementations on naive rebase | At least 8 of our merged fixes already exist upstream in reimplemented form (capture/error-body persistence, index clamping, input_tokens forwarding, inline-system strip, billing-header strip, GLM burst handling, server_tool_use suppression, custom-endpoint streamFormat) | High |
| R3 | Fleet-critical differentiators have no upstream home | relay/sidecar topology, budget failover, drain/twins, capture fleet, Qwen/GLM guards all carry production traffic; a resync movement must quarantine them as a fleet layer | High |
| R4 | Findings pipeline stalled | No upstream offer since 09-11 (#237); our September robustness work is invisible to the owner | Medium |
| R5 | Wrong-repo PR mistakes recur | 5 occurrences; the gh pr create parent-target trap is known but unfixed in our flow |
Low |
Options for arbitration (c) — NOT decided here
- (i) Rebase onto v10.3 — refuted by R1 (cadence mismatch).
- (ii) Fleet-layer quarantine + batched porting — declare the fork a long-lived derivative; refactor our core deltas behind stable seams (the three-layer adapter architecture is already that seam); port upstream releases as features on OUR cadence; resume contributing findings + fixtures upstream (owner's stated currency). Requires a dedupe pass first (R2).
- (iii) Full reset on v10.3 + re-apply fleet layer — highest cost/risk, fallback if (ii) fails.
Recommendation (for coordinator then user): (ii), dedupe pass first, quarterly port window, findings-pipeline revival (R4) as the cheap high-value half.
Verification trail
- Classification:
git log upstream/main..main --format=@@ --name-only+ path-footprint awk (scripts, counts above, 402 total). - PR states:
gh pr list --author jsboige --state all+ per-PR last-comment reads (Read-Body rule). - Versions: upstream CHANGELOG.md + package.json at upstream/main (10.3.0, 2026-09-24).
🤖 Generated with Claude Code
Activity
jsboige commentedon Oct 11, 2026
[po-203] Compteurs rafraîchis (deep-queue repli du 11/10, ~02:00Z) — l'inventaire du 26/09 est périmé sur les deux axes.
980ea089(2026-05-09, v7.1.2)2e4ac246Lecture : les deux côtés avancent au même rythme (~8 commits/j chacun) et l'écart net continue de s'élargir d'environ 15 commits/jour — 15 jours de plus sans arbitrage (c) ajoutent ~225 commits des deux côtés à la future resync. Aucun des compteurs ne se referme seul.
Inchangé par ailleurs : la base de fusion (2026-05-09) et donc la structure de l'analyse (a)/(b) du corps — les 181 commits cœur flotte du 26/09 sont devenis ~200+ au même périmètre
packages/**, les thèmes dominants identiques (never-hang, failover, ingress). L'arbitrage (c) — stratégie de resync — reste le seul geste qui change la pente, et il est toujours en attente côté user.(Mesure :
git fetch upstream --tags+rev-list --countdes deux côtés du merge-base, clone po-203.)