Files
management/analysis/HANDOFF.md
T
Thore Cimbal e68b295249 analysis: complete the systematic claim verification; add F-017 and ADR-0010 draft
verify_claims.py gives all 813 claim rows a mechanical disposition;
the 28 flags were adjudicated by hand (REPORT.md appendix). Two survived
as genuine drift (F-017): a closed issue still described as open in
shared/lab-netzwerk.md, and a 'pending' decision block in hosts/cfgmon.md
whose premise the same file records as executed.

Also: narrow the vendored-path filter (it silently dropped 7 tracked
icon files and produced false path-miss flags), record the confirmed
canonical author identity in F-003, verify the Gitea#48->GitLab#46
numbering shift by title in F-005, and add the ADR-0010 draft under
analysis/drafts/ for the human to git-mv into decisions/.

Branch renamed to Neckbeard-v0.1.1-analyse-1 per the human.
2026-08-10 12:00:00 +00:00

153 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HANDOFF.md — Session 1 → Session 2
Everything Session 2 needs, and nothing else. Session 2 designs and builds the
neckbeard-based management system in a **new branch**, starting fresh from this file.
## Where things are
| | |
|---|---|
| Analysis branch | `Neckbeard-v0.1.1-analyse-1`, branched from `main` at `2f012a6` (renamed from `analysis/neckbeard-fieldtest` at session close, per the human) |
| Commits | `git log main..` on this branch lists them: scope, inventory, SHA/timestamps, findings, report/handoff, reach correction, verification pass |
| Deliverables | [SCOPE.md](SCOPE.md) · [REPORT.md](REPORT.md) · [findings/](findings/) (F-001…F-017) · [data/](data/) · [scripts/](scripts/) |
| Read first | REPORT.md executive summary, then the pattern → mechanism → implication table |
| Neckbeard reference | `v0.1.1` @ `823a08cac6b03a47d7e2f661200a49ac6e09d38d`, `main`, clean |
Nothing outside `analysis/` was modified on this branch. `main` is untouched.
## Reproducing the raw data from zero
```bash
git clone https://git.lab/axion1337.chat/management.git
cd management && git checkout Neckbeard-v0.1.1-analyse-1
bash analysis/scripts/run_all.sh
```
Clones the five component repos into `../components/` if absent, exports group issue
metadata from git.lab, regenerates everything under `analysis/data/`. Bash + python3
stdlib only, no pip installs. Requires lab/VPN access for the clone and the issue export;
both skip cleanly without it and the rest still runs. Override the checkout location with
`NB_WORKSPACE`.
**A second run on an unchanged tree must produce no diff.** Verified with
`diff -r` after a full regeneration. No wall-clock time enters any output: "days since"
is measured against the management repo's HEAD commit date (2026-08-09), not the clock.
`inv_repo.py` aborts the whole run if anything outside `analysis/` was modified. That
guard was tested by deliberately dirtying `README.md`; it fires.
## Scope, as frozen at the Phase-0 STOP
Five components, slugs verified against git.lab with `git ls-remote`, human-confirmed:
| Display name | Repo slug |
|---|---|
| ThreadNet Call | `threadnet-call` |
| ThreadNet Git | `thread-net-git` |
| ThreadNet Operating | `threadnet-operating` |
| ThreadNet Server Suite | `axion1337.chat-gitops` |
| ThreadNet Web | `ThreadNet-Web` |
Out of scope as analysis targets: `game-operating`, `gameserver`, the `vendor` and
`Archiv` subgroups. References into them are recorded as `points-outside-scope`.
The human confirmed their own working copy points at canonical git.lab, not the mirror.
## Decisions taken this session, and why
1. **Both repos freshly cloned; push URL set to `DISABLED-no-push` on every clone**,
including clones `run_all.sh` creates. The mandate forbids modifying originals; making
it mechanically impossible beats remembering not to.
2. **The management repo is inventoried at `main`, not at the analysis branch.** The first
run counted this session's own commits and `analysis/` files as project reality (87
commits instead of 86, 45 files instead of 44). An analysis that observes itself
reports its own footprint as drift.
3. **Commits follow the repo's own convention** (`CLAUDE.md:116-134`): English,
conventional style, author *and* committer date at 12:00:00 UTC, plus the mandated
`analysis:` prefix. Not anonymising would have been drift this session introduced.
4. **The GitLab token is referenced by path, never read into output.** Per `CLAUDE.md:109`
its value was not printed, logged or written anywhere; the export holds **metadata
only** — no issue descriptions, no comments.
5. **All group issues exported, open and closed**, rather than an arbitrary
"recently closed" cutoff. The group is small (111 issues); a full export is
deterministic and needs no justification for where the line was drawn.
6. **`sha_refs.tsv` and `timestamp_anonymisation.tsv` were added** beyond the mandated file
list, prompted by the human's question about the rebase mapping list. They carry the
evidence for F-002, F-003, F-006, F-012 and F-015.
7. **Two tooling bugs were found and fixed mid-flight**, both of which would have produced
false conclusions: `git grep -E '\b…'` silently reports **zero** markers because git's
ERE has no `\b` (real count: 543), and a `TZ` that is not set on the `git` process
itself makes every commit look non-anonymised.
8. **Link statuses stayed at the three mandated values**; the nuance moved into a `kind`
column rather than inventing a fourth status.
9. **The claim sweep was completed inside Session 1**, after the human asked whether
pulling it forward would break the two-session split. It does not: verifying claims is
Phase-2 analysis work; only designing/fixing belongs to Session 2. Result: F-017 and
the REPORT appendix.
10. **ADR-0010 exists as a draft under [drafts/](drafts/)**, not under `decisions/`
the human decided it is filed in the old scheme, but this session must not create
files outside `analysis/`; placing it is one `git mv` by the human. Deliberately in
German, matching the old scheme it belongs to (a stated deviation from this
session's English-artifacts rule).
11. **Session-close corrections by the human**, both binding for Session 2: the Gitea
mirror is **private to the owner**, not public (reach of F-002/F-003 rewritten —
the exposure is prospective, via a possible future git.lab→GitHub push); canonical
author identity is `Thore Cimbal <cfx@riot.8shield.net>` (F-003 addendum).
## Where Session 2 should start
**Standing directive from the human (session close):** before applying anything, work
through the failures of *both* approaches — the drift this report found in the
management approach *and* the seven neckbeard gaps it exposed — and where the old
approach carries value that fits neckbeard's philosophy (candidates are the four
works-well findings, the milestone/priority evidence in F-014, the mirror-topology
prose in F-013), fold that value into neckbeard rather than discarding it. Adoption
comes after that two-way harvest, not before.
The pattern → mechanism → implication table in REPORT.md is the input. Two things gate
everything else:
- **Question 1 in REPORT.md** — where the 71 open issues live after migration. ADR-0002
Option C versus pure Option B changes the shape of the whole design.
- **Neckbeard gap 1** — how five repos share one `AGENTS.md`. Unanswered, this blocks any
multi-repo adoption.
Neckbeard's own rules for Session 2: `PROJECT.md` is absent from the management repo, so
**Gate 0 fires there** (`AGENTS.md:57-63`) — it was suspended for this session only. The
migration is size L, so `WORKFLOW.md` Gates 15 with a design doc in `docs/design/` apply.
## The decisions I am least confident about
In descending order of how much they could mislead Session 2.
1. **The claim sweep is complete mechanically, not semantically.** Every one of the 813
rows now has a disposition (REPORT appendix), and all 28 mechanical failures were
adjudicated by hand. What remains open is honest but real: 360 rows carry no
mechanically checkable token — their truth is prose about hosts, procedures and
history that only a human or a live system can judge. And extraction itself is still
trigger-based: a false sentence containing no path, issue, ID, date, count or
status word was never in `claims.tsv` to begin with.
2. **`git ls-remote` against `rohana.axion1337.de/sorb/<name>` is how I concluded
`game-operating` has no mirror** (F-007). That rests on the naming convention holding,
which I verified for six repos but cannot prove for the seventh. The contradiction
between `CLAUDE.md:36` and `hosts/overmind.md:28` is solid; the cause is not.
3. **F-009 and F-010 are judgement calls, marked `medium`.** "Doc attention should follow
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 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.
6. **I did not verify claims made inside issue bodies.** `CLAUDE.md:52` says the migration
footnote *in the issue* is authoritative for shifted gitops numbers — so the one source
that could settle F-005's numbering question is the one I deliberately did not export.
7. **`markers.tsv` was produced and then barely used.** 543 markers, 538 of them inherited
upstream. I recorded "management: 0 markers, checked, no drift found" and moved on. If
technical debt in the components matters to Session 2, that file is unmined.