On this page

Validate it · docs/validation/supplier-assessment.md

Supplier assessment

Document id CS-VAL-12
Title Supplier assessment
Version 1.0
Applies to Countersign 1.0.0
Status Template supplied with the software; to be completed, reviewed and approved by the regulated user

1. Purpose

Regulated organisations assess the suppliers of their computerised systems. Countersign is an open-source project, not a company: there is nobody to send a questionnaire to and nobody to audit. This document states the facts an assessor needs, honestly including what does not exist, and provides a completed questionnaire to file. The assessment decision and the compensating measures are the organisation's.

Facts about the repository were checked against the source of version 1.0.0. Where a statement depends on the standalone repository as published (issue tracker, release tags, continuous integration), verify it there yourself; the cells are marked "verify".

2. The product

Item Fact
Name, version Countersign 1.0.0
Kind Open-source web application with a command-line tool; self-hosted by the user
Licence Apache License 2.0 (LICENSE in the repository). It grants use, modification and redistribution, and disclaims warranty and liability (sections 7 and 8 of the licence)
Source code Public, complete, in the project's repository; no closed components
Languages and platform TypeScript on Node.js 22.18 or newer; Next.js and React for the web interface; PostgreSQL (recommended), SQLite, file or memory for storage
Release identification Version number in server/app.ts (VERSION), reported by /api/health; release tags and commit hashes in the repository (verify)
Change history CHANGELOG.md
Security contact SECURITY.md describes how to report a vulnerability
Documentation README.md; docs/ (developer setup, configuration, storage, authentication, deployment, operations, architecture, API, migration, security, user guide); this validation pack
Installed base Version 1.0.0 is the first release. No track record in regulated use can be claimed

3. Development practices present in the repository

Only what can be seen in the code is listed.

Practice Evidence Where
One rules engine as pure functions, shared by browser, server, command-line tool and tests act takes a state, an actor, a command and a time and returns a new state and an entry or a refusal; no input or output inside lib/engine.ts, lib/config.ts, lib/resolve.ts
Requirement catalogue 15 user and 88 functional requirements with risk rating and verification method docs/validation/requirements.json
Requirement-tagged automated tests Every test name starts with the id of the requirement it verifies, for example [FR-WF-04] lib/engine.test.ts, lib/migrate.test.ts, server/server.test.ts
Traceability generated, and checked in the test run scripts/trace.ts builds the matrix from the catalogue and the test names; lib/trace.test.ts fails if a requirement has no test or walkthrough step, if a test names an unknown requirement, or if the matrix is out of date scripts/trace.ts, lib/trace.test.ts, docs/validation/traceability-matrix.md
Storage conformance tests The same tests run against every storage adapter: append and read back, refusal of an entry that does not continue the chain, survival of a restart, refusal of UPDATE, DELETE and TRUNCATE at database level, two writers at once server/server.test.ts (PostgreSQL only when COUNTERSIGN_TEST_DATABASE_URL is set)
Tests of sign-in against a mock identity provider Code flow with PKCE, state and nonce; wrong signature, audience, issuer, nonce and state are refused; re-authentication for approvals; CSRF checks; proxy secret server/server.test.ts
Negative and tamper tests Altered, forged, missing, reordered and inserted entries; altered store behind a running service lib/engine.test.ts, server/server.test.ts
End-to-end walkthrough of the interface A browser script drives the demo through every feature and fails on a broken step; its steps carry the FR-UI ids scripts/guide-shots.mjs
Dated execution report Runs the suite and writes environment, one row per requirement with result, totals and a signature block scripts/oq-report.ts (npm run oq)
Reviewable database schema One SQL file, idempotent, read from disk when the server applies it db/postgres.sql
Demo data built by the engine The demo history is produced by real commands, so it is itself a replay test for three configurations lib/seed.ts, lib/presets/
Type checking TypeScript throughout Repository

Not evidenced in the repository itself, so not claimed here: a documented code review process, branch protection, continuous integration, signed releases, static security analysis, a defined support period. Verify what the published repository shows and record it in section 6.

4. Dependencies and software bill of materials

Runtime dependencies declared by the application:

Package Used for Notes
next Web framework: pages and HTTP route handlers
react, react-dom User interface
pg PostgreSQL driver Loaded only when the PostgreSQL store is selected
jose Verification of OpenID Connect ID tokens against the provider's keys Used only in server/auth/oidc.ts (and by the tests' mock provider)
marked Rendering of the documentation pages (Markdown to HTML) Not involved in records or the audit trail
mermaid Drawing the diagrams of the documentation pages in the browser Loaded only by documentation pages that contain a diagram; not involved in records or the audit trail

Node.js built-in modules used instead of further dependencies:

Module Used for
node:crypto HMAC-SHA256 of the session cookie, constant-time comparison, random values and the PKCE challenge of the sign-in flow, SHA-256 of migration source files
node:sqlite The SQLite store
node:fs, node:path, node:os, node:util Files, the file store, command-line parsing
node:test, node:assert The test suite (no test framework dependency)

One point for the assessor: the SHA-256 of the audit trail's hash chain is computed by a small implementation inside the repository (lib/sha256.ts), not by node:crypto, so that the identical code runs in the browser and on the server. The test [FR-INT-01] checks it against published SHA-256 known answers and against node:crypto, and you can check it independently on your own trail with the standalone script in Data integrity, section 6.2, which uses node:crypto and must reproduce every hash.

Producing the bill of materials for the release you install (attach to the IQ):

npm ci                                            # install exactly what the lock file names
npm ls --all --omit=dev > npm-ls-runtime.txt      # the runtime dependency tree with versions
npm ls --all > npm-ls.txt                         # including development tools
npm sbom --sbom-format cyclonedx > sbom.cdx.json  # CycloneDX; or --sbom-format spdx
npm audit --omit=dev                              # known vulnerabilities in runtime dependencies

The lock file (package-lock.json) pins every direct and transitive dependency with an integrity hash; installing with npm ci reproduces that set. Transitive dependencies of next are numerous; they are in the bill of materials, not in the table above.

5. What the project does not provide

Not provided Consequence for the regulated user
Warranty or liability The licence disclaims both. The risk of use is yours
A vendor to audit; a postal or on-site audit Assess from the public evidence; compensate with your own verification
A certified quality management system (for example ISO 9001) or documented development procedures Treat supplier assurance as low; run the complete test suite yourself, review high-risk code, execute the manual and negative tests
A support contract, service levels, guaranteed response to defects or security reports Decide who maintains your installation: your own developers or a service provider under contract
A penetration test report or independent security assessment Commission your own if your risk assessment requires one
A statement of compliance with 21 CFR Part 11, EU GMP Annex 11 or any other regulation, or any certification See Part 11 and Annex 11 mapping: a description with stated gaps, not a claim
Validation of your installation This pack is a set of templates; execution and approval are yours
Hosting, backup, monitoring, identity Your infrastructure
A guaranteed roadmap, long-term support versions or backports Plan upgrades under your change control; keep the ability to stay on a version you validated
Training services User guide and the operator documentation only
Escrow Not needed: you hold the complete source under a licence that lets you maintain it

What open source gives in return: complete transparency of the code and its history, the right to review, test, fix and keep any version indefinitely, and independence from a vendor's continued existence.

6. Questionnaire

Completed for Countersign 1.0.0 from the repository. Fill the "verified by you" column when you have checked the statement against the release you install; complete the rows marked "verify".

6.1 Supplier

No. Question Answer Verified by you (initials, date)
1 Legal entity supplying the software None. Open-source project; maintainers as listed in the repository (verify)
2 Contract or agreement with the supplier None, other than the Apache-2.0 licence
3 Certified quality system None
4 Can the supplier be audited No
5 Years in business; number of customers; references in regulated industry Not applicable; first release
6 Financial stability; continuity if the supplier ceases Not applicable; the source remains available to you under the licence
7 Support, service levels, escalation None committed

6.2 Development

No. Question Answer Verified by you (initials, date)
8 Is there a requirements specification Yes: docs/validation/requirements.json, 15 user and 88 functional requirements
9 Is there a design or functional specification Yes: functional specification, Architecture
10 Are requirements traced to tests Yes: generated matrix; the test run fails if a requirement is unverified
11 Is testing automated and repeatable by the customer Yes: npm test; report with npm run oq
12 Are there negative, boundary and security tests Yes: refusals for every rule, tamper detection, sign-in failures, CSRF, concurrency
13 Is the source under version control with history Yes: Git (verify the published history)
14 Is every change reviewed by a second person before release Not evidenced in the repository (verify)
15 Is there continuous integration running the tests on every change Verify in the published repository
16 Coding standards, static analysis TypeScript type checking; no further evidence (verify)
17 Are developers' qualifications documented No
18 Is third-party code inventoried Yes: package.json, package-lock.json; SBOM by npm sbom
19 Are cryptographic functions standard library implementations Partly. HMAC, random numbers and token verification use node:crypto and jose; the SHA-256 of the audit chain is an in-repository implementation, tested against known answers and node:crypto (section 4)

6.3 Release and maintenance

No. Question Answer Verified by you (initials, date)
20 How are releases identified Version number; tag and commit hash (verify)
21 Are release notes provided CHANGELOG.md
22 Are releases signed or checksummed Verify; otherwise record the commit hash and your own checksum in the IQ
23 How are defects reported and tracked The project's issue tracker (verify)
24 How are security vulnerabilities reported and announced SECURITY.md
25 Are customers notified of critical defects No notification service; watch the repository's releases and advisories
26 How long is a version supported No commitment
27 Is backward compatibility of stored data assured across versions No formal commitment. The audit trail is replayed by the installed version, so the user must run the new version's countersign verify on a copy of production before upgrading (SOP templates, SOP 10)
28 Is there a documented way to verify data without the software Yes: Data integrity, section 6

6.4 Product characteristics relevant to assessment

No. Question Answer Verified by you (initials, date)
29 Does the software send data to the supplier or third parties No telemetry in the application's code. Outbound connections at run time: to your identity provider (discovery, token, keys) and your database. The Next.js framework collects anonymous usage data during builds unless NEXT_TELEMETRY_DISABLED=1 is set
30 Does it need internet access at run time Only to reach the identity provider, if that is a cloud service
31 Can the audit trail be disabled or configured off No. It is the data store
32 Can records be deleted No. Retire and remove are audited state changes; nothing is physically deleted by the application
33 Are there built-in or default accounts or passwords No accounts and no passwords in the application. The actor system writes the first configuration entry only. Demo sign-in exists only with COUNTERSIGN_AUTH=demo
34 Are there back doors or administrative overrides of the workflow None in the engine. The command-line tool can import records as approved and change the configuration in one step, under stated identity, with the corresponding permission, recorded in the trail. A database owner can write to the table directly; that is detected as described in Data integrity, section 5
35 Known limitations Listed in Part 11 and Annex 11 mapping, section 2, and user requirements, section 6

7. Assessment and decision (complete)

Item Entry
Software category confirmed (see README, section 4)
Supplier assurance rating (for example: none, low, medium, high) and reason
Compensating measures decided [ ] Full automated suite executed by us (OQ part A) [ ] Manual and negative tests (OQ parts B and C) [ ] Code review of: ______ [ ] Independent verification script run [ ] Penetration test [ ] Support arrangement with: ______ [ ] Internal fork under our code control [ ] Other: ______
Who maintains the installation and applies security updates
How new releases and advisories are monitored
Decision [ ] Accepted [ ] Accepted with conditions: ______ [ ] Rejected
Role Name Signature Date
Assessed by
System owner
Quality assurance