Architecture¶
Argos is a once / soak runner. A self-hosted dash is optional: the CLI writes out/ locally and can also push a run over HTTP. Styled report.html uses a viewer that lives in dash, not in the Python wheel.
There is no Python package dependency between the library and dash. Cases live in a third repo (argos-pack), not in either framework repo.
Repos and artifacts¶
| Name | Host | Role |
|---|---|---|
| Product site | argos.benchyard.com | Docs, agent skill, SDK |
Git benchyard/argos |
GitHub | CLI / SDK (import argos, command argos) |
PyPI argospy |
pypi.org | Install the library (pip install argospy) |
Git benchyard/argos-dash |
GitHub | Hosted run browser, ingest receiver, ReportView source |
Image platform/argos |
Your registry | Your self-hosted dashboard image |
argos-pack |
Acahti | Product cases (argos.packs entry points) |
argospy is only the PyPI name (argos is the product, import, and CLI).
flowchart TB
pack["argos-pack cases"]
lib["GitHub benchyard/argos"]
pypi["PyPI argospy"]
dashGit["GitHub benchyard/argos-dash"]
image["Harbor platform/argos"]
dash["dash.example.com"]
pack -->|"pip + entry points"| pypi
lib --> pypi
dashGit --> image --> dash
pypi -->|"optional POST ingest"| dash
pypi -->|"GET /report-view"| dash
The library never publishes an npm package. Engineers change report styles in argos-dash (ui/src/report-view). The CLI downloads that IIFE when a dash URL is configured, caches it, and embeds it into out/.../report.html.
Hard rules:
argospydoes not depend onargos-dashas a Python package.- Dash does not
pip install argospy. It does not run cases. - Report UI source lives only in dash. The wheel ships no React / viewer.js.
- Compatibility is the ingest version header (
X-Argos-Ingest/GET /report-view/manifest.json), not equal semver.
Runtime¶
Every run has an actor (who started it) and a runner (hostname). Pipeline jobs prefer ACAHTI_USER. Details: Ingest.
flowchart LR
user["Human or agent"]
cli["argos CLI"]
out["out/ artifacts"]
dash["dash instance"]
user --> cli
cli --> out
cli -->|"argos run --dash ingest"| dash
cli -->|"GET /report-view if URL known"| dash
Local-only is the default. --dash still writes out/, then POSTs the run. Download dash.env from that instance’s /cli page (ARGOS_DASH_URL + ARGOS_TOKEN). There is no default dash URL in the library.
If a dash URL is known (--dash, ARGOS_DASH_URL, or a discovered dash.env), the CLI also fetches the report template. Ingest still requires a token; the template GET does not.
Local report.html¶
flowchart TD
start["write report.html"]
url{"dash URL configured?"}
get["GET manifest plus viewer"]
cache["~/.argos/report-view/ingest/"]
embed["inline CSS+JS into HTML"]
plain["plain HTML shell"]
start --> url
url -->|yes| get
get -->|ok| cache --> embed
get -->|fail| cache
cache -->|hit| embed
cache -->|miss| plain
url -->|no| cache
Generation always embeds. Opening an old report.html does not need dash to still be up. Fetch failures never fail the run. report.json and report.md are always written.
Release¶
Library and dash versions are independent.
flowchart LR
libTag["argos tag X.Y.Z"]
pypi["PyPI argospy"]
pushDev["argos-dash push dev"]
pipe["Acahti cd.office"]
image["Harbor platform/argos:dev-sha"]
libTag --> pypi
pushDev --> pipe --> image
- CLI / SDK change → tag
argosX.Y.Z(nov) → GitHub Actions → PyPI. - Dash UI, login, Helm →
git pushdevon Acahti → imagedev-{sha}+latest. - Breaking ingest /
report.json→ bumpX-Argos-Ingestand the dash manifestingestfield together.