Skip to content

chore: back-merge main into development to clear the release conflict - #481

Merged
MP2EZ merged 6 commits into
developmentfrom
chore/backmerge-main-into-dev
Sep 9, 2026
Merged

chore: back-merge main into development to clear the release conflict#481
MP2EZ merged 6 commits into
developmentfrom
chore/backmerge-main-into-dev

Conversation

@MP2EZ

@MP2EZ MP2EZ commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Zero content change. The merge result is byte-identical to developmentgit diff origin/development is empty. This commit exists only to record main's history so git stops seeing divergence.

Why the release PR conflicted

The v1.3.0 release PR (#480) opened CONFLICTING even though /b-release Phase 2.4 found no divergence. Both were correct:

  • main carries hotfix PR fix: DEBUG-534 privacy policy names a control the app does not provide (hotfix to main) #435 (d1e6e840, DEBUG-534 legal copy), backported to development by cherry-pick as 4b2119d7 per the documented Hotfix Process. Cherry-pick rewrites the SHA, so Phase 2.4's --cherry-pick --right-only patch-id check correctly reported that main has no unique content.
  • But development then moved past that content — DEBUG-545 took privacy-policy.md 1.10 → 1.11 and added three DPIA changelog rows. Git sees two independent edits to the same regions, so a textual conflict remains even though one side is a strict superset.

Resolution — development's side in both, being the superset

File main development Taken
docs/legal/privacy-policy.md Version: 1.10 Version: 1.11 dev
docs/legal/dpia-sensitive-wellness-data.md (empty side) rows 2.10 / 2.11 / 2.12 dev

docs/architecture/analytics-architecture.md auto-merged and is also unchanged from development.

Worth recording

CLAUDE.md's Hotfix Process says that after a cherry-pick backport "git handles identical content gracefully on the next release PR." That holds only while development does not subsequently edit the same lines. It did, and the conflict surfaced at release time rather than at backport time.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CkZagJp7dzojvrjY7uYwkh

MP2EZ and others added 6 commits July 12, 2026 18:29
…t does not exist

The policy directed users to "Settings > Privacy > Delete Analytics Data".
That control was removed as a non-functional stub (MAINT-173) and is absent
from app/src, so the copy was an affirmative representation about a named
control the app does not provide — the FTC Act §5 deception shape.

Remedy (b): correct the copy, do not build the control. Compliance ruled that
CCPA/GDPR/TDPSA require a designated request method rather than a self-service
in-app control. Building it was independently rejected because usePostHog()
returns undefined whenever the provider is unmounted — the analytics-OFF state,
i.e. exactly when a user would reach for the control — so handleAnalyticsDeletion
no-ops and still returns success, reproducing the misrepresentation in code.

The replacement copy states only what is verifiable in source and already
published elsewhere in the same document: analytics is opt-in default OFF,
toggling it off stops collection immediately, server-side events are deleted
after 90 days (§7.2), and earlier deletion is available via privacy@being.fyi,
honored within 30 days (§7.3).

Also corrected, because the same defect had two other shapes:
- The identical claim was mirrored at docs/architecture/analytics-architecture.md,
  which no legal tooling watches. Left alone it would re-seed the claim from an
  internal doc presenting itself as the policy's mirror.
- Five further stale in-app paths across privacy-policy, california-privacy and
  support. There is no "Settings" navigation root at all — the tab is Profile and
  the screen is "Privacy & Data". Export and Delete Account do exist, so those
  were path-naming defects, not missing controls. The iOS system path
  "Settings > Apple ID > Subscriptions" is not app navigation and is unchanged.

Adds app/__tests__/privacy/analyticsControlClaims.privacy.test.ts, run by CI's
Safety + privacy gates. It asserts the relation none of the three existing guards
covered: legal-registry.js compares filenames and never reads prose;
legal-site-freshness.js derives both sides of its comparison from the same
markdown, so it fingerprinted the deception as fresh; and
consumer-privacy-posture.test.ts never opens docs/legal. The new check asserts
that a control path named in the legal copy resolves to a real label in
PrivacyDataScreen.tsx.

Per DEBUG-390, markdown is matched on the DIRECTIVE shape rather than bare
presence, so the DPIA change log can record what it corrected without tripping
its own guard; source is comment-stripped so the MAINT-173 prose warning does
not match. A matcher-integrity block proves every regex still fires.

legalContent.generated.ts is gitignored (app/.gitignore, DEBUG-178) and
regenerates on postinstall/prestart/preios, so it is deliberately absent from
this diff and must never be hand-edited.

Verified: test:privacy 542 passed; legal-registry consistent;
check:ci-test-coverage consistent; typecheck clean; no new lint errors.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMQzeUa97ZCj4mnE1ZMLzS
fix: DEBUG-534 privacy policy names a control the app does not provide (hotfix to main)
Records `main`'s history on `development` with ZERO content change. The
resolved tree is byte-identical to `origin/development` — verified with
`git diff origin/development` (empty).

Why it was needed. The v1.3.0 release PR opened CONFLICTING against `main`
even though Phase 2.4 of /b-release found no divergence, and both checks
were correct:

- `main` carries hotfix PR #435 (`d1e6e840`, DEBUG-534 legal copy), which
  was backported to `development` by cherry-pick as `4b2119d7`, per the
  Hotfix Process. Cherry-pick rewrites the SHA, so Phase 2.4's
  `--cherry-pick --right-only` patch-id check correctly cleared it: `main`
  has no unique CONTENT.
- But `development` then moved PAST that content. DEBUG-545 took
  privacy-policy.md 1.10 -> 1.11 and added three DPIA changelog rows. Git
  sees two independent edits to the same regions with no common ancestor
  for them, so a textual conflict remains even though one side is a strict
  superset of the other.

Both conflicts resolved to `development`, which is the superset in each:
  docs/legal/privacy-policy.md            main 1.10 vs dev 1.11 -> dev
  docs/legal/dpia-sensitive-wellness-data.md  main empty vs dev rows
                                          2.10/2.11/2.12 -> dev

`docs/architecture/analytics-architecture.md` auto-merged and is likewise
unchanged from `development`.

Note for the Hotfix Process: CLAUDE.md states that after a cherry-pick
backport "git handles identical content gracefully on the next release
PR." That holds only while `development` does not subsequently edit the
same lines. It did here, and the conflict surfaced at release time rather
than at backport time.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CkZagJp7dzojvrjY7uYwkh
@MP2EZ
MP2EZ merged commit 763ec8c into development Sep 9, 2026
11 checks passed
@MP2EZ
MP2EZ deleted the chore/backmerge-main-into-dev branch September 9, 2026 00:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant