Extension Lifecycle
The extension lifecycle specification defines how OJS extensions progress from experimental ideas to stable core features. It establishes governance, versioning, and compatibility rules for the extension ecosystem.
Extension Tiers
Section titled “Extension Tiers”| Tier | Stability | Breaking Changes | Requirement |
|---|---|---|---|
| Core | Stable | Major version only | Required at specific conformance levels |
| Official | Stable | Deprecation cycle required | Opt-in, documented |
| Experimental | Unstable | May break at any time | Opt-in, marked with warning |
Extension Identification
Section titled “Extension Identification”Extensions are identified by URN:
| Tier | URN Pattern | Example |
|---|---|---|
| Core | urn:ojs:spec:{name} | urn:ojs:spec:retry |
| Official | urn:ojs:ext:{name} | urn:ojs:ext:rate-limiting |
| Experimental | urn:ojs:ext:experimental:{name} | urn:ojs:ext:experimental:multi-tenancy |
| Custom | urn:ojs:ext:x:{vendor}:{name} | urn:ojs:ext:x:acme:billing |
Promotion Criteria
Section titled “Promotion Criteria”Experimental → Official
Section titled “Experimental → Official”- Two or more independent implementations
- Conformance tests written and passing
- Eight-week community review period
- Four-week stability period (no breaking changes)
- Working group approval
Official → Core
Section titled “Official → Core”- 80%+ adoption across known backends
- Six or more months of production use
- Consensus approval from maintainers
- Backward-compatible integration with core spec
Manifest Declaration
Section titled “Manifest Declaration”Backends declare supported extensions in their manifest:
{ "specversion": "1.0.0-rc.1", "extensions": [ { "name": "retry", "uri": "urn:ojs:spec:retry", "version": "1.0.0" }, { "name": "rate-limiting", "uri": "urn:ojs:ext:rate-limiting", "version": "1.0.0" }, { "name": "multi-tenancy", "uri": "urn:ojs:ext:experimental:multi-tenancy", "version": "0.1.0" } ]}SDK Negotiation
Section titled “SDK Negotiation”SDKs discover backend capabilities via the manifest and enable features conditionally:
client, _ := ojs.NewClient("http://localhost:8080")if client.Supports("rate-limiting") { // Use rate limiting features}Extension Requirement Headers
Section titled “Extension Requirement Headers”Clients can require specific extensions, failing fast if the backend doesn’t support them:
POST /ojs/v1/jobsOJS-Requires-Extension: rate-limiting, unique-jobsIf the backend does not support a required extension, it returns 501 with the missing extension name.
Community Process
Section titled “Community Process”- RFC proposal: Submit an RFC with the extension design.
- Prototype: Build a working prototype in at least one language.
- Review: Working group review and feedback.
- Experimental release: Publish as experimental with stability warnings.
- Promotion: Meet promotion criteria for advancement.