docs: close active upstream cherry-pick pipeline

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.
This commit is contained in:
2026-05-08 15:00:30 +02:00
parent 9640d336a6
commit 9a8a014795
7 changed files with 117 additions and 121 deletions
-2
View File
@@ -23,7 +23,6 @@ https://github.com/JonKazama-Hellion/HellionChat/security/advisories/new
- [ ] Documentation only - [ ] Documentation only
- [ ] Translation update - [ ] Translation update
- [ ] Build, CI or tooling change - [ ] Build, CI or tooling change
- [ ] Upstream cherry-pick from Chat 2
## Linked issue ## 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? bump and is it covered by the existing migration tests?
- Does this change the schema in MessageStore? - Does this change the schema in MessageStore?
- Does this change the repo.json or HellionChat.yaml manifest fields? - 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 ## Checklist
+19 -9
View File
@@ -15,9 +15,11 @@ to make a contribution land smoothly.
- Read the [README](README.md) so you understand the scope: a - Read the [README](README.md) so you understand the scope: a
privacy-focused, EUPL-1.2-licensed Dalamud plugin that intentionally privacy-focused, EUPL-1.2-licensed Dalamud plugin that intentionally
removes the upstream webinterface and ships privacy-first defaults. removes the upstream webinterface and ships privacy-first defaults.
- Read [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md). Cherry-picks - Read [`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md). Active
from upstream Chat 2 are selective and deliberate; not everything cherry-picking from upstream Chat 2 has ended in the v1.4.x cycle;
that lands there belongs here. 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 - Read [`SECURITY.md`](SECURITY.md). Anything security-sensitive goes
through a private advisory, never a public issue or PR. through a private advisory, never a public issue or PR.
- Read the [Code of Conduct](CODE_OF_CONDUCT.md). - 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". "Was gegenüber Chat 2 fehlt".
- Features that bypass the privacy filter or weaken the default - Features that bypass the privacy filter or weaken the default
retention behaviour without an explicit, documented opt-in. retention behaviour without an explicit, documented opt-in.
- Sweeping refactors that touch large parts of the codebase. They make - Sweeping refactors that touch large parts of the codebase. The
selective upstream cherry-picks much harder and the maintenance cost maintenance cost outweighs the benefit for a one-person project.
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 - AI-generated code dropped in without disclosure or human review. See
[`docs/AI_DISCLOSURE.md`](docs/AI_DISCLOSURE.md) for how I handle [`docs/AI_DISCLOSURE.md`](docs/AI_DISCLOSURE.md) for how I handle
AI assistance on my side; I expect comparable transparency from AI assistance on my side; I expect comparable transparency from
@@ -117,9 +121,15 @@ Hellion-specific strings live in
direct pull requests. direct pull requests.
The upstream Chat 2 strings in `HellionChat/Resources/Language.*.resx` The upstream Chat 2 strings in `HellionChat/Resources/Language.*.resx`
are **not** translated here. They are owned by the upstream project are **not** translated here. They are kept as-is from the last
and synced in via cherry-pick. Please contribute those to upstream sync and remain the work of the Chat 2 Crowdin community.
[Infiziert90/ChatTwo](https://github.com/Infiziert90/ChatTwo) instead. 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 ## Licensing
+20 -7
View File
@@ -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 Concrete example: when API 15 hit, I cherry-picked your fix for the
BetterTTV emote regression with `git cherry-pick -x` so authorship and 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 co-author trail stay intact. That was the standard I held to as long
long as both projects are alive. You should never have to look at this as cherry-picking was viable, and you should never have to look at
fork and wonder if I quietly ate your work. 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 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 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. roleplaying community where chat archive is part of the play experience.
Trying to upstream HellionChat's defaults would have meant arguing that 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 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, user base ChatTwo serves. So I keep the fork separate and attribute
and pull selected upstream patches when they apply. 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 ## 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 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 release cadence, its own custom repo, its own user base. Detaching the
fork-network relation just makes the situation honest. The git history, fork-network relation just makes the situation honest. The git history,
the cherry-pick trail, and the attribution stay exactly the same. The the existing cherry-pick trail, and the attribution stay exactly the
only thing that changes is the GitHub UI no longer says "forked from". same. The only thing that changes is the GitHub UI no longer says
"forked from".
## Trademarks and naming ## Trademarks and naming
+2 -2
View File
@@ -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). 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 ## 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/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/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/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/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. | | [`docs/AI_DISCLOSURE.md`](docs/AI_DISCLOSURE.md) | Offenlegung der KI-Unterstützung im Entwicklungsprozess. |
+4 -3
View File
@@ -203,6 +203,7 @@ aktuellen Stand getestet.
Hellion Chat ist EUPL-1.2-lizenziert. Konzept-Imports aus AGPL-3.0-Plugins Hellion Chat ist EUPL-1.2-lizenziert. Konzept-Imports aus AGPL-3.0-Plugins
(z.B. XIV Instant Messenger) sind ausschließlich architektonische (z.B. XIV Instant Messenger) sind ausschließlich architektonische
Inspiration, kein Code-Port. Imports aus dem GPL-3.0-kompatiblen Inspiration, kein Code-Port. Code-Imports aus dem Upstream-Bestand
Upstream-Bestand laufen weiter über sind seit v1.4.x abgeschlossen, weil Chat 2 in einem grundlegenden
[`UPSTREAM_SYNC.md`](UPSTREAM_SYNC.md). Rework ist und selektive Patches nicht mehr sauber portierbar sind.
Stand und Begründung in [`UPSTREAM_SYNC.md`](UPSTREAM_SYNC.md).
+3 -2
View File
@@ -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. by Infiziert90 (Infi) and Anna Clemens, also licensed under EUPL-1.2.
The bulk of the code, including the message store architecture, the The bulk of the code, including the message store architecture, the
channel logic, the hook system and the ImGui chat window, originates channel logic, the hook system and the ImGui chat window, originates
from upstream. See `../NOTICE.md` and `UPSTREAM_SYNC.md` for the from upstream. See `../NOTICE.md` for the attribution; `UPSTREAM_SYNC.md`
attribution and the cherry-pick policy. documents the upstream-sync history, including the close of active
cherry-picking in the v1.4.x cycle.
--- ---
+69 -96
View File
@@ -2,12 +2,12 @@
HellionChat is a standalone EUPL-1.2 plugin that originated from HellionChat is a standalone EUPL-1.2 plugin that originated from
[Chat 2](https://github.com/Infiziert90/ChatTwo). Since v1.0.0 it [Chat 2](https://github.com/Infiziert90/ChatTwo). Since v1.0.0 it
lives under its own namespace, IPC channels and source tree. I no lives under its own namespace, IPC channels and source tree. The
longer track upstream as a Git fork, but I do monitor Chat 2 commits active cherry-pick pipeline from upstream Chat 2 is closed since
regularly and cherry-pick selectively where it makes sense. the v1.4.x cycle.
This document covers how that works so anyone (including future-me) This document covers what that means, why I closed it, and what
can do it cleanly. stays in place.
## A Word on Intent ## 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 pull in a different direction. Some upstream patches will simply stop
applying cleanly and that is expected. 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 1. **Chat 2 is in a rework cycle.** Infi mentioned directly that
git remote add upstream https://github.com/Infiziert90/ChatTwo.git parts of ChatTwo are being reworked and "stuff may not be able to
git fetch upstream 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 ## What Closing the Pipeline Means in Practice
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)
```
`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 ## What Could Re-Open Later
git fetch upstream
git log --oneline main..upstream/main | head -30
```
That shows every commit Infi or contributors landed since the last If Chat 2's rework lands and stabilises, and there is a piece of
sync. I read the messages and decide which ones apply to HellionChat. 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, This is heavier than `git cherry-pick -x` and that is the point.
BetterTTV and emote-cache fixes, regression fixes for upstream Cherry-picking was light because both codebases shared structure;
behaviour HellionChat still relies on. once they do not, the proper attribution costs a real conversation
rather than a flag on a git command.
**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-<topic> main
git cherry-pick -x <upstream-commit-sha>
```
`-x` appends a `(cherry picked from commit <sha>)` 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-<topic> -m "merge: upstream sync — <topic>"
```
## Contributing Back ## Contributing Back
@@ -138,17 +116,12 @@ A few things to note about that process:
not push that decision onto his codebase. not push that decision onto his codebase.
- This is not guaranteed for every change, only where it makes sense - This is not guaranteed for every change, only where it makes sense
and where I am confident the fix is clean and self-contained. and where I am confident the fix is clean and self-contained.
- Whether it gets accepted is Infi's call, and a "no" is fine.
## 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.
## When Upstream Takes a Direction I Cannot Follow ## When Upstream Takes a Direction I Cannot Follow
If a future Chat 2 release breaks compatibility with the HellionChat If a future Chat 2 release breaks compatibility with the HellionChat
privacy philosophy in a way that cannot be resolved (mandatory cloud privacy philosophy in a way that cannot be resolved (mandatory cloud
sync, removal of the local message store, an incompatible license sync, removal of the local message store, an incompatible licence
change), HellionChat continues from the last compatible cherry-pick. change), HellionChat continues from where it is. The inherited
The inherited history stays under EUPL-1.2 and stays attributed. history stays under EUPL-1.2 and stays attributed.