Skip to content

v0.6.1: imports recognise known rows, weekly catalog check, readability - #12

Merged
k3mpaxl merged 5 commits into
mainfrom
claude/inspiring-sagan-y7zy4q
Oct 17, 2026
Merged

k3mpaxl merged 5 commits into
mainfrom
claude/inspiring-sagan-y7zy4q

Conversation

@k3mpaxl

@k3mpaxl k3mpaxl commented Oct 16, 2026

Copy link
Copy Markdown
Owner

Three follow-ups to v0.6.0. Best reviewed commit by commit: the formatting commit is large but only moves and formats code.

Rows already on the board are recognised by their content (9286923)

An imported row used to be found again only through its activity, whose ID comes from the participants. When a newer mapping saw other entities in a row, importing the same export again added a second activity and evidence item.

  • The browser's import index now names the rows it holds: a 64-bit key of each evidence note (web/src/rowKey.ts, the same function as row_key in app/ingest.py; both test suites check the same reference values).
  • A known row adds no entity, activity or evidence; its entities on the board only get the IDs the newer mapping reads. The same row from a second export is one evidence item too. Older browsers send no keys and import as before.
  • With that, CloudAppEvents links the OAuth app that acted (OAuthAppId) as a participant. EmailEvents object IDs stay unlinked on purpose (they would join an email address to a user entity).
  • Trade-off: a row an agent imported first stays unconfirmed when the analyst imports the same file later (previously a second, confirmed copy appeared).

Weekly check against xdrinternals.com (4a5121d)

  • scripts/build_column_relations.py --check lists added, removed and changed joins (also in the job summary) and exits 1 on any change.
  • New workflow Relationship catalog (Mondays and on demand). A rebuild without changes touches no file.

Readability (ddb27f9, 6c227a4)

  • App.tsx (1,632 lines) split by purpose without behaviour changes: Inspector.tsx, Dialogs.tsx, Panels.tsx, ui.tsx; App.tsx keeps state, shortcuts and layout (~750 lines).
  • Prettier for TypeScript and Ruff for Python, both 140 columns; CI checks both (npm run format:check, ruff format --check; Ruff pinned with hashes in requirements-dev.lock). Not formatted: the compact style sheet, the generated joinColumns.ts, and index.html (its inline script is allowed by CSP hash).
  • Lines over 160 characters: from about 1,170 to about 190 (long strings formatters do not break).
  • .git-blame-ignore-revs lists the formatting commit (git config blame.ignoreRevsFile .git-blame-ignore-revs).

Release (86f8b4d)

Version 0.6.1 in the backend, frontend, publish script and README.

Tests

  • Backend: 74 tests incl. row keys and a repeated import with a changed mapping.
  • Frontend unit tests, format checks, build, performance budgets.
  • Browser workflows: 30 passed, 1 skipped (README screenshots), incl. a repeated import of the same row.

Generated by Claude Code

An imported row was found again only through its activity, whose ID comes
from the participants. When a newer mapping saw other entities in a row,
importing the same export again added a second activity and evidence item.

The browser's import index now names the rows it holds: a 64-bit key of
each evidence note (web/src/rowKey.ts, the same function as row_key in
app/ingest.py, checked against shared values in both test suites). A known
row adds no entity, activity or evidence; its entities on the board only
get the IDs the newer mapping reads. The same row from a second export is
one evidence item too. Older browsers send no keys and import as before.

With that, CloudAppEvents links the OAuth app that acted (OAuthAppId, an
Entra app ID) as a participant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XkeMnAg6DWQ8xZucm51CzK
scripts/build_column_relations.py --check compares the catalog upstream
with app/data/column_relations.json and lists added, removed and changed
joins (also in the job summary); it exits 1 when anything changed. The new
workflow "Relationship catalog" runs it every Monday and on demand, so a
change upstream shows up as a failed run. Building again keeps the date
when nothing changed, so a rebuild without changes touches no file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XkeMnAg6DWQ8xZucm51CzK
App.tsx (1,632 lines) is split by purpose without changing behaviour:
Inspector.tsx (entity and activity inspector, evidence list), Dialogs.tsx
(create/edit dialogs, help, agent connection, welcome), Panels.tsx
(timeline, evidence window, change log, explorer, command palette) and
ui.tsx (shared helpers and small components); App.tsx keeps state,
shortcuts and layout (about 750 lines).

TypeScript is formatted with Prettier (140 columns, no semicolons, single
quotes; web/.prettierrc.json), Python with Ruff (140 columns, quotes as
they are; pyproject.toml). Not formatted: the compact style sheet, the
generated joinColumns.ts and index.html (its inline script is allowed by
CSP hash). CI checks both formats; Ruff is pinned with hashes in
requirements-dev.lock like the app's own dependencies. Lines over 160
characters drop from about 1,170 to the long strings that remain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XkeMnAg6DWQ8xZucm51CzK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XkeMnAg6DWQ8xZucm51CzK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XkeMnAg6DWQ8xZucm51CzK
@k3mpaxl
k3mpaxl merged commit 39b1e87 into main Oct 17, 2026
4 checks passed
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.

2 participants