Agentic Workshop is an operating system for companies made of collaborating AI employees. The first working vertical slices contain one company, its Marketing department, Marketing Strategist Sarah Collins, Content Creator Casey, the client Jordan and the Fosters, and governed brief-to-content workflows.
The workflow is deterministic and local by default. An explicitly gated OpenAI drafting adapter is available, but no command publishes content. Client gaps remain explicit instead of being filled with invented facts.
See the architecture guide and implementation roadmap.
- Python 3.13 or newer
python -m venv .venvActivate the virtual environment:
-
Windows PowerShell:
.venv\Scripts\Activate.ps1
-
POSIX shells (Linux/macOS):
source .venv/bin/activate
python -m pip install -e .For development checks:
python -m pip install -e ".[dev]"
pytest
ruff check .
mypy srcThe complete governed workflow has two independent approval gates. Neither approval publishes anything.
agentic-workshop brief jordan-and-the-fosters --week-of 2026-08-03The requested date may be any day; it is normalized to that week's Monday. The command writes both
JSON and Markdown under artifacts/weekly-briefs/. The result is always a draft and never triggers
publication.
Strict mode refuses to generate while the client profile tracks missing information:
agentic-workshop brief jordan-and-the-fosters --week-of 2026-08-03 --strictApprove a planning artifact:
agentic-workshop review artifacts/weekly-briefs/jordan-and-the-fosters-2026-08-03.json --approveRequest a revision, for which instructions are mandatory:
agentic-workshop review artifacts/weekly-briefs/jordan-and-the-fosters-2026-08-03.json \
--request-revision "Clarify the information request before approval."Review updates the JSON and its paired Markdown representation. Approval remains review state only; it does not authorize or perform external publication.
Casey accepts only an approved weekly brief. First approve the brief as shown above, then run:
agentic-workshop content-package \
artifacts/weekly-briefs/jordan-and-the-fosters-2026-08-03.jsonThe command writes draft JSON and Markdown under artifacts/content-packages/. Each requested
assignment is adapted to its channel, carries source references and missing-input flags, and remains
grounded in the matching client profile. A draft or revision-requested brief is rejected.
Content packages use the same explicit review command:
agentic-workshop review \
artifacts/content-packages/jordan-and-the-fosters-2026-08-03-content.json --approve
agentic-workshop review \
artifacts/content-packages/jordan-and-the-fosters-2026-08-03-content.json \
--request-revision "Tailor the email opening more closely to the approved brand voice."Package approval is not publication authorization. No command in this slice publishes content.
Original client assets are local-only and live under
assets/clients/<client-id>/originals/. That directory is Git-ignored because originals may contain
private embedded metadata or have distribution rights that differ from the public source-code
license. Never download a substitute from a website, retailer, or search result.
The versioned manifest at
src/agentic_workshop/resources/client-assets/jordan-and-the-fosters.v1.json records the official
front cover's expected path, PNG dimensions, byte size, SHA-256 checksum, source, approval state,
allowed use, transformation permissions, attribution status, and restrictions. It deliberately does
not reproduce embedded Canva identifiers.
Validate the local inventory without modifying the original:
agentic-workshop asset-inventory jordan-and-the-fosters --repository-root .Review a draft or revision-requested manifest entry locally:
agentic-workshop asset-review path/to/manifest.json ASSET_ID --repository-root . --approve
agentic-workshop asset-review path/to/manifest.json ASSET_ID --repository-root . \
--request-revision "Revision instructions"Approval first verifies path containment, file signature, format, dimensions, byte size, and checksum.
Casey may place an approved, verified asset ID in ContentPackage.asset_recommendations; this does
not embed, transform, upload, distribute, externally transmit, or publish the file. Missing or altered
originals produce an explicit unavailable recommendation, and text-only generation continues. There
is no website, retailer, or generated-image fallback. Clients with no manifest or no asset approved
for recommendation continue through the existing text-only workflow with an empty recommendation
list.
Future marketing derivatives must be stored separately from originals and require their own asset ID, checksum, manifest entry, approval state, uses, restrictions, and provenance. The original must never be overwritten or sanitized in place.
The CEO has confirmed ownership rights to the complete Jordan and the Fosters cover and authorized its use for public book marketing on the official website, social posts, email marketing, and campaign-package previews. This rights confirmation does not authorize automatic publication or external delivery. The original remains local-only and Git-ignored.
A metadata-stripped 1576 × 1600 sRGB PNG is recorded as a separate approved derivative under
assets/clients/jordan-and-the-fosters/derivatives/. Its manifest state is approved for the
official website, social posts, email marketing, campaign previews, and Casey's package-metadata
recommendations. Casey recommends this metadata-clean derivative instead of the metadata-bearing
original. Publication and external delivery remain separate human-authorized actions.
New Sarah briefs can carry validated assignment-level asset recommendations. Each assignment records the approved derivative, its manifest source, and the exact channel permission required for that assignment. Deterministic Casey generation independently reloads the current manifest inventory and attaches an asset only when it is available and permits the assignment channel. Recommendations are metadata only: they never embed, transform, upload, publish, or externally transmit an image.
Generate a static, local-only campaign preview from an approved content package:
agentic-workshop campaign-preview artifacts/visual-enabled/2026-08-03/PACKAGE.jsonPreview output is restricted to the ignored artifacts/campaign-previews/ tree. The command rejects
unapproved packages, unapproved or invalid assets, original images, and channel-use mismatches. It
copies the validated metadata-clean derivative beside an escaped static HTML file; it does not embed
image bytes, start a server, contact external destinations, or expose publish/upload/send actions.
Existing previews are preserved unless --overwrite is supplied explicitly.
Generate the read-only local workspace dashboard with one command:
agentic-workshop todays-workThe command prints the path to a static index.html beneath the ignored
artifacts/todays-work/ directory. Open that file locally to review the current campaign strategy,
Sarah and Casey approval states, website and social draft summaries, the validated marketing-cover
recommendation, and a link to the local campaign preview when one exists. The dashboard clearly
lists missing work and items needing attention instead of failing when optional campaign artifacts
are absent.
The dashboard is a local review aid only. It does not start a server, run a model, edit or approve work, publish content, upload assets, or contact external destinations. Existing dashboards are preserved; regenerate intentionally with:
agentic-workshop todays-work --overwriteStart the first human-controlled workflow interface from the repository root:
agentic-workshop workspaceThe command prints the exact local URL, normally http://127.0.0.1:8765/. Open it manually in a
browser and press Ctrl+C in the terminal to stop it. The server binds only to the literal IPv4
loopback address and does not open a browser automatically.
The workspace displays Today's Work, campaign history across every known week, and lets you start a
new campaign, review and approve or request revisions for Sarah's brief and Casey's content
package, generate Casey's deterministic draft, and generate or regenerate the local campaign
preview — all after a deliberate confirmation. Starting a new campaign accepts any day within the
target week, normalizes it to that week's Monday, and refuses to create a duplicate week. It cannot
call a paid model, publish, upload, post, send, or contact an external destination. The static
todays-work command remains available.
While the workspace server is running, treat it as the sole workflow writer. It protects every mutation with artifact identity and checksum verification, reloads immediately before mutation, and uses atomic replacement. These safeguards detect concurrent CLI changes but do not provide a cross-process lock; stop the server before using CLI commands that modify the same workflow.
Content drafting defaults to an async deterministic adapter. The application service depends on
the provider-neutral ContentDraftGenerator port and independently enforces approval, assignment
coverage, client matching, approved-fact provenance, brand voice, and source references. A future
LanguageModel-backed generator without changing domain models or the CEO review workflow.
The official OpenAI Python SDK and Responses API are available behind the provider-neutral
LanguageModel port. Deterministic generation remains the default. OpenAI must be selected
explicitly and every paid request requires --confirm-paid-call.
For local development, copy the tracked template and add the credential only to the ignored file:
Copy-Item .env.example .envEdit .env locally:
OPENAI_API_KEY=<your local key>
OPENAI_MODEL=gpt-5.6-terraDo not commit or share .env. The repository-root file is loaded only when OpenAI is explicitly
selected. An operating-system OPENAI_API_KEY or OPENAI_MODEL overrides the corresponding .env
value. Production deployments should use operating-system environment injection or a secret manager.
The key is never accepted in a CLI argument or written to an artifact, prompt, fixture, snapshot, or
log. Empty and obvious placeholder values fail before making a request. .env and .env.* are
Git-ignored except for .env.example.
The explicitly named smoke test writes a new draft package under
artifacts/live-smoke/openai/; it cannot overwrite the deterministic baseline:
agentic-workshop live-smoke-openai \
artifacts/weekly-briefs/jordan-and-the-fosters-2026-08-03.json \
--model gpt-5.6-sol --reasoning-effort medium \
--max-output-tokens 4000 --timeout-seconds 60 --confirm-paid-callIt makes one Responses API request and records only the model name, response ID, token usage, and
latency alongside the draft. Prompts and credentials are not recorded. The same adapter can be
selected with content-package --generator openai --confirm-paid-call; model output goes to
artifacts/model-content-packages/ by default. All generated packages remain drafts and retain the
same approval, factual-provenance, assignment-coverage, URL, and review-quotation validation gates.
Every completed live response is first retained as a local, untrusted diagnostic JSON record under
the selected artifact root's attempts/ directory. See
the retention policy. Revalidate one with current local validators
without an API call:
agentic-workshop revalidate-attempt <attempt.json> <approved-brief.json>Revalidation writes a separate draft package and never approves or publishes it.
Employee definitions, client profiles, prompts, SOPs, and policies live under
src/agentic_workshop/resources/. Structured definitions use JSON and validate against domain
models. Prompt text remains a resource and does not contain application control flow.