AXIS© PlantUML Board
Live-rendered contract and app integration diagrams sourced from the local `.puml` files in `docs/diagrams`.
Episode Sync Lifecycle
How the episode catalog becomes onchain event registry state.
/episode-sync-lifecycle
Diagrams are scaled to fit the screen without horizontal scroll. Use Open SVG to zoom and inspect every label on mobile.
View PlantUML Source
@startuml
title Episode Catalog to Event Registry Sync
actor OwnerAdmin
participant "Owner Episodes Dashboard" as Dashboard
database "episodes.json" as Catalog
participant "Episode Sync Service" as SyncSvc
participant "SpectraEventAccessRegistry" as Registry
OwnerAdmin -> Dashboard : edit episode
Dashboard -> Catalog : save record
OwnerAdmin -> Dashboard : sync onchain
Dashboard -> SyncSvc : syncEpisodeToRegistry(slug)
SyncSvc -> Catalog : read episode
SyncSvc -> SyncSvc : build registry payload
alt registryEventId exists
SyncSvc -> Registry : updateEvent(eventId, name, metadataURI, active)
else first sync
SyncSvc -> Registry : createEvent(name, metadataURI)
Registry --> SyncSvc : EventCreated(eventId)
SyncSvc -> Catalog : persist registryEventId
end
SyncSvc --> Dashboard : action + tx hash + registryEventId
@enduml
Founder Mint Lifecycle
Submission approval and Season 1 founder membership mint lifecycle.
/founder-mint-lifecycle
Diagrams are scaled to fit the screen without horizontal scroll. Use Open SVG to zoom and inspect every label on mobile.
View PlantUML Source
@startuml
title Founder Submission to Founder Mint
actor Applicant
actor Approver
participant "SpectraSubmissionRegistry" as Submission
participant "SpectraFounderSeason1_1155" as Founder1155
Applicant -> Submission : createSubmission(emailHash, metadataURI)
Submission --> Applicant : submissionId
Applicant -> Submission : updateSubmissionMetadata(submissionId, metadataURI)
Approver -> Submission : setSubmissionApproval(submissionId, true)
Applicant -> Founder1155 : mintFounder(submissionId)
Founder1155 -> Submission : getSubmission(submissionId)
Submission --> Founder1155 : submission data
Founder1155 -> Founder1155 : validate approved\nvalidate applicant\nvalidate not minted
Founder1155 -> Applicant : mint tokenId=submissionId
Founder1155 -> Submission : markMinted(submissionId, tokenId)
Submission --> Founder1155 : ok
@enduml
Full Architecture
Top-level relationship map between the app, episode catalog, and all core contracts.
/full-architecture
Diagrams are scaled to fit the screen without horizontal scroll. Use Open SVG to zoom and inspect every label on mobile.
View PlantUML Source
@startuml
title SPECTRA Full Contract + App Architecture
skinparam componentStyle rectangle
skinparam packageStyle rectangle
actor User
actor Applicant
actor OwnerAdmin as "Owner / Admin"
actor Agent as "AI Agent"
package "Next.js App" {
[Episodes UI]
[Owner Episodes Dashboard]
[Admin Session API]
[Episodes Metadata API]
[Episode Sync Service]
[Owner Session Service]
database "episodes.json" as EpisodesJson
}
package "Contracts" {
[SpectraSubmissionRegistry]
[SpectraFounderSeason1_1155]
[SpectraEventAccessRegistry]
[SpectraOwnerAccess1155]
}
Applicant --> [Episodes UI]
Applicant --> [SpectraSubmissionRegistry] : createSubmission()
[SpectraFounderSeason1_1155] --> [SpectraSubmissionRegistry] : getSubmission()\nmarkMinted()
OwnerAdmin --> [Owner Episodes Dashboard]
[Owner Episodes Dashboard] --> [Admin Session API]
[Admin Session API] --> [Owner Session Service]
[Owner Session Service] --> [SpectraOwnerAccess1155] : balanceOf()
[Owner Episodes Dashboard] --> EpisodesJson : edit/save
[Episodes Metadata API] --> EpisodesJson : read
[Episode Sync Service] --> EpisodesJson : read/write registryEventId
[Episode Sync Service] --> [SpectraEventAccessRegistry] : createEvent()/updateEvent()
Agent --> [Admin Session API] : optional wallet auth
[Episodes UI] --> [Episodes Metadata API]
User --> [Episodes UI]
OwnerAdmin --> [SpectraOwnerAccess1155] : mint/revoke via ops scripts
OwnerAdmin --> [SpectraEventAccessRegistry] : event management
@enduml
Owner Auth Lifecycle
Wallet challenge, token verification, and owner dashboard session issuance.
/owner-auth-lifecycle
Diagrams are scaled to fit the screen without horizontal scroll. Use Open SVG to zoom and inspect every label on mobile.
View PlantUML Source
@startuml
title Owner Dashboard Wallet Authentication
actor WalletHolder
participant "EpisodesAdminPanel" as Panel
participant "Admin Session API" as SessionApi
participant "Owner Session Service" as SessionSvc
participant "SpectraOwnerAccess1155" as Owner1155
WalletHolder -> Panel : connect wallet
Panel -> SessionApi : POST mode=challenge
SessionApi -> SessionSvc : createOwnerWalletChallenge(address)
SessionSvc --> SessionApi : challenge message
SessionApi --> Panel : challenge message
WalletHolder -> Panel : sign message
Panel -> SessionApi : POST mode=wallet\naddress + signature
SessionApi -> SessionSvc : verifyOwnerWalletSignature(...)
SessionApi -> SessionSvc : issueOwnerWalletSession(address)
SessionSvc -> Owner1155 : balanceOf(address, tokenId)
Owner1155 --> SessionSvc : balance > 0
SessionSvc --> SessionApi : session issued
SessionApi --> Panel : authenticated
@enduml