analysis: correct the reach of the timestamp exposure

The Gitea mirror is private to the owner. An earlier draft inferred
'public' from an anonymous git ls-remote succeeding on the owner's
machine, which does not follow -- corrected in F-002, F-003, F-006,
REPORT.md and HANDOFF.md.

The exposure is prospective and sits on the git.lab side: content there
may later be pushed to GitHub. No such path is configured today (no
remote besides origin, no github.com reference in any of the six CI
configs). The severity ranking is unchanged and its reasoning is now
stated: a protection believed present but absent is what would make a
later outward push unsafe.
This commit is contained in:
Thore Cimbal
2026-08-10 12:00:00 +00:00
parent 0f419f006f
commit ccf83da515
5 changed files with 45 additions and 23 deletions
+7 -4
View File
@@ -111,10 +111,13 @@ In descending order of how much they could mislead Session 2.
work mass" assumes dormancy is unintended, and a "Stand" label may legitimately mean
"system state as last verified" rather than "state of this text". Both could be
dismissed by an answer I do not have.
4. **The severity I assigned to F-002/F-003.** I treated 237 commits with real clock times
on a public mirror as the report's most consequential finding. That weighting is mine.
If the exposure is acceptable to you, the finding shrinks to a documentation defect and
the executive summary over-weights it.
4. **The severity I assigned to F-002/F-003.** I first called the Gitea mirror public,
inferring it from an anonymous `git ls-remote` succeeding on the owner's machine. The
human corrected this: the host is private to them. The findings were rewritten; the
exposure is prospective (a future push from git.lab to GitHub) rather than realised.
The severity ranking still puts F-002 first, on the argument that a protection believed
present but absent is what makes a later outward push unsafe. That weighting is mine
and is contestable.
5. **F-011's confidence is `medium` because the sentence is ambiguous.** "Projekt-Repos
haben eigene CLAUDE.mds" may be descriptive rather than a claim about all five. I read
it as a claim because the sentence goes on to define conflict resolution against it.
+10 -8
View File
@@ -22,11 +22,13 @@ The most consequential finding is not documentation drift. The 2026-08-07 histor
set 251 commits to 12:00 UTC so that personal working hours could not be read out of the
history. That goal is met in **one of six repos**. 237 commits by the project's own
identities still carry real clock times, including 41 on an abandoned branch in
`axion1337.chat-gitops` clustered at 21:0001:00 — publicly readable on the Gitea mirror,
which this session verified is in sync. Two component repos were never rewritten at all.
The rule's own caveat in `CLAUDE.md:143` lists push times, issue timestamps and pipelines as
residual exposure, but not the git history itself, so a reader concludes the opposite of
what is true. See [F-002](findings/F-002-timestamp-anonymisation-covers-one-of-six-repos.md),
`axion1337.chat-gitops` clustered at 21:0001:00. Two component repos were never rewritten
at all. Both hosts are private today, so nothing has leaked; the cost is that the
protection is believed to be in place and is not, so any future decision to push outward —
to GitHub, or by opening a project — would be taken on a false premise, and history once
pushed cannot be recalled. The rule's own caveat in `CLAUDE.md:143` lists push times, issue
timestamps and pipelines as residual exposure, but not the git history itself, so a reader
concludes the opposite of what is true. See [F-002](findings/F-002-timestamp-anonymisation-covers-one-of-six-repos.md),
[F-003](findings/F-003-author-identity-unification-incomplete.md),
[F-006](findings/F-006-stale-branches-publish-pre-rewrite-history.md).
@@ -62,8 +64,8 @@ The declaration and the application live in different places, and nothing compar
| Finding | | Impact |
|---|---|---|
| [F-002](findings/F-002-timestamp-anonymisation-covers-one-of-six-repos.md) | Anonymisation reaches 1 of 6 repos; 237 commits expose real hours | Stated privacy goal unmet, publicly; expensive operation largely undone |
| [F-003](findings/F-003-author-identity-unification-incomplete.md) | 5 author identities of one person survive, one malformed | Same exposure; one person shows as 45 contributors publicly |
| [F-002](findings/F-002-timestamp-anonymisation-covers-one-of-six-repos.md) | Anonymisation reaches 1 of 6 repos; 237 commits carry real hours | Stated privacy goal unmet while believed met; blocks any safe future push outward |
| [F-003](findings/F-003-author-identity-unification-incomplete.md) | 5 author identities of one person survive, one malformed | Same exposure class; one person renders as 45 contributors |
| [F-011](findings/F-011-component-claude-md-claim-unmet.md) | 4 of 5 components have no `CLAUDE.md` | The distribution channel for the rules is itself only partly applied — a plausible cause of F-002/F-003 |
| [F-008](findings/F-008-component-slugs-inconsistent.md) | Five components, four naming schemes | No deterministic path from display name to repo; this session had to ask |
@@ -87,7 +89,7 @@ The declaration and the application live in different places, and nothing compar
| Finding | | Impact |
|---|---|---|
| [F-006](findings/F-006-stale-branches-publish-pre-rewrite-history.md) | 3 abandoned branches, one public with 41 pre-rewrite commits; `wiki` branch is a 3-month-old parallel truth | Undoes the rewrite for 42 commits; two truths about the same docs |
| [F-006](findings/F-006-stale-branches-publish-pre-rewrite-history.md) | 3 abandoned branches, one carrying 41 pre-rewrite commits; `wiki` branch is a 3-month-old parallel truth | Undoes the rewrite for 42 commits; two truths about the same docs |
| [F-012](findings/F-012-orphaned-sha-references.md) | 6 unresolvable SHA citations, all benign — but nothing could check them | Evidence-by-citation depends entirely on human diligence at rewrite time |
### What works and must be preserved
@@ -1,4 +1,4 @@
# F-002: The timestamp anonymisation rule reaches one of six repos; 237 commits still publish real working hours
# F-002: The timestamp anonymisation rule reaches one of six repos; 237 commits still carry real working hours
category: claim-vs-reality
confidence: high
@@ -28,8 +28,18 @@ evidence:
- The exposed times are exactly the ones the rule exists to hide. On
`axion1337.chat-gitops`'s `turn-secret-rotation-20260728-192656` branch alone, the
hour-of-day distribution of the 41 commits is 00h ×1, 01h ×6, 21h ×8, 22h ×1, 23h ×6.
- All of this is publicly readable: every one of the six repos mirrors to
`rohana.axion1337.de`, verified in sync by `git ls-remote` (see F-013).
- Reach of the exposure, stated precisely. Observed: all six repos mirror to
`rohana.axion1337.de` and `git ls-remote` succeeded there without credentials from the
owner's machine (see F-013). **Not** observed: that this host is reachable by anyone
else. The human states the Gitea host is private to them, and an earlier draft of this
finding wrongly inferred "public" from "readable from here" — corrected.
The exposure that matters is therefore **prospective and on the git.lab side**: content
from git.lab may be pushed to GitHub, which is public. No such push path is configured
today — no repo has a remote other than `origin`, and no `.gitlab-ci.yml` in the six
repos references `github.com` (the `.github/workflows/` mentions in `hosts/cfgmon.md:60,105`
are inherited Element files that were removed). The rule exists for the day that changes,
and on that day 237 commits would go out with real clock times unless the gap is closed
first.
- `CLAUDE.md:143-147` does carry a caveat, but it names push times, issue and comment
timestamps, pipeline runs and package publications — **not** the git history itself.
`shared/commit-zuordnung-2026-08-07.md:41-44` discloses the untouched pre-boundary
@@ -41,6 +51,11 @@ and its caveat read as though the remaining exposure were limited to non-git sur
Anyone reading `CLAUDE.md` would reasonably conclude the git history is clean. Effort was
spent (a 251-commit rewrite, three restarted release pipelines, a mapping document) for a
result that a `git log` on any side branch undoes.
The cost is not damage already done — both hosts are private today. It is that the
protection is believed to be in place and is not, so the decision to open any repo
outward (a GitHub push, an added collaborator, a public project toggle) would be taken on
a false premise. That is the moment the gap becomes irreversible: history, once pushed,
cannot be recalled.
root-cause pattern: **Rule declared repo-wide, applied to a subset — and the gap between
the two is documented in a third place, in different terms.**
@@ -19,10 +19,11 @@ evidence:
identity, while `axion1337.chat-gitops` main still carries 135 commits as
`Scrublord MacBad <Scrublord@Mac.Bad>` and 10 as `ScrublordMcBad`.
impact: Same exposure class as F-002 and the same false sense of completion. In addition,
the malformed address makes those two commits unattributable by tooling that matches on
e-mail, and `Scrublord@Mac.Bad` leaks a machine name. Contributor statistics on the public
Gitea mirror show one person as four or five contributors.
impact: Same exposure class as F-002 -- prospective, not realised, since both hosts are
private today (see the reach note in F-002) -- and the same false sense of completion. In
addition, the malformed address makes those two commits unattributable by tooling that
matches on e-mail, and `Scrublord@Mac.Bad` leaks a machine name. Any forge rendering these
repos shows one person as four or five contributors.
root-cause pattern: **Rule declared repo-wide, applied to a subset** — the same pattern as
F-002, in the same operation. Both were verified for the property that was easy to check
@@ -1,4 +1,4 @@
# F-006: Three abandoned branches keep publishing exactly what the rewrite removed from main
# F-006: Three abandoned branches still carry exactly what the rewrite removed from main
category: dead-artifact
confidence: high
@@ -9,12 +9,12 @@ evidence:
no). All 41 carry real clock times (00h01h and 21h23h heavy). They are the *pre-rewrite*
versions of commits the mapping table lists as replaced — 42 mapping rows resolve as
`ok-both-present` in `analysis/data/sha_refs.tsv`, meaning the old SHA is still reachable.
- The same branch exists on the public mirror:
- The same branch exists on the Gitea mirror (private to the owner, see F-002):
`git ls-remote https://rohana.axion1337.de/sorb/axion1337.chat-gitops.git` ->
`f30d2f582ba14d85a7dec97c4db9bb2677ca824d refs/heads/turn-secret-rotation-20260728-192656`,
identical to git.lab.
- `threadnet-call` `origin/livekit`: 14 own commits with real clock times, head `c12a4116`
(2026-07-31 22:22), mirrored publicly with the same head.
(2026-07-31 22:22), mirrored with the same head.
- `axion1337.chat-gitops` `origin/wiki`: head `0ff598e`, 2026-05-14. `CLAUDE.md:63` already
describes it as "ein überholter Mai-Abzug von `docs/`", and management#19 ("DOC-02:
Veralteten `wiki`-Branch im gitops-Repo entfernen?") tracks it — open, `priority:low`,
@@ -25,7 +25,8 @@ evidence:
impact: The single most expensive operation in this repo's history — a 251-commit rewrite
that restarted three release pipelines and needed its own mapping document — is undone for
42 of those commits by a branch nobody looks at, on a host that is public. The `wiki` branch
42 of those commits by a branch nobody looks at, and the branch travels with every mirror
and every future clone or push of that repo. The `wiki` branch
additionally offers a three-month-old copy of the documentation next to the current one,
which is the "zwei Wahrheiten über dieselbe Sache" failure `CLAUDE.md:94-97` names as worse
than an incomplete one.