From 9a8a01479598d2e83a69ce3e15b91e10389e18e0 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Fri, 8 May 2026 15:00:30 +0200 Subject: [PATCH] docs: close active upstream cherry-pick pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chat 2 has entered a major rework that Infi confirmed makes selective patches no longer portable. The cherry-pick pipeline as a routine workflow stops with the v1.4.x cycle. Documentation reflects the new state across all touchpoints. UPSTREAM_SYNC.md rewritten: replaces the "How I Cherry-Pick" / "Reviewing What Is New Upstream" / "Conflict Handling" sections with "Why Cherry-Picking Stopped", "What Closing the Pipeline Means in Practice", "What Does Not Change", "What Could Re-Open Later". Existing cherry-pick trails in the git history stay intact, EUPL-1.2 anchor lines and NOTICE.md remain canonical. README.md, CONTRIBUTING.md, ROADMAP.md, THIRD_PARTY_NOTICES.md and the PR template updated to match: cherry-pick references reframed as historical or pointed at UPSTREAM_SYNC.md for the current state. NOTICE.md keeps the BetterTTV cherry-pick example as a concrete past case but adds a paragraph that the pipeline is closed and clarifies the attribution standard is preserved unchanged. PULL_REQUEST_TEMPLATE.md drops the "Upstream cherry-pick from Chat 2" checkbox and the cherry-pick-path compatibility prompt. The upstream git remote was already removed locally on 2026-05-08 (separate change, not in this commit). No source-file edits, no manifest version bump, no changelog entry — this is documentation-only and ships with the next release. --- .github/PULL_REQUEST_TEMPLATE.md | 2 - CONTRIBUTING.md | 28 ++++-- NOTICE.md | 27 +++-- README.md | 4 +- docs/ROADMAP.md | 7 +- docs/THIRD_PARTY_NOTICES.md | 5 +- docs/UPSTREAM_SYNC.md | 165 +++++++++++++------------------ 7 files changed, 117 insertions(+), 121 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d4542c0..9245be4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -23,7 +23,6 @@ https://github.com/JonKazama-Hellion/HellionChat/security/advisories/new - [ ] Documentation only - [ ] Translation update - [ ] Build, CI or tooling change -- [ ] Upstream cherry-pick from Chat 2 ## Linked issue @@ -53,7 +52,6 @@ new commands, new translations, removed behaviour. If none, write bump and is it covered by the existing migration tests? - Does this change the schema in MessageStore? - Does this change the repo.json or HellionChat.yaml manifest fields? -- Does this affect the upstream cherry-pick path? See docs/UPSTREAM_SYNC.md. --> ## Checklist diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7de7a9e..1ba0500 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,9 +15,11 @@ to make a contribution land smoothly. - Read the [README](README.md) so you understand the scope: a privacy-focused, EUPL-1.2-licensed Dalamud plugin that intentionally removes the upstream webinterface and ships privacy-first defaults. -- Read [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md). Cherry-picks - from upstream Chat 2 are selective and deliberate; not everything - that lands there belongs here. +- Read [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md). Active + cherry-picking from upstream Chat 2 has ended in the v1.4.x cycle; + HellionChat continues as an independent codebase. Existing + upstream-derived code keeps its attribution. New contributions + stand on their own and do not need to be cherry-pick-compatible. - Read [`SECURITY.md`](SECURITY.md). Anything security-sensitive goes through a private advisory, never a public issue or PR. - Read the [Code of Conduct](CODE_OF_CONDUCT.md). @@ -43,9 +45,11 @@ to make a contribution land smoothly. "Was gegenüber Chat 2 fehlt". - Features that bypass the privacy filter or weaken the default retention behaviour without an explicit, documented opt-in. -- Sweeping refactors that touch large parts of the codebase. They make - selective upstream cherry-picks much harder and the maintenance cost - outweighs the benefit for a one-person project. +- Sweeping refactors that touch large parts of the codebase. The + maintenance cost outweighs the benefit for a one-person project. + (This used to be doubly important because of the upstream + cherry-pick path; that path is closed now, but the rule still + holds on its own merits.) - AI-generated code dropped in without disclosure or human review. See [`docs/AI_DISCLOSURE.md`](docs/AI_DISCLOSURE.md) for how I handle AI assistance on my side; I expect comparable transparency from @@ -117,9 +121,15 @@ Hellion-specific strings live in direct pull requests. The upstream Chat 2 strings in `HellionChat/Resources/Language.*.resx` -are **not** translated here. They are owned by the upstream project -and synced in via cherry-pick. Please contribute those to -[Infiziert90/ChatTwo](https://github.com/Infiziert90/ChatTwo) instead. +are **not** translated here. They are kept as-is from the last +upstream sync and remain the work of the Chat 2 Crowdin community. +Active cherry-picking from upstream ended in the v1.4.x cycle (see +[`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md)), so future +translation improvements to those upstream strings will not flow +into HellionChat automatically anymore. If you have improvements +for the original Chat 2 strings, please contribute them to +[Infiziert90/ChatTwo](https://github.com/Infiziert90/ChatTwo) +directly. ## Licensing diff --git a/NOTICE.md b/NOTICE.md index 786f887..9043229 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -35,9 +35,19 @@ edits minimal, isolated to clearly-marked Hellion files, and reversible. Concrete example: when API 15 hit, I cherry-picked your fix for the BetterTTV emote regression with `git cherry-pick -x` so authorship and -co-author trail stay intact. That is the standard I want to keep using as -long as both projects are alive. You should never have to look at this -fork and wonder if I quietly ate your work. +co-author trail stay intact. That was the standard I held to as long +as cherry-picking was viable, and you should never have to look at +this fork and wonder if I quietly ate your work. + +With ChatTwo entering its rework cycle, the active cherry-pick +pipeline is closed since v1.4.x — see [docs/UPSTREAM_SYNC.md](docs/UPSTREAM_SYNC.md) +for the full reasoning. The attribution standard stays exactly the +same: every existing `(cherry picked from commit ...)` line remains +in the git history, the EUPL-1.2 anchor lines in source files are +untouched, and this NOTICE.md remains canonical. If anything from +this point forward originates from Chat 2 it will be a hand-port at +most, called out as such in the commit message and source comments, +not a `git cherry-pick`. If anything in this fork ever steps on something you would not be okay with, please reach out and I will fix it. Genuinely. The list of contacts @@ -62,8 +72,10 @@ full-history-by-default position fits a much larger one, including the roleplaying community where chat archive is part of the play experience. Trying to upstream HellionChat's defaults would have meant arguing that Chat 2's defaults are wrong, and they are not. They are right for the -user base ChatTwo serves. So I keep the fork separate, attribute clearly, -and pull selected upstream patches when they apply. +user base ChatTwo serves. So I keep the fork separate and attribute +clearly. Active cherry-picking from upstream stopped in the v1.4.x +cycle once Chat 2's rework made selective patches no longer portable; +the existing cherry-pick trail stays in the git history. ## Why HellionChat left the GitHub fork network @@ -72,8 +84,9 @@ that a fork is either a development branch or a dead mirror. HellionChat is neither. It is an independently-maintained EUPL-1.2 fork with its own release cadence, its own custom repo, its own user base. Detaching the fork-network relation just makes the situation honest. The git history, -the cherry-pick trail, and the attribution stay exactly the same. The -only thing that changes is the GitHub UI no longer says "forked from". +the existing cherry-pick trail, and the attribution stay exactly the +same. The only thing that changes is the GitHub UI no longer says +"forked from". ## Trademarks and naming diff --git a/README.md b/README.md index 992f6e3..b01f483 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Hellion Chat ist ein Privacy-First-Plugin auf dem Chat-2-Fundament. Der größte Der Daten-Handling-Fokus liegt auf den DSGVO/EU-, US- und JP-Regelungen, soweit für ein Chat-Plugin praktisch umsetzbar: Speicherzeit pro Kanal, granulare Filter, Selbstauskunft per Export. Eine ausführliche Auflistung steht in [`PRIVACY.md`](PRIVACY.md). -Eigenständiges Repository, EUPL-1.2-lizenziert. Mit v1.0.0 ist der Standalone-Cut abgeschlossen: eigener Namespace `HellionChat.*`, eigene IPC-Kanäle, eigene Source-Tree-Struktur. Distribution über Custom-Repo. Selektive Cherry-Picks von Upstream-Chat-2 nach Bedarf, dokumentiert in [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md). +Eigenständiges Repository, EUPL-1.2-lizenziert. Mit v1.0.0 ist der Standalone-Cut abgeschlossen: eigener Namespace `HellionChat.*`, eigene IPC-Kanäle, eigene Source-Tree-Struktur. Distribution über Custom-Repo. Aktiver Upstream-Sync ist mit dem v1.4.x-Cycle beendet: Chat 2 befindet sich in einem grundlegenden Rework und Cherry-Picks sind nicht mehr portierbar. Hellion Chat geht ab da als unabhängige Codebase weiter, Hintergrund und Attribution in [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md). ## Acknowledgements @@ -311,7 +311,7 @@ Im Repo-Root liegen die Standard-Repository-Dokumente, vertiefende Dokumentation | [`docs/LEARNING-JOURNEY.md`](docs/LEARNING-JOURNEY.md) | Entwicklungsgeschichte, vom Web-Stack zu C# / Dalamud, was ich aus dem Fork gelernt habe. | | [`docs/IPC.md`](docs/IPC.md) | IPC-Kanal-Reference, Tuple-Payload-Felder, Migrations-Diff für Drittplugins. | | [`docs/THEME-AUTHORING.md`](docs/THEME-AUTHORING.md) | Theme-Engine-Authoring-Guide (EN): JSON-Schema, Color- und Layout-Slots, Channel-Identity-Regeln, Validierung. | -| [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md) | Cherry-Pick-Policy gegenüber Chat 2. | +| [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md) | Upstream-Sync-Stand: Cherry-Pick-Pipeline seit v1.4.x geschlossen, Attribution intakt. | | [`docs/THIRD_PARTY_NOTICES.md`](docs/THIRD_PARTY_NOTICES.md) | NuGet-Dependencies mit Lizenzen, Bundled Assets, Network-Status pro Komponente. | | [`docs/AI_DISCLOSURE.md`](docs/AI_DISCLOSURE.md) | Offenlegung der KI-Unterstützung im Entwicklungsprozess. | diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index a613750..9abaa0d 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -203,6 +203,7 @@ aktuellen Stand getestet. Hellion Chat ist EUPL-1.2-lizenziert. Konzept-Imports aus AGPL-3.0-Plugins (z.B. XIV Instant Messenger) sind ausschließlich architektonische -Inspiration, kein Code-Port. Imports aus dem GPL-3.0-kompatiblen -Upstream-Bestand laufen weiter über -[`UPSTREAM_SYNC.md`](UPSTREAM_SYNC.md). +Inspiration, kein Code-Port. Code-Imports aus dem Upstream-Bestand +sind seit v1.4.x abgeschlossen, weil Chat 2 in einem grundlegenden +Rework ist und selektive Patches nicht mehr sauber portierbar sind. +Stand und Begründung in [`UPSTREAM_SYNC.md`](UPSTREAM_SYNC.md). diff --git a/docs/THIRD_PARTY_NOTICES.md b/docs/THIRD_PARTY_NOTICES.md index 5a79c65..5255fbc 100644 --- a/docs/THIRD_PARTY_NOTICES.md +++ b/docs/THIRD_PARTY_NOTICES.md @@ -51,8 +51,9 @@ HellionChat is a fork of [Chat 2](https://github.com/Infiziert90/ChatTwo) by Infiziert90 (Infi) and Anna Clemens, also licensed under EUPL-1.2. The bulk of the code, including the message store architecture, the channel logic, the hook system and the ImGui chat window, originates -from upstream. See `../NOTICE.md` and `UPSTREAM_SYNC.md` for the -attribution and the cherry-pick policy. +from upstream. See `../NOTICE.md` for the attribution; `UPSTREAM_SYNC.md` +documents the upstream-sync history, including the close of active +cherry-picking in the v1.4.x cycle. --- diff --git a/docs/UPSTREAM_SYNC.md b/docs/UPSTREAM_SYNC.md index 8bbd786..b5be49a 100644 --- a/docs/UPSTREAM_SYNC.md +++ b/docs/UPSTREAM_SYNC.md @@ -2,12 +2,12 @@ HellionChat is a standalone EUPL-1.2 plugin that originated from [Chat 2](https://github.com/Infiziert90/ChatTwo). Since v1.0.0 it -lives under its own namespace, IPC channels and source tree. I no -longer track upstream as a Git fork, but I do monitor Chat 2 commits -regularly and cherry-pick selectively where it makes sense. +lives under its own namespace, IPC channels and source tree. The +active cherry-pick pipeline from upstream Chat 2 is closed since +the v1.4.x cycle. -This document covers how that works so anyone (including future-me) -can do it cleanly. +This document covers what that means, why I closed it, and what +stays in place. ## A Word on Intent @@ -28,99 +28,77 @@ new UI from scratch and making deliberate architectural decisions that pull in a different direction. Some upstream patches will simply stop applying cleanly and that is expected. -## One-Time Setup +## Why Cherry-Picking Stopped in v1.4.x -Add the upstream repo as a remote on a fresh clone: +Two things converged: -```bash -git remote add upstream https://github.com/Infiziert90/ChatTwo.git -git fetch upstream -``` +1. **Chat 2 is in a rework cycle.** Infi mentioned directly that + parts of ChatTwo are being reworked and "stuff may not be able to + be cherry picked anymore." Once the upstream code paths I would + pull from no longer exist in the same shape, `git cherry-pick` + stops being a meaningful tool — what would land would not be the + change Infi wrote, it would be a hand-port of his concept. +2. **HellionChat has drifted enough that selective patches require + adaptation anyway.** The UI is being rebuilt, the theme engine + sits on top of HellionStyle which has no upstream equivalent, the + privacy filter changes how messages flow through MessageManager. + Even before the rework was announced, more and more upstream + patches needed adaptation rather than a clean apply. -Verify both remotes are wired up: +Together those two points mean continuing to call this an "active +cherry-pick pipeline" was no longer honest. So I closed it. -```bash -git remote -v -# origin https://github.com/JonKazama-Hellion/HellionChat.git (fetch) -# origin https://github.com/JonKazama-Hellion/HellionChat.git (push) -# upstream https://github.com/Infiziert90/ChatTwo.git (fetch) -# upstream https://github.com/Infiziert90/ChatTwo.git (push) -``` +## What Closing the Pipeline Means in Practice -`upstream` is read-only. Never push to it. +- The `upstream` git remote was removed locally on 2026-05-08. + Anyone setting up a fresh clone does **not** add it back. +- New commits will not carry `(cherry picked from commit ...)` + trailers. Anything that originates from Chat 2 from this point + forward will be a hand-port at most, and it gets called out as + such in its own commit message and in the relevant source comments. +- The existing cherry-pick trail stays in the git history exactly as + it is. Every `(cherry picked from commit ...)` line that was added + with `-x` in earlier releases remains intact; that is the + attribution paper trail and removing it would be wrong. -## Reviewing What Is New Upstream +## What Does Not Change -Before any feature cycle I run a quick check: +- **EUPL-1.2 anchor lines in source files.** Files that originated + from Chat 2 keep their licence headers and any "based on + Infiziert90/ChatTwo" notice exactly as they are. The licence + obligations under EUPL-1.2 do not lapse because cherry-picking + stopped. +- **NOTICE.md** stays canonical. Attribution to Infi and Anna for the + message store, channel logic, hook system, ImGui chat window and + the localisation infrastructure remains the foundation statement of + this fork. +- **README acknowledgements.** The Acknowledgements section in + `README.md`, the maintainer thanks in the About tab, and the + `Language.*.resx` Crowdin translator credit list all stay as they + are. +- **The original `Language.*.resx` files** remain in the source tree + in their last upstream-sync state. They are the work of the Chat 2 + Crowdin community and the existing translations stay valuable. They + will not receive automatic upstream updates anymore — see + CONTRIBUTING.md for what that means for translators. -```bash -git fetch upstream -git log --oneline main..upstream/main | head -30 -``` +## What Could Re-Open Later -That shows every commit Infi or contributors landed since the last -sync. I read the messages and decide which ones apply to HellionChat. +If Chat 2's rework lands and stabilises, and there is a piece of +upstream code that I genuinely want in HellionChat, the path forward +is **study and re-implement**, not cherry-pick. That means: -## What I Cherry-Pick +- Read the upstream change, understand the design, port the concept + to HellionChat's actual code paths. +- Credit the upstream author in the commit message and, if the + ported code is non-trivial, in a source-file comment. +- Pre-clear with Infi if the port is large enough to warrant a + conversation. -**Always:** security fixes, Dalamud API compatibility patches, -BetterTTV and emote-cache fixes, regression fixes for upstream -behaviour HellionChat still relies on. - -**Sometimes:** small bug fixes in `MessageManager.cs`, -`MessageStore.cs`, `ChatLogWindow.cs`, the Tabs system. These come in -when they touch code I have not heavily modified. - -**Never:** webinterface changes (the entire webinterface tree is gone -in HellionChat), changes that conflict with the privacy filter, changes -that re-add upstream defaults I deliberately reversed (full-history -logging, Tell Exclusive defaults, etc.). - -As HellionChat's UI moves further from the Chat 2 baseline, upstream -patches will increasingly require adaptation rather than a clean -apply. If a patch cannot be ported without breaking HellionChat -behaviour or the privacy model, I skip it rather than force a -compromised version in. - -## How I Cherry-Pick - -Always with `-x` so authorship and the original commit hash stay -visible: - -```bash -git checkout -b sync/upstream- main -git cherry-pick -x -``` - -`-x` appends a `(cherry picked from commit )` line to the commit -message. That preserves upstream-author credit and lets anyone reading -`git log` trace the change back to Chat 2. Commit messages stay -identical to the upstream original; I do not rewrite them to match the -HellionChat format. - -## Conflict Handling - -When a cherry-pick conflicts: - -1. Resolve by hand. Do not rewrite upstream code to match HellionChat - conventions; that is what the merge marker showed. -2. If the conflict is fundamental (touches code that no longer exists - in HellionChat), abort the cherry-pick and note why in the - relevant GitHub issue or backlog item. Some upstream patches are - simply not portable and that is fine. -3. After a clean resolve the commit message stays as-is, with the - `-x` footer Git appends automatically. - -## Pushing the Sync - -Cherry-picked commits go through the same review as any other change. -The sync branch lands in `main` via a no-fast-forward merge, then gets -a release tag if user-visible behaviour changed: - -```bash -git checkout main -git merge --no-ff sync/upstream- -m "merge: upstream sync — " -``` +This is heavier than `git cherry-pick -x` and that is the point. +Cherry-picking was light because both codebases shared structure; +once they do not, the proper attribution costs a real conversation +rather than a flag on a git command. ## Contributing Back @@ -138,17 +116,12 @@ A few things to note about that process: not push that decision onto his codebase. - This is not guaranteed for every change, only where it makes sense and where I am confident the fix is clean and self-contained. - -## When Upstream Goes Silent - -If Chat 2 stops receiving updates the remote stays configured and this -workflow stays documented. The moment maintenance picks back up I am -ready to pull again. +- Whether it gets accepted is Infi's call, and a "no" is fine. ## When Upstream Takes a Direction I Cannot Follow If a future Chat 2 release breaks compatibility with the HellionChat privacy philosophy in a way that cannot be resolved (mandatory cloud -sync, removal of the local message store, an incompatible license -change), HellionChat continues from the last compatible cherry-pick. -The inherited history stays under EUPL-1.2 and stays attributed. +sync, removal of the local message store, an incompatible licence +change), HellionChat continues from where it is. The inherited +history stays under EUPL-1.2 and stays attributed.