Skip to content

Add DESIGN.md and IMPLEMENTATION.md for eval-under action - #6

Open
yarikoptic-gitmate wants to merge 1 commit into
masterfrom
claude/eval-under-github-action-xu7b57
Open

yarikoptic-gitmate wants to merge 1 commit into
masterfrom
claude/eval-under-github-action-xu7b57

Conversation

@yarikoptic-gitmate

Copy link
Copy Markdown

Summary

This PR establishes the design and implementation roadmap for packaging eval-under as a reusable GitHub Action. It adds two complementary documentation files that define the feature scope, constraints, and sequencing for making eval-under available to downstream projects (fscacher, datalad, dandi-cli).

Changes

  • DESIGN.md (276 lines): Defines the what and why of the feature

    • Problem statement: downstream projects hand-roll worse versions of eval-under
    • Goals: one-step adoption, capability-scoped sweeps, static committed feature data, testability
    • Two-action design: actions/run (wraps one command under one backend) and actions/list (emits filtered backend catalog)
    • Capability tags system for filesystem features (symlinks, hardlinks, xattrs, mtime granularity, etc.)
    • Constraints that shape the design (composite action limitations, matrix dynamics, sudo placement, etc.)
    • Testing strategy: selftest as a target row, not a parallel matrix
    • Adoption order: fscacher → datalad → dandi-cli (by feedback-loop length)
  • IMPLEMENTATION.md (308 lines): Defines the how, measurements, and constraints already established

    • Verified facts: backends run wrapped commands as invoker, GitHub Actions constraints, consumer inventory (fscacher/datalad/dandi-cli specifics)
    • Component sketches: actions/run/action.yml, actions/list/action.yml, bin/eval-under-none, feature probe, selftest target
    • act compatibility checklist (unverified, requires Vagrant VM)
    • Decisions with rationale (exec-wrapper shape, backend slug as identifier, logic in shell scripts, etc.)
    • Sequencing: first commit set (eval-under-none, action-run.sh, selftest, actionlint) then features/probe/list/act/v1 tag
  • .claude/CLAUDE.md (updated): Adds guidance on keeping DESIGN.md and IMPLEMENTATION.md in sync

    • Establishes that changes to interfaces, constraints, or rollout order must land in both files in the same commit
    • Documents provenance tracking for verified vs. unverified facts

Notable Details

  • Both documents are marked as drafts ("nothing implemented yet") and establish a bidirectional sync requirement: if they disagree, DESIGN.md wins
  • IMPLEMENTATION.md extensively documents verified facts with their verification method (e.g., [verified: read of bin/eval-under-{loop,nfs,beegfs}])
  • The design explicitly scopes act compatibility to "plumbing only" (backend: none works; BeeGFS/NFS do not)
  • Adoption order is driven by CI feedback-loop length (0.86 s for fscacher vs. multi-hour NFS chunks for datalad)
  • The selftest target row pattern allows every backend to test the action automatically without a parallel test matrix

https://claude.ai/code/session_01TFwTzwKHoApnMTRfGpbWXf

Design docs only -- no code yet -- so the shape can be reviewed before
anything is built.

DESIGN.md (what and why): the action splits in two, because an action
runs inside one job and looping backends inside it would serialize the
mounts, collapse five verdicts into one, and lose per-cell re-runs.
`actions/run` wraps one command under one backend; `actions/list` emits
the backend catalog as a matrix and lets GitHub do the looping. Both
speak the backend slug `backend_slug()` already produces.

Also covers: capability tags on the backend rows (with the rule that
tags scope a sweep and never predict its outcome); why that table is
measured in our CI and committed rather than probed in consumers' CI;
the three target consumers (fscacher, datalad, dandi-cli) and why the
adoption order is feedback-loop length rather than value; the
constraints that forced the shape (no `post:` on composite actions, no
expressions in `uses:`, sudo must not wrap the action, the house rule
against shell logic in workflow YAML); and act compatibility scoped to
plumbing rather than filesystems, which is what `eval-under-none` makes
achievable.

IMPLEMENTATION.md (how): component sketches, plus the facts already
established so nobody re-derives them -- each carrying its provenance.
Notably: tox passes TMPDIR/HOME by default but no custom vars, so
fscacher needs no tox.ini change while any extra var we set does need a
passenv entry; the backends already run the wrapped command as the
invoker, so the action must not be wrapped in sudo; and the vfat
experiment where two simulations of the same filesystem gave opposite
answers about fscacher going stale -- recorded as an unverified
hypothesis, since this container's kernel has no vfat to settle it.
That failure is also why `ctime-advances-on-write` is in the probed
feature set: it is the field that decided the outcome, and nobody would
have declared it by hand.

CLAUDE.md gains the rule that the two documents are a pair: interface,
constraint and ordering changes land in both in the same commit,
DESIGN.md wins on disagreement, and recorded facts keep their
[verified]/[unverified] provenance.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TFwTzwKHoApnMTRfGpbWXf

This branch has not been deployed

No deployments
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