Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
bd0f415
docs: 2026-07-23 verification sweep audit (no new findings)
reverb256 Jul 23, 2026
92abb35
ci: add secretspec check --profile production step
reverb256 Jul 23, 2026
1c26dc2
chore(gitignore): ignore fixtures/*.key defense-in-depth
reverb256 Jul 23, 2026
620a2a5
docs: 2026-07-23 lib.fakeHash SRI upstream precondition check (deferred)
reverb256 Jul 23, 2026
43eadc6
feat(ci+fixtures): provider-rust end-to-end SOPS bridge \u2014 plaint…
reverb256 Jul 23, 2026
89456f5
docs: tighten lib.fakeHash SRI audit ledger entry + apply Recommended…
reverb256 Jul 23, 2026
a3a9685
docs: draft cachix/secretspec PR body in cachix-pr-body.md + cross-re…
reverb256 Jul 23, 2026
a8ae5c8
docs(pr-body): correct test-count breakdown in cachix-pr-body.md
reverb256 Jul 23, 2026
c4b2214
docs(context): align verification-sweep test-count with knowledge.md …
reverb256 Jul 23, 2026
af72ce1
docs(context+knowledge): record lib.fakeHash SRI fallback application
reverb256 Jul 23, 2026
c693c4b
fix(workflows): correct dtolnay/rust-toolchain action ref @1.78 -> @m…
reverb256 Jul 23, 2026
0b94bf7
fix(ci): wrap inline-`$VAR`-quoted `run:` scalars in YAML single quotes
reverb256 Jul 23, 2026
1bee306
fix(workflows): pass toolchain+components via `with:` to dtolnay/rust…
reverb256 Jul 23, 2026
912a345
fix(ci): drop nixpkgs#age-keygen (legacy attr; sub-binary of nixpkgs#…
reverb256 Jul 23, 2026
fd1ba8f
style(provider-rust): cargo fmt --check pass (manual transform)
reverb256 Jul 23, 2026
8648b90
style(provider-rust): cargo fmt --check pass (rustfmt 1.78.0 auto-for…
reverb256 Jul 23, 2026
ee946e8
fix(deps): pin clap to ~4.5.0 to suppress clap_derive edition2024 on …
reverb256 Jul 23, 2026
e5aebff
chore: vendor cachix/secretspec#98 protocol-v1 spec for reference
reverb256 Jul 23, 2026
a16d712
feat(protocol): NDJSON request/response types for cachix/secretspec#98
reverb256 Jul 23, 2026
7d8da16
feat(plugin): rewrite src/main.rs as NDJSON protocol dispatcher
reverb256 Jul 23, 2026
99629e6
refactor: remove SopsFileProvider SCAFFOLD (superseded by NDJSON plugin)
reverb256 Jul 23, 2026
362a280
fix(deps): drop clap dependency (kills clap_lex 1.1.0 edition2024 tra…
reverb256 Jul 23, 2026
c09501e
test(protocol): subprocess-driven Hello/Get/Bye round-trip integration
reverb256 Jul 23, 2026
2af40d9
chore: cleanup main.rs + SetRequest per code-reviewer feedback
reverb256 Jul 23, 2026
f291f59
fix(deps): pin indexmap to 2.10.0 (last edition2021 release)
reverb256 Jul 23, 2026
b0bb1bc
fix: add pub mod protocol declaration + tokio io-util feature
reverb256 Jul 23, 2026
5dc5562
fix(protocol): close Response::hello helper brace properly
reverb256 Jul 23, 2026
9729f3c
fix(test): close .into() call inside get_response_serializes_string_f…
reverb256 Jul 23, 2026
424ae63
test(protocol): add diagnostic failure messages + clean-room syntax r…
reverb256 Jul 23, 2026
5e0cb5a
feat: Domen #1+#2 — credentials chain + URI/redaction + cli binary
reverb256 Jul 23, 2026
5619669
feat: protocol.rs ↔ schema.json reconciliation (v1 conformance)
reverb256 Jul 23, 2026
4c342e8
feat: Phase 2 SOPS target stubs (9 per-category files)
reverb256 Jul 23, 2026
2e25f42
feat: secretspec runtime recipe + bootstrap regression guard
reverb256 Jul 23, 2026
ecdbe04
fix: CI gate — fmt + clippy + clap 4.6.4 test alignment
reverb256 Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 51 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ jobs:
# (rustfmt + clippy); the dtolnay/rust-toolchain action picks it up
# automatically — no separate `rustup component add` step needed.
- name: Install Rust per rust-toolchain.toml
uses: dtolnay/rust-toolchain@1.78
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.78.0
components: rustfmt, clippy

# Cargo target cache keyed on provider-rust/Cargo.lock hashing —
# ~70% faster rebuilds on subsequent pushes to the same ref.
Expand All @@ -49,7 +52,9 @@ jobs:

- name: Install sops / age / age-keygen binaries
run: |
nix profile install nixpkgs#sops nixpkgs#age nixpkgs#age-keygen
# nixpkgs#age-keygen is no longer a top-level flake attribute; modern nixpkgs ships
# age-keygen as a sub-binary of nixpkgs#age (pkgs.age/bin/age-keygen). Installing pkgs.age is sufficient.
nix profile install nixpkgs#sops nixpkgs#age
which sops age age-keygen

- name: cargo fmt --check
Expand Down Expand Up @@ -80,12 +85,53 @@ jobs:
- name: bootstrap-dev.sh (populate .env.secrets from template)
run: ./scripts/bootstrap-dev.sh --force

# secretspec profile gate: coupled to .env.secrets populated by bootstrap-dev.sh above;
# validates default → development → production inheritance chain end-to-end.
- name: secretspec check --profile default
run: "$HOME/.local/bin/secretspec" check --profile default -f ./secretspec.toml
run: '"$HOME/.local/bin/secretspec" check --profile default -f ./secretspec.toml'

- name: secretspec check --profile development
run: "$HOME/.local/bin/secretspec" check --profile development
run: '"$HOME/.local/bin/secretspec" check --profile development -f ./secretspec.toml'

- name: secretspec check --profile production
run: '"$HOME/.local/bin/secretspec" check --profile production -f ./secretspec.toml'

- name: provider-rust binary smoke (doctor)
working-directory: provider-rust
run: "$PWD/target/release/secretspec-provider-sops" doctor
run: '"$PWD/target/release/secretspec-provider-sops" doctor'

# provider-rust end-to-end SOPS bridge (test fixture decrypt):
# Generates an ephemeral age keypair + encrypts fixtures/test-secrets.yaml
# inline; asserts `secretspec-provider-sops get <encrypted> <key>` returns
# the expected plaintext for each key. Closes the end-to-end validation
# gap while upstream cachix/secretspec#58 + #98 remain OPEN (formal
# sops:// wiring in secretspec.toml stays deferred to keep Phase 1 exit 0).
- name: provider-rust end-to-end SOPS bridge (test fixture decrypt)
working-directory: provider-rust
run: |
set -e
# Pin binary path BEFORE any `cd` — $PWD would otherwise resolve to /tmp.
BIN="${GITHUB_WORKSPACE}/provider-rust/target/release/secretspec-provider-sops"
test -x "$BIN" || { echo "FAIL: binary not found at $BIN"; exit 1; }
BDIR=/tmp/sops-bridge-test
rm -rf "$BDIR" && mkdir -p "$BDIR"
cd "$BDIR"
age-keygen -o test-age.key >/dev/null
chmod 600 test-age.key
AGE_PUB=$(grep '^# public key:' test-age.key | awk '{print $NF}')
cp "${GITHUB_WORKSPACE}/fixtures/test-secrets.yaml" test-secrets.yaml
SOPS_AGE_KEY_FILE="$BDIR/test-age.key" sops --encrypt --age "$AGE_PUB" --in-place test-secrets.yaml

expected_keys=(nvidia_api_key openai_api_key huggingface_token github_token)
expected_values=(nvapi-bridge-known sk-bridge-known hf-bridge-known ghp-bridge-known)
for i in "${!expected_keys[@]}"; do
key="${expected_keys[$i]}"
want="${expected_values[$i]}"
got=$(SOPS_AGE_KEY_FILE="$BDIR/test-age.key" "$BIN" get "$BDIR/test-secrets.yaml" "$key")
if [ "$got" != "$want" ]; then
echo "FAIL: $key — got '$got' want '$want'"
exit 1
fi
echo "PASS: $key decrypted to '$got'"
done
echo "ALL PASS: provider-rust SOPS bridge round-trip succeeded for 4 keys"
5 changes: 4 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ jobs:
uses: actions/checkout@v4

- name: Install Rust per rust-toolchain.toml
uses: dtolnay/rust-toolchain@1.78
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.78.0
components: rustfmt, clippy

- name: Rust Cache (Swatinem/rust-cache, keyed on provider-rust/Cargo.lock)
uses: Swatinem/rust-cache@v2
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,10 @@ target/
.env.production
!.env.secrets.example
!.env.production.example

# Test fixtures should only include placeholder plaintext (the SOPS bridge
# in .github/workflows/ci.yml regenerates ephemeral age keypairs in /tmp
# at runtime). If anyone runs the bridge locally and accidentally drops
# the test-age.key into fixtures/, the gitignore rule below prevents
# accidental commit of the artifact.
fixtures/*.key
Loading
Loading