Skip to content
Open
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1f396cf
feat(api): list startable published instruments over HTTP
cursoragent Aug 16, 2026
02d9121
docs(traceability): name Active PR #165 for instrument catalog HTTP
cursoragent Aug 16, 2026
523ceb7
test(recovery): seed processing claim_deadline_at after inbox expiry
seonghobae Aug 16, 2026
336c1ed
test(api): cover truncated catalog requests and extra request-line to…
seonghobae Aug 16, 2026
e214a57
test(api): hide suspended and unpublished instrument families
seonghobae Aug 16, 2026
a3d3a67
style(api): keep catalog visibility regression rustfmt-clean
seonghobae Aug 16, 2026
f2f6f83
style(api): rustfmt catalog visibility regression
seonghobae Aug 16, 2026
94def41
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae Aug 26, 2026
bedda40
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae Aug 26, 2026
8a65595
test(instrument-http): cover every non-startable publication state
seonghobae Aug 27, 2026
1900701
test(instrument-http): require RFC 9110 Allow metadata
seonghobae Aug 27, 2026
123aee6
chore(instrument-http): remove unimplemented Allow probe
seonghobae Aug 27, 2026
565cb5c
test(instrument-http): require RFC 9110 Allow metadata
seonghobae Aug 27, 2026
e27d6de
fix(instrument-http): emit RFC 9110 Allow for method rejection
seonghobae Aug 27, 2026
270bcb2
docs(instrument-http): bind 405 Allow contract in OpenAPI
seonghobae Aug 27, 2026
af5339f
test(instrument-http): cover encoded multilingual family refs
seonghobae Aug 27, 2026
ffba05b
test(instrument-http): exercise strict percent-decoding boundaries
seonghobae Aug 27, 2026
bcf45c7
test(instrument-http): accept encoded multilingual family refs
seonghobae Aug 27, 2026
94a9005
fix(instrument-http): decode canonical UTF-8 path segments
seonghobae Aug 27, 2026
7eeef16
test(instrument-http): cover percent decoder boundaries
seonghobae Aug 27, 2026
537484c
test(instrument-http): preserve timeout error boundary
seonghobae Aug 27, 2026
df3da6e
fix(instrument-http): propagate slow-client read timeout
seonghobae Aug 27, 2026
254d4bc
fix(pr-165): address review feedback
github-actions[bot] Sep 29, 2026
bb90287
test(api): close instrument catalog coverage gaps
seonghobae Oct 7, 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
5 changes: 3 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ All notable product and architecture changes are recorded here. Releases use imm
## Unreleased

### Added
- Active PR #248 adds PostgreSQL 18 durability for immutable normalized longitudinal observation evidence: exact source identity, separate validity/recorded/received/ingested clocks, explicit membership shares whose deferred transaction invariant totals 10,000 basis points, exact replay, tenant isolation, and fail-closed rebinding/immutability. This entry is active-PR evidence only and is not a protected-main or release claim.
- Active PR #287 rejects padded or otherwise noncanonical published narrative, style-mapping, interpretation-unit, and approved-selection references before deterministic rendering. Numeric score authority and the protected-main narrative boundary are unchanged; this is active-PR evidence only and not a release claim.
- Active PR #165 adds public in-process instrument catalog HTTP: `GET /v1/instruments` and `GET /v1/instruments/{instrument_ref}` return only published locale-specific releases so a purchaser can copy `release_ref` and `locale` into `POST /v1/sessions`. Draft, suspended, and retired rows stay hidden. OpenAPI 3.2 is limited to those two operations.
- Merged #248 adds PostgreSQL 18 durability for immutable normalized longitudinal observation evidence: exact source identity, separate validity/recorded/received/ingested clocks, explicit membership shares whose deferred transaction invariant totals 10,000 basis points, exact replay, tenant isolation, and fail-closed rebinding/immutability.
- Merged #287 rejects padded or otherwise noncanonical published narrative, style-mapping, interpretation-unit, and approved-selection references before deterministic rendering. Numeric score authority and the protected-main narrative boundary are unchanged.
- Personal result export delivery authorization (`authorize_result_export_read`) reuses the stored-record `ReadOwnResult` check on the product-owned participant and immutable result, then requires the export's result snapshot reference and copied participant reference to match that exact snapshot. A cross-tenant caller fails closed with the ordinary result-authorization denial before export-binding details are evaluated, so a mismatched export is not an existence oracle. No new permission or persistence is introduced; authorized HTTP transport ships through merged `src/result_export_http.rs` and `openapi/result-exports.yaml`. This is the post-#231 export-delivery guard (ADR-0010 provenance; ADR-0003 tenant-bound authorization).
- Personal result export copies one immutable snapshot into JSON and a human-readable report so a purchaser can archive the same Extraversion estimate, standard error, and version provenance they were shown. The owner participant reference stays in both artifacts. Abstained or failed constructs keep their disposition and do not receive an invented score. Approved limitation text is required.
- Product and technical gap baseline records the exact protected-main snapshot, current participant-visible gaps, all open repository PRs, issue #260 dependency, and the next executable delivery loop.
Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ Measure -> Understand -> Reflect -> Observe Over Time -> Contribute to Science

This repository owns the hosted product runtime and integration composition. It consumes reusable measurement contracts and numerical capabilities from `ContextualWisdomLab/fast-mlsirm`; identity and federation from Keyverse; temporal/event analysis from TEPP; and research release/catalog capabilities from `semantic-data-portal`.

## Start with a published instrument

When the instrument catalog HTTP family is running in this process:

1. Call `GET /v1/instruments` to list startable published locale-specific releases.
2. Copy one `release_ref` and its exact `locale`.
3. Call `POST /v1/sessions` with those values when the session family is available.

Draft, suspended, and retired releases are omitted. The as-built contract is [`openapi/instruments.yaml`](openapi/instruments.yaml).

## Architecture boundary

Psychometrics Commons owns product APIs, instrument publication, participant/session lifecycle, response events, consent and data-rights workflows, scoring dispatch, immutable result snapshots, product persistence, resource authorization, reference-client composition, deployment profiles, research-contribution handoff, observability, and service integration.
Expand Down
2 changes: 1 addition & 1 deletion docs/DOCUMENTATION_ASSESSMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ This reconciliation closes those architecture-definition gaps without promoting
| Quality / risk / compliance readiness | **Sufficient as assurance baseline** | Evidence scenarios and risk state are explicit; readiness is not certification. |
| Traceability | **Repaired in this reconciliation** | Baseline now names exact protected-main `4499d9c…`, reconciles merged result/session/anonymous-authorization/scoring-adapter slices, and isolates still-open PRs from shipped truth. Must be updated after every material merge. |
| Roadmap / agent guidance / changelog | **Sufficient for continued delivery** | Must remain code-current; documentation completion is not a terminal condition for the execution loop. |
| Machine-readable OpenAPI / AsyncAPI | **Not yet applicable as as-built evidence** | Add and validate with the first implemented HTTP/event transport. Do not publish aspirational operations as deployed. |
| Machine-readable OpenAPI / AsyncAPI | **Active PR** #165 instrument catalog HTTP (`openapi/instruments.yaml`) is as-built for `GET /v1/instruments` and `GET /v1/instruments/{instrument_ref}` only; remaining families and AsyncAPI stay unimplemented | Do not list session, response, consent, or event operations as deployed until those transports exist. |
| Physical schema / as-built topology | **Partial / implementation-gated** | Logical ERD is authoritative target semantics. Actual migrations/topology/rollback/restore evidence must be compared to it as those artifacts land. |
| Instrument-release evidence bundles | **Target** | Every publishable consumer instrument needs immutable rights, locale/translation, scoring/calibration/norm, DIF/invariance/linking where claimed, scoreability, intended-use and narrative-rule evidence. |

Expand Down
Loading
Loading