Skip to content

privacy: tracked config, corpus and docs carry no real paths or private names - #129

Merged
musharna merged 1 commit into
mainfrom
privacy/pseudonymise-corpus
Sep 2, 2026
Merged

privacy: tracked config, corpus and docs carry no real paths or private names#129
musharna merged 1 commit into
mainfrom
privacy/pseudonymise-corpus

Conversation

@musharna

@musharna musharna commented Sep 2, 2026

Copy link
Copy Markdown
Owner

The 2026-08-19 scrub genericised projects.yaml; the 08-31 cwd-identity work
put the real roots back, plus a 250-row export of the production job DB as a
test corpus, a plan doc with an ssh line to the broker's tailnet address, and
a collaborator's name in a path. A scrub is a state, not a commit, and nothing
was checking the state.

  • config/projects.local.yaml (gitignored, beside projects.yaml) now carries
    machine-specific roots and private names; each entry replaces the same-named
    tracked entry wholesale. load_local_projects is a no-op when the file is
    absent, so existing deployments start unchanged -- but they lose cwd-derived
    identity for the real roots until the file is created (docs/projects-yaml.md).
  • projects.yaml, tests/data/project_cwd_corpus.csv, tests, plans, docs and
    docstrings are pseudonymised: /home/user, greek-letter project names, the
    broker address as a hostname. Every name variant a test relied on was mapped
    by substring, so folding/variant behaviour is unchanged (1296 passed).
  • tests/test_no_private_paths.py scans every tracked file for private paths,
    hosts, addresses and session trailers, with a planted-hit positive control.

Deploy note: the broker keeps working without config/projects.local.yaml, but cwd-derived identity for the real roots only returns once that file exists beside the deployed projects.yaml (a ready copy is at ~/.config/jobd/projects.local.yaml on the laptop; gt76 was unreachable from this session).

…rivate names

The 2026-08-19 scrub genericised projects.yaml; the 08-31 cwd-identity work
put the real roots back, plus a 250-row export of the production job DB as a
test corpus, a plan doc with an ssh line to the broker's tailnet address, and
a collaborator's name in a path. A scrub is a state, not a commit, and nothing
was checking the state.

- config/projects.local.yaml (gitignored, beside projects.yaml) now carries
  machine-specific roots and private names; each entry replaces the same-named
  tracked entry wholesale. load_local_projects is a no-op when the file is
  absent, so existing deployments start unchanged -- but they lose cwd-derived
  identity for the real roots until the file is created (docs/projects-yaml.md).
- projects.yaml, tests/data/project_cwd_corpus.csv, tests, plans, docs and
  docstrings are pseudonymised: /home/user, greek-letter project names, the
  broker address as a hostname. Every name variant a test relied on was mapped
  by substring, so folding/variant behaviour is unchanged (1296 passed).
- tests/test_no_private_paths.py scans every tracked file for private paths,
  hosts, addresses and session trailers, with a planted-hit positive control.
@musharna
musharna force-pushed the privacy/pseudonymise-corpus branch from 45fe03f to 409c884 Compare September 2, 2026 16:46
@musharna
musharna merged commit 6b04e31 into main Sep 2, 2026
7 checks passed
@musharna
musharna deleted the privacy/pseudonymise-corpus branch September 2, 2026 16:51
musharna added a commit that referenced this pull request Sep 2, 2026
tests/test_changelog_fragments.py requires [Unreleased] to stay empty; the
broken header from #129 had hidden this entry from that test.
musharna added a commit that referenced this pull request Sep 2, 2026
…130)

* fix: .gitignore and CHANGELOG were appended with literal backslash-n

The privacy commit (#129) wrote both files through a script whose "\\n" was
the two characters backslash-n, not a newline. .gitignore therefore had one
line that matched nothing, so config/projects.local.yaml -- the file that
holds the real roots -- was NOT ignored (git check-ignore printed nothing).
CHANGELOG gained a second, broken [Unreleased] header. Found by the ~/jobd
session's cat -A. Both rewritten with real newlines; check-ignore now
resolves to .gitignore:32.

* docs: changelog entry moves to a changelog.d fragment

tests/test_changelog_fragments.py requires [Unreleased] to stay empty; the
broken header from #129 had hidden this entry from that test.
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