Part of #589.
CONTEXT
Experience has a free-text Owner and Developer (internal/store/store.go:21-22) and no org link. There is no ?owner= or ?organization= filter on any list endpoint. "My experiences" for visit-flanders cannot be resolved. Also, the runbook create example documents an organization_id field that does not exist (docs/runbooks/runbook.md:83); the real field is owner (internal/api/handlers.go:44).
SCOPE
- Add OrganizationID string
yaml:"organization_id,omitempty" json:"organization_id,omitempty" to the Experience struct (store.go:17-43). YAML store means no migration: old files unmarshal with the zero value.
- Accept organization_id on create and update requests (handlers.go:44 area). Keep Owner as free text, unchanged.
- Validate on write: when organization_id is non-empty, GET https://hydraorganization.experiencenet.com/api/v1/organizations/{id} (public read) must return 200. Reject with a 400 {"error": "unknown organization"} otherwise, in the existing inline-validation style. If hydraorganization is unreachable, log a warning and accept, so the library does not hard-depend on the registry being up.
- Add ?organization= filtering to the experience list endpoints (same pattern as the existing ?district=&venue= filters on /api/v1/experiences/live, handlers.go:643-686).
- Data: set organization_id=visit-flanders on mercator-talks and rupelmonde-castle-viewer via the API.
- Fix docs/runbooks/runbook.md:83 so the create example matches the implemented fields (owner plus the new organization_id).
- Tests for the filter and validation.
ACCEPTANCE CRITERIA
- GET /api/v1/experiences?organization=visit-flanders (bearer token) returns mercator-talks and rupelmonde-castle-viewer and nothing else.
- Create/update with an unknown organization_id returns 400.
- Runbook example is correct.
FILES
- /home/claude-user/hydraexperiencelibrary/internal/store/store.go
- /home/claude-user/hydraexperiencelibrary/internal/api/handlers.go
- /home/claude-user/hydraexperiencelibrary/internal/api/server.go
- /home/claude-user/hydraexperiencelibrary/docs/runbooks/runbook.md
DEPLOY
Tag vX.Y.Z, push, CI builds binaries plus the multi-arch OCI image. The venues-experiences system map verifies the live instance runs as an Incus scale on pi-node-004-nvme (node-50ab5309), updated via hydraskin update hydraexperiencelibrary --apply after CI publishes (verified for v0.10.6 to v0.10.7). Before applying, confirm the hosting is still current: run hydraskin list on the node over the hydracluster exec transport (POST /api/v1/nodes/{id}/exec, never SSH) and check the scale name and tag. Dry-run first, then --apply, then verify /api/v1/health reports the new version.