{"id":50877250,"url":"https://github.com/pulseengine/example-kvs","last_synced_at":"2026-06-15T11:02:04.106Z","repository":{"id":360057460,"uuid":"1248506759","full_name":"pulseengine/example-kvs","owner":"pulseengine","description":"Eclipse-score persistency::kvs through the full pulseengine stack — rivet typed artifacts + spar AADL + WIT contract + witness MC/DC harness + sigil release manifest + artifact-driven verification gate. Not affiliated with Eclipse Foundation.","archived":false,"fork":false,"pushed_at":"2026-05-24T20:06:34.000Z","size":127,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T21:10:02.286Z","etag":null,"topics":["aadl","eclipse-score","iso-26262","mbse","pulseengine","rivet","safety-critical","spar","wasm-component","wit"],"latest_commit_sha":null,"homepage":"https://pulseengine.eu","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pulseengine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-24T18:23:05.000Z","updated_at":"2026-05-24T18:23:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pulseengine/example-kvs","commit_stats":null,"previous_names":["pulseengine/example-kvs"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/pulseengine/example-kvs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Fexample-kvs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Fexample-kvs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Fexample-kvs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Fexample-kvs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pulseengine","download_url":"https://codeload.github.com/pulseengine/example-kvs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Fexample-kvs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34357285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aadl","eclipse-score","iso-26262","mbse","pulseengine","rivet","safety-critical","spar","wasm-component","wit"],"created_at":"2026-06-15T11:02:03.138Z","updated_at":"2026-06-15T11:02:04.101Z","avatar_url":"https://github.com/pulseengine.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `example-kvs`\n\n[![license: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)\n\n\u003e A [pulseengine.eu](https://pulseengine.eu) worked example: eclipse-score's\n\u003e `persistency::kvs` component treated end-to-end with the pulseengine stack\n\u003e — rivet typed artifacts + spar AADL + WIT binary contract +\n\u003e witness MC/DC harness + sigil-signed release manifest + artifact-driven\n\u003e verification gate.\n\u003e\n\u003e **Not affiliated with the Eclipse Foundation.** Derived from\n\u003e [eclipse-score/persistency](https://github.com/eclipse-score/persistency)\n\u003e as a worked example. The eclipse-score equivalents of each artifact\n\u003e are named in their descriptions.\n\n## What this is\n\nEclipse-score declares `persistency::kvs` as a sphinx-needs typed\ngraph: requirements, architecture, FMEA, design decisions, all as\nRST need directives. The actual Rust implementation lives separately\nwith no automated link to the spec.\n\nThis repo shows what the same component looks like when expressed\nthrough the full pulseengine stack. Each layer adds something\neclipse's setup doesn't have:\n\n| Layer | What it adds | Eclipse equivalent |\n|---|---|---|\n| `artifacts/` (rivet typed YAML) | Validated typed graph: 8 requirements + 8 architecture elements + 2 FMEA + 2 decisions + 3 test-specs, all schema-checked by `rivet validate` | sphinx-needs `comp_req` / `feat` / `feat_saf_fmea` / `dec_rec` / `testcase` directives |\n| `arch/kvs.aadl` (spar AADL) | Typed feature group + subprogram signatures + ARP4761 safety properties | None — eclipse has no architecture-model file |\n| `arch/kvs.wit` (binary contract) | WIT interface that wit-bindgen turns into a Rust trait the impl must satisfy at link time | None — interface stops at the rendered diagram |\n| `verification/mc_dc_harness.rs` (witness) | Truth-table evidence per tested predicate, with explicit gap-identification for masking-MC/DC | `testcase` need carries pass/fail only |\n| `tools/verify.py` (artifact-driven gate) | Walks the artifact list, finds tests by name convention, reports PASSED / FAILED / **MISSING** per artifact, exits red on any gap | None — eclipse renders a coverage pie chart on the docs site; missing tests are a wedge in the pie, not a CI gate |\n| `attestation/release-manifest.yaml` (sigil) | Signed in-toto-style attestation tying artifact hashes + WIT contract hash + evidence hashes to a release | Green CI badge (\"`bazel run //:docs_check` succeeded\") |\n\n## What's *real* infrastructure vs *example skeleton*\n\nEverything in `artifacts/` validates today with `make validate`\nagainst the pinned rivet schemas. The artifact-driven verification\ngate (`tools/verify.py`) runs today as a stub.\n\nThe AADL → WIT → Rust component chain is **real pulseengine\ninfrastructure** — `rules_wasm_component`'s `wit_library` /\n`wit_bindgen` / `cpp_component` / `rust_component` Bazel rules,\nfed by spar's AADL frontend. The chain has been exercised on\nother pulseengine projects; this example is the first time it's\nbeen applied to eclipse-score content. The Rust component\nimplementation itself is not in this repo — it would live in a\nseparate crate that depends on the WIT contract.\n\nWitness and sigil entries are skeletons showing the artifact\nshape; they show what the evidence and attestation would look\nlike, not a populated run.\n\n## Layout\n\n```\nexample-kvs/\n├── rivet.yaml                     # rivet project: common + score schemas\n├── artifacts/\n│   ├── requirements.yaml          # 8 reqs across stkh / feat / comp levels\n│   ├── architecture.yaml          # feat → comp → interface + 5 ops + dd-sta + sw-units\n│   └── safety-and-decisions.yaml  # 2 FMEA entries + 2 ADRs + 3 test-specs\n├── arch/\n│   ├── kvs.aadl                   # spar AADL package, ARP4761 properties\n│   └── kvs.wit                    # WIT contract emitted from the AADL\n├── verification/\n│   ├── README.md                  # witness MC/DC explainer\n│   └── mc_dc_harness.rs           # skeleton showing witness annotations\n├── attestation/\n│   └── release-manifest.yaml      # sigil-shaped signed release manifest\n├── tools/\n│   └── verify.py                  # artifact-driven verification gate\n├── vendor/\n│   └── rivet-schemas/             # pinned snapshot of rivet's schema set\n├── Makefile                       # validate / aadl / wit / verify / attest\n├── LICENSE                        # Apache-2.0\n└── README                         # you are here\n```\n\n## Run it\n\n```sh\nmake validate    # rivet validate against the typed schema (always works)\nmake verify      # artifact-driven verification gate (always works)\nmake aadl        # spar validates the AADL package (requires spar)\nmake wit         # spar AADL → WIT round-trip check (requires spar)\nmake attest      # sigil-signed release manifest (requires sigil)\n```\n\nToday's `make verify` output:\n\n```\nPASSED    COMP-REQ-KVS-KEY-NAMING                       1 test(s) all green\nPASSED    COMP-REQ-KVS-VALUE-CHECKSUM                   1 test(s) all green\nPASSED    COMP-REQ-KVS-ATOMIC-STORE                     1 test(s) all green\nMISSING   COMP-REQ-KVS-INLINE-STORAGE                   no test matching `test_comp_req_kvs_inline_storage_*`\n3 PASSED, 0 FAILED, 1 MISSING\n```\n\nThe MISSING is intentional — `COMP-REQ-KVS-INLINE-STORAGE` is\napproved but has no harness coverage. Run `make verify` after\nadding a `test_comp_req_kvs_inline_storage_*` to\n`verification/mc_dc_harness.rs` and the bucket clears.\n\nThis is the operational difference the example illustrates:\n**eclipse-score's coverage report tells you about gaps**;\n**pulseengine's verify gate makes gaps fail CI**.\n\n## What this is *not*\n\n- **Not a complete persistency::kvs implementation.** The Rust\n  source files referenced in the artifacts (`src/key_validator.rs`\n  etc.) are not in this repo — they'd live in a separate crate\n  that imports the WIT contract.\n- **Not an automatic translation of eclipse-score content.** Every\n  artifact here was hand-authored from the eclipse equivalents.\n  An automated `score → pulseengine` converter is a separate\n  workstream — see the\n  [playground-eclipse-score](https://github.com/pulseengine/playground-eclipse-score)\n  workspace for that.\n- **Not endorsed by the Eclipse Foundation or eclipse-score\n  maintainers.** This is a pulseengine demonstration, not a\n  collaboration. Issues belong here; eclipse-score's RST is\n  unchanged.\n- **Not certification-ready.** rivet, spar, witness, and sigil\n  are all pre-1.0; this example exercises them against real\n  content but no part has been independently TCL-assessed. See\n  each tool's `SAFETY.md` for self-assessed scope.\n\n## Cross-references\n\n- The conversion playground: https://github.com/pulseengine/playground-eclipse-score\n- Rivet (typed traceability): https://github.com/pulseengine/rivet\n- Spar (AADL → WIT): https://github.com/pulseengine/spar\n- `rules_wasm_component` (WIT → WASM): https://github.com/pulseengine/rules_wasm_component\n- Witness (MC/DC for Wasm): https://github.com/pulseengine/witness\n- Sigil (signed attestation): https://github.com/pulseengine/sigil\n\n## License\n\nApache-2.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpulseengine%2Fexample-kvs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpulseengine%2Fexample-kvs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpulseengine%2Fexample-kvs/lists"}