Commits

08b46b8deb4a4df3cdca7b8dc8520cec7707d727
Switch branches/tags

Commits on May 10, 2026

  1. Matthew Forrester Wolffe committed
  2. mfwolffe committed
  3. Matthew Forrester Wolffe committed
  4. mfwolffe committed
  5. Matthew Forrester Wolffe committed
  6. mfwolffe committed
  7. mfwolffe committed
  8. mfwolffe committed
  9. mfwolffe committed
  10. espadonne committed
  11. mfwolffe committed
  12. Merge pull request #77 from tenseleyFlow/repo-source-remotes
    Add source remotes for submodule imports
    espadonne committed
  13. mfwolffe committed
  14. mfwolffe committed
  15. mfwolffe committed
  16. mfwolffe committed
  17. mfwolffe committed
  18. Matthew Forrester Wolffe committed
  19. Merge pull request #75 from tenseleyFlow/s41c/secrets-variables
    S41c-1: actions secrets and variables settings
    Matthew Forrester Wolffe committed
  20. mfwolffe committed
  21. mfwolffe committed
  22. mfwolffe committed
  23. 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
  24. 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