openvibers/openvibe.contracts Commits
Locker's service manifest; Computer is live (#359)
Changes
@@@ -12,21 +12,34 @@],"publicOrigin": "https://openvibe.computer","exposure": {-- "state": "repository",-- "publicSite": null,-- "note": "Computer is a new front door over Run. The repo and reference vhost are prepared; host launch is pending review."++ "state": "live",++ "publicSite": "service",++ "note": "openvibe.computer is live (launched 2026-11-08): a front door over OpenVibe.Run."},"capabilities": [],"eventsProduced": [],"eventsConsumed": [],"namespacesOwned": [],"lifecycle": {-- "liveness": { "none": "Computer is prepared in the repository and is not installed on a host yet." },-- "shutdown": { "none": "Computer has no running host process yet." },-- "startupRecovery": { "none": "Computer has no running host process or local state yet." },-- "rollback": { "none": "Host deployment is pending review." },-- "contracts": { "range": ">=0.346.0 <1.0.0" },-- "leases": { "none": "Computer keeps no sessions; OpenVibe.Run owns session state and placement." }++ "liveness": {++ "endpoint": "/api/health",++ "means": "the process is up and answers HTTP"++ },++ "shutdown": {++ "none": "Computer has no running host process yet."++ },++ "startupRecovery": {++ "none": "Computer has no running host process or local state yet."++ },++ "rollback": {++ "none": "Host deployment is pending review."++ },++ "contracts": {++ "range": ">=0.346.0 <1.0.0"++ },++ "leases": {++ "none": "Computer keeps no sessions; OpenVibe.Run owns session state and placement."++ }},"site": {"name": "Computer",nnew file mode 100644@@@ -0,0 +1,78 @@++{++ "version": "0.1.0",++ "contractRanges": {++ "openvibe-contracts": ">=0.346.0 <1.0.0"++ },++ "id": "locker",++ "name": "OpenVibe.Locker",++ "status": "alpha",++ "repository": "OpenVibers/OpenVibe.Locker",++ "domains": [++ "openvibe.locker"++ ],++ "publicOrigin": "https://openvibe.locker",++ "exposure": {++ "state": "live",++ "publicSite": "service",++ "note": "openvibe.locker serves Drive, Sends and the recovery kit once Locker's vhost replaces the parked 302 to openvibe.download (Network #678, the same step)."++ },++ "capabilities": [],++ "eventsProduced": [],++ "eventsConsumed": [],++ "namespacesOwned": [++ "locker"++ ],++ "lifecycle": {++ "liveness": {++ "endpoint": "/api/health",++ "means": "the process is up and answers HTTP"++ },++ "shutdown": {++ "signal": "SIGTERM",++ "deadlineSeconds": 1800,++ "drains": [++ "uploads in flight finish or keep their resumable parts",++ "the cleanup timer stops after its batch",++ "HTTP server closed and in-flight requests drained",++ "PostgreSQL pool closed, then the process exits"++ ]++ },++ "startupRecovery": {++ "resumes": [++ {++ "kind": "state",++ "what": "items, Sends, reservations and upload sessions in ov_locker survive a stop; ciphertext lives in Media's locker tenant"++ },++ {++ "kind": "schedule",++ "what": "the cleanup is due-based: its first run after a stop expires Sends, releases abandoned uploads and retries Media erasure"++ }++ ]++ },++ "rollback": {++ "conditions": [++ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",++ "manual: ovhost rollback <service> --to <sha>"++ ],++ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",++ "blockers": {++ "none": "migrations are expand only; an earlier release reads none of what a later one added"++ }++ },++ "contracts": {++ "range": ">=0.346.0 <1.0.0"++ },++ "leases": {++ "none": "Locker holds no cross-service leases; quota reservations are rows in its own database."++ }++ },++ "site": {++ "name": "Locker",++ "icon": "lock",++ "tagline": "Files only you can open",++ "what": "End-to-end encrypted files and expiring Sends: OpenVibe stores only ciphertext and cannot read what is inside.",++ "legalProfile": "hosting",++ "position": 54,++ "neighbourhood": "make"++ }++}
@@ -12,21 +12,34 @@
@@ -12,21 +12,34 @@
],
],
"publicOrigin": "https://openvibe.computer",
"publicOrigin": "https://openvibe.computer",
"exposure": {
"exposure": {
- "state": "repository",
- "publicSite": null,
- "note": "Computer is a new front door over Run. The repo and reference vhost are prepared; host launch is pending review."
+ "state": "live",
+ "publicSite": "service",
+ "note": "openvibe.computer is live (launched 2026-11-08): a front door over OpenVibe.Run."
},
},
"capabilities": [],
"capabilities": [],
"eventsProduced": [],
"eventsProduced": [],
"eventsConsumed": [],
"eventsConsumed": [],
"namespacesOwned": [],
"namespacesOwned": [],
"lifecycle": {
"lifecycle": {
- "liveness": { "none": "Computer is prepared in the repository and is not installed on a host yet." },
- "shutdown": { "none": "Computer has no running host process yet." },
- "startupRecovery": { "none": "Computer has no running host process or local state yet." },
- "rollback": { "none": "Host deployment is pending review." },
- "contracts": { "range": ">=0.346.0 <1.0.0" },
- "leases": { "none": "Computer keeps no sessions; OpenVibe.Run owns session state and placement." }
+ "liveness": {
+ "endpoint": "/api/health",
+ "means": "the process is up and answers HTTP"
+ },
+ "shutdown": {
+ "none": "Computer has no running host process yet."
+ },
+ "startupRecovery": {
+ "none": "Computer has no running host process or local state yet."
+ },
+ "rollback": {
+ "none": "Host deployment is pending review."
+ },
+ "contracts": {
+ "range": ">=0.346.0 <1.0.0"
+ },
+ "leases": {
+ "none": "Computer keeps no sessions; OpenVibe.Run owns session state and placement."
+ }
},
},
"site": {
"site": {
"name": "Computer",
"name": "Computer",
new file mode 100644
new file mode 100644
@@ -0,0 +1,78 @@
@@ -0,0 +1,78 @@
+{
+ "version": "0.1.0",
+ "contractRanges": {
+ "openvibe-contracts": ">=0.346.0 <1.0.0"
+ },
+ "id": "locker",
+ "name": "OpenVibe.Locker",
+ "status": "alpha",
+ "repository": "OpenVibers/OpenVibe.Locker",
+ "domains": [
+ "openvibe.locker"
+ ],
+ "publicOrigin": "https://openvibe.locker",
+ "exposure": {
+ "state": "live",
+ "publicSite": "service",
+ "note": "openvibe.locker serves Drive, Sends and the recovery kit once Locker's vhost replaces the parked 302 to openvibe.download (Network #678, the same step)."
+ },
+ "capabilities": [],
+ "eventsProduced": [],
+ "eventsConsumed": [],
+ "namespacesOwned": [
+ "locker"
+ ],
+ "lifecycle": {
+ "liveness": {
+ "endpoint": "/api/health",
+ "means": "the process is up and answers HTTP"
+ },
+ "shutdown": {
+ "signal": "SIGTERM",
+ "deadlineSeconds": 1800,
+ "drains": [
+ "uploads in flight finish or keep their resumable parts",
+ "the cleanup timer stops after its batch",
+ "HTTP server closed and in-flight requests drained",
+ "PostgreSQL pool closed, then the process exits"
+ ]
+ },
+ "startupRecovery": {
+ "resumes": [
+ {
+ "kind": "state",
+ "what": "items, Sends, reservations and upload sessions in ov_locker survive a stop; ciphertext lives in Media's locker tenant"
+ },
+ {
+ "kind": "schedule",
+ "what": "the cleanup is due-based: its first run after a stop expires Sends, releases abandoned uploads and retries Media erasure"
+ }
+ ]
+ },
+ "rollback": {
+ "conditions": [
+ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",
+ "manual: ovhost rollback <service> --to <sha>"
+ ],
+ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
+ "blockers": {
+ "none": "migrations are expand only; an earlier release reads none of what a later one added"
+ }
+ },
+ "contracts": {
+ "range": ">=0.346.0 <1.0.0"
+ },
+ "leases": {
+ "none": "Locker holds no cross-service leases; quota reservations are rows in its own database."
+ }
+ },
+ "site": {
+ "name": "Locker",
+ "icon": "lock",
+ "tagline": "Files only you can open",
+ "what": "End-to-end encrypted files and expiring Sends: OpenVibe stores only ciphertext and cannot read what is inside.",
+ "legalProfile": "hosting",
+ "position": 54,
+ "neighbourhood": "make"
+ }
+}