Commits

trunk
Switch branches/tags
mfwolffe
Until May 10, 2026
June 2026
Su Mo Tu We Th Fr Sa
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

Commits on May 10, 2026

  1. mfwolffe committed
  2. mfwolffe committed
  3. mfwolffe committed
  4. mfwolffe committed
  5. mfwolffe committed
  6. mfwolffe committed
  7. mfwolffe committed
  8. mfwolffe committed
  9. mfwolffe committed
  10. mfwolffe committed
  11. mfwolffe committed
  12. mfwolffe committed
  13. mfwolffe committed
  14. mfwolffe committed
  15. mfwolffe committed
  16. mfwolffe committed
  17. actions/secrets: store test suite — 10 cases covering encryption + scope + citext (S41c)
    - TestSet_RoundTripsThroughSecretbox: set → get → plaintext matches.
      - TestSet_OverwriteOnSameName: UPSERT semantics.
      - TestSet_InvalidNameRejected: regex enforcement (5 bad names).
      - TestSet_EmptyValueRejected: nil/empty plaintext.
      - TestSet_InvalidScopeRejected: zero AND both-set scope.
      - TestList_NamesAndMetadataOnly: load-bearing — listing has no
        plaintext or ciphertext exposed; the public surface can't leak.
      - TestDelete_RemovesRow + TestDelete_MissingIsIdempotent.
      - TestGet_CitextNameIsCaseInsensitive: pins citext semantics.
      - TestCiphertext_IsActuallyEncryptedInDB: the spec called this out
        explicitly. Reads the bytea column directly via SQL and asserts
        the plaintext substring doesn't appear anywhere — would catch a
        silent regression to plaintext-storage.
    mfwolffe committed
  18. actions/secrets: store orchestrator with secretbox round-trip (S41c)
    Set/Get/List/Delete over workflow_secrets. Plaintext is sealed via
    internal/auth/secretbox (ChaCha20Poly1305 AEAD) before INSERT;
    ciphertext + nonce live in the bytea columns. Plaintext never lives
    in postgres.
    
    Scope is a small XOR struct (RepoID xor OrgID); the table CHECK
    mirrors it. Helpers RepoScope/OrgScope keep the XOR honest at call
    sites — no struct-literal traps.
    
    Public API:
      Deps.Set(ctx, scope, name, plaintext, createdBy) error
      Deps.Get(ctx, scope, name) ([]byte, error)
      Deps.List(ctx, scope) ([]Meta, error)         — names+metadata, no value
      Deps.Delete(ctx, scope, name) error            — idempotent
    
    Get() is for the runner-side claim resolver only (S41c-2). Web UI
    consumes List() — public listing surface deliberately can't reach
    plaintext or ciphertext.
    
    Errors mapped:
      ErrInvalidScope — programmer error (zero or both scope fields)
      ErrInvalidName  — name regex/length cap mismatch (mirrors DB CHECK)
      ErrEmptyValue   — empty plaintext (operators usually mean delete)
      ErrNotFound     — no row for (scope, name)
    mfwolffe committed
  19. mfwolffe committed
  20. mfwolffe committed
  21. mfwolffe committed
  22. mfwolffe committed
  23. mfwolffe committed
  24. actions/trigger + scripts: gofumpt + drop unused placeholder + lint-unused bash 3.2 shim (S41b)
    - gofumpt fixes across the trigger package + dispatch handler
      - drop the stale 'startedAtNow' placeholder var in enqueue.go that
        the lint-unused script flagged as a dead 'silence unused import'
        shim (it was originally a hint for S41c+, but never used)
      - scripts/lint-unused.sh: ${ALLOWED_FILES[@]:-} so an empty
        array doesn't trip set -u under macOS bash 3.2
    mfwolffe committed