Skip to content

Applications: what LOOP needs next (0.0.18) - #25

Open
echarles wants to merge 36 commits into
mainfrom
feat/apps-next
Open

echarles wants to merge 36 commits into
mainfrom
feat/apps-next

Conversation

@echarles

@echarles echarles commented Oct 3, 2026

Copy link
Copy Markdown
Member

The open PR for agentspecs' LOOP work, pushed to as it goes; released by tagging the branch head when green.

  • The Appspec reference, generated from the JSON Schema, with an example of every field from the catalogue (LOOP S-07). python -m agentspecs.apps writes it to docs/docs/apps/reference.md; a test keeps it in step.

…an example of every field from the catalogue (LOOP S-07); 0.0.18
Copilot AI balanced review requested due to automatic review settings October 3, 2026 09:26

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The generated reference omits examples for nine top-level fields despite promising an example for every field.

Review effort: Balanced
Findings: 2 Medium severity

Open (2)
What changed in this PR

Adds a generated Appspec reference for release 0.0.18.

Changes:

  • Generates Markdown documentation from the Appspec schema and catalogue.
  • Updates the generation command and synchronization tests.
  • Adds generated documentation and release notes.
File Description
agentspecs/​apps/​reference.py Implements reference generation.
agentspecs/​apps/​__main__.py Writes the generated reference.
docs/​docs/​apps/​reference.md Adds generated Appspec documentation.
tests/​test_apps.py Tests reference coverage and synchronization.
agentspecs/​__version__.py Bumps the version to 0.0.18.
CHANGELOG.md Documents the release.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread agentspecs/apps/reference.py Outdated
Comment on lines +70 to +72
for application in APP_CATALOGUE.values():
for key, value in dump_app(application).items():
examples.setdefault(key, value)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 968443b: examples come from the catalogue's YAML files merged field by field (not dump_app, which leaves out defaults), and the eight fields no application sets — team, model, skills, tools, permissions, checks, avatar, banner — take one of EXTRA_EXAMPLES. The page now has an example for all 34 fields.

Comment thread tests/test_apps.py Outdated
Comment on lines +684 to +689
for name in schema["properties"]:
assert f"| `{name}`" in page, name
for name, spec in schema["$defs"].items():
assert name in page, name
# Every example comes from an application the spec reads.
assert "### `connections`" in page and "### `rules`" in page

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 968443b: the test requires an example heading for every top-level property, and reads each of EXTRA_EXAMPLES into an application of the catalogue with parse_app, so an example the spec would refuse fails the test.

…atalogue's files, not their dumps, and for the rest examples the spec is tested to accept
…s as a JSON Schema; an Appspec's components and surface checked against it (LOOP C-13); 0.0.19
…og by its names, Datalayer's own as its custom catalog — not a place of its own (LOOP C-13)
…e Bluesky icon its own; pydantic-ai extra at 1.94 or later
…e, the landing's templates as Appspecs (LOOP E-01); the assistant embed mode (D-07) and interface.assistant, the character of the floating assistant (T-24); 0.0.20
…y that name, the fields of a component, how a surface names one and app_problems refusing an unknown one, the generated lookups; the catalog's page generated from ui-plugins/*.yaml by python -m agentspecs.ui_plugins (each plugin, its components, Datalayer's own with their properties as JSON Schema, bindings, events and example), and a test that keeps it in step (LOOP G-05)
…get's page publishes — ChoicePicker options as {label, value}, seats, plan and term as its settings at /inputs/<id>, its answer at /output and where it stands at /status; a test validates every catalogue surface's basic components against A2UI v0.9's basic catalog and its inputs against its settings (LOOP R-01, C-04); 0.0.21
…on the Canvas, its page bound to a chat's question and answer), Customer interview and Report from a file (written in Python, apps/<id>/app.py, their specs built by loop apps build), Weekly pipeline report (a worker under the Guards, Gates and Track of op-sales-pipeline-board-report, asking before it sends); each says what was verified and what was not; tests for the eleven (LOOP E-01, E-02, E-14); 0.0.22
…osed_by takes canvas, a page composed by a person on the Canvas, and Support desk says it (it said developer, as the Python examples do); a test keeps Support desk the one Canvas example, without an app.py (LOOP E-05); 0.0.23
…rsation alone and its page composed on the Canvas was not shown; app_problems says a page composed for a chat layout, in agent-runtimes' surfaceUnshown sentence; dump_app writes a rule on one class of action alone (applies_to: send), as the TypeScript writer does, and Customer interview and Report from a file are rebuilt so (LOOP R-01, E-01); 0.0.24
… may be switched to beside its model — catalogue ids of chat models, not its own, listed once; the four enabled agents list alibaba:qwen-max, with their own Sonnet 4.6 the chat models datalayer-ai-inference serves from the catalogue; tested and documented with the agent fields; 0.0.25
…0.0.24 carries and links their pages, with the missing 0.0.19 entry (LOOP G-09)
… judge is decider, a decision's judgment_model is decision_model, Jev is asked at ai-inference's POST /decisions; the decide tool (action read) asks Jev typed questions — noul, choice, score — through ai-inference with the runtime's token, and A Simple Agent lists it, says so and suggests three decisions; the Appspec schema written again; 0.0.26
…versations may be used to suggest tests, off unless said; said on the Applications page and in the changelog
…its own (LOOP U-31, U-32) — frames_with_organization gives the catalogue as an organization reads it for compose_frames: its rules, terminology and style in place of a Frame's three as resolved, and its own org-… Frames with a name and a description; the catalogue refuses an org- id; app_problems checks an org-… context against the organization's Frames, and refuses it when no organization is said; 0.0.28
…ateway's own table (LOOP I-12, F-10) — what an application's connection to Datalayer reaches through the gateway, by level; 0.0.29
…s.verified (AppVerified: live, recorded, unverified, each a sentence; empty unless said), said by the eleven examples in place of their header comments, the schema and the reference written again; Report from a File takes its CSV on its page (LOOP E-01): a File upload at /files, the file going to its session with the run; 0.0.30
…rver, skill, tool and frontend tool set; an Odoo accounting server through the Datalayer MCP server — agentspecs.marks (MARKS_SCHEMA, icon_problem, emoji_problem, marks_problems, parse_icon): an icon is <package>:<kebab-case name>, the package @datalayer/icons-react or @primer/octicons-react (@datalayer/icons-react:odoo, @primer/octicons-react:mark-github), a bare name refused; the 47 entries say theirs (brands from the Datalayer icons, the rest octicons; notebook and brain, never octicons, gone). odoo-accounting: the datalayer server at mcp?only=odoo-accounting, its 49 tools classed as datalayer classes them, off by default. Tools are the runtime's, frontend-tools the page's: said in the README and the Tools page; tests/test_marks.py; 0.0.31
…n agent, not a Cog; what it suggests you ask; Datalayer's own tests; 0.0.32
…4) — the past orders, a run already recorded, nothing has stopped for an approval, measured for it; 0.0.33
…egies (StrategySpec, StrategyHuman, StrategyTermination, STRATEGY_CATALOGUE, Strategies, get_strategy, list_strategies), the same four ids, no alias for agentspecs.loops; README and the teams docstring; tests/test_strategies.py; 0.0.34
… the decide tool (yes or no, a choice, a score, each with its confidence); its instructions, its decision starters, and its one rule: deciding is a read, done without asking; the reference's tools example is its own; 0.0.35
…tools, and the field that names them backend_tools — agentspecs/tools moved to agentspecs/backend-tools (all nineteen run on the runtime, in Python; none moved to frontend-tools); backend_tools on agents (146), applications (AppSpec, Decide), Frames (FrameSpec, FrameContext) and in composition; no alias: tools refused by resolve_spec, FrameSpec and the Appspec; actions, the rules' tool lookup and the marks read backend-tools; a team member's tools unchanged; the Appspec schema and reference written again, the docs page agents/backend-tools; 0.0.36
…eam over A2A — sales (chat, in the browser: asks Accounting with ask_accounting and hands over what it answered, never a figure of its own; the paper clip) and accounting (chat, on a runtime: odoo-accounting at Can read in its owner's name, Read the books done alone, Change the books asked first, never writes to Odoo; the wizard); a team member may be an application (app, not with ref), say where its loop turns (runs_in: browser or runtime) and whom it asks (talks_to: {member, over: a2a}), a team says its entry and a supervisor may be an application; links and the entry checked at load; TeamSpec.referenced_apps(); the team sales-and-accounting; docs: Teams of applications, members, execution; the Appspec reference written again; 0.0.37
…s agent-runtimes writes it, named for the application (accounting)
…s/voices (kokoro-af-heart en-US, kokoro-bf-emma en-GB, kokoro-ff-siwis fr-FR with the SIWIS attribution) and agentspecs/speech-models (moonshine-tiny-en, moonshine-base-en and whisper-base for the browser, silero-vad, kokoro-82m for ai-agents), every file pinned by SHA-256 and size; the licence register agentspecs/speech-licences.yaml (allowed, server_only, every library, model, voice and dataset weighed; not yet reviewed by counsel); agentspecs.speech refuses at load a voice or a model whose weights, data or code the register does not allow (VO-04), transcriber_for, voice_problems; the Appspec's interface.voice (enabled, input, output, voice, language, where; VO-41) and the audio record item, kept only by an application that listens and never by a public one (VO-42); schema and reference written again; test_speech.py; 0.0.38
…ixtures it heard better than base (WER 3.3% against 4.9%) at half the download (VOICE.md VO-05); 0.0.39
…pplication's answers come in, words first — a media type the outputs catalogue gives, named once (output_media_types); Accounting answers in Markdown and a Jupyter notebook (LOOP H-29); 0.0.41
…stant's balloon shows the conversation — history (every message, the composer last) or current (only what it says or does now: the answer being written, or the tool it calls); the page's own when unsaid (LOOP T-23); 0.0.42

This branch was successfully deployed

1 active deployment
pypi — e4a2b658 Deployed Oct 5, 2026 by echarles via pypi #36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants