Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
282 commits
Select commit Hold shift + click to select a range
eadb681
A2ATeamGraph: minHeight, a board the graph fills — the room beyond it…
echarles Oct 30, 2026
aefefa0
Stages: a member's colour resolved by a thin local resolver (backdrop…
echarles Oct 30, 2026
79cd595
Colours by palette name, from primer-addons 1.0.46 and agentspecs 0.0…
echarles Oct 30, 2026
62da406
Scenes: a fifth backdrop, minimal (agentspecs cd8b8b8) — each member …
echarles Oct 30, 2026
107cc25
Scenes: a sixth backdrop, orb (agentspecs 6339e8e) — each member Data…
echarles Oct 30, 2026
c126c2a
1.5.95: colours by palette name, the minimal and orb backdrops, detai…
echarles Oct 30, 2026
1fcc3c7
A2A spans: a harness's steps named by kind and title (Edit README.md)…
echarles Oct 30, 2026
a065b8c
Computer: GET /api/v1/apps/agents/{agent}/computer/repository — the r…
echarles Oct 30, 2026
4fc0208
1.5.96: a lent repository's state for its owner; a harness's steps ov…
echarles Oct 30, 2026
f431a9f
A harness's tool kind in the Inspector; the computer's repository rou…
echarles Oct 30, 2026
f2bcc31
Tool approvals: View details in primer-addons' Card, its ground the t…
echarles Oct 30, 2026
51ac57b
Tool approvals: a parameter that is an object shown as JSON, not [obj…
echarles Oct 30, 2026
0d1c114
PAP: a scope's name is no longer said to stay away from poppy:, which…
echarles Oct 30, 2026
4631bae
Evals adapters: the sandbox framework code runs in: new namespaces, n…
echarles Oct 30, 2026
c31c394
Evals adapters: the contract (inspect, validate, import_definition, p…
echarles Oct 30, 2026
8446081
Evals adapters: whatever a source does to its reader is a refusal of …
echarles Oct 30, 2026
9f3cf5f
Evals adapters: Inspect AI, pinned at 0.3.286: tasks discovered in th…
echarles Oct 30, 2026
6d2d4de
Evals adapters: formatted and typed; a sandbox is a protocol with its…
echarles Oct 30, 2026
99dfab1
Evals adapters: the tar branch of unpacking reads the entry it is on
echarles Oct 30, 2026
74d6ac1
A local personal agent and company at PAP draft 0.3 as rewritten: a S…
echarles Oct 30, 2026
e03d792
Every company operation is the person's: the Rule decides only whethe…
echarles Oct 30, 2026
af8f1d0
Specs regenerated from agentspecs cde11cd: Operations version 2 in th…
echarles Oct 30, 2026
9f74bcc
PAP examples at draft 0.3 as rewritten: session-jwt, session-transpor…
echarles Oct 30, 2026
1e880da
PAP traces rerun at the SDK of draft 0.3 as rewritten: Session JWTs, …
echarles Oct 30, 2026
64f4c0b
TypeScript at Operations version 2: the Appspec reads no allows or us…
echarles Oct 30, 2026
c168558
PAP example views at draft 0.3 as rewritten: a Session JWT view in pl…
echarles Oct 30, 2026
59fe2ad
Docs: the integration pages say PAP draft 0.3 as of its 2026-10-28 re…
echarles Oct 30, 2026
9e732c5
Comments: sentences left broken when their references were taken out …
echarles Oct 30, 2026
86feea0
The operation's old field name leaves the generator, PAP_OUTCOME_TYPE…
echarles Oct 30, 2026
b5f3e7a
Evals adapters: every model call goes through ai-inference: a third n…
echarles Oct 30, 2026
fa354db
Evals adapters: typed through; the fake adapter keeps the network it …
echarles Oct 30, 2026
fbe3e5c
UCP and PACT cases as decks: lib/protocols/decks, YAML from TypeScrip…
echarles Oct 30, 2026
dae8521
Evals adapters: `evals adapters` lists, inspects, imports, launches a…
echarles Oct 30, 2026
d0fbaee
On a Datalayer runtime every harness's model calls go through ai-infe…
echarles Oct 30, 2026
bab5b77
Docs: a harness on Datalayer calls through ai-inference on no key of …
echarles Oct 30, 2026
507e2c7
Headers: a JSON Lines fixture carries none
echarles Oct 30, 2026
0a719f1
Evals adapters: bandit, mypy, ruff, numpydoc and interrogate clear: e…
echarles Oct 30, 2026
7dec397
Evals adapters: Harbor, pinned at 0.25.0: task packages read and lint…
echarles Oct 30, 2026
29f3bc0
Automatic application of license header
github-actions[bot] Oct 30, 2026
c729ec2
Stages: a member's details say what its application does, its harness…
echarles Oct 30, 2026
aae92dd
Merge branch 'feat/scenes' of https://github.com/datalayer/agent-runt…
echarles Oct 30, 2026
a70178f
Studio's Toolbox says Codex is not offered on Datalayer and never set…
echarles Oct 30, 2026
4a06988
Evals adapters: one task-environment provider for Inspect and Harbor;…
echarles Oct 30, 2026
cbad22a
An agent is told today's date on each run: a model has no clock, and …
echarles Oct 30, 2026
bb0eb95
Evals adapters CLI: a launch takes a budget and names its application…
echarles Oct 30, 2026
b24693a
Shield: IAM's policy read with the account's key before a token that …
echarles Oct 30, 2026
604fb7d
Codex is offered on Datalayer again, through ai-inference's Responses…
echarles Oct 30, 2026
f00bc22
package.json: two spaces
echarles Oct 30, 2026
5656d17
Evals adapters: a task's Dockerfile builds on its own base through th…
echarles Oct 30, 2026
26eb33c
PAP 0.28.0 and agentspecs 0.0.141 pinned
echarles Oct 30, 2026
10f83d7
1.5.97: agentspecs 0.0.141 in the specs, the traces at PAP 0.28.0, th…
echarles Oct 30, 2026
5e25c7f
Evals adapters: a root of its own keeps the links to its interpreter,…
echarles Oct 30, 2026
6cf7e09
Evals client mixin: formatted
echarles Oct 30, 2026
d5bb0c0
1.5.97: tests read the date among an agent's instructions, code-sandb…
echarles Oct 30, 2026
4a5fdc6
Type: the instructions indexed where they are there
echarles Oct 30, 2026
892592f
Model budget tests: the delegation's names read from context.delegati…
echarles Oct 30, 2026
d2277e0
Scenes record: the YAML file given is the one updated, whatever its name
echarles Oct 30, 2026
c6570e5
Scenes record: the rehearsal's own indent and a comment on its line k…
echarles Oct 30, 2026
acc37ac
Scenes transcript, Python: a finished call or ask says when it ended,…
echarles Oct 30, 2026
d963dec
Environments' generated types: code-sandboxes 1.11.0's foreignDockerf…
echarles Oct 30, 2026
95de37a
Scene transcript: a harness's steps kept apart by their call, here an…
echarles Oct 30, 2026
dc69ea7
Scene transcript: each line's time a native button that selects it fr…
echarles Oct 30, 2026
372c88a
Transcript table: each row's time a native button that selects it fro…
echarles Oct 30, 2026
bbc6336
Transcript table: Failed first holds, the rows keeping the order the …
echarles Oct 30, 2026
576323d
Scene recording: played once, the last answer and result are played o…
echarles Oct 30, 2026
69f7414
Scenes example: the line selected held by the page and handed to the …
echarles Oct 30, 2026
ab8d5e8
Evals adapters: the golden plan is what the adapter plans today
echarles Oct 30, 2026
26a4430
The Shield decides each step of Codex and pi: a Codex session is held…
echarles Oct 30, 2026
a0e89df
1.5.98: the Shield decides each step of Codex and pi
echarles Oct 30, 2026
776694d
Evals adapters: Harbor's dataset.toml read and proved by digest; Git …
echarles Oct 30, 2026
bff52cd
Evals adapters: a result carries what the relay counted, so a budget …
echarles Oct 30, 2026
14798f9
Evals adapters: the Harbor fixture's check finds the examples
echarles Oct 30, 2026
324acb4
Evals adapters: a task's build context read in the sandbox and carrie…
echarles Oct 30, 2026
b362aa4
Typed and formatted, for the style checks
echarles Oct 30, 2026
236b97e
Apps: a context its organization disabled is left out and said: the a…
echarles Oct 31, 2026
08fcf91
A model with no provider named follows the process's setting, so a me…
echarles Oct 31, 2026
11dae0e
1.5.99: personal-agent-protocol 0.29.0: DPoP proofs at Device Sign-In…
echarles Oct 31, 2026
eb104ef
Automatic application of license header
github-actions[bot] Oct 31, 2026
8e09c87
Tests: the import block as the hook writes it
echarles Oct 31, 2026
674355a
Docs: every protocol has its page under Protocols in the sidebar: AG-…
echarles Oct 31, 2026
c1a7dd0
Docs: TAP's page says which signatures, on a page of its own
echarles Oct 31, 2026
0b10538
Docs: the page reads MCP and A2A
echarles Oct 31, 2026
2b1f1ad
1.5.100: the process's inference provider wins over an agentspec's
echarles Oct 31, 2026
90fde4c
1.5.101: a deployment's principal goes to its runtime: the proof the …
echarles Oct 31, 2026
4f3ac3d
Shield: a kept harness reads its policy with what is renewed
echarles Oct 31, 2026
3161e2e
A runtime launched for a deployment runs what ai-agents says, not wha…
echarles Oct 31, 2026
1196dc6
On a runtime launched for a deployment, a pod-local secret replaces l…
echarles Oct 31, 2026
380d33e
Tests: the sandbox is no local caller of the application routes, and …
echarles Oct 31, 2026
2c3846a
Tests: a deployment's code is read through what answers only its code
echarles Oct 31, 2026
b8383fc
1.5.102: a deployment's runtime runs its pinned spec, and a pod-local…
echarles Oct 31, 2026
0b1ca4f
On a deployment's runtime, what the sandbox sends the MCP proxy is a …
echarles Oct 31, 2026
3a3a271
Scenes: a read-only catalogue keeps no rehearsal, and that is no warning
echarles Oct 31, 2026
badf818
A secret no longer sets what the runtime reads of its own
echarles Oct 31, 2026
7f03deb
What woke a deployment's session is its owner's to say, not its caller's
echarles Oct 31, 2026
93417e3
A harness is lent no credential: the runtime holds it and adds it on …
echarles Nov 1, 2026
5fd4c18
Tests: a delegated credential reaches the gateway through the runtime…
echarles Nov 1, 2026
88645f7
Tests: a deployment's user secret is the platform's, though named as …
echarles Nov 1, 2026
a7fe92c
Reserved secret names hold deployments: a person's own runtime keeps …
echarles Nov 1, 2026
7f0577f
A harness holds no inference token: the runtime adds it on the pod's …
echarles Nov 1, 2026
88d8e57
A runtime launched for a deployment reads its owner's secrets, over i…
echarles Nov 1, 2026
53e0b2a
An owner's secrets stay out of a kernel they did not launch
echarles Nov 1, 2026
86bdc92
Speech balloon: an overlay's background, solid over what it floats on
echarles Nov 1, 2026
ac73ab1
CLI: benchmarks import, publish, unpublish and download
echarles Nov 1, 2026
f8c1eb7
Depend on @primer/octicons-react 19.42.0
echarles Nov 2, 2026
46b64cf
Code sandbox environment picker: long names ellipsed on one line, lab…
echarles Nov 2, 2026
46c0576
Code Sandboxes: a platform environment its definition disables is off…
echarles Nov 2, 2026
3a39ed1
Guards extend a Policy: the Guardrails catalogue removed, an agent's …
echarles Nov 5, 2026
0e98a81
Checks of a session's start read the Guard's Policy (R-06)
echarles Nov 5, 2026
a496e3f
1.5.103 with agentspecs 0.0.143: a Guard extends a Policy, the Guardr…
echarles Nov 5, 2026
82939cf
Tracks: drafting and regulated in the generated catalogue (agentspecs…
echarles Nov 6, 2026
39af840
1.5.104: agentspecs 0.0.144 (the drafting and regulated Tracks); the …
echarles Nov 6, 2026
aa95fb0
1.5.105: a catalogue MCP server asking for ${DATALAYER_API_KEY} on a …
echarles Nov 6, 2026
eed0b83
Battles: the kind generated from agentspecs 0.0.145 (generate_ops --k…
echarles Nov 6, 2026
de9931b
1.5.106: the releases green again — the Sensitive Data Guard knows an…
echarles Nov 6, 2026
3911a70
Streaming frontend tools (AGENT_BATTLE B1-00, the user, 6 November 20…
echarles Nov 6, 2026
9b93ff7
Streaming tools' events as turns (AGENT_BATTLE B1-00): the chat takes…
echarles Nov 6, 2026
5a31065
The team hook takes the page's frontend tools (AGENT_BATTLE B1-01): a…
echarles Nov 6, 2026
97f9ab9
BattleSpec.arena: a deck or a sheet beside the games' arenas (agentsp…
echarles Nov 6, 2026
93abb6e
SpeechBalloon: a small copy icon under the words — the words whole to…
echarles Nov 6, 2026
54c56f9
Tools: the machinery from @datalayer/reactor/tools — the adapters' To…
echarles Nov 6, 2026
e4b3790
QuestionView: Box from @datalayer/primer-addons, following the theme …
echarles Nov 6, 2026
94e6d22
Specs regenerated for agentspecs 0.0.148: the Player application and …
echarles Nov 6, 2026
3091b26
Specs regenerated: the Deck Maker wears the paper clip
echarles Nov 6, 2026
d6822c9
Specs regenerated: the Player moves to the height the arena says the …
echarles Nov 6, 2026
391a38a
Specs regenerated: the Sheet Maker inserts its chart before answering
echarles Nov 6, 2026
370b997
Stages: the kind generated from agentspecs 0.0.149 (generate_ops --ki…
echarles Nov 7, 2026
6a816c8
Overriding an application on stage: AppOverridesSpec on a Battle's co…
echarles Nov 7, 2026
1aa77a4
MCP servers: the catalogue carries what each spec says of itself — wh…
echarles Nov 7, 2026
6698471
MCP: the package init as the generator rewrites it
echarles Nov 7, 2026
3f00e11
Runtime image: Node.js 22 and uv, with the catalogue's local MCP serv…
echarles Nov 7, 2026
34ca154
Types: overrides optional on a cast member and a contestant — the gen…
echarles Nov 7, 2026
d00fb97
Catalogues regenerated from agentspecs: the Marketer (its application…
echarles Nov 7, 2026
563e057
Catalogues regenerated from agentspecs: the Discord MCP server with i…
echarles Nov 7, 2026
a191405
MCP servers regenerated: the setup sentences in Markdown (the user, 7…
echarles Nov 7, 2026
ad8bb41
MCP servers regenerated: Bluesky, LinkedIn and Discord enabled (the u…
echarles Nov 7, 2026
6c68b6e
Applications regenerated: the Order Tracker's sentence
echarles Nov 7, 2026
f11463c
Applications regenerated: clones, not copies
echarles Nov 7, 2026
1c74660
Catalogues regenerated: the Space Invaders arena, the invaders Battle…
echarles Nov 7, 2026
e1bae07
Battles: a Battle's evals (BattleEvalSpec: eval, config, says) in bot…
echarles Nov 7, 2026
b06603e
Image and Video Skills, every skill enabled (the user, 7 November 202…
echarles Nov 7, 2026
a884976
1.5.107: Image and Video Skills, every skill of the catalogue enabled…
echarles Nov 7, 2026
c4a26b6
Tests: the disabled-skill refusal puts its own disabled skill in the …
echarles Nov 7, 2026
dd7f007
1.5.108: reactor 1.3.5 the floor, which publishes @datalayer/reactor/…
echarles Nov 7, 2026
f488f46
1.5.109: the catalogue test names the deck and sheet makers, the play…
echarles Nov 7, 2026
1467cb5
1.5.110: jokes loads from its module (agentspecs 0.0.151, agent-skill…
echarles Nov 7, 2026
56a99fe
1.5.111: a kept runtime learns who launched it before refusing a sand…
echarles Nov 7, 2026
c7a82f9
Battles: the race runs to the end (the user, 7 November 2026) — first…
echarles Nov 7, 2026
2f93e15
Specs regenerated from agentspecs 0.0.152 (the user, 7 November 2026)…
echarles Nov 7, 2026
1be8c11
Models: a direct provider's model is called by the agent itself (the …
echarles Nov 7, 2026
bf1ad4a
Local models: an httpx client, not httpx2 (the user, 7 November 2026)…
echarles Nov 7, 2026
b582637
PAP 0.3 as published: pins (D4-01) — personal-agent-protocol 0.31.0 (…
echarles Nov 7, 2026
7b725f1
Specs regenerated from agentspecs 0.0.154: the Social Marketer carrie…
echarles Nov 7, 2026
d050cc3
PAP 0.3 as published: the company role's sign_in_disabled (D4-08) — A…
echarles Nov 7, 2026
730c30c
PAP 0.3 as published: extension content (D4-03) — the PAP capability …
echarles Nov 7, 2026
6545042
PAP 0.3 as published: the company role's sign_in_disabled (D4-08) — t…
echarles Nov 7, 2026
75a4f12
PAP 0.3 as published: the examples (D4-10) — the PAP views and traces…
echarles Nov 7, 2026
bac0bac
1.5.112: a Battle runs to the end; a direct provider's model (OpenRou…
echarles Nov 7, 2026
06f4836
PAP 0.3 as published: a company publishes its public skills (D4-06) —…
echarles Nov 7, 2026
1d1caca
1.5.113: agentspecs 0.0.156 is the floor (a company's publish_skills)…
echarles Nov 7, 2026
bef7e15
1.5.114: the PAP examples send an approval as extensions.operations (…
echarles Nov 7, 2026
3733605
Battles: a Battle's token (B4-01) — fetchBattleToken mints the token …
echarles Nov 7, 2026
3e42888
Battles: the demo books for a catalogue Battle (B4-01) — the visitors…
echarles Nov 7, 2026
8f41ee7
Battles: a runtime given no books key keeps its own rule (B4-01) — a …
echarles Nov 7, 2026
3979361
1.5.115: a Battle's own token (a per-play budget) and the demo books …
echarles Nov 7, 2026
bff6f29
PAP draft 0.4: pins (D5-01) — personal-agent-protocol 0.32.0 (draft 0…
echarles Nov 7, 2026
67ad1fa
specs: battle rubrics from agentspecs 0.0.157 — the judge's evidence …
echarles Nov 8, 2026
7f8f4ee
Memory: an agent's mem0 memories outlive its runtime — kept in Postgr…
echarles Nov 8, 2026
42b48af
configure-from-spec: without_mcp_servers — an agent configured with n…
echarles Nov 8, 2026
6854a1d
A company's website at PAP draft 0.4 (D5-09) — the company role's web…
echarles Nov 8, 2026
b63de24
Memory: a runtime keeps its agent's memories under the person it is a…
echarles Nov 8, 2026
65a3eb9
PAP draft 0.4 in the PAP capabilities (D5-03, D5-06) — PapPersonalAge…
echarles Nov 8, 2026
654f161
PAP examples at draft 0.4 (D5-12) — every example on the SDK 0.32.0: …
echarles Nov 8, 2026
ee39aa4
MCP: a server that lost the session gets a new one, and the call is a…
echarles Nov 8, 2026
2edee94
CLI: agent-runtimes mcp — a plain MCP client for the Datalayer gatewa…
echarles Nov 8, 2026
ebeab93
A Direct Conversation's answer at PAP draft 0.4 (D5-10) — portable/di…
echarles Nov 8, 2026
af238dc
mcp client: a result with no content answers its structured content —…
echarles Nov 8, 2026
495fb3c
configure-from-spec: without_skills — the skills named left out, by i…
echarles Nov 8, 2026
f1d1b53
loop --cloud --prompt: --without-mcp-servers and --without-skill conf…
echarles Nov 8, 2026
9b1f45e
Resume answers the runtime it launched (runtime_uid): a light pause i…
echarles Nov 8, 2026
d691be4
1.5.116: PAP draft 0.4 (SDK 0.32.0), memory kept in PostgreSQL across…
echarles Nov 8, 2026
69bf470
1.5.117: the memory tests run in CI (the test extra installs memory),…
echarles Nov 8, 2026
5ac7bbe
1.5.118: the memory backend names the package mem0 lacks, never 'requ…
echarles Nov 8, 2026
e4176d5
Specs regenerated from agentspecs 0.0.162: the odoo MCP server is the…
echarles Nov 8, 2026
dbacb65
loop: --without-mcp-servers and --without-skill declared on the loop …
echarles Nov 8, 2026
9093ab1
1.5.119: loop takes --without-mcp-servers and --without-skill (drille…
echarles Nov 8, 2026
b6275af
Specs from agentspecs 0.0.163: the Titan embedding models, priced — a…
echarles Nov 8, 2026
1de1cc9
mcp client, round two from a day on Odoo: -a values typed by the tool…
echarles Nov 8, 2026
d72a005
Tests: odoo-accounting is enabled since agentspecs 0.0.162, so it is …
echarles Nov 8, 2026
a657cc8
1.5.120: the four odoo-accounting tests follow agentspecs 0.0.162; 1.…
echarles Nov 8, 2026
73ee0aa
Tests on GitHub's runner: a span ends after its children in the milli…
echarles Nov 8, 2026
211c97f
1.5.121: a rehearsal's answer stays after the turn's words in the sam…
echarles Nov 8, 2026
4aae8a5
evals: the llm_judge gives way to Qwen-Max when its model is at its p…
echarles Nov 8, 2026
9267fa4
Specs from agentspecs 0.0.164: Customer Interviewer, Document Q&A and…
echarles Nov 8, 2026
cbadae2
Specs: an agent's policy — its own ask of the Shield, policy.shield (…
echarles Nov 8, 2026
5468e25
1.5.122: an agent answers while its MCP servers start — configure-fro…
echarles Nov 8, 2026
58d7733
Tests: Inbox triage's setup names its worker since agentspecs 0.0.164…
echarles Nov 8, 2026
ecbeebb
1.5.123: what 1.5.122 carries; the apps command's test expects Inbox …
echarles Nov 8, 2026
751083d
specs: agentspecs 0.0.166 — the Crawler Agent (and the Crawler Cog th…
echarles Nov 8, 2026
d733f1f
Memory routes: an agent's memory kept (POST /agents/{id}/memory), one…
echarles Nov 8, 2026
7ca3bd8
1.5.124: what 1.5.122 carries; the ready-without-MCP test leaves the …
echarles Nov 8, 2026
bf9283a
CHANGELOG: 1.5.124 — what 1.5.122 carries, and an agent's memory kept…
echarles Nov 8, 2026
3a5bc3a
1.5.125: loop tool-approvals (list, approve, reject the tool calls wa…
echarles Nov 8, 2026
5be8d4b
1.5.126: loop says the approval a run waits on and waits for its deci…
echarles Nov 8, 2026
9ed1569
Memory: the Crawler's memories outlive its pause as the Marketer's do…
echarles Nov 9, 2026
a655782
specs: agentspecs 0.0.167 — the Marketer gains the datalayer-memory s…
echarles Nov 9, 2026
56c5d4f
1.5.127: the Marketer lists and forgets what it remembers — worker-ma…
echarles Nov 9, 2026
f044ae2
1.5.128: what 1.5.127 carries — the evals-adapters gate's inspect env…
echarles Nov 9, 2026
5dd1d6e
Identities from agentspecs 0.0.168: the identities catalogue generate…
echarles Nov 9, 2026
02aac4a
Identities: the TypeScript catalogue lists them with listIdentities (…
echarles Nov 9, 2026
61a648c
AgentCore Runtime's contract (AC-01..AC-03): serve --target agentcore…
echarles Nov 9, 2026
512f2bd
runtime.target and identity.provider (AC-10, AC-11, ID-20..ID-22): tw…
echarles Nov 9, 2026
af961d8
AgentCore: each run holds the workload token AgentCore Runtime sent w…
echarles Nov 9, 2026
cb0dcae
Agents from agentspecs 0.0.169: every agent's identity generated; the…
echarles Nov 9, 2026
6ca46a8
1.6.0: AgentCore as a runtime target (the contract, the target, loop …
echarles Nov 9, 2026
8ce60d0
1.6.1: what 1.6.0 carries — AGENTCORE_ among the reserved prefixes (i…
echarles Nov 9, 2026
2c6b01a
AgentCore contract: names no private document
echarles Nov 9, 2026
e84333a
AgentCore and identity modules name no private document
echarles Nov 9, 2026
748d1e9
aws: the AgentCore cross-account role and execution role (CloudFormat…
echarles Nov 9, 2026
cdf8344
AgentCore AC-05, AC-06, AC-12..AC-15 and ID-06: A2A on port 9000 at /…
echarles Nov 9, 2026
ecb6164
ID-10: a tool's third-party grant asked in the chat — the AG-UI run r…
echarles Nov 9, 2026
b46b19e
AgentCore target: deploy waits for the created runtime to be READY, t…
echarles Nov 9, 2026
14a19d0
AgentCore cross-account role: Datalayer may list the organization's O…
echarles Nov 9, 2026
a18f1d5
AC-20: an AgentCore Gateway as a remote MCP server — MCPServer.auth (…
echarles Nov 9, 2026
ac158cc
AC-12: GenAI spans of a harness's turn driven over ACP — an invoke_ag…
echarles Nov 9, 2026
4c1a35a
1.6.2: AgentCore continued (A2A seat, token exchange, the runtime's o…
echarles Nov 10, 2026
95e1254
1.6.3: what 1.6.2 carries — the agentcore evals adapter's test skips …
echarles Nov 10, 2026
ec9c53a
AC-04: the AgentCore image — docker/Dockerfile.agentcore (agent-runti…
echarles Nov 10, 2026
4eab740
AC-44: each AgentCore Gateway request names the run's policy session …
echarles Nov 10, 2026
e1da8c4
1.6.4: agent-shield 0.2.18's decide names the recorded call key (coun…
echarles Nov 10, 2026
fa9babf
1.6.5: the generated MCP catalogue's test writes the agentcore-gatewa…
echarles Nov 10, 2026
fce6e45
AgentCore image: the smoke test gives the container its AWS region (a…
echarles Nov 10, 2026
ed3e2ee
1.6.6: the AgentCore image's smoke test has its region and the build …
echarles Nov 10, 2026
b0fc3d7
aws: agentcore-datalayer-principal.yaml — the IAM user Datalayer's se…
echarles Nov 10, 2026
14a1199
1.6.7: AgentCore invocation time in the record — each run's output en…
echarles Nov 10, 2026
7dafce1
Battles: a contestant played by a decision model — decision_model car…
echarles Nov 10, 2026
63ae162
1.6.8: an AgentCore runtime behind Datalayer's JWT authorizer is told…
echarles Nov 10, 2026
2c5b862
1.6.9: the Authorization header allowlisted on a JWT-authorized Agent…
echarles Nov 10, 2026
63f5440
loop agentcore invoke --bearer: a JWT-authorized runtime invoked over…
echarles Nov 10, 2026
89e88ae
Generated agentspecs: an agent's skills carry their icon and emoji (t…
echarles Nov 10, 2026
fddd000
Generated env vars: TAVILY_API_KEY's key at https://app.tavily.com/home
echarles Nov 10, 2026
d1c7b09
Specs regenerated: the Dogwood example policies and gateway rate limi…
echarles Nov 10, 2026
a4517d3
AgentCore target: iam_url_of's docstring starts with a verb (numpydoc…
echarles Nov 10, 2026
0ac45f9
loop: the Marketer in the picker, and an agent remembering with mem0 …
echarles Nov 10, 2026
b5c82ff
1.6.10: an AgentCore session keeps the conversation of whichever run …
echarles Nov 10, 2026
ca4f960
install on MCP servers and skills: InstallSpec {type, command, note} …
echarles Nov 10, 2026
88c6eec
MCP servers: ${VAR} and ${VAR:-default} expanded by one function (mcp…
echarles Nov 10, 2026
c36da11
AgentCore: a runtime deployed for an application (AGENTCORE_DEPLOYMEN…
echarles Nov 10, 2026
cc99d59
1.6.11: an AgentCore runtime deployed for an application runs the dep…
echarles Nov 10, 2026
558ed78
Identity on AgentCore: a token asked for the person names Datalayer I…
echarles Nov 10, 2026
d5abc82
Generated actions: the github-repositories tool's (agentspecs 64af336)
echarles Nov 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 224 additions & 0 deletions .github/workflows/nightly-rehearsal.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
# Copyright (c) 2025-2026 Datalayer, Inc.
# Distributed under the terms of the Modified BSD License.

# The nightly rehearsal of the demo stages: each demo scene rehearsed on
# Datalayer, where it is kept running under the demo account, with
# `loop scenes rehearse --cloud`. Each run writes the scene's
# `<id>/rehearsal.json` (what the stage's *Live* reads, or *Needs attention*
# with the failing beat) and the transcript of what it played, both kept as
# the run's artifacts; with a token that may push to agentspecs, the
# rehearsal files are committed there too.
#
# It asks the stages where they are served and launches nothing: a scene
# whose members' addresses are not set is skipped with a sentence, and the
# whole run does nothing, saying so, when the demo account's key is absent.
#
# Secrets (repository settings, never in this file):
# DATALAYER_DEMO_API_KEY the demo account's API key (required)
# DATALAYER_SCENE_KEY_<MEMBER> a key granted to each runtime member's A2A route:
# ACCOUNTING, MONTH_END_CLOSE, CROP_MONITORING,
# DISASTER_ASSESSMENT, CHANGE_DETECTION, CODE_EXPLAINER
# DATALAYER_BEDROCK_AWS_ACCESS_KEY_ID, DATALAYER_BEDROCK_AWS_SECRET_ACCESS_KEY,
# DATALAYER_BEDROCK_AWS_DEFAULT_REGION
# the model of the members a page plays in the
# browser (Sales, Event response), played here
# AGENTSPECS_PUSH_TOKEN optional: commit rehearsal.json to agentspecs
# Variables (or secrets) — where each kept stage is served, as its scene's
# `deployment.addresses` names them:
# DATALAYER_DEMO_TEAM_ACCOUNTING_A2A_URL,
# DATALAYER_DEMO_SCENE_<SCENE>_<MEMBER>_A2A_URL for the others.

name: Nightly rehearsal

on:
schedule:
# Every night at 03:17 UTC, away from the hour's crowd.
- cron: '17 3 * * *'
workflow_dispatch:
inputs:
scene:
description: One scene to rehearse, by id; every demo scene when empty.
required: false
default: ''

concurrency:
group: nightly-rehearsal
cancel-in-progress: false

permissions:
contents: read

env:
AGENTSPECS_BRANCH: feat/apps-next

jobs:
scenes:
name: The demo scenes
runs-on: ubuntu-latest
outputs:
scenes: ${{ steps.which.outputs.scenes }}
ready: ${{ steps.which.outputs.ready }}
steps:
- name: Which scenes, and whether the demo account's key is set
id: which
env:
DEMO_KEY: ${{ secrets.DATALAYER_DEMO_API_KEY }}
ONE: ${{ github.event.inputs.scene }}
run: |
if [ -z "$DEMO_KEY" ]; then
echo "::notice title=Nightly rehearsal::Nothing rehearsed: the secret DATALAYER_DEMO_API_KEY (the demo account's API key) is not set in this repository."
echo "ready=false" >> "$GITHUB_OUTPUT"
echo 'scenes=[]' >> "$GITHUB_OUTPUT"
exit 0
fi
all='["sales-and-accounting","month-end-close","crop-monitoring","disaster-assessment","coding-agent-behind-the-shield"]'
if [ -n "$ONE" ]; then
all="[\"$ONE\"]"
fi
echo "ready=true" >> "$GITHUB_OUTPUT"
echo "scenes=$all" >> "$GITHUB_OUTPUT"

rehearse:
name: Rehearse ${{ matrix.scene }}
needs: scenes
if: needs.scenes.outputs.ready == 'true'
runs-on: ubuntu-latest
timeout-minutes: 40
strategy:
fail-fast: false
# One at a time: the demo account's runtimes answer one rehearsal at once.
max-parallel: 1
matrix:
scene: ${{ fromJSON(needs.scenes.outputs.scenes) }}
env:
DATALAYER_API_KEY: ${{ secrets.DATALAYER_DEMO_API_KEY }}
DATALAYER_SCENE_KEY_ACCOUNTING: ${{ secrets.DATALAYER_SCENE_KEY_ACCOUNTING }}
DATALAYER_SCENE_KEY_MONTH_END_CLOSE: ${{ secrets.DATALAYER_SCENE_KEY_MONTH_END_CLOSE }}
DATALAYER_SCENE_KEY_CROP_MONITORING: ${{ secrets.DATALAYER_SCENE_KEY_CROP_MONITORING }}
DATALAYER_SCENE_KEY_DISASTER_ASSESSMENT: ${{ secrets.DATALAYER_SCENE_KEY_DISASTER_ASSESSMENT }}
DATALAYER_SCENE_KEY_CHANGE_DETECTION: ${{ secrets.DATALAYER_SCENE_KEY_CHANGE_DETECTION }}
DATALAYER_SCENE_KEY_CODE_EXPLAINER: ${{ secrets.DATALAYER_SCENE_KEY_CODE_EXPLAINER }}
DATALAYER_DEMO_TEAM_ACCOUNTING_A2A_URL: ${{ vars.DATALAYER_DEMO_TEAM_ACCOUNTING_A2A_URL || secrets.DATALAYER_DEMO_TEAM_ACCOUNTING_A2A_URL }}
DATALAYER_DEMO_SCENE_MONTH_END_CLOSE_MONTH_END_CLOSE_A2A_URL: ${{ vars.DATALAYER_DEMO_SCENE_MONTH_END_CLOSE_MONTH_END_CLOSE_A2A_URL || secrets.DATALAYER_DEMO_SCENE_MONTH_END_CLOSE_MONTH_END_CLOSE_A2A_URL }}
DATALAYER_DEMO_SCENE_CROP_MONITORING_CROP_MONITORING_A2A_URL: ${{ vars.DATALAYER_DEMO_SCENE_CROP_MONITORING_CROP_MONITORING_A2A_URL || secrets.DATALAYER_DEMO_SCENE_CROP_MONITORING_CROP_MONITORING_A2A_URL }}
DATALAYER_DEMO_SCENE_DISASTER_ASSESSMENT_DISASTER_ASSESSMENT_A2A_URL: ${{ vars.DATALAYER_DEMO_SCENE_DISASTER_ASSESSMENT_DISASTER_ASSESSMENT_A2A_URL || secrets.DATALAYER_DEMO_SCENE_DISASTER_ASSESSMENT_DISASTER_ASSESSMENT_A2A_URL }}
DATALAYER_DEMO_SCENE_DISASTER_ASSESSMENT_CHANGE_DETECTION_A2A_URL: ${{ vars.DATALAYER_DEMO_SCENE_DISASTER_ASSESSMENT_CHANGE_DETECTION_A2A_URL || secrets.DATALAYER_DEMO_SCENE_DISASTER_ASSESSMENT_CHANGE_DETECTION_A2A_URL }}
DATALAYER_DEMO_SCENE_CODING_AGENT_BEHIND_THE_SHIELD_CODE_EXPLAINER_A2A_URL: ${{ vars.DATALAYER_DEMO_SCENE_CODING_AGENT_BEHIND_THE_SHIELD_CODE_EXPLAINER_A2A_URL || secrets.DATALAYER_DEMO_SCENE_CODING_AGENT_BEHIND_THE_SHIELD_CODE_EXPLAINER_A2A_URL }}
AWS_ACCESS_KEY_ID: ${{ secrets.DATALAYER_BEDROCK_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.DATALAYER_BEDROCK_AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.DATALAYER_BEDROCK_AWS_DEFAULT_REGION }}
steps:
- name: Checkout
uses: actions/checkout@v7

- name: Checkout agentspecs
uses: actions/checkout@v7
with:
repository: datalayer/agentspecs
ref: ${{ env.AGENTSPECS_BRANCH }}
path: agentspecs-clone

- uses: astral-sh/setup-uv@v7
with:
version: "latest"
python-version: "3.12"
activate-environment: true

# The scenes are read from the agentspecs checkout, so that the
# rehearsal it keeps is written there, beside the specs.
- name: Install
run: |
uv pip install -e .
uv pip install --no-deps -e ./agentspecs-clone

- name: Is the scene kept on Datalayer?
id: kept
env:
SCENE: ${{ matrix.scene }}
run: |
python - <<'EOF'
import os
from agentspecs.scenes import get_scene

scene = get_scene(os.environ["SCENE"])
output = open(os.environ["GITHUB_OUTPUT"], "a")
if scene is None:
print(f"::warning title=Nightly rehearsal::No scene {os.environ['SCENE']!r} in agentspecs.")
output.write("kept=false\n")
raise SystemExit(0)
missing = [
f"{variable} ({member})"
for member, variable in scene.deployment.addresses.items()
if not os.environ.get(variable)
]
keys = [
"DATALAYER_SCENE_KEY_" + member.upper().replace("-", "_")
for member in scene.deployment.addresses
]
unkeyed = [key for key in keys if not os.environ.get(key)]
if missing or unkeyed:
said = ", ".join(missing + unkeyed)
print(
f"::notice title=Nightly rehearsal::{scene.name} is not rehearsed: "
f"where its stage is served, or the key to its route, is not set ({said})."
)
output.write("kept=false\n")
else:
output.write("kept=true\n")
EOF

- name: Rehearse on Datalayer
if: steps.kept.outputs.kept == 'true'
env:
SCENE: ${{ matrix.scene }}
run: |
set +e
loop scenes rehearse "$SCENE" --cloud --transcript "rehearsals/$SCENE/transcript.json"
code=$?
mkdir -p "rehearsals/$SCENE"
if [ -f "agentspecs-clone/agentspecs/scenes/$SCENE/rehearsal.json" ]; then
cp "agentspecs-clone/agentspecs/scenes/$SCENE/rehearsal.json" "rehearsals/$SCENE/rehearsal.json"
fi
echo "code=$code" >> "$GITHUB_ENV"
exit 0

- name: Keep what it played
if: steps.kept.outputs.kept == 'true'
uses: actions/upload-artifact@v4
with:
name: rehearsal-${{ matrix.scene }}
path: rehearsals/${{ matrix.scene }}/
if-no-files-found: warn
retention-days: 30

- name: Commit the rehearsal to agentspecs
if: steps.kept.outputs.kept == 'true'
env:
SCENE: ${{ matrix.scene }}
PUSH_TOKEN: ${{ secrets.AGENTSPECS_PUSH_TOKEN }}
run: |
if [ -z "$PUSH_TOKEN" ]; then
echo "::notice title=Nightly rehearsal::The rehearsal of $SCENE is kept as this run's artifact only: AGENTSPECS_PUSH_TOKEN is not set."
exit 0
fi
cd agentspecs-clone
file="agentspecs/scenes/$SCENE/rehearsal.json"
[ -f "$file" ] || { echo "No rehearsal of $SCENE was kept."; exit 0; }
git config user.name "Datalayer nightly rehearsal"
git config user.email "info@datalayer.io"
git add "$file"
git diff --cached --quiet && exit 0
git commit -m "Nightly rehearsal of $SCENE on Datalayer"
git push "https://x-access-token:${PUSH_TOKEN}@github.com/datalayer/agentspecs.git" "HEAD:${AGENTSPECS_BRANCH}" \
|| { git pull --rebase "https://x-access-token:${PUSH_TOKEN}@github.com/datalayer/agentspecs.git" "${AGENTSPECS_BRANCH}" \
&& git push "https://x-access-token:${PUSH_TOKEN}@github.com/datalayer/agentspecs.git" "HEAD:${AGENTSPECS_BRANCH}"; }

- name: Say the verdict
if: steps.kept.outputs.kept == 'true'
env:
SCENE: ${{ matrix.scene }}
run: |
if [ "${code:-3}" != "0" ]; then
echo "::error title=Nightly rehearsal::$SCENE needs attention: the rehearsal exited $code (1: a beat failed, 3: a beat was not run). Its rehearsal.json says the failing beat."
exit 1
fi
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@
Each version names the boxes it carries (their ids, as its commits
say them) and links the page that documents them, at <https://agent-runtimes.datalayer.tech>.

## 1.5.91

29 October 2026. Scenes drawn on a backdrop, read three ways and drilled into; stages that rehearse, record and play their recording; a coding agent behind the Shield on a stage of its own. Needs agentspecs 0.0.137 for the sixth demo scene and the recordings' place; the [Scenes](https://agent-runtimes.datalayer.tech/docs/scenes) and [Stages](https://agent-runtimes.datalayer.tech/docs/scenes/stages) pages say it all for a person using them.

- **Backdrops** (`components/teams/backdrops`): a scene is drawn on `studio` (characters with speech balloons, the drawing every scene had), `hero` (round faces on a deep tint, a dot that flies with each message, still under reduced motion) or `plain` (boxes and arrows that do not move, for a printout). `A2ATeamGraph` takes `backdrop`; `stageBackdropOf(scene)` reads a scene's `stage.backdrop`, `studio` when it says none or one no backdrop has, and every stage — the Scenes example, a card, a page — reads it there; `SCENE_BACKDROP_CHOICES` lists the three for a chooser. The Python `SceneStageSpec` carries `backdrop`. The demo scenes say `hero`, the others `studio`, held by a test on both sides.
- **The message views and the drill-down** (`components/teams/transcript`): `TranscriptViews` shows a scene's transcript as Lines, a Table (durations, failed rows) and a mermaid Sequence diagram (loaded only when the view opens), under one filter, with *Copy* and *Export JSON*; `TranscriptDetail` opens a line's span — words, tool arguments and result, times, status, error, ids, *Open in the Inspector*; the selected exchange is highlighted on the stage, on every backdrop, and a click on an edge selects its latest exchange.
- **A coding harness's steps are lines** (`sceneTranscriptRules.ts`, `loop/scenes/transcript.py`): a `shield.turn` span's Shield events (`shield.tool_call`, `shield.permission`) become one line per step, *Code Explainer → its workspace: Read README.md*, failed when the Shield refused it; the drill-down shows the Shield's decision (*do it*, *ask me first*, *leave it to me*), the rule it decided by and its scope (`shieldStepOf`). Both sides held to the shared transcript fixture.
- **Recordings** (`loop scenes record`): `loop scenes rehearse … --transcript run.json` writes what a rehearsal played as the transcript JSON a stage exports (version 1), with its beats and verdict; `loop scenes record <scene> --from run.json` keeps it, only when the rehearsal passed every beat of that scene, as `<id>/recording.json` beside the spec and names it in the spec's `rehearsal.recording` (`--taken`, `--note`, `--specs-dir`), keeping the YAML's comments. `make specs` writes the recordings to `specs/sceneRecordings.ts` (`SCENE_RECORDINGS`, `getSceneRecording`), apart from the catalogue. `useSceneRecording` plays one at its recorded pace — the lines said so far for `TranscriptViews`, the `flows` and `calls` for `A2ATeamGraph`, one beat or all, faster, with long pauses cut, looping — and `RecordingLabel` says *Recording, taken <date>*.
- **The nightly rehearsal** (`.github/workflows/nightly-rehearsal.yaml`): every night each demo stage is rehearsed with `loop scenes rehearse --cloud` at the address it is kept at, its `rehearsal.json` and transcript kept as artifacts (and committed to agentspecs with a token that may push there); it does nothing, saying why, until the demo account's key is set, and skips a stage whose address or key is not.
- **A sixth demo stage**, *A Coding Agent Behind the Shield* (agentspecs 0.0.137): Code Explainer, OpenCode behind the Shield, lent one repository to read; the edit it is asked for is refused under the rule *Change a file*. Generated into the catalogue with `make specs`.

## 1.5.90

28 October 2026. Three runtime fixes found on r1 the same day, a host's visitors and `pap_confirm` decided in a host.
Expand Down
12 changes: 8 additions & 4 deletions agent_runtimes/apps/a2a.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,10 @@ def _with_credential(body: bytes, token: str) -> bytes:
return body
if not isinstance(request, dict) or request.get("method") not in _RUN_METHODS:
return body
from agent_runtimes.context.delegation import CREDENTIAL_FIELD
from agent_runtimes.guardrails.model_budget import DELEGATION_META_KEY
from agent_runtimes.context.delegation import (
CREDENTIAL_FIELD,
DELEGATION_META_KEY,
)

params = request.get("params")
message = params.get("message") if isinstance(params, dict) else None
Expand Down Expand Up @@ -281,8 +283,10 @@ def as_visitors_run(body: bytes, visitor: str, key: Optional[str]) -> bytes:
if not isinstance(request, dict) or request.get("method") not in _RUN_METHODS:
return body
from agent_runtimes.apps.visitors import A2A_VISITOR_FIELD
from agent_runtimes.context.delegation import CREDENTIAL_FIELD
from agent_runtimes.guardrails.model_budget import DELEGATION_META_KEY
from agent_runtimes.context.delegation import (
CREDENTIAL_FIELD,
DELEGATION_META_KEY,
)

params = request.get("params")
message = params.get("message") if isinstance(params, dict) else None
Expand Down
2 changes: 1 addition & 1 deletion agent_runtimes/apps/visitors.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ def use_turn_token(token: str) -> None:

def visitor_of_a2a(meta: Any) -> str:
"""The visitor an A2A message was marked for by the gate, or ``""``."""
from agent_runtimes.guardrails.model_budget import DELEGATION_META_KEY
from agent_runtimes.context.delegation import DELEGATION_META_KEY

ours = meta.get(DELEGATION_META_KEY) if isinstance(meta, Mapping) else None
visitor = ours.get(A2A_VISITOR_FIELD) if isinstance(ours, Mapping) else None
Expand Down
Loading
Loading