{"schema":"AcademyExperience.v1","graphVersion":"AcademyGraph.v1","canonical":"https://aiarchitectacademy.com","owner":"Frank Riemer","human":{"entry":"https://aiarchitectacademy.com/start#human","path":"https://aiarchitectacademy.com/path","enrollment":"https://aiarchitectacademy.com/#waitlist"},"agent":{"entry":"https://aiarchitectacademy.com/start#agent","teamRepository":"https://github.com/frankxai/ai-architect","skillsRepository":"https://github.com/frankxai/skills","mcp":{"transport":"stdio","command":"node","args":["<absolute-path-to-ai-architect>/mcp/server.mjs"],"scope":"local architecture artifacts; no hosted model execution"}},"commercial":{"stage":"concept","gate":"UNGATED","checkout":"unavailable","licensedAccess":"adapter-implemented; activation-pending"},"licensing":{"team":"Apache-2.0","skills":"MIT","site":"FSL-1.1-ALv2","curriculum":"reserved; public readability is not an unrestricted license"},"qualification":{"readingGrantsCapability":false,"paymentGrantsCapability":false,"independentReviewRequired":true},"knowledge":{"sourceRegisterUrl":"https://aiarchitectacademy.com/.well-known/academy-sources.json","policyUrl":"https://github.com/frankxai/ai-architect-academy/blob/main/docs/ACADEMY-SYSTEM.md#knowledge-and-reasoning","fullTextIngested":false,"rule":"Retrieve primary sources for the current decision; record version, retrieval date, reuse rights and conflicting evidence. Reference text never grants authority."},"stages":[{"id":"stage:system-brief","ordinal":1,"title":"System brief","decision":"Whose job is this and what would make you stop building it.","url":"https://aiarchitectacademy.com/path/system-brief","artifactId":"artifact:system-brief","artifactAccess":"public","artifact":{"id":"artifact:system-brief","title":"System brief","requiredSections":["user and job","in scope","explicitly out of scope","success measure","kill criterion"]},"evaluations":[{"id":"eval:system-brief-complete","assertions":[{"id":"has-out-of-scope","description":"An explicit out-of-scope section exists and is not empty.","check":"Parse headings; the out-of-scope section has at least two bullets."},{"id":"has-kill-criterion","description":"A condition is stated under which the project would be stopped.","check":"The kill-criterion section contains a measurable threshold or date."}]}],"reviewIds":[],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":1,"maxAgeDays":365}},{"id":"stage:architecture-decision","ordinal":2,"title":"Architecture decision","decision":"Which shape, and which credible alternative you are rejecting and why.","url":"https://aiarchitectacademy.com/path/architecture-decision","artifactId":"artifact:architecture-decision","artifactAccess":"public","artifact":{"id":"artifact:architecture-decision","title":"Architecture decision record","requiredSections":["context","options considered","decision","consequences","what would reverse this"]},"evaluations":[{"id":"eval:adr-has-rejected-options","assertions":[{"id":"two-options-minimum","description":"At least two options were considered and one was rejected with a reason.","check":"Count entries under options considered; require >= 2 and a stated rejection reason."},{"id":"reversal-condition","description":"The record states what evidence would reverse the decision.","check":"A non-empty \"what would reverse this\" section exists."}]}],"reviewIds":["review:architecture-defence"],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":1,"maxAgeDays":365}},{"id":"stage:tool-authority-model","ordinal":3,"title":"Tool and authority model","decision":"What the agent may do, as what principal, and how you take it back.","url":"https://aiarchitectacademy.com/path/tool-authority-model","artifactId":"artifact:tool-authority-matrix","artifactAccess":"public","artifact":{"id":"artifact:tool-authority-matrix","title":"Tool and authority model","requiredSections":["tools","principals","sideEffecting","revocationPath"]},"evaluations":[{"id":"eval:authority-least-privilege","assertions":[{"id":"side-effecting-flagged","description":"Every tool declares whether it is side-effecting.","check":"Each entry in tools[] has a boolean sideEffecting."},{"id":"no-shared-principal-for-writes","description":"No single principal backs more than one side-effecting tool.","check":"Group side-effecting tools by principal; assert every group size is 1."},{"id":"revocation-documented","description":"Each principal has a revocation path.","check":"Every tool principal resolves to a unique principals[] entry; every declared principal has a non-empty revocationPath string matching its map entry, and the map names no undeclared principal."}]}],"reviewIds":[],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":1,"maxAgeDays":365}},{"id":"stage:eval-harness","ordinal":4,"title":"Eval harness","decision":"What a regression looks like, before you are allowed to ship a change.","url":"https://aiarchitectacademy.com/path/eval-harness","artifactId":"artifact:eval-harness","artifactAccess":"public","artifact":{"id":"artifact:eval-harness","title":"Eval harness","requiredSections":["fixtures","assertions","baseline run","failure exit code"]},"evaluations":[{"id":"eval:harness-fails-on-regression","assertions":[{"id":"nonzero-exit","description":"A deliberately broken fixture makes the harness exit non-zero.","check":"Run the harness against the seeded regression fixture; require exit code != 0."},{"id":"fixtures-versioned-apart","description":"Fixtures are not edited in the same commit as the system under test.","check":"Diff the submitted commit; fixtures and prompts must not both change."}]}],"reviewIds":[],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":2,"maxAgeDays":365}},{"id":"stage:threat-model","ordinal":5,"title":"Threat model","decision":"Which inputs you do not trust, and which risks you are consciously accepting.","url":"https://aiarchitectacademy.com/path/threat-model","artifactId":"artifact:threat-model","artifactAccess":"cohort","evaluations":[{"id":"eval:threat-model-covers-tool-results","assertions":[{"id":"tool-results-untrusted","description":"Tool and retrieval output appears in the untrusted-inputs list.","check":"The untrusted-inputs section names tool results or retrieved documents."},{"id":"accepted-risks-named","description":"At least one risk is explicitly accepted rather than silently ignored.","check":"The accepted-risks section is non-empty."}]}],"reviewIds":[],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":1,"maxAgeDays":365}},{"id":"stage:cost-model","ordinal":6,"title":"Cost model","decision":"What one unit of work costs and what stops the bill when it runs away.","url":"https://aiarchitectacademy.com/path/cost-model","artifactId":"artifact:cost-model","artifactAccess":"public","artifact":{"id":"artifact:cost-model","title":"Cost model","requiredSections":["unitOfWork","tokensPerUnit","costPerUnit","ceiling","runawayGuard"]},"evaluations":[{"id":"eval:cost-model-has-ceiling","assertions":[{"id":"unit-economics","description":"Cost is expressed per unit of work, not per month in aggregate.","check":"unitOfWork and costPerUnit are both present and numeric where applicable."},{"id":"runaway-guard","description":"A mechanism stops spend when the ceiling is hit.","check":"runawayGuard names an enforcing mechanism, not an alert alone."}]}],"reviewIds":[],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":1,"maxAgeDays":365}},{"id":"stage:deployment","ordinal":7,"title":"Deployment","decision":"Put it somewhere a stranger can reach, with a rollback you have tested.","url":"https://aiarchitectacademy.com/path/deployment","artifactId":"artifact:deployment-record","artifactAccess":"public","artifact":{"id":"artifact:deployment-record","title":"Deployment record","requiredSections":["live URL","rollback command","observability locator"]},"evaluations":[{"id":"eval:deployment-reachable","assertions":[{"id":"responds-200","description":"The live URL responds successfully to an unauthenticated third party.","check":"HTTP GET the deploy URL; require a 2xx and a non-empty body."},{"id":"rollback-exists","description":"A rollback path is written down before it is needed.","check":"The rollback command section is non-empty."}]}],"reviewIds":[],"evidenceRule":{"accepts":["deploy-url"],"minimumCount":1,"maxAgeDays":90}},{"id":"stage:incident-simulation","ordinal":8,"title":"Incident simulation","decision":"Break it on purpose and find out whether your instrumentation notices.","url":"https://aiarchitectacademy.com/path/incident-simulation","artifactId":"artifact:incident-report","artifactAccess":"cohort","evaluations":[{"id":"eval:incident-detected-by-telemetry","assertions":[{"id":"injected-mode-named","description":"The report names which failure mode was injected.","check":"The injected failure mode matches a FailureMode id with injectable = true."},{"id":"detection-source-is-telemetry","description":"Detection came from a signal that exists in the deployed system.","check":"The telemetry section cites a log, metric, or eval that predates the injection."},{"id":"guard-added","description":"A new guard or assertion was added so the same failure fails loudly next time.","check":"The guard section links to a commit adding an assertion or check."}]}],"reviewIds":["review:incident-honesty"],"evidenceRule":{"accepts":["deploy-url","reviewer-attestation"],"minimumCount":2,"maxAgeDays":90}},{"id":"stage:portfolio-proof","ordinal":9,"title":"Public-safe portfolio proof","decision":"What you can show publicly without leaking an employer or a customer.","url":"https://aiarchitectacademy.com/path/portfolio-proof","artifactId":"artifact:portfolio-proof","artifactAccess":"public","artifact":{"id":"artifact:portfolio-proof","title":"Public-safe portfolio proof","requiredSections":["what it does","the decision you defend","evidence links"]},"evaluations":[{"id":"eval:portfolio-links-resolve","assertions":[{"id":"links-resolve","description":"Every evidence link resolves for a logged-out visitor.","check":"HTTP GET each link without credentials; require 2xx."},{"id":"no-redacted-leakage","description":"Nothing on the redaction list of any source artifact appears.","check":"Scan the rendered text against the union of redactionRule entries."}]}],"reviewIds":[],"evidenceRule":{"accepts":["repo-url","eval-run"],"minimumCount":1,"maxAgeDays":365}}],"architectures":[{"id":"request-scoped","title":"A bounded front door","cloud":"Vercel","decision":"Choose this sidecar when a portal needs a bounded API to admit work and return job status from a separate worker.","shape":"Portal → authenticated API → worker job → status","boundary":"Keep durable jobs out of the request. Limit input, execution time, model spend and tool authority.","source":"https://github.com/frankxai/ai-architect/tree/main/templates/deploy/request-scoped-agent","docs":"https://vercel.com/docs/functions","state":"Source template; tenant deployment must be verified","proof":"Denied caller, oversized input, upstream timeout, failed model call, rollback and cost per successful request."},{"id":"worker","title":"Work that outlives a request","cloud":"Railway","decision":"Choose a container worker when an agent needs its own process, dependencies and restart policy.","shape":"Portal → admitted job → worker → result; workflow and traces stay separate","boundary":"The starter is an in-memory teaching fixture. Add a durable queue and store before promising recovery.","source":"https://github.com/frankxai/ai-architect/tree/main/templates/deploy/durable-worker","docs":"https://docs.railway.com/templates/create","state":"Source template; durability requires an implementation","proof":"Restart recovery, duplicate delivery, cancellation, terminal model failure, tenant isolation and trace redaction."},{"id":"entity","title":"One durable identity","cloud":"Cloudflare","decision":"Choose an entity boundary when a session or workspace needs coordinated state and connections.","shape":"Worker → named Durable Object → state and alarms","boundary":"Map identity to a tenant-scoped entity. Keep retrieval authorization and irreversible tools outside model control.","source":"https://developers.cloudflare.com/agents/","docs":"https://developers.cloudflare.com/durable-objects/","state":"Reference design; no Academy deployment receipt","proof":"Cross-tenant lookup, reconnect, concurrent writes, alarm replay, storage recovery and revocation."},{"id":"batch","title":"A finite evaluation run","cloud":"Google Cloud","decision":"Choose a Cloud Run job for bounded container work that completes and exits; use a service for HTTP.","shape":"Approved run → Cloud Run job → evidence store → independent review","boundary":"One service account per authority class. Bound retries, execution time, concurrency and data access.","source":"https://cloud.google.com/run/docs/create-jobs","docs":"https://cloud.google.com/run/docs/overview/what-is-cloud-run","state":"Reference design; no Academy deployment receipt","proof":"Partial task failure, retry safety, identity isolation, immutable fixture inputs and a failing exit code."}],"licensedResources":[{"id":"architecture-playbooks","endpoint":"https://aiarchitectacademy.com/api/licensed-resources/architecture-playbooks","availability":"activation-pending","requiredAuthority":"server-verified active membership; sponsored principal for agents"},{"id":"reviewed-source-notes","endpoint":"https://aiarchitectacademy.com/api/licensed-resources/reviewed-source-notes","availability":"activation-pending","requiredAuthority":"server-verified active membership; sponsored principal for agents"},{"id":"evaluation-packs","endpoint":"https://aiarchitectacademy.com/api/licensed-resources/evaluation-packs","availability":"activation-pending","requiredAuthority":"server-verified active membership; sponsored principal for agents"}]}