mirror of
https://github.com/mudler/LocalAI.git
synced 2026-11-03 02:54:45 -05:00
* feat(tables): list accessible databases Let agents discover existing databases through the host gateway. Keep listing actor-scoped and separate from executable tools. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * test(tables): verify database listing authority Exercise model discovery through the real owner and carrier. Check shared access, revocation, denial and resource limits. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(tables): bundle database search guidance Teach agents to discover existing databases before querying records. Package and verify the skill with the Tables add-on. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * test(tables): cover packaged chat skill gates Load the real receipt-verified Tables instructions through the temporary Studio workspace. Check the index and load refusal after runtime, chat switch and saved-agent grant changes. This fixture starts at the receipt and broker boundary; packaging tests cover artifact construction and integrity separately. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(office): parse Markdown and CSV inputs Convert bounded text inputs into document and workbook structures. Render supported Markdown formatting without fetching external content. Preserve spreadsheet fields as strings rather than inferring formulas. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix(office): preserve list markers, breaks and PDF page margins Cover actual DOCX breaks and tabs, explicit zero list starts, empty list rejection, and PDF margin/pagination regressions. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix(office): guard Markdown parsing work Check cancellation and nesting during parser callbacks. Validate table dimensions before padded table allocation. Keep parser state isolated to each conversion. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix(office): recognize tables before applying limits Leave mismatched table-like paragraphs as ordinary Markdown. Keep oversized real tables bounded before allocation. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat(office): simplify document creation inputs Accept Markdown for DOCX and PDF, and CSV for single-sheet XLSX files. Replace nested creation schemas to reduce model tool grammar complexity. Keep existing read, edit and PowerPoint behavior and internal office IDs. Present the add-on as Simple Office and document the compatibility change. Keep same-style Markdown fragments editable in generated DOCX files. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix(ci): align add-on fixtures and test inventories Tables fixtures must carry the skill their manifest declares. Preserve its bytes in package tests and mark only binaries executable in UI fixtures. Assert that installation keeps the shipped skill intact. Register the new Tables tests and the connector case from master in exact suite inventories. Include the new database read in tool counts. Run Office regressions through Ginkgo and check reader close errors. Keep all document assertions and the existing CI gates intact. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: nib:gpt-6.1-sol * fix(ci): restore Office and packaging checks Keep the generated Office label consistent with Simple Office. Install Poppler for the PDF layout regressions on Linux and macOS. Separate successful runtime setup from the 300 ms deadline under test. Keep the timeout, cancellation, stop and admission assertions intact. Refresh the packaging inventory from all 209 executed cases, retaining repeated platform checks and the Office and Tables skill checks. Assisted-by: nib:gpt-6.1-sol Signed-off-by: Ettore Di Giacinto <mudler@localai.io> --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
4699 lines
334 KiB
JSON
4699 lines
334 KiB
JSON
{
|
|
"prerequisites": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/prerequisites_test.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"missing-go",
|
|
"old-go",
|
|
"future-go",
|
|
"old-node",
|
|
"wrong-node",
|
|
"wrong-protoc",
|
|
"absent-generated",
|
|
"empty-name",
|
|
"future-suite",
|
|
"empty-selection",
|
|
"failed-child",
|
|
"failed-case-named",
|
|
"failed-tail-kept",
|
|
"zero-tests",
|
|
"skipped-tests",
|
|
"exact-tag-pin",
|
|
"wrong-tag-sum",
|
|
"ginkgo-empty",
|
|
"ginkgo-skipped",
|
|
"ginkgo-missing",
|
|
"ginkgo-failed-spec-named",
|
|
"ginkgo-failure-message",
|
|
"browser-setup-failure",
|
|
"configured-browser-missing",
|
|
"configured-browser-setup",
|
|
"contracts-empty",
|
|
"contracts-skipped",
|
|
"gateway-missing-report",
|
|
"gateway-skipped-report",
|
|
"ui-report-failed",
|
|
"ui-report-skipped",
|
|
"ui-report-flaky",
|
|
"ui-report-empty",
|
|
"ui-report-missing",
|
|
"leak-ignores-command-line",
|
|
"leak-finds-working-directory"
|
|
],
|
|
"readiness": {
|
|
"ginkgo": {
|
|
"command": [
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"<temporary SQLite probe>",
|
|
"-ginkgo.json-report=<unique report>"
|
|
],
|
|
"cases": [
|
|
"sqlite transaction"
|
|
]
|
|
},
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/prepare.sh",
|
|
"--check"
|
|
],
|
|
[
|
|
"tests/e2e-ui/ui-test-server",
|
|
"--mock-backend=<absolute mock-backend>",
|
|
"--port=<isolated port>"
|
|
],
|
|
[
|
|
"core/http/react-ui/node_modules/.bin/playwright",
|
|
"--version"
|
|
],
|
|
[
|
|
"node",
|
|
"--input-type=module",
|
|
"-e",
|
|
"<browser readiness probe>",
|
|
"<healthy server URL>"
|
|
]
|
|
],
|
|
"cases": [
|
|
"toolchain",
|
|
"server health",
|
|
"browser"
|
|
]
|
|
}
|
|
},
|
|
"contracts": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./pkg/addons/contract",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/contracts.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"accepts independent service tool page and chat capabilities",
|
|
"rejects invalid namespace IDs and executable paths",
|
|
"rejects add-on IDs that the host serves as a route segment",
|
|
"rejects invalid versions ranges and capabilities",
|
|
"rejects unknown duplicate trailing and oversized manifest JSON",
|
|
"rejects incompatible host API protocol SDK data and platform fixtures",
|
|
"validates UI only when declared and rejects inconsistent contributions",
|
|
"uses canonical version one wire fixtures",
|
|
"rejects incomplete expired or forged authority shapes",
|
|
"rejects unknown and oversized wire payloads",
|
|
"validates finite defaults overrides and cross field bounds",
|
|
"validates preview receipt states and output descriptions",
|
|
"accepts the apps surface fields and keeps headless manifests valid",
|
|
"rejects unknown and reserved launch modes",
|
|
"rejects remote data absolute and traversing icon paths",
|
|
"requires the main page to be one of the declared pages",
|
|
"bounds localized titles and descriptions and rejects markup",
|
|
"requires the existence tool of an addon whose resources are created or deleted",
|
|
"reserves the segments of the navigation routes",
|
|
"refuses an add-on that needs a newer SDK than the host provides, and says so",
|
|
"accepts a range that contains the host SDK",
|
|
"accepts a range that spans the host SDK",
|
|
"refuses an add-on built for SDK 1 only on a version 2 host",
|
|
"keeps the generic message for a range that is malformed",
|
|
"accepts a read tool that names no resource",
|
|
"keeps a create tool free of the resource argument",
|
|
"refuses a read tool that offers the resource without requiring it",
|
|
"refuses a write or schema tool without a resource",
|
|
"still accepts a read tool that requires its resource",
|
|
"still accepts a write or schema tool that requires its resource",
|
|
"accepts a pull kind with a declared page",
|
|
"accepts drafts and a preview interval within the bounds",
|
|
"lets an add-on declare nothing but the connector",
|
|
"no kind",
|
|
"a bad kind id",
|
|
"a repeated kind",
|
|
"markup in the title",
|
|
"an unknown delivery",
|
|
"a page the UI does not declare",
|
|
"a preview interval too short",
|
|
"a preview interval too long",
|
|
"is valid when the add-on says it acts",
|
|
"is refused when the add-on does not say it acts",
|
|
"leaves the other kinds alone",
|
|
"cuts a long name on a character boundary",
|
|
"a plain name",
|
|
"a path keeps its last element",
|
|
"a Windows path",
|
|
"control characters and quotes",
|
|
"dots only",
|
|
"empty",
|
|
"a hidden name loses its leading dot",
|
|
"a long name keeps its extension",
|
|
"is a valid scope for an action request",
|
|
"is refused for any other request, and an action request refuses any other scope",
|
|
"has a long timeout of its own that is not part of the limits an add-on receives",
|
|
"accepts an action tool that names no resource, and refuses one that offers it without requiring it",
|
|
"keeps the argument names of identity and approval out of an action tool",
|
|
"round-trip",
|
|
"unknown field",
|
|
"duplicate key",
|
|
"trailing",
|
|
"not an object",
|
|
"empty",
|
|
"refuses an oversized body",
|
|
"finetune.get",
|
|
"quantize.start",
|
|
"finetune.a.b",
|
|
"empty",
|
|
"no dot",
|
|
"leading dot",
|
|
"uppercase",
|
|
"trailing space",
|
|
"slash",
|
|
"trailing newline",
|
|
"hyphen",
|
|
"empty verb",
|
|
"too long",
|
|
"bash is replaceable",
|
|
"web_search and web_fetch are replaceable",
|
|
"a file tool is not",
|
|
"an unknown name is not",
|
|
"a page-only tool cannot shadow",
|
|
"two tools cannot shadow one name",
|
|
"a shadow of bash must be an action tool",
|
|
"a shadow of web_fetch must be a read tool",
|
|
"a shadow of bash must declare command",
|
|
"a shadow keeps the type of a required property",
|
|
"a shadow requires no property the built-in does not",
|
|
"a shadow names no resource",
|
|
"extra optional properties are allowed",
|
|
"lists only the shadows that pass the check",
|
|
"keeps the file tools off the replaceable list",
|
|
"parses skillDefinitions from the manifest",
|
|
"accepts the add-on id and names that start with it",
|
|
"refuses a bad name, naming it",
|
|
"refuses a name declared twice",
|
|
"refuses more than 16 skills",
|
|
"refuses a plain name that does not start with the add-on id",
|
|
"refuses a plain name that is a built-in skill, whatever the add-on id",
|
|
"accepts a skill that replaces a replaceable built-in skill by its name",
|
|
"refuses shadows that does not repeat the name, or names a skill that may not be replaced",
|
|
"keeps the built-in names covered: each is replaceable or protected, never both",
|
|
"keeps the replaceable skills and tools apart, so one pin map holds both",
|
|
"accepts a read tool without a resource",
|
|
"refuses one that works on a resource or is not a read: the page has no resource to name",
|
|
"is resourceless like any read without a resource",
|
|
"has the same IDs as the registry of the React UI",
|
|
"accepts known controls and refuses an unknown or repeated one",
|
|
"reads ui.controls from a manifest and refuses an unknown field in it",
|
|
"draws the network policy only for an add-on granted egress that runs bash",
|
|
"serves a second add-on with the same controls, by its grant and not by its name",
|
|
"draws the tool providers for an add-on that replaces any built-in tool"
|
|
],
|
|
"report": ".cache/addons/logs/contracts.json"
|
|
},
|
|
"catalog": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/catalog",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/catalog.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"fetches private bearer and basic catalogs without OCI credentials",
|
|
"blocks redirects without leaking credentials or error details",
|
|
"reports refresh failures rather than serving stale success",
|
|
"resolves the host platform from a multi platform catalog",
|
|
"selects exact configured owner targets and rejects absent or ambiguous targets",
|
|
"requires authoritative administration for all source edits",
|
|
"persists protected references and removes sources without touching installs",
|
|
"invalidates cached releases on explicit source changes",
|
|
"rejects secret URLs invalid digests duplicate identities and malformed catalogs",
|
|
"refuses a library entry whose add-on ID is a host route segment",
|
|
"lists and gets protected source copies including disabled and empty sources after reload",
|
|
"requires current authoritative administration and context for source reads",
|
|
"serializes source reads with concurrent configuration edits",
|
|
"pins channels and restricts package transport to secure or opted in loopback origins",
|
|
"surfaces optional UI metadata in search results and resolutions without changing plain entries",
|
|
"rejects entries with remote icons, reserved launch modes, markup or overlong display text",
|
|
"lists only releases the configured target platform can install",
|
|
"keeps the compatibility hint of an entry and refuses a malformed range",
|
|
"lists the releases of one add-on for every platform, from the cache, and refuses a failed library",
|
|
"names an unavailable credential reference as a credential failure inside the refresh failure",
|
|
"reads a YAML list of releases with the documented fields",
|
|
"accepts an empty library written as an empty list",
|
|
"refuses a JSON index",
|
|
"refuses an unknown field, at the top and inside ui",
|
|
"refuses a second document, a mapping, an empty body and a duplicate key",
|
|
"refuses duplicate identities",
|
|
"enforces the release count and the size limit",
|
|
"resolves the tag at install and builds the version from the digest",
|
|
"refuses a tag that cannot be resolved or a answer that is not a digest",
|
|
"keeps a pinned entry as it is and never looks it up",
|
|
"refuses an entry that is neither mutable nor pinned, and a mutable one that has a digest",
|
|
"refreshes an index with an unknown kind and reports what it skipped",
|
|
"lists add-ons by default and backends on request",
|
|
"resolves a backend only as a backend",
|
|
"refuses entries that mix the fields of the kinds",
|
|
"accepts an anchored identity pattern and refuses a loose one",
|
|
"has an entry for every enabled platform of every add-on",
|
|
"a release tag",
|
|
"a release candidate",
|
|
"a source build",
|
|
"a commit after a tag",
|
|
"a bare commit",
|
|
"a version that could escape the URL",
|
|
"moves a stored official library to the index of the new build",
|
|
"leaves an official library the admin pointed at another URL",
|
|
"reads an index written before kinds existed, and the entry is an add-on",
|
|
"reads a backend entry on a reader that knows backends",
|
|
"skips a backend entry on an add-on only reader and says so",
|
|
"skips an unknown kind without reading its fields, and keeps the rest",
|
|
"skips the reserved model kind in this phase",
|
|
"reports the id of a skipped entry, written as id or as the legacy addonId",
|
|
"reads a backend entry that still uses the legacy addonId, and refuses one that has both",
|
|
"still refuses an unknown field on an entry of a known kind",
|
|
"refuses a malformed kind",
|
|
"reads every new field and keeps it",
|
|
"keeps the reader strict about an unknown field of the backend kind",
|
|
"refuses a license, urls, tags, icon, mirrors or capabilities on an add-on",
|
|
"refuses a schemaVersion this host does not know",
|
|
"is a URL, and the host does not fetch it",
|
|
"must be an https URL with a host and no credentials",
|
|
"is not the icon of the add-on UI, which stays a path in the package",
|
|
"refuses a url that is not http or https",
|
|
"refuses too many urls and too many tags",
|
|
"refuses a tag or a license with a control character or a length over the bound",
|
|
"keeps the order",
|
|
"refuses a mirror that is not an oci image, a duplicate, the artifact itself, and too many",
|
|
"refuses a malformed capability name or backend name",
|
|
"has capabilities and no artifact, digest or platform, and is listed for every platform",
|
|
"cannot carry an artifact-only field",
|
|
"needs capabilities: an entry with no artifact and none is refused",
|
|
"is not a meta backend when it has an artifact",
|
|
"keeps its tag, has no digest and is listed",
|
|
"is refused with a digest, and an entry with no digest is refused unless it is mutable",
|
|
"is accepted on an add-on without a digest, as on a backend",
|
|
"is refused on an add-on with a digest, without a digest unless mutable, or on an archive",
|
|
"reads an index of more than a thousand entries",
|
|
"encodes and decodes an entry with the new fields unchanged",
|
|
"reads the legacy addonId as id, and refuses an entry that has both",
|
|
"carries the built-in tools an add-on replaces, and refuses one that may not be replaced",
|
|
"carries the built-in skills an add-on replaces, and refuses one that may not be replaced",
|
|
"carries toolCount and tools from the index to the listing",
|
|
"leaves both fields out for an entry without chat tools",
|
|
"keeps a count above the listed names when the names are capped",
|
|
"refuses a malformed hint",
|
|
"lists the first-party add-ons, one entry for each platform, in the library format",
|
|
"is a valid, signature-requiring source",
|
|
"is added when there is no sources.json and is written to it",
|
|
"keeps a sources.json the admin already has",
|
|
"does not add the default again after the admin removed it",
|
|
"seeds only once per instance",
|
|
"refuses an entry two of your sources list, and excludes disabled sources"
|
|
],
|
|
"report": ".cache/addons/logs/catalog.json"
|
|
},
|
|
"packages": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/packages",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/packages.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"stages verified HTTP bytes and commits immutable receipts without activation",
|
|
"rejects untrusted integrity forged releases and digest mismatches",
|
|
"rejects traversal links collisions and excessive extraction",
|
|
"rejects cancellation disk full and preserves existing packages",
|
|
"rejects platform data API SDK and missing asset mismatches",
|
|
"pins and verifies real local OCI distribution bytes without a container runtime",
|
|
"rejects downloaded digest mismatch redirects cancellation and file count limits",
|
|
"accepts optional UI only with real immutable assets and rejects non executable entrypoints",
|
|
"does not allow remote verification policy to replace owner trust",
|
|
"requires source opt in before any plaintext OCI request",
|
|
"bounds compressed OCI PAX expansion before tar parsing",
|
|
"bounds compressed OCI GNU expansion before tar parsing",
|
|
"counts padding trailing bytes and layers at the exact expanded boundary",
|
|
"denies nonloopback plaintext and redirect responses at the transport boundary",
|
|
"bounds expanded bytes cumulatively across real OCI layers",
|
|
"bounds sparse logical output across files and layers preserving old packages",
|
|
"accepts exact sparse output budget and cancels synthesized writes",
|
|
"stages real trusted signatures and rejects signed identity digest and trust mismatches offline",
|
|
"records the digest of a packaged immutable icon in the receipt and refuses unusable icons",
|
|
"installs from the old repository per add-on",
|
|
"installs from the shared repository with an id-prefixed tag",
|
|
"follows a digest-pinned blob redirect without the registry credential",
|
|
"still verifies the digest of the redirected bytes",
|
|
"refuses a plaintext redirect to a host name instead of a loopback address",
|
|
"installs by a digest resolved at install, and the receipt records it",
|
|
"checks the signature against the resolved digest",
|
|
"is refused when the tag cannot be resolved or resolves to something that is not the image",
|
|
"refuses an entry that has no digest and is not mutable",
|
|
"accepts a good skills tree and records every file with its digest",
|
|
"reads the skills back for the copy, checked against the receipt",
|
|
"refuses a file added after commit",
|
|
"has nothing to copy for a package without skills",
|
|
"refuses a declared skill without a folder, and a folder that is not declared",
|
|
"refuses a skills folder when the manifest declares none",
|
|
"refuses a folder without SKILL.md and bad frontmatter",
|
|
"refuses links, executable files and special entries",
|
|
"refuses scripts and other file types",
|
|
"refuses names that are not plain lowercase ASCII",
|
|
"refuses text that is not UTF-8 or holds a NUL",
|
|
"refuses oversize files, deep paths and too many files",
|
|
"is for backend sources only: an add-on install refuses it",
|
|
"installs the darwin/amd64 child of an index with four platforms",
|
|
"installs the darwin/arm64 child of an index with four platforms",
|
|
"installs the linux/amd64 child of an index with four platforms",
|
|
"installs the linux/arm64 child of an index with four platforms",
|
|
"refuses an index that does not list the host platform",
|
|
"refuses a child whose digest differs from the one the index lists",
|
|
"still installs a single manifest and refuses a different digest"
|
|
],
|
|
"report": ".cache/addons/logs/packages.json"
|
|
},
|
|
"lifecycle": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/lifecycle.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"recovers every durable journal boundary without replaying publication",
|
|
"removes abandoned staging without removing published packages on recovery",
|
|
"keeps immutable history on successful upgrade and reinstallation",
|
|
"excludes competing owners and rejects conflicting durable identities",
|
|
"never opens replica roots or elects an absent owner",
|
|
"binds duplicate operation IDs to actor and command and serializes conflicts",
|
|
"refuses commands and asset reads for an add-on ID the host serves as a route",
|
|
"retains generations identity data and grants across uninstall and restart",
|
|
"preserves old packages and active generation on manager upgrade failure",
|
|
"requires current authoritative administration even for idempotent retries",
|
|
"rejects symlinked package roots without touching external staging",
|
|
"executes enabled owner intent on startup and stops on disable and close without forwarder execution",
|
|
"retries runtime synchronization after canceled disable and generation upgrade",
|
|
"binds lifecycle lookup to current admin and original actor without writes or repair",
|
|
"cancels status lookup while a lifecycle writer holds the journal lock",
|
|
"denies enable and disable for a stale generation without recording anything",
|
|
"lists the identifiers of installed addons, disabled ones included",
|
|
"refuses to list installed identifiers while recovery is required",
|
|
"lists apps by visibility and serves an icon only for a visible app at its generation",
|
|
"reports the supervisor state of an app through a crash and a restart",
|
|
"reads a flat directory in batches and stops at the entry bound",
|
|
"adds up nested files and reports a complete walk as not truncated",
|
|
"never follows or counts a symbolic link",
|
|
"keeps a result for a short time so polling does not walk again",
|
|
"stops at the time bound and reports a truncated size",
|
|
"does not keep a result cut short by the caller",
|
|
"is what the installed view reports for the data directory",
|
|
"resolves a package for the current enabled generation and digest only",
|
|
"answers from the current installed manifest only and follows a generation change",
|
|
"reports a digest-only change of a moving channel, applies nothing and offers the pinned upgrade",
|
|
"refuses a second operation ID for the same transition, in flight or done, and applies it once",
|
|
"runs concurrent requests with one operation ID once and gives each the same answer",
|
|
"serializes conflicting upgrades by the installed digest and refuses the loser without a record",
|
|
"refuses a candidate that is not the one the library resolves now",
|
|
"refuses an upgrade to the digest that is already installed",
|
|
"rechecks compatibility at execution and refuses an incompatible candidate",
|
|
"selects a newer immutable version and treats a rewritten version as an integrity error",
|
|
"keeps the last good generation when the candidate cannot be staged",
|
|
"never switches the library or channel, and a failed check is never up to date",
|
|
"lets an administrator refresh and everyone with the feature read a redacted status",
|
|
"shows the pending update in the apps list from the cache only",
|
|
"does not accept pins without an update checker or on another action",
|
|
"keeps the unpinned typed upgrade of an earlier release working",
|
|
"carries the SDK refusal text to the caller of a failed install and keeps the generic error",
|
|
"installs an add-on whose SDK range contains the host SDK",
|
|
"upgrades an installed add-on through the same path as a manual upgrade",
|
|
"does nothing when no newer version is listed",
|
|
"refuses a candidate whose package no longer matches its listed digest and replaces nothing",
|
|
"refuses a candidate that fails the signature policy of its library and replaces nothing",
|
|
"does not upgrade to a release the host cannot run",
|
|
"does nothing without an update checker",
|
|
"keeps the manual upgrade closed to a caller who is not an administrator",
|
|
"copies them at install, upgrade and owner start, and removes them at uninstall",
|
|
"never fails the operation when the copy fails",
|
|
"fails the install and says the package could not be verified, without installing anything",
|
|
"names a release that the library does not list",
|
|
"names two libraries that list the same add-on",
|
|
"names a library that cannot be read",
|
|
"reads the library on demand when the startup refresh has not filled the cache",
|
|
"reads the library again when the startup refresh failed",
|
|
"writes the owner and storage only, with no address",
|
|
"loads a file written in the old format with an address",
|
|
"loads when only the address changed",
|
|
"refuses a changed owner ID",
|
|
"refuses a changed storage ID",
|
|
"copies every capability field of the manifest, so a new field cannot be forgotten",
|
|
"is offered when the tag moved, pinned to the build the tag names, and upgrades to exactly that build",
|
|
"refuses the upgrade when the tag moved again after the check, and installs nothing",
|
|
"stamps the first install, keeps the time over an upgrade and stamps it again after an uninstall",
|
|
"needs a state root for the owner only",
|
|
"starts the enabled add-ons side by side, so the start takes the slowest ones and not the sum",
|
|
"distinguishes healthy empty connector discovery from loss of runtime ownership"
|
|
],
|
|
"report": ".cache/addons/logs/lifecycle.json"
|
|
},
|
|
"runtime": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/runtime",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/runtime.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"registers only ready generation bound service headless and UI capabilities",
|
|
"rejects forged registration nonloopback and stale incarnation handshakes",
|
|
"bounds readiness and handles exit during start and stop",
|
|
"withdraws immediately drains boundedly and rejects stale process identities",
|
|
"exhausts restart budget without retaining dead registrations",
|
|
"does not inherit secrets and exits when the private parent channel closes",
|
|
"rejects foreign supervisor handles and numeric PID substitutions",
|
|
"resets restart budget only after sustained authenticated health",
|
|
"authenticates every request and separates trusted authority from model arguments",
|
|
"bounds output streams cancellation deadlines and stop admission",
|
|
"tells a 409 conflict of the add-on from an outage",
|
|
"rejects nonloopback endpoints and bounds oversized streams and concurrency",
|
|
"never reports failed between a launch starting and the restarted process being published",
|
|
"reserves a draining slot against concurrent starts",
|
|
"waits for a restart launch worker before acknowledging stop",
|
|
"exposes a new incarnation client after restart without reviving the old client",
|
|
"kills the exact paused child of a killed owner before launching its replacement",
|
|
"fails closed on ambiguous launch identities and preserves unrelated reused PIDs",
|
|
"retains a canceled restart slot until cleanup completes and rejects duplicate supervisors",
|
|
"refuses a missing established ledger and fences failed cleanup publication",
|
|
"withdraws and initiates every live slot before a cleanup timeout",
|
|
"reports stopped, running, failed, starting and running again across a crash and a restart",
|
|
"keeps reporting failed once the restart budget is exhausted",
|
|
"creates one private data directory per addon and passes its path in the startup object",
|
|
"gives no data directory without a data root and refuses an unsafe root or addon ID",
|
|
"gives an add-on that the host setting names a host endpoint of its own",
|
|
"gives an add-on that the host setting does not name no host endpoint",
|
|
"closes the host endpoint when the incarnation ends",
|
|
"an HTTP 400 answer",
|
|
"an HTTP 422 answer",
|
|
"keeps a bounded, printable reason and nothing else of the body",
|
|
"leaves 503, 500 and 404 as outages",
|
|
"types a withdrawn client, a full slot table, a bad envelope and a missing schema as not sent",
|
|
"keeps a not-sent error an ErrRuntime for callers that do not tell them apart",
|
|
"types a refused connection as not sent",
|
|
"never types a possibly-sent request as not sent",
|
|
"types the add-on's own 'forbidden' answer as a denial of the person, not as an outage",
|
|
"keeps a 403 about the envelope itself an outage: it is a host fault, not a permission",
|
|
"reaches an add-on that declares actions, as the actor of the envelope, under the act scope",
|
|
"never sends a call that is not an act call or has another scope",
|
|
"never sends an act call to an add-on that did not declare actions",
|
|
"stops an act call when the caller gives up",
|
|
"posts the request with the incarnation credential and decodes the answer",
|
|
"is not sent to an add-on that declared no connector",
|
|
"gives it time to release what it owns before it kills the process",
|
|
"kills an add-on that ignores the closing of its startup channel, within the grace period",
|
|
"goes to the log line by line with the add-on ID and a cap per line",
|
|
"records the chat with the envelope of a read and of an action while it runs",
|
|
"sends the add-on an envelope without a new field"
|
|
],
|
|
"report": ".cache/addons/logs/runtime.json"
|
|
},
|
|
"gateway": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/gateway",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/gateway.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/http/endpoints/addons",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/gateway-http.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"serves only declared installed generation assets and rejects traversal",
|
|
"fails closed without current identity or resource policy and reports the original ID of an unknown mutation outcome",
|
|
"reports an unclassified account check error as unavailable on every path and a wrapped denial as forbidden",
|
|
"propagates interrupted progress cancellation through the receiving frontend",
|
|
"validates finite relay budgets and prevents disabling polling bounds",
|
|
"builds a carrier only from complete pinned identities",
|
|
"types an unknown mutation outcome as unavailable without losing its operation",
|
|
"rejects untrusted peers wrong audience body expiry replay and revoked credentials",
|
|
"alternates pinned frontends and rejects untrusted certificates without local fallback",
|
|
"reports the original operation after lost mutation replies without retrying",
|
|
"rejects a stream longer than its receiving frontend budget",
|
|
"rejects a CA signed peer without a pin on the owner side",
|
|
"refuses an owner whose CA signed certificate is not the pinned owner",
|
|
"returns the artifact status through the owner from every frontend with one denial for the rest",
|
|
"types the owner's refusal and outage of a lookup the same from every frontend",
|
|
"writes an attachment header that cannot be broken out of",
|
|
"rotates the enforced audience on restart and rejects captured requests",
|
|
"never expires the response deadline after the relay returned",
|
|
"returns the owner's forbidden status for an invalid kind and for missing policy",
|
|
"still reports unavailable when the owner is unable to serve and not forbidden",
|
|
"reaches the same decision through both frontends and delivers bytes when allowed",
|
|
"keeps aborting when revocation happens after bytes were written",
|
|
"bounds progress, asset and file relays by their own limit",
|
|
"alternates real owner journal status and terminates coarse progress without submitting again",
|
|
"reports an account store outage as unavailable and a refused account as forbidden",
|
|
"rejects unknown lifecycle argument fields before touching the owner journal",
|
|
"reports a runtime that cannot serve as unavailable through both frontends",
|
|
"reports an output that ends before its first byte as unavailable",
|
|
"fails closed as unavailable for an unclassified owner error",
|
|
"keeps authorization and policy denials forbidden",
|
|
"keeps a mutation unknown when the runtime fails after the owner applied it",
|
|
"keeps a mutation unknown when the owner reports recovery required for its operation",
|
|
"reports a mutation as unknown when the owner cannot serve it at all",
|
|
"keeps a mutation unknown on the owner's own frontend and leaves reads and denials alone",
|
|
"lets unavailability win when an error wraps both a denial and an unavailable cause",
|
|
"does not leak attachment headers into an error when the first read fails",
|
|
"treats every action except the known reads as a mutation",
|
|
"keeps resolved resources under admission for JSON and attachment bytes",
|
|
"closes interrupted output and releases admission on disconnect",
|
|
"rechecks revoked credentials during attachment copying",
|
|
"adopts read outputs as private artifacts inside admission and replaces a forged resource identity",
|
|
"refuses at ingest a file result larger than the relay file bound so nothing unservable is staged",
|
|
"denies private relays without host resolution and admission",
|
|
"serves declared assets of the current enabled generation by package digest only",
|
|
"allows only an exact declared tool name and fails closed otherwise",
|
|
"never contacts the add-on for an undeclared tool and still serves a declared one",
|
|
"denies a repeated key at any depth however it is spelled",
|
|
"denies arguments that are not exactly one object",
|
|
"separates a denial from an unavailable declaration source",
|
|
"answers 503 and never contacts the add-on when the source is unavailable or the arguments repeat a key",
|
|
"is the typed invalid request on the owner for a read, never an outage",
|
|
"is the typed invalid request on the owner for a proposal call",
|
|
"is the typed invalid request on the owner for a json relay",
|
|
"is the same typed answer from a forwarding frontend",
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"crosses the owner's wire as the same typed error, whatever the frontend",
|
|
"does not trust a code the host does not know, and cleans the detail the add-on wrote",
|
|
"is a stale view for a caller that only knows ErrStale, and a denial otherwise",
|
|
"is a mutation on the carrier: a lost answer is an unknown outcome, never a plain outage",
|
|
"runs on the owner for the actor the signature binds, and the typed direct dispatch still refuses it",
|
|
"keeps the answer of a call that outlasts the write timeout of the owner server",
|
|
"is an unknown outcome when the answer is lost",
|
|
"runs the backend-releases check for a pinned frontend without an actor",
|
|
"refuses a system call from a peer that is not pinned",
|
|
"never lets a system call change anything or ride the user-facing route",
|
|
"writes the set with private modes and no CA key",
|
|
"loads both roles into carriers and serves a frontend call from the owner",
|
|
"gives the owner no signing key and the frontend its own",
|
|
"accepts two frontends made from the same set",
|
|
"refuses a frontend from another generation",
|
|
"reads only the files of the role",
|
|
"refuses a key file with group or other access",
|
|
"refuses an unknown role",
|
|
"refuses to overwrite a file and leaves it unchanged",
|
|
"needs an owner host",
|
|
"says nothing was sent when the add-on is not running, instead of an unknown outcome",
|
|
"runs a declared action tool for the calling user, under the act scope, admitted as an add-on call",
|
|
"is not reachable through the typed dispatch of the direct API",
|
|
"refuses what is not a declared action tool",
|
|
"refuses an add-on that did not declare actions",
|
|
"is unavailable when the runtime does not serve action tools, and never runs for an unvalidated user",
|
|
"reports an unknown outcome, not a refusal, when the runtime fails after the call began",
|
|
"runs a resource-less read tool for the calling user only",
|
|
"denies a tool that declares a resource when none is given, and never reaches the add-on",
|
|
"denies a resource-less read when the admission cannot admit an add-on, or the tool is undeclared",
|
|
"keeps its address stable across starts",
|
|
"does not share state between different roots",
|
|
"fails clearly when the port is in use",
|
|
"rejects an invalid port file",
|
|
"rejects a port file with a loose mode",
|
|
"rejects a port file that links outside the root",
|
|
"is not permitted when the add-on denies the person, on the owner and on a forwarding frontend",
|
|
"is an unreachable resource when the policy denies it, on the owner and on a forwarding frontend",
|
|
"types the denial of a read like the denial of a write, on the owner and on a forwarding frontend",
|
|
"crosses the wire of a resource call typed, so a forwarding frontend answers like the owner",
|
|
"keeps any other failure to resolve a resource a plain denial, so nothing more is told",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"returns the same text through a forwarding frontend",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route",
|
|
"carries the chat binding signed and rejects a changed one",
|
|
"signs a request without a binding as before",
|
|
"gives the owner the chat the frontend bound the call to"
|
|
],
|
|
"report": ".cache/addons/logs/gateway.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/gateway.json",
|
|
"cases": [
|
|
"serves only declared installed generation assets and rejects traversal",
|
|
"fails closed without current identity or resource policy and reports the original ID of an unknown mutation outcome",
|
|
"reports an unclassified account check error as unavailable on every path and a wrapped denial as forbidden",
|
|
"propagates interrupted progress cancellation through the receiving frontend",
|
|
"validates finite relay budgets and prevents disabling polling bounds",
|
|
"builds a carrier only from complete pinned identities",
|
|
"types an unknown mutation outcome as unavailable without losing its operation",
|
|
"rejects untrusted peers wrong audience body expiry replay and revoked credentials",
|
|
"alternates pinned frontends and rejects untrusted certificates without local fallback",
|
|
"reports the original operation after lost mutation replies without retrying",
|
|
"rejects a stream longer than its receiving frontend budget",
|
|
"rejects a CA signed peer without a pin on the owner side",
|
|
"refuses an owner whose CA signed certificate is not the pinned owner",
|
|
"returns the artifact status through the owner from every frontend with one denial for the rest",
|
|
"types the owner's refusal and outage of a lookup the same from every frontend",
|
|
"writes an attachment header that cannot be broken out of",
|
|
"rotates the enforced audience on restart and rejects captured requests",
|
|
"never expires the response deadline after the relay returned",
|
|
"returns the owner's forbidden status for an invalid kind and for missing policy",
|
|
"still reports unavailable when the owner is unable to serve and not forbidden",
|
|
"reaches the same decision through both frontends and delivers bytes when allowed",
|
|
"keeps aborting when revocation happens after bytes were written",
|
|
"bounds progress, asset and file relays by their own limit",
|
|
"alternates real owner journal status and terminates coarse progress without submitting again",
|
|
"reports an account store outage as unavailable and a refused account as forbidden",
|
|
"rejects unknown lifecycle argument fields before touching the owner journal",
|
|
"reports a runtime that cannot serve as unavailable through both frontends",
|
|
"reports an output that ends before its first byte as unavailable",
|
|
"fails closed as unavailable for an unclassified owner error",
|
|
"keeps authorization and policy denials forbidden",
|
|
"keeps a mutation unknown when the runtime fails after the owner applied it",
|
|
"keeps a mutation unknown when the owner reports recovery required for its operation",
|
|
"reports a mutation as unknown when the owner cannot serve it at all",
|
|
"keeps a mutation unknown on the owner's own frontend and leaves reads and denials alone",
|
|
"lets unavailability win when an error wraps both a denial and an unavailable cause",
|
|
"does not leak attachment headers into an error when the first read fails",
|
|
"treats every action except the known reads as a mutation",
|
|
"keeps resolved resources under admission for JSON and attachment bytes",
|
|
"closes interrupted output and releases admission on disconnect",
|
|
"rechecks revoked credentials during attachment copying",
|
|
"adopts read outputs as private artifacts inside admission and replaces a forged resource identity",
|
|
"refuses at ingest a file result larger than the relay file bound so nothing unservable is staged",
|
|
"denies private relays without host resolution and admission",
|
|
"serves declared assets of the current enabled generation by package digest only",
|
|
"allows only an exact declared tool name and fails closed otherwise",
|
|
"never contacts the add-on for an undeclared tool and still serves a declared one",
|
|
"denies a repeated key at any depth however it is spelled",
|
|
"denies arguments that are not exactly one object",
|
|
"separates a denial from an unavailable declaration source",
|
|
"answers 503 and never contacts the add-on when the source is unavailable or the arguments repeat a key",
|
|
"is the typed invalid request on the owner for a read, never an outage",
|
|
"is the typed invalid request on the owner for a proposal call",
|
|
"is the typed invalid request on the owner for a json relay",
|
|
"is the same typed answer from a forwarding frontend",
|
|
"crosses the owner's wire as the same typed error, whatever the frontend",
|
|
"does not trust a code the host does not know, and cleans the detail the add-on wrote",
|
|
"is a stale view for a caller that only knows ErrStale, and a denial otherwise",
|
|
"is a mutation on the carrier: a lost answer is an unknown outcome, never a plain outage",
|
|
"runs on the owner for the actor the signature binds, and the typed direct dispatch still refuses it",
|
|
"keeps the answer of a call that outlasts the write timeout of the owner server",
|
|
"is an unknown outcome when the answer is lost",
|
|
"runs the backend-releases check for a pinned frontend without an actor",
|
|
"refuses a system call from a peer that is not pinned",
|
|
"never lets a system call change anything or ride the user-facing route",
|
|
"writes the set with private modes and no CA key",
|
|
"loads both roles into carriers and serves a frontend call from the owner",
|
|
"gives the owner no signing key and the frontend its own",
|
|
"accepts two frontends made from the same set",
|
|
"refuses a frontend from another generation",
|
|
"reads only the files of the role",
|
|
"refuses a key file with group or other access",
|
|
"refuses an unknown role",
|
|
"refuses to overwrite a file and leaves it unchanged",
|
|
"needs an owner host",
|
|
"says nothing was sent when the add-on is not running, instead of an unknown outcome",
|
|
"runs a declared action tool for the calling user, under the act scope, admitted as an add-on call",
|
|
"is not reachable through the typed dispatch of the direct API",
|
|
"refuses what is not a declared action tool",
|
|
"refuses an add-on that did not declare actions",
|
|
"is unavailable when the runtime does not serve action tools, and never runs for an unvalidated user",
|
|
"reports an unknown outcome, not a refusal, when the runtime fails after the call began",
|
|
"runs a resource-less read tool for the calling user only",
|
|
"denies a tool that declares a resource when none is given, and never reaches the add-on",
|
|
"denies a resource-less read when the admission cannot admit an add-on, or the tool is undeclared",
|
|
"keeps its address stable across starts",
|
|
"does not share state between different roots",
|
|
"fails clearly when the port is in use",
|
|
"rejects an invalid port file",
|
|
"rejects a port file with a loose mode",
|
|
"rejects a port file that links outside the root",
|
|
"is not permitted when the add-on denies the person, on the owner and on a forwarding frontend",
|
|
"is an unreachable resource when the policy denies it, on the owner and on a forwarding frontend",
|
|
"types the denial of a read like the denial of a write, on the owner and on a forwarding frontend",
|
|
"crosses the wire of a resource call typed, so a forwarding frontend answers like the owner",
|
|
"keeps any other failure to resolve a resource a plain denial, so nothing more is told",
|
|
"carries the chat binding signed and rejects a changed one",
|
|
"signs a request without a binding as before",
|
|
"gives the owner the chat the frontend bound the call to"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/gateway-http.json",
|
|
"cases": [
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"returns the same text through a forwarding frontend",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"policy": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/policy",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/policy.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"enforces the viewer editor owner matrix on fixture resources",
|
|
"denies installation administrators and unrelated users any access to user data",
|
|
"does not leak resource existence and treats unknown actions as owner mutations",
|
|
"never grants the owner role or a grant to the owner and the synthetic principals",
|
|
"rejects anonymous and legacy synthetic principals in named mode",
|
|
"checks credential and account status on every admission",
|
|
"keeps no current-user state shared between concurrent admissions",
|
|
"disables sharing in explicit local-owner mode and lets every local caller own the resource",
|
|
"refuses a mode switch of populated data without a stopped backed-up migration",
|
|
"retains resources and grants across a restart and an uninstall of the package",
|
|
"refuses a corrupt store and a second opener",
|
|
"stops admitted work of a revoked user and acknowledges only after it ended",
|
|
"lets a racing revocation win against read and write admissions",
|
|
"serializes writes per resource while reads run concurrently",
|
|
"bounds the revocation wait and does not acknowledge a stuck drain",
|
|
"invalidates pending proposals on revoke and downgrade and fails closed when it cannot",
|
|
"requires explicit creation authority and keeps pending registrations inaccessible",
|
|
"reconciles a registration interrupted by a crash from the durable store",
|
|
"keeps a record whose existence cannot be established and settles the rest",
|
|
"never drops a committed resource and counts pending quota unchanged",
|
|
"retries kept records from the loop on a tick and on a kick, and stops on Close",
|
|
"closes a loop that never started without waiting",
|
|
"maps opaque ids to the trusted addon and owner and keeps an absent policy denying",
|
|
"does not acknowledge a retried downgrade while the lowered user's write still runs",
|
|
"retries a failed proposal invalidation after the lowered grant is already durable",
|
|
"keeps the drain owed across a restart",
|
|
"does not cancel work admitted under a later grant when a lowering is retried",
|
|
"still waits for and cancels work admitted before the lowering when the regrant is retried",
|
|
"stops work admitted after a regrant when the role is lowered again",
|
|
"keeps the epoch of the owed drain across a restart",
|
|
"keeps a drain mark that a concurrent lowering replaced while a retry was waiting",
|
|
"maps a store outage to unavailable and a disabled account to forbidden",
|
|
"caps pending and committed registrations per user and in total",
|
|
"applies finite defaults when no limit is configured",
|
|
"denies creation as unavailable when the authority cannot tell",
|
|
"reports an unclassified account or creation check error as unavailable and a definite denial as forbidden",
|
|
"does not start the work when revocation cancels the admission before run",
|
|
"rejects persisted unknown roles and trailing bytes without resetting the store",
|
|
"removes stale temporary files on open",
|
|
"stops accepting writes after a failed directory sync and keeps the applied change",
|
|
"retains resources and grants across a real manager uninstall and restart",
|
|
"stores a pending proposal with its exact effects and never executes it",
|
|
"applies exactly the stored arguments once and answers a repeat from the stored receipt",
|
|
"refuses changed arguments, other actors, unknown identifiers and an unbound digest",
|
|
"never lets an API key, plain text or a boolean approve",
|
|
"accepts the local owner as the confirming principal in local-owner mode only",
|
|
"expires a proposal and refuses a late or repeated confirmation",
|
|
"refuses a proposal made stale by a new generation or a moved revision",
|
|
"cancels a proposal for good and restricts who may propose which action",
|
|
"never accepts sharing, deletion, reads or unclassified actions as proposals",
|
|
"cancels pending proposals when authority is lowered and lets a revocation win the confirmation race",
|
|
"persists every transition atomically before it is reported",
|
|
"does not dispatch when the executing state cannot be made durable",
|
|
"keeps a lost reply unknown, blocks conflicting writes and resolves it by receipt without a replay",
|
|
"reports a lost reply from the owner's own gateway with the original operation",
|
|
"recovers a crash after dispatch by receipt and a crash before dispatch as unknown without replay",
|
|
"keeps pending proposals across a restart and never resets a corrupt store",
|
|
"bounds the pending proposals of one user and the store as a whole",
|
|
"records expiry and collects settled proposals without any read so a quiet clock cannot fill the store",
|
|
"records expiry durably when the owner starts and when it recovers",
|
|
"keeps settled proposals for the retention window only",
|
|
"keeps one user from starving others and never drops another user's live proposal",
|
|
"bounds the stored canonical arguments per user and in total with a typed quota error",
|
|
"looks an unresolved receipt up again with backoff for a finite window and never applies again",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then unblocks writes",
|
|
"records a late receipt of an abandoned outcome instead of hiding it",
|
|
"settles by lookup instead of abandoning when the receipt is final",
|
|
"refuses a stored abandonment that names nobody and keeps looking up in the background",
|
|
"binds the digest to the operation, actor, resource, generation, action, arguments and revision",
|
|
"refuses a stored proposal whose operation, actor, resource, generation or arguments changed at rest",
|
|
"issues resource identifiers the envelope contract accepts",
|
|
"is unavailable until it is attached to a policy and a runtime",
|
|
"keeps executing, outcome-unknown and abandoned records far past retention and still dedupes them",
|
|
"waits for the background run and for lookups in flight before it closes, and writes nothing after",
|
|
"lets the owner role list the unresolved proposals of its resource and abandon one by the listed digest",
|
|
"names the blocking proposal in the denial only to the resource owner",
|
|
"refuses an unbound digest when the owner abandons through the gateway or the broker",
|
|
"answers the same typed outage for a resolution whoever proposed the operation",
|
|
"returns the applied proposal when the owner cannot read it back after a successful apply",
|
|
"does not show another user's blocking operation in a proposal view",
|
|
"denies a proposal for an undeclared tool before any preview and stores nothing",
|
|
"denies a proposal that names a tool when no tool source is installed",
|
|
"rechecks the stored tool at confirmation and never applies a withdrawn tool",
|
|
"denies a proposal whose arguments repeat a key and stores nothing",
|
|
"reports an unavailable declaration source as unavailable, never as a denial",
|
|
"does not apply at confirmation while the declaration source is unavailable, and applies once it recovers",
|
|
"reserves a create proposal as a pending resource that nobody can reach",
|
|
"commits the reservation on confirmation and makes the proposer the private owner",
|
|
"abandons the reservation when a create proposal is cancelled or expires",
|
|
"abandons the reservation when the addon rejects the creation",
|
|
"keeps a lost create reply pending and unknown and settles it by receipt",
|
|
"abandons an unknown create only when the addon confirms the backing is absent",
|
|
"settles reservations at restart by asking the addon and keeps those of live proposals",
|
|
"bounds concurrent create proposals by the pending quota",
|
|
"lets only the proposer confirm, cancel or read a create proposal",
|
|
"denies a create proposal when creation authority is revoked before confirmation",
|
|
"denies a create proposal for an undeclared tool or an existing resource without reserving",
|
|
"does not let reconcile drop the reservation of a creation in flight",
|
|
"commits the reservation at recovery when the crash came after the receipt was stored",
|
|
"never reads an add-on that cannot answer as a backing that is gone",
|
|
"accepts the explicit answer of the declared existence tool, true or false",
|
|
"holds the resources of one add-on and leaves another add-on alone",
|
|
"cancels admitted work and reports a drain that did not finish",
|
|
"restores grants through the account directory and the lowerings since the backup, never beyond them",
|
|
"keeps a bounded durable log of lowered access",
|
|
"keeps a revocation however many later lowerings of another person follow",
|
|
"restores the data but no access when the history may have lost a lowering",
|
|
"reads a store that is full of lowerings as one whose history may be cut",
|
|
"applies a lowering made after the export whatever time the backup is given",
|
|
"refuses a change that was authorized just before the hold began",
|
|
"cancels a pending proposal and leaves an executing one outcome-unknown after a restore",
|
|
"forgets the records of one add-on and no other",
|
|
"maps an owner on a restore to a local-owner store only when nothing named is in it",
|
|
"migrates the ownership of a stopped store with a backup and an explicit mapping and refuses a populated downgrade",
|
|
"refuses a proposal whose preview the add-on refused, storing nothing",
|
|
"settles a confirmation the add-on refused as rejected, never as an unknown outcome",
|
|
"R34: returns an admission that was refused before the wire to pending, and a repeat applies",
|
|
"R35, R52: a hold that cancels the dispatch before the wire ends the proposal as cancelled, not unknown",
|
|
"R38: records a conflict of the add-on as rejected, not unknown",
|
|
"R39: still records an unknown outcome when the request may have been sent",
|
|
"reports a not-sent confirmation through the gateway as an outage that sent nothing, never as unknown",
|
|
"is a refusal that changed nothing, not an outage, and leaves the ID free",
|
|
"R4, S4: refuses an editor who claims the write action for a schema tool, and stores nothing",
|
|
"R4: refuses an editor who names the schema action for a schema tool",
|
|
"derives the action from the tool, so the owner needs the matching claim and gets the schema action",
|
|
"still lets an editor propose a data write for a write tool",
|
|
"R3: refuses a read tool, a create tool and a tool without a definition",
|
|
"runs the declaration check as well as the kind check",
|
|
"refuses a named tool when the source cannot report kinds",
|
|
"R3: a creation names a create tool, never a schema or data tool",
|
|
"retry-after-not-sent: R34 then R37",
|
|
"addon-conflict-is-rejected: R38",
|
|
"timeout-unknown-then-receipt-committed: R39 then R40",
|
|
"runs the work for a current account",
|
|
"refuses a stale account and does not run the work",
|
|
"refuses an identity that does not fit the mode",
|
|
"refuses a held add-on as unavailable, and serves it again after the release",
|
|
"refuses an empty add-on ID and a nil work function",
|
|
"is reached through the gateway provider"
|
|
],
|
|
"report": ".cache/addons/logs/policy.json"
|
|
},
|
|
"proposals": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/policy",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/proposals.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/http/endpoints/addons",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/proposals-http.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"requires explicit creation authority and keeps pending registrations inaccessible",
|
|
"reconciles a registration interrupted by a crash from the durable store",
|
|
"keeps a record whose existence cannot be established and settles the rest",
|
|
"never drops a committed resource and counts pending quota unchanged",
|
|
"retries kept records from the loop on a tick and on a kick, and stops on Close",
|
|
"closes a loop that never started without waiting",
|
|
"stops admitted work of a revoked user and acknowledges only after it ended",
|
|
"lets a racing revocation win against read and write admissions",
|
|
"serializes writes per resource while reads run concurrently",
|
|
"bounds the revocation wait and does not acknowledge a stuck drain",
|
|
"invalidates pending proposals on revoke and downgrade and fails closed when it cannot",
|
|
"maps a store outage to unavailable and a disabled account to forbidden",
|
|
"maps opaque ids to the trusted addon and owner and keeps an absent policy denying",
|
|
"disables sharing in explicit local-owner mode and lets every local caller own the resource",
|
|
"refuses a mode switch of populated data without a stopped backed-up migration",
|
|
"retains resources and grants across a restart and an uninstall of the package",
|
|
"refuses a corrupt store and a second opener",
|
|
"caps pending and committed registrations per user and in total",
|
|
"applies finite defaults when no limit is configured",
|
|
"denies creation as unavailable when the authority cannot tell",
|
|
"does not acknowledge a retried downgrade while the lowered user's write still runs",
|
|
"retries a failed proposal invalidation after the lowered grant is already durable",
|
|
"keeps the drain owed across a restart",
|
|
"does not start the work when revocation cancels the admission before run",
|
|
"retains resources and grants across a real manager uninstall and restart",
|
|
"rejects persisted unknown roles and trailing bytes without resetting the store",
|
|
"removes stale temporary files on open",
|
|
"stops accepting writes after a failed directory sync and keeps the applied change",
|
|
"enforces the viewer editor owner matrix on fixture resources",
|
|
"denies installation administrators and unrelated users any access to user data",
|
|
"does not leak resource existence and treats unknown actions as owner mutations",
|
|
"never grants the owner role or a grant to the owner and the synthetic principals",
|
|
"does not cancel work admitted under a later grant when a lowering is retried",
|
|
"still waits for and cancels work admitted before the lowering when the regrant is retried",
|
|
"stops work admitted after a regrant when the role is lowered again",
|
|
"keeps the epoch of the owed drain across a restart",
|
|
"keeps a drain mark that a concurrent lowering replaced while a retry was waiting",
|
|
"reports an unclassified account or creation check error as unavailable and a definite denial as forbidden",
|
|
"rejects anonymous and legacy synthetic principals in named mode",
|
|
"checks credential and account status on every admission",
|
|
"keeps no current-user state shared between concurrent admissions",
|
|
"stores a pending proposal with its exact effects and never executes it",
|
|
"applies exactly the stored arguments once and answers a repeat from the stored receipt",
|
|
"refuses changed arguments, other actors, unknown identifiers and an unbound digest",
|
|
"never lets an API key, plain text or a boolean approve",
|
|
"accepts the local owner as the confirming principal in local-owner mode only",
|
|
"expires a proposal and refuses a late or repeated confirmation",
|
|
"refuses a proposal made stale by a new generation or a moved revision",
|
|
"cancels a proposal for good and restricts who may propose which action",
|
|
"never accepts sharing, deletion, reads or unclassified actions as proposals",
|
|
"cancels pending proposals when authority is lowered and lets a revocation win the confirmation race",
|
|
"persists every transition atomically before it is reported",
|
|
"does not dispatch when the executing state cannot be made durable",
|
|
"keeps a lost reply unknown, blocks conflicting writes and resolves it by receipt without a replay",
|
|
"reports a lost reply from the owner's own gateway with the original operation",
|
|
"recovers a crash after dispatch by receipt and a crash before dispatch as unknown without replay",
|
|
"keeps pending proposals across a restart and never resets a corrupt store",
|
|
"bounds the pending proposals of one user and the store as a whole",
|
|
"records expiry and collects settled proposals without any read so a quiet clock cannot fill the store",
|
|
"records expiry durably when the owner starts and when it recovers",
|
|
"keeps settled proposals for the retention window only",
|
|
"keeps one user from starving others and never drops another user's live proposal",
|
|
"bounds the stored canonical arguments per user and in total with a typed quota error",
|
|
"looks an unresolved receipt up again with backoff for a finite window and never applies again",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then unblocks writes",
|
|
"records a late receipt of an abandoned outcome instead of hiding it",
|
|
"settles by lookup instead of abandoning when the receipt is final",
|
|
"refuses a stored abandonment that names nobody and keeps looking up in the background",
|
|
"binds the digest to the operation, actor, resource, generation, action, arguments and revision",
|
|
"refuses a stored proposal whose operation, actor, resource, generation or arguments changed at rest",
|
|
"issues resource identifiers the envelope contract accepts",
|
|
"is unavailable until it is attached to a policy and a runtime",
|
|
"keeps executing, outcome-unknown and abandoned records far past retention and still dedupes them",
|
|
"waits for the background run and for lookups in flight before it closes, and writes nothing after",
|
|
"lets the owner role list the unresolved proposals of its resource and abandon one by the listed digest",
|
|
"names the blocking proposal in the denial only to the resource owner",
|
|
"refuses an unbound digest when the owner abandons through the gateway or the broker",
|
|
"answers the same typed outage for a resolution whoever proposed the operation",
|
|
"returns the applied proposal when the owner cannot read it back after a successful apply",
|
|
"does not show another user's blocking operation in a proposal view",
|
|
"denies a proposal for an undeclared tool before any preview and stores nothing",
|
|
"denies a proposal that names a tool when no tool source is installed",
|
|
"rechecks the stored tool at confirmation and never applies a withdrawn tool",
|
|
"denies a proposal whose arguments repeat a key and stores nothing",
|
|
"reports an unavailable declaration source as unavailable, never as a denial",
|
|
"does not apply at confirmation while the declaration source is unavailable, and applies once it recovers",
|
|
"reserves a create proposal as a pending resource that nobody can reach",
|
|
"commits the reservation on confirmation and makes the proposer the private owner",
|
|
"abandons the reservation when a create proposal is cancelled or expires",
|
|
"abandons the reservation when the addon rejects the creation",
|
|
"keeps a lost create reply pending and unknown and settles it by receipt",
|
|
"abandons an unknown create only when the addon confirms the backing is absent",
|
|
"settles reservations at restart by asking the addon and keeps those of live proposals",
|
|
"bounds concurrent create proposals by the pending quota",
|
|
"lets only the proposer confirm, cancel or read a create proposal",
|
|
"denies a create proposal when creation authority is revoked before confirmation",
|
|
"denies a create proposal for an undeclared tool or an existing resource without reserving",
|
|
"does not let reconcile drop the reservation of a creation in flight",
|
|
"commits the reservation at recovery when the crash came after the receipt was stored",
|
|
"never reads an add-on that cannot answer as a backing that is gone",
|
|
"accepts the explicit answer of the declared existence tool, true or false",
|
|
"holds the resources of one add-on and leaves another add-on alone",
|
|
"cancels admitted work and reports a drain that did not finish",
|
|
"restores grants through the account directory and the lowerings since the backup, never beyond them",
|
|
"keeps a bounded durable log of lowered access",
|
|
"keeps a revocation however many later lowerings of another person follow",
|
|
"restores the data but no access when the history may have lost a lowering",
|
|
"reads a store that is full of lowerings as one whose history may be cut",
|
|
"applies a lowering made after the export whatever time the backup is given",
|
|
"refuses a change that was authorized just before the hold began",
|
|
"cancels a pending proposal and leaves an executing one outcome-unknown after a restore",
|
|
"forgets the records of one add-on and no other",
|
|
"maps an owner on a restore to a local-owner store only when nothing named is in it",
|
|
"migrates the ownership of a stopped store with a backup and an explicit mapping and refuses a populated downgrade",
|
|
"refuses a proposal whose preview the add-on refused, storing nothing",
|
|
"settles a confirmation the add-on refused as rejected, never as an unknown outcome",
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"R34: returns an admission that was refused before the wire to pending, and a repeat applies",
|
|
"R35, R52: a hold that cancels the dispatch before the wire ends the proposal as cancelled, not unknown",
|
|
"R38: records a conflict of the add-on as rejected, not unknown",
|
|
"R39: still records an unknown outcome when the request may have been sent",
|
|
"reports a not-sent confirmation through the gateway as an outage that sent nothing, never as unknown",
|
|
"is a refusal that changed nothing, not an outage, and leaves the ID free",
|
|
"R4, S4: refuses an editor who claims the write action for a schema tool, and stores nothing",
|
|
"R4: refuses an editor who names the schema action for a schema tool",
|
|
"derives the action from the tool, so the owner needs the matching claim and gets the schema action",
|
|
"still lets an editor propose a data write for a write tool",
|
|
"R3: refuses a read tool, a create tool and a tool without a definition",
|
|
"runs the declaration check as well as the kind check",
|
|
"refuses a named tool when the source cannot report kinds",
|
|
"R3: a creation names a create tool, never a schema or data tool",
|
|
"retry-after-not-sent: R34 then R37",
|
|
"addon-conflict-is-rejected: R38",
|
|
"timeout-unknown-then-receipt-committed: R39 then R40",
|
|
"runs the work for a current account",
|
|
"refuses a stale account and does not run the work",
|
|
"refuses an identity that does not fit the mode",
|
|
"refuses a held add-on as unavailable, and serves it again after the release",
|
|
"refuses an empty add-on ID and a nil work function",
|
|
"is reached through the gateway provider",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"returns the same text through a forwarding frontend",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route"
|
|
],
|
|
"report": ".cache/addons/logs/proposals.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/proposals.json",
|
|
"cases": [
|
|
"requires explicit creation authority and keeps pending registrations inaccessible",
|
|
"reconciles a registration interrupted by a crash from the durable store",
|
|
"keeps a record whose existence cannot be established and settles the rest",
|
|
"never drops a committed resource and counts pending quota unchanged",
|
|
"retries kept records from the loop on a tick and on a kick, and stops on Close",
|
|
"closes a loop that never started without waiting",
|
|
"stops admitted work of a revoked user and acknowledges only after it ended",
|
|
"lets a racing revocation win against read and write admissions",
|
|
"serializes writes per resource while reads run concurrently",
|
|
"bounds the revocation wait and does not acknowledge a stuck drain",
|
|
"invalidates pending proposals on revoke and downgrade and fails closed when it cannot",
|
|
"maps a store outage to unavailable and a disabled account to forbidden",
|
|
"maps opaque ids to the trusted addon and owner and keeps an absent policy denying",
|
|
"disables sharing in explicit local-owner mode and lets every local caller own the resource",
|
|
"refuses a mode switch of populated data without a stopped backed-up migration",
|
|
"retains resources and grants across a restart and an uninstall of the package",
|
|
"refuses a corrupt store and a second opener",
|
|
"caps pending and committed registrations per user and in total",
|
|
"applies finite defaults when no limit is configured",
|
|
"denies creation as unavailable when the authority cannot tell",
|
|
"does not acknowledge a retried downgrade while the lowered user's write still runs",
|
|
"retries a failed proposal invalidation after the lowered grant is already durable",
|
|
"keeps the drain owed across a restart",
|
|
"does not start the work when revocation cancels the admission before run",
|
|
"retains resources and grants across a real manager uninstall and restart",
|
|
"rejects persisted unknown roles and trailing bytes without resetting the store",
|
|
"removes stale temporary files on open",
|
|
"stops accepting writes after a failed directory sync and keeps the applied change",
|
|
"enforces the viewer editor owner matrix on fixture resources",
|
|
"denies installation administrators and unrelated users any access to user data",
|
|
"does not leak resource existence and treats unknown actions as owner mutations",
|
|
"never grants the owner role or a grant to the owner and the synthetic principals",
|
|
"does not cancel work admitted under a later grant when a lowering is retried",
|
|
"still waits for and cancels work admitted before the lowering when the regrant is retried",
|
|
"stops work admitted after a regrant when the role is lowered again",
|
|
"keeps the epoch of the owed drain across a restart",
|
|
"keeps a drain mark that a concurrent lowering replaced while a retry was waiting",
|
|
"reports an unclassified account or creation check error as unavailable and a definite denial as forbidden",
|
|
"rejects anonymous and legacy synthetic principals in named mode",
|
|
"checks credential and account status on every admission",
|
|
"keeps no current-user state shared between concurrent admissions",
|
|
"stores a pending proposal with its exact effects and never executes it",
|
|
"applies exactly the stored arguments once and answers a repeat from the stored receipt",
|
|
"refuses changed arguments, other actors, unknown identifiers and an unbound digest",
|
|
"never lets an API key, plain text or a boolean approve",
|
|
"accepts the local owner as the confirming principal in local-owner mode only",
|
|
"expires a proposal and refuses a late or repeated confirmation",
|
|
"refuses a proposal made stale by a new generation or a moved revision",
|
|
"cancels a proposal for good and restricts who may propose which action",
|
|
"never accepts sharing, deletion, reads or unclassified actions as proposals",
|
|
"cancels pending proposals when authority is lowered and lets a revocation win the confirmation race",
|
|
"persists every transition atomically before it is reported",
|
|
"does not dispatch when the executing state cannot be made durable",
|
|
"keeps a lost reply unknown, blocks conflicting writes and resolves it by receipt without a replay",
|
|
"reports a lost reply from the owner's own gateway with the original operation",
|
|
"recovers a crash after dispatch by receipt and a crash before dispatch as unknown without replay",
|
|
"keeps pending proposals across a restart and never resets a corrupt store",
|
|
"bounds the pending proposals of one user and the store as a whole",
|
|
"records expiry and collects settled proposals without any read so a quiet clock cannot fill the store",
|
|
"records expiry durably when the owner starts and when it recovers",
|
|
"keeps settled proposals for the retention window only",
|
|
"keeps one user from starving others and never drops another user's live proposal",
|
|
"bounds the stored canonical arguments per user and in total with a typed quota error",
|
|
"looks an unresolved receipt up again with backoff for a finite window and never applies again",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then unblocks writes",
|
|
"records a late receipt of an abandoned outcome instead of hiding it",
|
|
"settles by lookup instead of abandoning when the receipt is final",
|
|
"refuses a stored abandonment that names nobody and keeps looking up in the background",
|
|
"binds the digest to the operation, actor, resource, generation, action, arguments and revision",
|
|
"refuses a stored proposal whose operation, actor, resource, generation or arguments changed at rest",
|
|
"issues resource identifiers the envelope contract accepts",
|
|
"is unavailable until it is attached to a policy and a runtime",
|
|
"keeps executing, outcome-unknown and abandoned records far past retention and still dedupes them",
|
|
"waits for the background run and for lookups in flight before it closes, and writes nothing after",
|
|
"lets the owner role list the unresolved proposals of its resource and abandon one by the listed digest",
|
|
"names the blocking proposal in the denial only to the resource owner",
|
|
"refuses an unbound digest when the owner abandons through the gateway or the broker",
|
|
"answers the same typed outage for a resolution whoever proposed the operation",
|
|
"returns the applied proposal when the owner cannot read it back after a successful apply",
|
|
"does not show another user's blocking operation in a proposal view",
|
|
"denies a proposal for an undeclared tool before any preview and stores nothing",
|
|
"denies a proposal that names a tool when no tool source is installed",
|
|
"rechecks the stored tool at confirmation and never applies a withdrawn tool",
|
|
"denies a proposal whose arguments repeat a key and stores nothing",
|
|
"reports an unavailable declaration source as unavailable, never as a denial",
|
|
"does not apply at confirmation while the declaration source is unavailable, and applies once it recovers",
|
|
"reserves a create proposal as a pending resource that nobody can reach",
|
|
"commits the reservation on confirmation and makes the proposer the private owner",
|
|
"abandons the reservation when a create proposal is cancelled or expires",
|
|
"abandons the reservation when the addon rejects the creation",
|
|
"keeps a lost create reply pending and unknown and settles it by receipt",
|
|
"abandons an unknown create only when the addon confirms the backing is absent",
|
|
"settles reservations at restart by asking the addon and keeps those of live proposals",
|
|
"bounds concurrent create proposals by the pending quota",
|
|
"lets only the proposer confirm, cancel or read a create proposal",
|
|
"denies a create proposal when creation authority is revoked before confirmation",
|
|
"denies a create proposal for an undeclared tool or an existing resource without reserving",
|
|
"does not let reconcile drop the reservation of a creation in flight",
|
|
"commits the reservation at recovery when the crash came after the receipt was stored",
|
|
"never reads an add-on that cannot answer as a backing that is gone",
|
|
"accepts the explicit answer of the declared existence tool, true or false",
|
|
"holds the resources of one add-on and leaves another add-on alone",
|
|
"cancels admitted work and reports a drain that did not finish",
|
|
"restores grants through the account directory and the lowerings since the backup, never beyond them",
|
|
"keeps a bounded durable log of lowered access",
|
|
"keeps a revocation however many later lowerings of another person follow",
|
|
"restores the data but no access when the history may have lost a lowering",
|
|
"reads a store that is full of lowerings as one whose history may be cut",
|
|
"applies a lowering made after the export whatever time the backup is given",
|
|
"refuses a change that was authorized just before the hold began",
|
|
"cancels a pending proposal and leaves an executing one outcome-unknown after a restore",
|
|
"forgets the records of one add-on and no other",
|
|
"maps an owner on a restore to a local-owner store only when nothing named is in it",
|
|
"migrates the ownership of a stopped store with a backup and an explicit mapping and refuses a populated downgrade",
|
|
"refuses a proposal whose preview the add-on refused, storing nothing",
|
|
"settles a confirmation the add-on refused as rejected, never as an unknown outcome",
|
|
"R34: returns an admission that was refused before the wire to pending, and a repeat applies",
|
|
"R35, R52: a hold that cancels the dispatch before the wire ends the proposal as cancelled, not unknown",
|
|
"R38: records a conflict of the add-on as rejected, not unknown",
|
|
"R39: still records an unknown outcome when the request may have been sent",
|
|
"reports a not-sent confirmation through the gateway as an outage that sent nothing, never as unknown",
|
|
"is a refusal that changed nothing, not an outage, and leaves the ID free",
|
|
"R4, S4: refuses an editor who claims the write action for a schema tool, and stores nothing",
|
|
"R4: refuses an editor who names the schema action for a schema tool",
|
|
"derives the action from the tool, so the owner needs the matching claim and gets the schema action",
|
|
"still lets an editor propose a data write for a write tool",
|
|
"R3: refuses a read tool, a create tool and a tool without a definition",
|
|
"runs the declaration check as well as the kind check",
|
|
"refuses a named tool when the source cannot report kinds",
|
|
"R3: a creation names a create tool, never a schema or data tool",
|
|
"retry-after-not-sent: R34 then R37",
|
|
"addon-conflict-is-rejected: R38",
|
|
"timeout-unknown-then-receipt-committed: R39 then R40",
|
|
"runs the work for a current account",
|
|
"refuses a stale account and does not run the work",
|
|
"refuses an identity that does not fit the mode",
|
|
"refuses a held add-on as unavailable, and serves it again after the release",
|
|
"refuses an empty add-on ID and a nil work function",
|
|
"is reached through the gateway provider"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/proposals-http.json",
|
|
"cases": [
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"returns the same text through a forwarding frontend",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"artifacts": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/artifacts",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/artifacts.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/gateway",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/artifacts-gateway.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/http/endpoints/addons",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/artifacts-http.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"adopts every output of a result or none, and shows the owner only its own status",
|
|
"sanitizes attachment names and maps media types to a fixed allowlist",
|
|
"applies finite default limits and rejects partial or unbounded overrides",
|
|
"keeps staged bytes behind the object store boundary and publishes only complete writes",
|
|
"never serves an artifact at or after expiry, including during admission and mid-stream",
|
|
"fails a transfer that outlives its artifact",
|
|
"fails a transfer whose source is revoked before completion and denies a revoked download",
|
|
"stops a download stream when the source is revoked mid-stream",
|
|
"requires read access to every source resource at completion and download",
|
|
"denies a disabled or unavailable account at ingestion and download",
|
|
"denies downloads of a disabled addon, keeps the bytes and serves again only while unexpired with current permissions",
|
|
"denies downloads after uninstall and removes the bytes at the next sweep",
|
|
"sweeps expired artifacts, abandoned partials and orphan files without touching live transfers",
|
|
"enforces per-user, total and size limits atomically under concurrent ingestion",
|
|
"bounds concurrent transfers and concurrent downloads",
|
|
"cancels a transfer by its context or by its owner and removes the partial bytes",
|
|
"returns the same artifact for a repeated request without a second transfer",
|
|
"keeps addon handles operation-bound and out of metadata and views",
|
|
"keeps complete artifacts across a restart and settles interrupted transfers",
|
|
"keeps the bytes of a transfer that completes while a sweep is running",
|
|
"never loses the bytes of a complete artifact when sweeps race with several completing transfers",
|
|
"answers a transient storage error as unavailable and keeps the bytes and the record",
|
|
"marks an artifact corrupt only for missing bytes or a size mismatch",
|
|
"answers a download that races with an expiry or a drop like any expired identifier",
|
|
"refuses a corrupt metadata store and stops writing after a failed sync",
|
|
"waits for background transfers before Close returns and writes nothing after",
|
|
"ingests a file result into a private staged artifact with a host-generated identifier",
|
|
"never uses an addon handle, URL or path as an identifier or a file path",
|
|
"answers one denial for an unknown identifier and for another principal's artifact",
|
|
"never serves incomplete, short, long or failed transfers and removes their partial bytes",
|
|
"streams ingestion and download without buffering the whole file",
|
|
"rejects an output declared larger than one artifact may be before reading it",
|
|
"never opens an output for a request that names a tool no source declares",
|
|
"denies an output request whose arguments repeat a key and never opens the output",
|
|
"reports an unavailable declaration source as unavailable and never opens the output",
|
|
"shortens the lifetime and keeps the bounds consistent, and zero keeps the defaults",
|
|
"fails the artifact with a fixed reason that says it was refused, not that the add-on is down",
|
|
"serves only declared installed generation assets and rejects traversal",
|
|
"fails closed without current identity or resource policy and reports the original ID of an unknown mutation outcome",
|
|
"reports an unclassified account check error as unavailable on every path and a wrapped denial as forbidden",
|
|
"propagates interrupted progress cancellation through the receiving frontend",
|
|
"validates finite relay budgets and prevents disabling polling bounds",
|
|
"builds a carrier only from complete pinned identities",
|
|
"types an unknown mutation outcome as unavailable without losing its operation",
|
|
"rejects untrusted peers wrong audience body expiry replay and revoked credentials",
|
|
"alternates pinned frontends and rejects untrusted certificates without local fallback",
|
|
"reports the original operation after lost mutation replies without retrying",
|
|
"rejects a stream longer than its receiving frontend budget",
|
|
"rejects a CA signed peer without a pin on the owner side",
|
|
"refuses an owner whose CA signed certificate is not the pinned owner",
|
|
"returns the artifact status through the owner from every frontend with one denial for the rest",
|
|
"types the owner's refusal and outage of a lookup the same from every frontend",
|
|
"writes an attachment header that cannot be broken out of",
|
|
"rotates the enforced audience on restart and rejects captured requests",
|
|
"never expires the response deadline after the relay returned",
|
|
"returns the owner's forbidden status for an invalid kind and for missing policy",
|
|
"still reports unavailable when the owner is unable to serve and not forbidden",
|
|
"reaches the same decision through both frontends and delivers bytes when allowed",
|
|
"keeps aborting when revocation happens after bytes were written",
|
|
"bounds progress, asset and file relays by their own limit",
|
|
"alternates real owner journal status and terminates coarse progress without submitting again",
|
|
"reports an account store outage as unavailable and a refused account as forbidden",
|
|
"rejects unknown lifecycle argument fields before touching the owner journal",
|
|
"reports a runtime that cannot serve as unavailable through both frontends",
|
|
"reports an output that ends before its first byte as unavailable",
|
|
"fails closed as unavailable for an unclassified owner error",
|
|
"keeps authorization and policy denials forbidden",
|
|
"keeps a mutation unknown when the runtime fails after the owner applied it",
|
|
"keeps a mutation unknown when the owner reports recovery required for its operation",
|
|
"reports a mutation as unknown when the owner cannot serve it at all",
|
|
"keeps a mutation unknown on the owner's own frontend and leaves reads and denials alone",
|
|
"lets unavailability win when an error wraps both a denial and an unavailable cause",
|
|
"does not leak attachment headers into an error when the first read fails",
|
|
"treats every action except the known reads as a mutation",
|
|
"keeps resolved resources under admission for JSON and attachment bytes",
|
|
"closes interrupted output and releases admission on disconnect",
|
|
"rechecks revoked credentials during attachment copying",
|
|
"adopts read outputs as private artifacts inside admission and replaces a forged resource identity",
|
|
"refuses at ingest a file result larger than the relay file bound so nothing unservable is staged",
|
|
"denies private relays without host resolution and admission",
|
|
"serves declared assets of the current enabled generation by package digest only",
|
|
"allows only an exact declared tool name and fails closed otherwise",
|
|
"never contacts the add-on for an undeclared tool and still serves a declared one",
|
|
"denies a repeated key at any depth however it is spelled",
|
|
"denies arguments that are not exactly one object",
|
|
"separates a denial from an unavailable declaration source",
|
|
"answers 503 and never contacts the add-on when the source is unavailable or the arguments repeat a key",
|
|
"is the typed invalid request on the owner for a read, never an outage",
|
|
"is the typed invalid request on the owner for a proposal call",
|
|
"is the typed invalid request on the owner for a json relay",
|
|
"is the same typed answer from a forwarding frontend",
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"crosses the owner's wire as the same typed error, whatever the frontend",
|
|
"does not trust a code the host does not know, and cleans the detail the add-on wrote",
|
|
"is a stale view for a caller that only knows ErrStale, and a denial otherwise",
|
|
"is a mutation on the carrier: a lost answer is an unknown outcome, never a plain outage",
|
|
"runs on the owner for the actor the signature binds, and the typed direct dispatch still refuses it",
|
|
"keeps the answer of a call that outlasts the write timeout of the owner server",
|
|
"is an unknown outcome when the answer is lost",
|
|
"runs the backend-releases check for a pinned frontend without an actor",
|
|
"refuses a system call from a peer that is not pinned",
|
|
"never lets a system call change anything or ride the user-facing route",
|
|
"writes the set with private modes and no CA key",
|
|
"loads both roles into carriers and serves a frontend call from the owner",
|
|
"gives the owner no signing key and the frontend its own",
|
|
"accepts two frontends made from the same set",
|
|
"refuses a frontend from another generation",
|
|
"reads only the files of the role",
|
|
"refuses a key file with group or other access",
|
|
"refuses an unknown role",
|
|
"refuses to overwrite a file and leaves it unchanged",
|
|
"needs an owner host",
|
|
"says nothing was sent when the add-on is not running, instead of an unknown outcome",
|
|
"runs a declared action tool for the calling user, under the act scope, admitted as an add-on call",
|
|
"is not reachable through the typed dispatch of the direct API",
|
|
"refuses what is not a declared action tool",
|
|
"refuses an add-on that did not declare actions",
|
|
"is unavailable when the runtime does not serve action tools, and never runs for an unvalidated user",
|
|
"reports an unknown outcome, not a refusal, when the runtime fails after the call began",
|
|
"runs a resource-less read tool for the calling user only",
|
|
"denies a tool that declares a resource when none is given, and never reaches the add-on",
|
|
"denies a resource-less read when the admission cannot admit an add-on, or the tool is undeclared",
|
|
"keeps its address stable across starts",
|
|
"does not share state between different roots",
|
|
"fails clearly when the port is in use",
|
|
"rejects an invalid port file",
|
|
"rejects a port file with a loose mode",
|
|
"rejects a port file that links outside the root",
|
|
"is not permitted when the add-on denies the person, on the owner and on a forwarding frontend",
|
|
"is an unreachable resource when the policy denies it, on the owner and on a forwarding frontend",
|
|
"types the denial of a read like the denial of a write, on the owner and on a forwarding frontend",
|
|
"crosses the wire of a resource call typed, so a forwarding frontend answers like the owner",
|
|
"keeps any other failure to resolve a resource a plain denial, so nothing more is told",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"returns the same text through a forwarding frontend",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route",
|
|
"carries the chat binding signed and rejects a changed one",
|
|
"signs a request without a binding as before",
|
|
"gives the owner the chat the frontend bound the call to"
|
|
],
|
|
"report": ".cache/addons/logs/artifacts.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/artifacts.json",
|
|
"cases": [
|
|
"adopts every output of a result or none, and shows the owner only its own status",
|
|
"sanitizes attachment names and maps media types to a fixed allowlist",
|
|
"applies finite default limits and rejects partial or unbounded overrides",
|
|
"keeps staged bytes behind the object store boundary and publishes only complete writes",
|
|
"never serves an artifact at or after expiry, including during admission and mid-stream",
|
|
"fails a transfer that outlives its artifact",
|
|
"fails a transfer whose source is revoked before completion and denies a revoked download",
|
|
"stops a download stream when the source is revoked mid-stream",
|
|
"requires read access to every source resource at completion and download",
|
|
"denies a disabled or unavailable account at ingestion and download",
|
|
"denies downloads of a disabled addon, keeps the bytes and serves again only while unexpired with current permissions",
|
|
"denies downloads after uninstall and removes the bytes at the next sweep",
|
|
"sweeps expired artifacts, abandoned partials and orphan files without touching live transfers",
|
|
"enforces per-user, total and size limits atomically under concurrent ingestion",
|
|
"bounds concurrent transfers and concurrent downloads",
|
|
"cancels a transfer by its context or by its owner and removes the partial bytes",
|
|
"returns the same artifact for a repeated request without a second transfer",
|
|
"keeps addon handles operation-bound and out of metadata and views",
|
|
"keeps complete artifacts across a restart and settles interrupted transfers",
|
|
"keeps the bytes of a transfer that completes while a sweep is running",
|
|
"never loses the bytes of a complete artifact when sweeps race with several completing transfers",
|
|
"answers a transient storage error as unavailable and keeps the bytes and the record",
|
|
"marks an artifact corrupt only for missing bytes or a size mismatch",
|
|
"answers a download that races with an expiry or a drop like any expired identifier",
|
|
"refuses a corrupt metadata store and stops writing after a failed sync",
|
|
"waits for background transfers before Close returns and writes nothing after",
|
|
"ingests a file result into a private staged artifact with a host-generated identifier",
|
|
"never uses an addon handle, URL or path as an identifier or a file path",
|
|
"answers one denial for an unknown identifier and for another principal's artifact",
|
|
"never serves incomplete, short, long or failed transfers and removes their partial bytes",
|
|
"streams ingestion and download without buffering the whole file",
|
|
"rejects an output declared larger than one artifact may be before reading it",
|
|
"never opens an output for a request that names a tool no source declares",
|
|
"denies an output request whose arguments repeat a key and never opens the output",
|
|
"reports an unavailable declaration source as unavailable and never opens the output",
|
|
"shortens the lifetime and keeps the bounds consistent, and zero keeps the defaults",
|
|
"fails the artifact with a fixed reason that says it was refused, not that the add-on is down"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/artifacts-gateway.json",
|
|
"cases": [
|
|
"serves only declared installed generation assets and rejects traversal",
|
|
"fails closed without current identity or resource policy and reports the original ID of an unknown mutation outcome",
|
|
"reports an unclassified account check error as unavailable on every path and a wrapped denial as forbidden",
|
|
"propagates interrupted progress cancellation through the receiving frontend",
|
|
"validates finite relay budgets and prevents disabling polling bounds",
|
|
"builds a carrier only from complete pinned identities",
|
|
"types an unknown mutation outcome as unavailable without losing its operation",
|
|
"rejects untrusted peers wrong audience body expiry replay and revoked credentials",
|
|
"alternates pinned frontends and rejects untrusted certificates without local fallback",
|
|
"reports the original operation after lost mutation replies without retrying",
|
|
"rejects a stream longer than its receiving frontend budget",
|
|
"rejects a CA signed peer without a pin on the owner side",
|
|
"refuses an owner whose CA signed certificate is not the pinned owner",
|
|
"returns the artifact status through the owner from every frontend with one denial for the rest",
|
|
"types the owner's refusal and outage of a lookup the same from every frontend",
|
|
"writes an attachment header that cannot be broken out of",
|
|
"rotates the enforced audience on restart and rejects captured requests",
|
|
"never expires the response deadline after the relay returned",
|
|
"returns the owner's forbidden status for an invalid kind and for missing policy",
|
|
"still reports unavailable when the owner is unable to serve and not forbidden",
|
|
"reaches the same decision through both frontends and delivers bytes when allowed",
|
|
"keeps aborting when revocation happens after bytes were written",
|
|
"bounds progress, asset and file relays by their own limit",
|
|
"alternates real owner journal status and terminates coarse progress without submitting again",
|
|
"reports an account store outage as unavailable and a refused account as forbidden",
|
|
"rejects unknown lifecycle argument fields before touching the owner journal",
|
|
"reports a runtime that cannot serve as unavailable through both frontends",
|
|
"reports an output that ends before its first byte as unavailable",
|
|
"fails closed as unavailable for an unclassified owner error",
|
|
"keeps authorization and policy denials forbidden",
|
|
"keeps a mutation unknown when the runtime fails after the owner applied it",
|
|
"keeps a mutation unknown when the owner reports recovery required for its operation",
|
|
"reports a mutation as unknown when the owner cannot serve it at all",
|
|
"keeps a mutation unknown on the owner's own frontend and leaves reads and denials alone",
|
|
"lets unavailability win when an error wraps both a denial and an unavailable cause",
|
|
"does not leak attachment headers into an error when the first read fails",
|
|
"treats every action except the known reads as a mutation",
|
|
"keeps resolved resources under admission for JSON and attachment bytes",
|
|
"closes interrupted output and releases admission on disconnect",
|
|
"rechecks revoked credentials during attachment copying",
|
|
"adopts read outputs as private artifacts inside admission and replaces a forged resource identity",
|
|
"refuses at ingest a file result larger than the relay file bound so nothing unservable is staged",
|
|
"denies private relays without host resolution and admission",
|
|
"serves declared assets of the current enabled generation by package digest only",
|
|
"allows only an exact declared tool name and fails closed otherwise",
|
|
"never contacts the add-on for an undeclared tool and still serves a declared one",
|
|
"denies a repeated key at any depth however it is spelled",
|
|
"denies arguments that are not exactly one object",
|
|
"separates a denial from an unavailable declaration source",
|
|
"answers 503 and never contacts the add-on when the source is unavailable or the arguments repeat a key",
|
|
"is the typed invalid request on the owner for a read, never an outage",
|
|
"is the typed invalid request on the owner for a proposal call",
|
|
"is the typed invalid request on the owner for a json relay",
|
|
"is the same typed answer from a forwarding frontend",
|
|
"crosses the owner's wire as the same typed error, whatever the frontend",
|
|
"does not trust a code the host does not know, and cleans the detail the add-on wrote",
|
|
"is a stale view for a caller that only knows ErrStale, and a denial otherwise",
|
|
"is a mutation on the carrier: a lost answer is an unknown outcome, never a plain outage",
|
|
"runs on the owner for the actor the signature binds, and the typed direct dispatch still refuses it",
|
|
"keeps the answer of a call that outlasts the write timeout of the owner server",
|
|
"is an unknown outcome when the answer is lost",
|
|
"runs the backend-releases check for a pinned frontend without an actor",
|
|
"refuses a system call from a peer that is not pinned",
|
|
"never lets a system call change anything or ride the user-facing route",
|
|
"writes the set with private modes and no CA key",
|
|
"loads both roles into carriers and serves a frontend call from the owner",
|
|
"gives the owner no signing key and the frontend its own",
|
|
"accepts two frontends made from the same set",
|
|
"refuses a frontend from another generation",
|
|
"reads only the files of the role",
|
|
"refuses a key file with group or other access",
|
|
"refuses an unknown role",
|
|
"refuses to overwrite a file and leaves it unchanged",
|
|
"needs an owner host",
|
|
"says nothing was sent when the add-on is not running, instead of an unknown outcome",
|
|
"runs a declared action tool for the calling user, under the act scope, admitted as an add-on call",
|
|
"is not reachable through the typed dispatch of the direct API",
|
|
"refuses what is not a declared action tool",
|
|
"refuses an add-on that did not declare actions",
|
|
"is unavailable when the runtime does not serve action tools, and never runs for an unvalidated user",
|
|
"reports an unknown outcome, not a refusal, when the runtime fails after the call began",
|
|
"runs a resource-less read tool for the calling user only",
|
|
"denies a tool that declares a resource when none is given, and never reaches the add-on",
|
|
"denies a resource-less read when the admission cannot admit an add-on, or the tool is undeclared",
|
|
"keeps its address stable across starts",
|
|
"does not share state between different roots",
|
|
"fails clearly when the port is in use",
|
|
"rejects an invalid port file",
|
|
"rejects a port file with a loose mode",
|
|
"rejects a port file that links outside the root",
|
|
"is not permitted when the add-on denies the person, on the owner and on a forwarding frontend",
|
|
"is an unreachable resource when the policy denies it, on the owner and on a forwarding frontend",
|
|
"types the denial of a read like the denial of a write, on the owner and on a forwarding frontend",
|
|
"crosses the wire of a resource call typed, so a forwarding frontend answers like the owner",
|
|
"keeps any other failure to resolve a resource a plain denial, so nothing more is told",
|
|
"carries the chat binding signed and rejects a changed one",
|
|
"signs a request without a binding as before",
|
|
"gives the owner the chat the frontend bound the call to"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/artifacts-http.json",
|
|
"cases": [
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"returns the same text through a forwarding frontend",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"apps": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/apps",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/apps.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/apps-lifecycle.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/services/addons/runtime",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/apps-runtime.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./core/http/endpoints/addons",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/apps-http.json"
|
|
]
|
|
],
|
|
"cases": [
|
|
"lists installed enabled addons for users and adds installed disabled ones only for administrators",
|
|
"derives display fields, the main page and the icon URL from the verified manifest only",
|
|
"bounds the tool summary and coerces unknown process states to failed",
|
|
"shows controls and the management link only to administrators and never leaks owner details",
|
|
"describes the immutable UI assets of an enabled addon by the package digest and never otherwise",
|
|
"denies enable and disable for a stale generation without recording anything",
|
|
"lists the identifiers of installed addons, disabled ones included",
|
|
"refuses to list installed identifiers while recovery is required",
|
|
"lists apps by visibility and serves an icon only for a visible app at its generation",
|
|
"cancels status lookup while a lifecycle writer holds the journal lock",
|
|
"retries runtime synchronization after canceled disable and generation upgrade",
|
|
"rejects symlinked package roots without touching external staging",
|
|
"recovers every durable journal boundary without replaying publication",
|
|
"removes abandoned staging without removing published packages on recovery",
|
|
"keeps immutable history on successful upgrade and reinstallation",
|
|
"excludes competing owners and rejects conflicting durable identities",
|
|
"never opens replica roots or elects an absent owner",
|
|
"binds duplicate operation IDs to actor and command and serializes conflicts",
|
|
"refuses commands and asset reads for an add-on ID the host serves as a route",
|
|
"retains generations identity data and grants across uninstall and restart",
|
|
"preserves old packages and active generation on manager upgrade failure",
|
|
"requires current authoritative administration even for idempotent retries",
|
|
"executes enabled owner intent on startup and stops on disable and close without forwarder execution",
|
|
"binds lifecycle lookup to current admin and original actor without writes or repair",
|
|
"reports the supervisor state of an app through a crash and a restart",
|
|
"reads a flat directory in batches and stops at the entry bound",
|
|
"adds up nested files and reports a complete walk as not truncated",
|
|
"never follows or counts a symbolic link",
|
|
"keeps a result for a short time so polling does not walk again",
|
|
"stops at the time bound and reports a truncated size",
|
|
"does not keep a result cut short by the caller",
|
|
"is what the installed view reports for the data directory",
|
|
"resolves a package for the current enabled generation and digest only",
|
|
"answers from the current installed manifest only and follows a generation change",
|
|
"reports a digest-only change of a moving channel, applies nothing and offers the pinned upgrade",
|
|
"refuses a second operation ID for the same transition, in flight or done, and applies it once",
|
|
"runs concurrent requests with one operation ID once and gives each the same answer",
|
|
"serializes conflicting upgrades by the installed digest and refuses the loser without a record",
|
|
"refuses a candidate that is not the one the library resolves now",
|
|
"refuses an upgrade to the digest that is already installed",
|
|
"rechecks compatibility at execution and refuses an incompatible candidate",
|
|
"selects a newer immutable version and treats a rewritten version as an integrity error",
|
|
"keeps the last good generation when the candidate cannot be staged",
|
|
"never switches the library or channel, and a failed check is never up to date",
|
|
"lets an administrator refresh and everyone with the feature read a redacted status",
|
|
"shows the pending update in the apps list from the cache only",
|
|
"does not accept pins without an update checker or on another action",
|
|
"keeps the unpinned typed upgrade of an earlier release working",
|
|
"registers only ready generation bound service headless and UI capabilities",
|
|
"rejects forged registration nonloopback and stale incarnation handshakes",
|
|
"bounds readiness and handles exit during start and stop",
|
|
"withdraws immediately drains boundedly and rejects stale process identities",
|
|
"exhausts restart budget without retaining dead registrations",
|
|
"does not inherit secrets and exits when the private parent channel closes",
|
|
"fails closed on ambiguous launch identities and preserves unrelated reused PIDs",
|
|
"retains a canceled restart slot until cleanup completes and rejects duplicate supervisors",
|
|
"rejects nonloopback endpoints and bounds oversized streams and concurrency",
|
|
"reports stopped, running, failed, starting and running again across a crash and a restart",
|
|
"keeps reporting failed once the restart budget is exhausted",
|
|
"rejects foreign supervisor handles and numeric PID substitutions",
|
|
"resets restart budget only after sustained authenticated health",
|
|
"kills the exact paused child of a killed owner before launching its replacement",
|
|
"never reports failed between a launch starting and the restarted process being published",
|
|
"reserves a draining slot against concurrent starts",
|
|
"waits for a restart launch worker before acknowledging stop",
|
|
"exposes a new incarnation client after restart without reviving the old client",
|
|
"refuses a missing established ledger and fences failed cleanup publication",
|
|
"authenticates every request and separates trusted authority from model arguments",
|
|
"bounds output streams cancellation deadlines and stop admission",
|
|
"tells a 409 conflict of the add-on from an outage",
|
|
"withdraws and initiates every live slot before a cleanup timeout",
|
|
"creates one private data directory per addon and passes its path in the startup object",
|
|
"gives no data directory without a data root and refuses an unsafe root or addon ID",
|
|
"gives an add-on that the host setting names a host endpoint of its own",
|
|
"gives an add-on that the host setting does not name no host endpoint",
|
|
"closes the host endpoint when the incarnation ends",
|
|
"an HTTP 400 answer",
|
|
"an HTTP 422 answer",
|
|
"keeps a bounded, printable reason and nothing else of the body",
|
|
"leaves 503, 500 and 404 as outages",
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"types a withdrawn client, a full slot table, a bad envelope and a missing schema as not sent",
|
|
"keeps a not-sent error an ErrRuntime for callers that do not tell them apart",
|
|
"types a refused connection as not sent",
|
|
"never types a possibly-sent request as not sent",
|
|
"carries the SDK refusal text to the caller of a failed install and keeps the generic error",
|
|
"installs an add-on whose SDK range contains the host SDK",
|
|
"returns the same text through a forwarding frontend",
|
|
"carries the install time to the list and the management view, and none for an old record",
|
|
"lists the host controls an add-on is entitled to, whatever its ID",
|
|
"copies them at install, upgrade and owner start, and removes them at uninstall",
|
|
"never fails the operation when the copy fails",
|
|
"fails the install and says the package could not be verified, without installing anything",
|
|
"names a release that the library does not list",
|
|
"names two libraries that list the same add-on",
|
|
"names a library that cannot be read",
|
|
"reads the library on demand when the startup refresh has not filled the cache",
|
|
"reads the library again when the startup refresh failed",
|
|
"writes the owner and storage only, with no address",
|
|
"loads a file written in the old format with an address",
|
|
"loads when only the address changed",
|
|
"refuses a changed owner ID",
|
|
"refuses a changed storage ID",
|
|
"copies every capability field of the manifest, so a new field cannot be forgotten",
|
|
"is offered when the tag moved, pinned to the build the tag names, and upgrades to exactly that build",
|
|
"refuses the upgrade when the tag moved again after the check, and installs nothing",
|
|
"stamps the first install, keeps the time over an upgrade and stamps it again after an uninstall",
|
|
"needs a state root for the owner only",
|
|
"upgrades an installed add-on through the same path as a manual upgrade",
|
|
"does nothing when no newer version is listed",
|
|
"refuses a candidate whose package no longer matches its listed digest and replaces nothing",
|
|
"refuses a candidate that fails the signature policy of its library and replaces nothing",
|
|
"does not upgrade to a release the host cannot run",
|
|
"does nothing without an update checker",
|
|
"keeps the manual upgrade closed to a caller who is not an administrator",
|
|
"starts the enabled add-ons side by side, so the start takes the slowest ones and not the sum",
|
|
"types the add-on's own 'forbidden' answer as a denial of the person, not as an outage",
|
|
"keeps a 403 about the envelope itself an outage: it is a host fault, not a permission",
|
|
"reaches an add-on that declares actions, as the actor of the envelope, under the act scope",
|
|
"never sends a call that is not an act call or has another scope",
|
|
"never sends an act call to an add-on that did not declare actions",
|
|
"stops an act call when the caller gives up",
|
|
"posts the request with the incarnation credential and decodes the answer",
|
|
"is not sent to an add-on that declared no connector",
|
|
"gives it time to release what it owns before it kills the process",
|
|
"kills an add-on that ignores the closing of its startup channel, within the grace period",
|
|
"goes to the log line by line with the add-on ID and a cap per line",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route",
|
|
"records the chat with the envelope of a read and of an action while it runs",
|
|
"sends the add-on an envelope without a new field",
|
|
"distinguishes healthy empty connector discovery from loss of runtime ownership"
|
|
],
|
|
"report": ".cache/addons/logs/apps.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/apps.json",
|
|
"cases": [
|
|
"lists installed enabled addons for users and adds installed disabled ones only for administrators",
|
|
"derives display fields, the main page and the icon URL from the verified manifest only",
|
|
"bounds the tool summary and coerces unknown process states to failed",
|
|
"shows controls and the management link only to administrators and never leaks owner details",
|
|
"describes the immutable UI assets of an enabled addon by the package digest and never otherwise",
|
|
"carries the install time to the list and the management view, and none for an old record",
|
|
"lists the host controls an add-on is entitled to, whatever its ID"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/apps-lifecycle.json",
|
|
"cases": [
|
|
"denies enable and disable for a stale generation without recording anything",
|
|
"lists the identifiers of installed addons, disabled ones included",
|
|
"refuses to list installed identifiers while recovery is required",
|
|
"lists apps by visibility and serves an icon only for a visible app at its generation",
|
|
"cancels status lookup while a lifecycle writer holds the journal lock",
|
|
"retries runtime synchronization after canceled disable and generation upgrade",
|
|
"rejects symlinked package roots without touching external staging",
|
|
"recovers every durable journal boundary without replaying publication",
|
|
"removes abandoned staging without removing published packages on recovery",
|
|
"keeps immutable history on successful upgrade and reinstallation",
|
|
"excludes competing owners and rejects conflicting durable identities",
|
|
"never opens replica roots or elects an absent owner",
|
|
"binds duplicate operation IDs to actor and command and serializes conflicts",
|
|
"refuses commands and asset reads for an add-on ID the host serves as a route",
|
|
"retains generations identity data and grants across uninstall and restart",
|
|
"preserves old packages and active generation on manager upgrade failure",
|
|
"requires current authoritative administration even for idempotent retries",
|
|
"executes enabled owner intent on startup and stops on disable and close without forwarder execution",
|
|
"binds lifecycle lookup to current admin and original actor without writes or repair",
|
|
"reports the supervisor state of an app through a crash and a restart",
|
|
"reads a flat directory in batches and stops at the entry bound",
|
|
"adds up nested files and reports a complete walk as not truncated",
|
|
"never follows or counts a symbolic link",
|
|
"keeps a result for a short time so polling does not walk again",
|
|
"stops at the time bound and reports a truncated size",
|
|
"does not keep a result cut short by the caller",
|
|
"is what the installed view reports for the data directory",
|
|
"resolves a package for the current enabled generation and digest only",
|
|
"answers from the current installed manifest only and follows a generation change",
|
|
"reports a digest-only change of a moving channel, applies nothing and offers the pinned upgrade",
|
|
"refuses a second operation ID for the same transition, in flight or done, and applies it once",
|
|
"runs concurrent requests with one operation ID once and gives each the same answer",
|
|
"serializes conflicting upgrades by the installed digest and refuses the loser without a record",
|
|
"refuses a candidate that is not the one the library resolves now",
|
|
"refuses an upgrade to the digest that is already installed",
|
|
"rechecks compatibility at execution and refuses an incompatible candidate",
|
|
"selects a newer immutable version and treats a rewritten version as an integrity error",
|
|
"keeps the last good generation when the candidate cannot be staged",
|
|
"never switches the library or channel, and a failed check is never up to date",
|
|
"lets an administrator refresh and everyone with the feature read a redacted status",
|
|
"shows the pending update in the apps list from the cache only",
|
|
"does not accept pins without an update checker or on another action",
|
|
"keeps the unpinned typed upgrade of an earlier release working",
|
|
"carries the SDK refusal text to the caller of a failed install and keeps the generic error",
|
|
"installs an add-on whose SDK range contains the host SDK",
|
|
"copies them at install, upgrade and owner start, and removes them at uninstall",
|
|
"never fails the operation when the copy fails",
|
|
"fails the install and says the package could not be verified, without installing anything",
|
|
"names a release that the library does not list",
|
|
"names two libraries that list the same add-on",
|
|
"names a library that cannot be read",
|
|
"reads the library on demand when the startup refresh has not filled the cache",
|
|
"reads the library again when the startup refresh failed",
|
|
"writes the owner and storage only, with no address",
|
|
"loads a file written in the old format with an address",
|
|
"loads when only the address changed",
|
|
"refuses a changed owner ID",
|
|
"refuses a changed storage ID",
|
|
"copies every capability field of the manifest, so a new field cannot be forgotten",
|
|
"is offered when the tag moved, pinned to the build the tag names, and upgrades to exactly that build",
|
|
"refuses the upgrade when the tag moved again after the check, and installs nothing",
|
|
"stamps the first install, keeps the time over an upgrade and stamps it again after an uninstall",
|
|
"needs a state root for the owner only",
|
|
"upgrades an installed add-on through the same path as a manual upgrade",
|
|
"does nothing when no newer version is listed",
|
|
"refuses a candidate whose package no longer matches its listed digest and replaces nothing",
|
|
"refuses a candidate that fails the signature policy of its library and replaces nothing",
|
|
"does not upgrade to a release the host cannot run",
|
|
"does nothing without an update checker",
|
|
"keeps the manual upgrade closed to a caller who is not an administrator",
|
|
"starts the enabled add-ons side by side, so the start takes the slowest ones and not the sum",
|
|
"distinguishes healthy empty connector discovery from loss of runtime ownership"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/apps-runtime.json",
|
|
"cases": [
|
|
"registers only ready generation bound service headless and UI capabilities",
|
|
"rejects forged registration nonloopback and stale incarnation handshakes",
|
|
"bounds readiness and handles exit during start and stop",
|
|
"withdraws immediately drains boundedly and rejects stale process identities",
|
|
"exhausts restart budget without retaining dead registrations",
|
|
"does not inherit secrets and exits when the private parent channel closes",
|
|
"fails closed on ambiguous launch identities and preserves unrelated reused PIDs",
|
|
"retains a canceled restart slot until cleanup completes and rejects duplicate supervisors",
|
|
"rejects nonloopback endpoints and bounds oversized streams and concurrency",
|
|
"reports stopped, running, failed, starting and running again across a crash and a restart",
|
|
"keeps reporting failed once the restart budget is exhausted",
|
|
"rejects foreign supervisor handles and numeric PID substitutions",
|
|
"resets restart budget only after sustained authenticated health",
|
|
"kills the exact paused child of a killed owner before launching its replacement",
|
|
"never reports failed between a launch starting and the restarted process being published",
|
|
"reserves a draining slot against concurrent starts",
|
|
"waits for a restart launch worker before acknowledging stop",
|
|
"exposes a new incarnation client after restart without reviving the old client",
|
|
"refuses a missing established ledger and fences failed cleanup publication",
|
|
"authenticates every request and separates trusted authority from model arguments",
|
|
"bounds output streams cancellation deadlines and stop admission",
|
|
"tells a 409 conflict of the add-on from an outage",
|
|
"withdraws and initiates every live slot before a cleanup timeout",
|
|
"creates one private data directory per addon and passes its path in the startup object",
|
|
"gives no data directory without a data root and refuses an unsafe root or addon ID",
|
|
"gives an add-on that the host setting names a host endpoint of its own",
|
|
"gives an add-on that the host setting does not name no host endpoint",
|
|
"closes the host endpoint when the incarnation ends",
|
|
"an HTTP 400 answer",
|
|
"an HTTP 422 answer",
|
|
"keeps a bounded, printable reason and nothing else of the body",
|
|
"leaves 503, 500 and 404 as outages",
|
|
"types a withdrawn client, a full slot table, a bad envelope and a missing schema as not sent",
|
|
"keeps a not-sent error an ErrRuntime for callers that do not tell them apart",
|
|
"types a refused connection as not sent",
|
|
"never types a possibly-sent request as not sent",
|
|
"types the add-on's own 'forbidden' answer as a denial of the person, not as an outage",
|
|
"keeps a 403 about the envelope itself an outage: it is a host fault, not a permission",
|
|
"reaches an add-on that declares actions, as the actor of the envelope, under the act scope",
|
|
"never sends a call that is not an act call or has another scope",
|
|
"never sends an act call to an add-on that did not declare actions",
|
|
"stops an act call when the caller gives up",
|
|
"posts the request with the incarnation credential and decodes the answer",
|
|
"is not sent to an add-on that declared no connector",
|
|
"gives it time to release what it owns before it kills the process",
|
|
"kills an add-on that ignores the closing of its startup channel, within the grace period",
|
|
"goes to the log line by line with the add-on ID and a cap per line",
|
|
"records the chat with the envelope of a read and of an action while it runs",
|
|
"sends the add-on an envelope without a new field"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/apps-http.json",
|
|
"cases": [
|
|
"rejects anonymous and forged forwarding authority through real authentication",
|
|
"lets callers through only when the deployment selected local-owner mode",
|
|
"keeps authentication, the feature gate and administration when accounts exist",
|
|
"lists the enabled installed apps for a reader and the disabled ones too for administrators, the same from every frontend",
|
|
"lets only administrators start and stop, through the lifecycle manager, and denies a stale generation",
|
|
"serves the verified icon through the host route and denies it identically otherwise",
|
|
"reports a lost start as an unknown outcome with its original operation and a lost list as unavailable",
|
|
"documents the apps routes and every field of the app view in the Swagger spec",
|
|
"rejects anonymous callers and forged forwarding headers",
|
|
"gates the feature and then administration for named keys",
|
|
"requires same-origin browser requests for cookie mutations",
|
|
"registers only the dispatch, relay and proposal mutations",
|
|
"reserves every first path segment the host registers under /api/addons",
|
|
"gates the artifact routes by authentication and feature",
|
|
"lists every registered addon route in the feature registry",
|
|
"gates the apps routes by authentication, feature and administration",
|
|
"gates the proposal routes by feature and refuses a confirmation from a key before the owner is asked",
|
|
"checks browser CSRF feature and admin access with real stored keys",
|
|
"stores a proposal from an API key and lets only the proposer's browser session confirm it",
|
|
"cancels a proposal from the same chain and never lets typed dispatch or relay confirm",
|
|
"denies sharing and deletion proposals and an unauthenticated caller",
|
|
"serves the local owner's confirmation only from a same-origin fetch of the host page",
|
|
"reports a lost reply with the original operation from forwarding frontends and resolves it by receipt",
|
|
"lets only the resource owner's browser session abandon an unresolved outcome and then accepts writes",
|
|
"lets the owner role list an editor's unresolved proposal and abandon it by the listed digest from every frontend",
|
|
"tells an editor of a blocked write only that it is denied",
|
|
"returns the applied proposal when the confirmed operation committed",
|
|
"answers an owner outage by the owner's state with the same type from every frontend",
|
|
"keeps a proposal confirmable by the same ID after the owner could not reach the addon",
|
|
"documents the proposal routes and the proposal schema in the Swagger spec",
|
|
"reports an unknown mutation outcome from a forwarding frontend with the original operation",
|
|
"documents every field the error responses emit in the Swagger schema",
|
|
"reports an unavailable read as plain unavailability",
|
|
"reports a denial as forbidden",
|
|
"reports an unclassified account check error as unavailable and a definite denial as forbidden",
|
|
"reports an unknown mutation outcome from the owner's own frontend with the original operation",
|
|
"serves a private file result as a safe attachment over real HTTP",
|
|
"never renders hostile names or active media types inline",
|
|
"answers one 403 for unknown, foreign, incomplete and expired artifacts and requires the feature and a principal",
|
|
"denies the download of a disabled addon and serves it again after enable",
|
|
"relays the same bytes, headers and denials through two forwarding frontends",
|
|
"keeps a file result of a read denied whole without an artifact store",
|
|
"serves the local owner's file only in local-owner mode",
|
|
"documents the artifact routes and the artifact schema in the Swagger spec",
|
|
"serves one owner journal through two real authenticated HTTP frontends and rejects paused keys",
|
|
"serves the synthetic owner through the real chain, denies sharing and rejects named callers",
|
|
"serves catalog search, details and the installed management view to administrators only, the same from every frontend",
|
|
"refuses every management call of the owner itself for a caller that is not an administrator",
|
|
"saves, refreshes and removes a library by reference and leaves installed addons alone",
|
|
"upgrades an installed addon through the typed action and keeps its earlier generation",
|
|
"reports a lost source change as an unknown outcome and a lost read as unavailable",
|
|
"documents the management actions and every emitted field of the installed view",
|
|
"serves the declared files of the current package through every frontend with immutable headers",
|
|
"lists the same URLs the route serves, and only for an enabled addon",
|
|
"denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"refuses a declared file that is not a regular file of the package",
|
|
"documents the asset route and its binary response in the Swagger spec",
|
|
"gives the same 403 on the owner and on a forwarding frontend and never contacts the add-on",
|
|
"lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"checks only for an administrator's own browser session, and applies nothing",
|
|
"upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"answers an add-on's invalid-request refusal as a typed 400 from the owner and from a forwarding frontend",
|
|
"returns the same text through a forwarding frontend",
|
|
"Sec-Fetch-Site cross-site is refused even with a Referer on the same host",
|
|
"Sec-Fetch-Site same-origin passes",
|
|
"Sec-Fetch-Site same-site is refused",
|
|
"a request without a session cookie is not guarded",
|
|
"no Sec-Fetch-Site and no Origin or Referer is refused",
|
|
"no Sec-Fetch-Site with a Referer on the same host passes",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused",
|
|
"no Sec-Fetch-Site with a foreign Origin is refused even with a Referer on the same host",
|
|
"no Sec-Fetch-Site with a foreign Referer is refused",
|
|
"no Sec-Fetch-Site with a null Origin is refused",
|
|
"no Sec-Fetch-Site with an Origin on the same host passes",
|
|
"no Sec-Fetch-Site with the same host on another port is refused",
|
|
"matches the host without regard to letter case",
|
|
"gives no pins to an account created after the upgrade",
|
|
"round-trips pins for the local owner",
|
|
"drops IDs the caller cannot see",
|
|
"an object",
|
|
"numbers",
|
|
"not JSON",
|
|
"empty",
|
|
"null",
|
|
"rejects a list over the hard limit",
|
|
"does not show Studio and Talk as pins without the add-ons",
|
|
"lists add-ons by default, and takes a kind that this host reads",
|
|
"is empty because Studio and Talk are packaged add-ons",
|
|
"lists every entry without an account database",
|
|
"strict same-origin fetch",
|
|
"same-origin without destination",
|
|
"same-host Referer, no Sec-Fetch headers",
|
|
"same-host Origin, no Sec-Fetch headers",
|
|
"foreign Referer",
|
|
"same host, other port",
|
|
"foreign Origin wins over same-host Referer",
|
|
"no Origin and no Referer",
|
|
"cross-site with same-host Referer",
|
|
"same-site with same-host Origin",
|
|
"same-host Referer but navigation destination",
|
|
"same-host Referer but no-cors mode",
|
|
"still refuses a same-host Referer with an API key",
|
|
"returns the SDK refusal text, the unverified-package text and the missing-release text to the administrator",
|
|
"logs the cause of a failed install and types it for the client",
|
|
"logs the reason behind a generic denial and leaves the response unchanged",
|
|
"names every typed cause of a failed install in the 403 of the dispatch route"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"gallery-ui": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/gallery_ui.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: query normalization bounds text, library and page",
|
|
"unit: an operation book keeps one identity per action until it is done",
|
|
"unit: responses classify the same way everywhere",
|
|
"unit: polling backs off on failure, slows when hidden and stays bounded",
|
|
"unit: library drafts accept references and refuse secrets before sending",
|
|
"unit: tabs: the server decides, the page only avoids showing what it will refuse",
|
|
"unit: the installed list puts what needs a person first and filters by state",
|
|
"unit: an add-on without an icon gets a stable letter and hue, and a dev build says so",
|
|
"unit: app chips never turn an unknown state into running",
|
|
"unit: titles follow the language, then the default text, then the id",
|
|
"unit: update status comes only from an authoritative check",
|
|
"unit: the api sends one dispatch shape and classifies refusals",
|
|
"unit: an unknown outcome is read with the original identity and never resubmitted",
|
|
"unit: a denial is not retried and an exhausted read is reported as unknown",
|
|
"unit: an action book binds one identity to one click and its retries",
|
|
"unit: an action book mints a fresh identity once an action is resolved",
|
|
"unit: an action book blocks another action on a subject with an unknown outcome until it is resolved or dismissed",
|
|
"unit: a completed status that left the add-on unchanged is not reported as done",
|
|
"apps: lists enabled apps with state chips, the icon route and Open only for a main page",
|
|
"apps: a headless add-on shows its tools and no Open action",
|
|
"apps: a reader gets no start, stop, manage or management tabs",
|
|
"apps: an administrator starts an app with a fresh operation ID and the listed generation",
|
|
"apps: a lost start is read with the same operation ID and never submitted again",
|
|
"apps: an unknown start is resolved or dismissed before the next action and never replays its ID",
|
|
"apps: dismissing an unknown outcome lets the next click mint a new operation",
|
|
"apps: a completed status that left the app unchanged is not shown as done",
|
|
"apps: a refused start shows the server denial and refreshes the list",
|
|
"apps: the list refreshes on a bounded interval, backs off on errors and stops when left",
|
|
"apps: an add-on that contributes UI keeps the list current off the page and its disable stops the reads",
|
|
"apps: a viewer without the add-ons feature never requests the list",
|
|
"browse: searches the libraries, pages and shows trust and platform facts",
|
|
"browse: Install and turn on asks once, installs and turns the add-on on",
|
|
"browse: a failed turn on keeps the install, says why in the dialog and can be tried again",
|
|
"browse: an add-on that is installed but off offers Turn on and nothing else",
|
|
"installed: health is separate from enabled and the details show trust, compatibility and storage",
|
|
"installed: an update is shown only from the owner update field and upgrade sends that version",
|
|
"installed: removing warns that data is kept before anything is submitted",
|
|
"installed: Escape cancels the remove dialog only, then closes the pane, and focus returns to the card",
|
|
"installed: a headless add-on keeps its details, health and tools",
|
|
"installed: a refusal of the installed list leaves the pane without Details",
|
|
"installed: an old Installed address lands on Installed and the management link opens the details",
|
|
"libraries: a private library is saved by credential reference and never carries a secret",
|
|
"libraries: removing a library says installed add-ons stay and leaves them installed",
|
|
"libraries: a refresh reports its result and a failed fetch is shown as failed",
|
|
"keyboard: the tab list moves with the arrow keys and actions are reachable",
|
|
"narrow: at 400 px the apps page is one column without sideways scrolling",
|
|
"theme: the apps page follows the light and dark tokens",
|
|
"i18n: the page follows the interface language",
|
|
"regression: the backends catalog still searches, pages and shows its empty state",
|
|
"unit: the add-on browse list drops backend entries and keeps entries with no kind",
|
|
"unit: a refusal shows the server reason and falls back to the generic text",
|
|
"unit: the add-on list drops a backend entry, and the backend route still installs one",
|
|
"unit: a library signer is named exactly or by a pattern, never both",
|
|
"unit: a backend install follows its job through the steps and ends with the result",
|
|
"unit: a failed backend install job throws the reason and keeps the step that failed",
|
|
"unit: install steps: left steps are done, the reported one runs, the rest wait",
|
|
"unit: backends page: a library backend shows its library and the digest it pinned",
|
|
"unit: backends page: a newer build in the library is an update state, and a running job wins over it",
|
|
"unit: the updates route of the host is read as a list and nothing is sent",
|
|
"unit: every locale carries the add-on and navigation keys of English",
|
|
"unit: the chats page has its add-on control strings in English",
|
|
"unit: the add-on labels use one name and one verb pair",
|
|
"unit: what an add-on adds comes from its page and its tools, and nothing is guessed",
|
|
"unit: screenshots appear only when the host lists them and they are served by the host",
|
|
"unit: the list says first run, no match or none, and a search never claims that nothing is installed",
|
|
"unit: featured add-ons are the first three add-on entries that are not installed",
|
|
"unit: install and turn on runs the install, then the turn on, each as its own action",
|
|
"unit: install and turn on stops at a failed install and retries only the turn on",
|
|
"unit: a library entry shows its tool count only when it is above zero, from the installed-view fields",
|
|
"unit: the catalog adapter carries toolCount and tools of a release, and defaults them to none",
|
|
"unit: the English wording is \"Adds 16 tools\" and \"Adds 1 tool\"",
|
|
"unit: addons: the install dialog names each built-in skill the entry replaces, and who already does",
|
|
"unit: addons: the details list the skills of an add-on and which replace a built-in one",
|
|
"hub: under the legacy switch the Add-ons tab appears only for an account that holds the feature"
|
|
]
|
|
},
|
|
"esm-ui": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/esm_ui.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: sdk: compatibility accepts only a range that holds the host SDK version",
|
|
"unit: sdk: the object is a frozen allowlist that carries the host React and no host internals",
|
|
"unit: sdk: hooks run on the host React instance and a wrapper keeps one component type",
|
|
"unit: sdk: icons outside the semantic set fall back and theme tokens are a fixed set",
|
|
"unit: sdk: navigation stays inside the add-on prefix and its declared pages",
|
|
"unit: sdk: api calls carry the add-on and its generation and nothing else is reachable",
|
|
"unit: sdk: after the signal aborts every service refuses and each disposer runs once",
|
|
"unit: sdk: markDirty reports unsaved edits once per change and notifications are bounded",
|
|
"unit: sdk: locale is scoped to the add-on and falls back to the default text",
|
|
"unit: sdk: layers are host wrappers with a bounded spec",
|
|
"unit: css: every selector is scoped to the add-on root and the global ones are neutralised",
|
|
"unit: css: imports, fonts, external urls and unknown at-rules are dropped and keyframes are renamed",
|
|
"unit: css: no value that loads a URL survives anywhere in the sheet",
|
|
"unit: css: harmless values, escapes in strings and nested rules are kept",
|
|
"unit: css: two add-ons that use the same class names get disjoint scopes",
|
|
"unit: loader: asset URLs must be same-origin immutable URLs of the add-on own package",
|
|
"unit: loader: an incompatible SDK range is never imported and leaves a clear error",
|
|
"unit: loader: the module receives only the host SDK, its result is validated and styles are scoped",
|
|
"unit: loader: a module without createAddon, with a bad result or a bare import is a load error",
|
|
"unit: loader: a hanging import times out and an abort cancels and cleans up",
|
|
"unit: loader: dispose runs once, aborts the SDK signal and removes the styles",
|
|
"unit: loader: chat actions are limited to declared ids and carry only the conversation context",
|
|
"unit: registry: disable, uninstall, crash and update withdraw a loaded add-on at once",
|
|
"unit: registry: unsaved edits keep a withdrawn add-on stale until the user reloads",
|
|
"unit: registry: a poll never replaces a withdrawn instance; only reload does",
|
|
"unit: registry: a hold ends with its last holder and a load that was withdrawn leaves no instance behind",
|
|
"unit: registry: navigation and chat actions come only from usable add-ons of the current generation",
|
|
"unit: registry: the legacy Add-ons tab lists page links only when the registry has usable add-ons",
|
|
"unit: registry: the list is read off the Add-ons page only for a viewer with the feature and a UI contribution",
|
|
"go: describes the immutable UI assets of an enabled addon by the package digest and never otherwise",
|
|
"go: resolves a package for the current enabled generation and digest only",
|
|
"go: serves declared assets of the current enabled generation by package digest only",
|
|
"go: serves the declared files of the current package through every frontend with immutable headers",
|
|
"go: lists the same URLs the route serves, and only for an enabled addon",
|
|
"go: denies every other path, digest, addon and credential form with one answer and no immutable caching",
|
|
"go: accepts a same-origin browser session and refuses a cross-site or direct one",
|
|
"go: withdraws the code the moment the addon is disabled, uninstalled or replaced, even for a page that is still open",
|
|
"go: refuses a declared file that is not a regular file of the package",
|
|
"go: documents the asset route and its binary response in the Swagger spec",
|
|
"esm: a fixture add-on installed after the host build loads through real authorization and draws in its own root",
|
|
"esm: hooks run on the host React and the add-on keeps its state across renders",
|
|
"esm: the add-on style sheet is scoped to its root and leaves the host and other add-ons alone",
|
|
"esm: a component that throws is contained by the error boundary and the shell keeps working",
|
|
"esm: deep links, the bare add-on address and a proxy path prefix reach the same declared page",
|
|
"esm: a host that does not provide the add-on SDK range never imports its code and says so",
|
|
"esm: a module that imports React by a bare specifier fails to load and no second React is resolved",
|
|
"esm: the server decides asset access: undeclared files, traversal, other add-ons, credentials in URLs and foreign sessions are denied",
|
|
"esm: an add-on navigates only to its own declared pages and the host draws the add-on navigation",
|
|
"esm: dialogs an add-on opens are owned by the host: focus, Escape and the close button",
|
|
"esm: a dialog or panel whose render throws is contained and the host app keeps running",
|
|
"esm: unsaved edits are guarded when leaving the page",
|
|
"esm: the page keeps inside the viewport at 400 px and follows the light and dark themes",
|
|
"esm: a member without the add-ons feature gets no add-on page and no code",
|
|
"esm: disabling an add-on unmounts it, aborts its signal, drops its styles and denies its code at once",
|
|
"esm: a withdrawn add-on with unsaved edits stays on screen until the user decides, and never saves",
|
|
"esm: an update withdraws the old generation, denies its code and loads the new one only on an explicit reload"
|
|
]
|
|
},
|
|
"host-slots": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/host_slots.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: slots: the registry is closed and each slot has a frozen minimal props contract",
|
|
"unit: slots: props carry only the contract and never message text or history",
|
|
"unit: slots: declared component names come from the manifest only and the module cannot add more",
|
|
"unit: slots: the loader hands the host only declared components and never an imperative registration",
|
|
"unit: slots: contributions come only from enabled, usable, current-generation add-ons that are ready",
|
|
"unit: slots: an action appears only in its declared placement and carries its own target",
|
|
"unit: slots: labels follow the language with a safe fallback",
|
|
"unit: slots: a renderer is found only for the addon own declared tool and kind",
|
|
"unit: slots: an action sends its declared tool and the sanitized context, and results are bounded text",
|
|
"unit: slots: disable, crash and update unmount every contribution through the runtime",
|
|
"unit: slots: contributions keep the apps list polled while they exist",
|
|
"unit: slots: the approval frame decides from the stored proposal and never from the renderer",
|
|
"unit: slots: the SDK can present an approval of its own addon only through the host",
|
|
"unit: slots: a page that only needs the list reads it once and never retries a failed read",
|
|
"unit: slots: a file preview is offered for the extensions it declared and gets only the file facts",
|
|
"go: accepts tool and component chat actions, slots and own-tool renderers",
|
|
"go: keeps bare chat action identifiers and every earlier fixture valid",
|
|
"go: rejects every undeclared, unsafe or inconsistent contribution at install",
|
|
"go: keeps the closed slot list and the icon allowlist equal to the host",
|
|
"go: lists actions, slots and renderers for an enabled addon and keeps the identifiers",
|
|
"go: lists no contribution for a disabled addon, whoever asks",
|
|
"go: accepts a file preview slot that names the extensions it handles",
|
|
"go: rejects a file preview slot or extension list that is not safe",
|
|
"slots: an add-on's settings sections are drawn on the Settings tab of its own details and nowhere else",
|
|
"slots: the Settings page lists the add-ons that have settings, each a link to its Settings tab",
|
|
"slots: the old anchor of a section on the Settings page opens the add-on's Settings tab",
|
|
"slots: the add-on page and its details offer the settings to an administrator only",
|
|
"slots: the navigation slot adds its entry below the tile grid of the Add-ons drawer"
|
|
]
|
|
},
|
|
"foundation-acceptance": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/foundation.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"go: fails closed on every frontend while the owner is down, executes nothing locally and recovers the last good package and data on restart",
|
|
"go: refuses a second owner on the same storage and keeps one process per add-on",
|
|
"go: stops an add-on process orphaned by an owner crash before it starts the next one",
|
|
"go: leaves no process behind when a cluster with an orphaned add-on is taken down",
|
|
"go: keeps the last good generation running and its data when an upgrade fails to start",
|
|
"go: keeps the last good code and data when the owner is killed in the middle of an upgrade and recovers on restart",
|
|
"go: keeps retained data and a consistent lifecycle when the owner is killed in the middle of an enable",
|
|
"go: keeps the files of the package of an installed add-on read only",
|
|
"go: keeps the last good generation running and the retained data when the new generation cannot start",
|
|
"go: restores the last good generation and resumes the same operation when the request is canceled during an upgrade start",
|
|
"go: converges on the last good generation after a crash that follows the rollback start and precedes any journal write",
|
|
"go: starts the owner when an enabled add-on cannot become ready and fails only that add-on",
|
|
"go: gives an ordinary account the apps list and no management on any node",
|
|
"go: returns the same typed denial from the owner and from each frontend",
|
|
"go: refuses a session on every node once it was ended through one frontend",
|
|
"go: refuses an API key on every node once it was revoked through one frontend",
|
|
"go: installs the UI, tool and service-only packages from the catalog through a frontend without starting them and leaves the host binary and UI build unchanged",
|
|
"go: activates each package through the other frontend and runs one process per add-on under the owner only",
|
|
"go: lists the same apps from the owner and both frontends and shows only what each declared",
|
|
"go: serves reads of the UI, tool and service-only packages alternately through the owner and both frontends",
|
|
"go: denies an account without the feature, a stranger to the resource and an anonymous caller the same way on every node",
|
|
"go: takes the actor from the authenticated credential only and ignores forged actor and authority headers",
|
|
"go: denies a tool the add-on did not declare and a generation that is not current on every node",
|
|
"go: relays JSON and a private file result and downloads the file through a different frontend than the one that produced it",
|
|
"go: relays lifecycle status and progress of an operation to the administrator who made it and to nobody else",
|
|
"go: serves the immutable UI assets by package digest through a non-owner frontend and refuses everything else",
|
|
"go: applies one confirmed change exactly once through a different frontend than the one that proposed it",
|
|
"go: reports a lost reply as outcome unknown with the original operation ID and settles it by receipt lookup without a second apply",
|
|
"go: upgrades to a new generation, denies the previous generation and its assets, and keeps the retained data",
|
|
"go: disables, removes and reinstalls an add-on while its data and grants remain",
|
|
"go: never changes the host binary or the shipped UI build over the whole lifecycle",
|
|
"regression: model and backend gallery specs (core/gallery)",
|
|
"regression: gallery operation specs (core/services/galleryop)",
|
|
"regression: process adapter specs (pkg/model)",
|
|
"foundation: a member opens the add-on through each non-owner frontend and its module comes from the owner by digest",
|
|
"foundation: the owner and both frontends list the same add-on to the same account",
|
|
"foundation: a member sees the add-on list only and the server refuses every management request",
|
|
"foundation: an account without the add-ons feature gets no apps and no code on any node",
|
|
"foundation: an administrator manages through a frontend and the change is the owner's",
|
|
"foundation: deep links of the add-on page work behind a proxy path prefix on a non-owner frontend",
|
|
"foundation: a session ended through one frontend is refused for add-on assets by the other servers"
|
|
]
|
|
},
|
|
"tables-databases": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./addons/tables/internal/store",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/tables-databases-store.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./tests/addons/tables",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/tables-databases.json"
|
|
]
|
|
],
|
|
"report": ".cache/addons/logs/tables-databases-store.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/tables-databases-store.json",
|
|
"cases": [
|
|
"enforces the size cap on every connection and fails with a typed capacity error",
|
|
"builds a database under a data directory containing percent, question and hash characters",
|
|
"leaves no change and no receipt when the process dies before commit, and the ID can still apply",
|
|
"finds the committed receipt after a crash between commit and reply and never applies twice",
|
|
"replays one operation ID to one receipt and refuses another request under the same ID",
|
|
"applies one change once when the same operation arrives concurrently",
|
|
"keeps a rejected change out of the receipts so its ID is not burnt",
|
|
"encodes the receipt payload so the host can read what changed",
|
|
"creates, renames and drops tables with stable internal identifiers and one revision step each",
|
|
"adds typed columns, renames them without touching identifiers and never uses a label in SQL",
|
|
"validates labels by length, characters and case-insensitive uniqueness",
|
|
"refuses type changes, unknown operations, expressions and unknown types",
|
|
"encodes typed defaults as literals and survives hostile defaults",
|
|
"enforces required columns and refuses unique defaults that would collide",
|
|
"adds a unique column through a unique index and refuses duplicates atomically",
|
|
"drops a column by rebuilding the table and loses exactly what the preview reported",
|
|
"never hands out a row ID again after a column drop rebuilds the table",
|
|
"keeps the row ID counter when a column drop rebuilds a table emptied by deletes",
|
|
"leaves the original table, data and revision intact when a rebuild fails midway",
|
|
"previews exact effects and dependent data loss and changes nothing",
|
|
"refuses a stale expected revision with the current revision and applies nothing",
|
|
"keeps finite limits on tables and columns",
|
|
"migrates a database made before the catalog existed on its first schema change",
|
|
"inserts bound rows atomically with defaults, required and unique checks",
|
|
"updates by explicit IDs and by filter and bumps only the data revision",
|
|
"deletes by IDs or filter and refuses broad, empty or oversized selections",
|
|
"previews exact count, sample and conflicts without changing anything",
|
|
"refuses a changed revision and never re-evaluates a filter against new rows",
|
|
"applies exactly one of two proposals made on the same revision",
|
|
"replays a row operation by ID and refuses another request under the same ID",
|
|
"leaves no change when the process dies before commit and finds the receipt after commit",
|
|
"reserves the row id label so no column can shadow it",
|
|
"keeps a row table's data across a column drop that rebuilds it",
|
|
"reads selected columns with stable row IDs and typed JSON values",
|
|
"filters with bounded AND/OR trees and every operator, matching a reference evaluator on random trees",
|
|
"escapes LIKE wildcards in text filters",
|
|
"keeps NULL semantics: comparisons never match NULL and is-null finds it",
|
|
"sorts with a stable row ID tie-break and pages through a cursor that stops at a revision change",
|
|
"counts, sums, averages and bounds groups of aggregates",
|
|
"reports a real sum or average that overflows as the typed arithmetic error",
|
|
"never lets a label, operator or value reach SQL as text",
|
|
"honours hard limits on page size, filter depth, conditions, in-lists, sort keys and result bytes",
|
|
"stops a query when the context is cancelled or the deadline passes",
|
|
"encodes all five types as JSON and writes 64-bit integers as strings beyond 2^53",
|
|
"orders datetimes chronologically across fractional seconds and offsets",
|
|
"creates one private WAL database file named by the host resource ID",
|
|
"never lets an opaque ID or a name reach outside the storage directory",
|
|
"refuses a symbolic link as storage directory, database file or ledger",
|
|
"is idempotent by operation ID and never creates a second database",
|
|
"serializes concurrent creation of one operation into one database",
|
|
"recovers creation after a crash on either side of the file, and hides half-built files",
|
|
"renames only the named database and replays a renamed operation without effect",
|
|
"reports an unknown database and creates nothing for it",
|
|
"honours the busy timeout and the per-operation deadline, then succeeds once the lock is gone",
|
|
"encodes its receipts so the host can read them",
|
|
"writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"streams a large table row by row with bounded memory",
|
|
"fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"does not change the database it reads",
|
|
"records the current format of a new store and migrates nothing",
|
|
"migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"leaves no pending line for a change the add-on refused, so the same ID applies the corrected request",
|
|
"records an inverse for an insert and removes exactly those rows on undo",
|
|
"restores the previous values of an update, for the columns it set only",
|
|
"brings deleted rows back with their row IDs and every value, nulls included",
|
|
"is idempotent by operation ID: the same ID returns the same receipt and undoes once",
|
|
"refuses the same operation ID for another change",
|
|
"refuses a stale undo with what changed and overwrites nothing",
|
|
"refuses an undo whose expected revision moved between the read and the apply",
|
|
"unwinds in order: undoing the latest change makes the earlier one undoable again",
|
|
"keeps no change set that is too large and says so at apply time",
|
|
"expires a change set after the retention and drops what it held",
|
|
"keeps the total of change sets of one database bounded by dropping the oldest",
|
|
"answers not found for a change that never existed or belongs to a read",
|
|
"removes a created table again and refuses once it was touched",
|
|
"renames a table or a column back",
|
|
"removes an added column again, with its unique index",
|
|
"restores a dropped column with its data, its type, required and unique flags",
|
|
"restores a dropped table with its columns, rows and row IDs",
|
|
"says a dropped column or table was too large to keep, at apply time",
|
|
"renames the database back only while it still has the new name",
|
|
"undoes a creation only while the database is untouched, and marks that the resource is deleted",
|
|
"keeps the change sets in the database file, so deleting the database removes them"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/tables-databases.json",
|
|
"cases": [
|
|
"starts the real executable through the authenticated handshake and refuses unauthenticated callers",
|
|
"creates a database under the host-assigned ID and lists it only for people who may read it",
|
|
"drops the reservation when the addon refuses the name, and leaves no database",
|
|
"drops a reservation at reconcile when the crash came before the database was created",
|
|
"commits a reservation at reconcile when the crash came after the database was created",
|
|
"never exposes a database that has no host record",
|
|
"renames one database by operation, replays safely, and leaves every other database alone",
|
|
"rejects an undeclared tool, a forged addon binding and an unknown resource",
|
|
"keeps databases and operation receipts across an addon restart",
|
|
"fails closed when the addon cannot answer, and drops only for an addon that is not installed",
|
|
"creates a database from a chat proposal that only the proposer's session confirms",
|
|
"settles reservations at bootstrap by asking the real addon and keeps those of pending proposals",
|
|
"reads and mutates rows with the exact preview, refuses wrong actions and keeps receipts across a restart",
|
|
"declares the row tools and refuses a row tool the manifest does not name",
|
|
"changes the schema as the owner, shows data loss in the preview and refuses an editor at the host and the addon",
|
|
"rejects a stale schema revision, replays an operation and keeps receipts across a restart",
|
|
"declares the schema tools and refuses any schema tool the manifest does not name",
|
|
"applies row changes only on the proposer's confirmation and rejects a proposal whose database moved",
|
|
"offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"tells the model and the chat that a data change can be undone, and undoes it from the person's own tab",
|
|
"never lets a key, a tool call, another session or a stranger undo, so a model cannot undo its own work",
|
|
"refuses a stale undo with what changed, and unwinds from the newest change to the oldest",
|
|
"answers not_found for a change nobody recorded",
|
|
"restores a dropped column with its data and puts a dropped table back",
|
|
"undoes the creation of a database only while nothing touched it, and deletes it then",
|
|
"lets an editor undo a data change but not a schema change"
|
|
]
|
|
}
|
|
],
|
|
"cases": [
|
|
"enforces the size cap on every connection and fails with a typed capacity error",
|
|
"builds a database under a data directory containing percent, question and hash characters",
|
|
"leaves no change and no receipt when the process dies before commit, and the ID can still apply",
|
|
"finds the committed receipt after a crash between commit and reply and never applies twice",
|
|
"replays one operation ID to one receipt and refuses another request under the same ID",
|
|
"applies one change once when the same operation arrives concurrently",
|
|
"keeps a rejected change out of the receipts so its ID is not burnt",
|
|
"encodes the receipt payload so the host can read what changed",
|
|
"creates, renames and drops tables with stable internal identifiers and one revision step each",
|
|
"adds typed columns, renames them without touching identifiers and never uses a label in SQL",
|
|
"validates labels by length, characters and case-insensitive uniqueness",
|
|
"refuses type changes, unknown operations, expressions and unknown types",
|
|
"encodes typed defaults as literals and survives hostile defaults",
|
|
"enforces required columns and refuses unique defaults that would collide",
|
|
"adds a unique column through a unique index and refuses duplicates atomically",
|
|
"drops a column by rebuilding the table and loses exactly what the preview reported",
|
|
"never hands out a row ID again after a column drop rebuilds the table",
|
|
"keeps the row ID counter when a column drop rebuilds a table emptied by deletes",
|
|
"leaves the original table, data and revision intact when a rebuild fails midway",
|
|
"previews exact effects and dependent data loss and changes nothing",
|
|
"refuses a stale expected revision with the current revision and applies nothing",
|
|
"keeps finite limits on tables and columns",
|
|
"migrates a database made before the catalog existed on its first schema change",
|
|
"inserts bound rows atomically with defaults, required and unique checks",
|
|
"updates by explicit IDs and by filter and bumps only the data revision",
|
|
"deletes by IDs or filter and refuses broad, empty or oversized selections",
|
|
"previews exact count, sample and conflicts without changing anything",
|
|
"refuses a changed revision and never re-evaluates a filter against new rows",
|
|
"applies exactly one of two proposals made on the same revision",
|
|
"replays a row operation by ID and refuses another request under the same ID",
|
|
"leaves no change when the process dies before commit and finds the receipt after commit",
|
|
"reserves the row id label so no column can shadow it",
|
|
"keeps a row table's data across a column drop that rebuilds it",
|
|
"reads selected columns with stable row IDs and typed JSON values",
|
|
"filters with bounded AND/OR trees and every operator, matching a reference evaluator on random trees",
|
|
"escapes LIKE wildcards in text filters",
|
|
"keeps NULL semantics: comparisons never match NULL and is-null finds it",
|
|
"sorts with a stable row ID tie-break and pages through a cursor that stops at a revision change",
|
|
"counts, sums, averages and bounds groups of aggregates",
|
|
"reports a real sum or average that overflows as the typed arithmetic error",
|
|
"never lets a label, operator or value reach SQL as text",
|
|
"honours hard limits on page size, filter depth, conditions, in-lists, sort keys and result bytes",
|
|
"stops a query when the context is cancelled or the deadline passes",
|
|
"encodes all five types as JSON and writes 64-bit integers as strings beyond 2^53",
|
|
"orders datetimes chronologically across fractional seconds and offsets",
|
|
"creates one private WAL database file named by the host resource ID",
|
|
"never lets an opaque ID or a name reach outside the storage directory",
|
|
"refuses a symbolic link as storage directory, database file or ledger",
|
|
"is idempotent by operation ID and never creates a second database",
|
|
"serializes concurrent creation of one operation into one database",
|
|
"recovers creation after a crash on either side of the file, and hides half-built files",
|
|
"renames only the named database and replays a renamed operation without effect",
|
|
"reports an unknown database and creates nothing for it",
|
|
"honours the busy timeout and the per-operation deadline, then succeeds once the lock is gone",
|
|
"encodes its receipts so the host can read them",
|
|
"writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"streams a large table row by row with bounded memory",
|
|
"fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"does not change the database it reads",
|
|
"records the current format of a new store and migrates nothing",
|
|
"migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"leaves no pending line for a change the add-on refused, so the same ID applies the corrected request",
|
|
"starts the real executable through the authenticated handshake and refuses unauthenticated callers",
|
|
"creates a database under the host-assigned ID and lists it only for people who may read it",
|
|
"drops the reservation when the addon refuses the name, and leaves no database",
|
|
"drops a reservation at reconcile when the crash came before the database was created",
|
|
"commits a reservation at reconcile when the crash came after the database was created",
|
|
"never exposes a database that has no host record",
|
|
"renames one database by operation, replays safely, and leaves every other database alone",
|
|
"rejects an undeclared tool, a forged addon binding and an unknown resource",
|
|
"keeps databases and operation receipts across an addon restart",
|
|
"fails closed when the addon cannot answer, and drops only for an addon that is not installed",
|
|
"creates a database from a chat proposal that only the proposer's session confirms",
|
|
"settles reservations at bootstrap by asking the real addon and keeps those of pending proposals",
|
|
"reads and mutates rows with the exact preview, refuses wrong actions and keeps receipts across a restart",
|
|
"declares the row tools and refuses a row tool the manifest does not name",
|
|
"changes the schema as the owner, shows data loss in the preview and refuses an editor at the host and the addon",
|
|
"rejects a stale schema revision, replays an operation and keeps receipts across a restart",
|
|
"declares the schema tools and refuses any schema tool the manifest does not name",
|
|
"applies row changes only on the proposer's confirmation and rejects a proposal whose database moved",
|
|
"offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"records an inverse for an insert and removes exactly those rows on undo",
|
|
"restores the previous values of an update, for the columns it set only",
|
|
"brings deleted rows back with their row IDs and every value, nulls included",
|
|
"is idempotent by operation ID: the same ID returns the same receipt and undoes once",
|
|
"refuses the same operation ID for another change",
|
|
"refuses a stale undo with what changed and overwrites nothing",
|
|
"refuses an undo whose expected revision moved between the read and the apply",
|
|
"unwinds in order: undoing the latest change makes the earlier one undoable again",
|
|
"keeps no change set that is too large and says so at apply time",
|
|
"expires a change set after the retention and drops what it held",
|
|
"keeps the total of change sets of one database bounded by dropping the oldest",
|
|
"answers not found for a change that never existed or belongs to a read",
|
|
"removes a created table again and refuses once it was touched",
|
|
"renames a table or a column back",
|
|
"removes an added column again, with its unique index",
|
|
"restores a dropped column with its data, its type, required and unique flags",
|
|
"restores a dropped table with its columns, rows and row IDs",
|
|
"says a dropped column or table was too large to keep, at apply time",
|
|
"renames the database back only while it still has the new name",
|
|
"undoes a creation only while the database is untouched, and marks that the resource is deleted",
|
|
"keeps the change sets in the database file, so deleting the database removes them",
|
|
"tells the model and the chat that a data change can be undone, and undoes it from the person's own tab",
|
|
"never lets a key, a tool call, another session or a stranger undo, so a model cannot undo its own work",
|
|
"refuses a stale undo with what changed, and unwinds from the newest change to the oldest",
|
|
"answers not_found for a change nobody recorded",
|
|
"restores a dropped column with its data and puts a dropped table back",
|
|
"undoes the creation of a database only while nothing touched it, and deletes it then",
|
|
"lets an editor undo a data change but not a schema change"
|
|
]
|
|
},
|
|
"tables-schema": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./addons/tables/internal/store",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/tables-schema-store.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./tests/addons/tables",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/tables-schema.json"
|
|
]
|
|
],
|
|
"report": ".cache/addons/logs/tables-schema-store.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/tables-schema-store.json",
|
|
"cases": [
|
|
"enforces the size cap on every connection and fails with a typed capacity error",
|
|
"builds a database under a data directory containing percent, question and hash characters",
|
|
"leaves no change and no receipt when the process dies before commit, and the ID can still apply",
|
|
"finds the committed receipt after a crash between commit and reply and never applies twice",
|
|
"replays one operation ID to one receipt and refuses another request under the same ID",
|
|
"applies one change once when the same operation arrives concurrently",
|
|
"keeps a rejected change out of the receipts so its ID is not burnt",
|
|
"encodes the receipt payload so the host can read what changed",
|
|
"creates, renames and drops tables with stable internal identifiers and one revision step each",
|
|
"adds typed columns, renames them without touching identifiers and never uses a label in SQL",
|
|
"validates labels by length, characters and case-insensitive uniqueness",
|
|
"refuses type changes, unknown operations, expressions and unknown types",
|
|
"encodes typed defaults as literals and survives hostile defaults",
|
|
"enforces required columns and refuses unique defaults that would collide",
|
|
"adds a unique column through a unique index and refuses duplicates atomically",
|
|
"drops a column by rebuilding the table and loses exactly what the preview reported",
|
|
"never hands out a row ID again after a column drop rebuilds the table",
|
|
"keeps the row ID counter when a column drop rebuilds a table emptied by deletes",
|
|
"leaves the original table, data and revision intact when a rebuild fails midway",
|
|
"previews exact effects and dependent data loss and changes nothing",
|
|
"refuses a stale expected revision with the current revision and applies nothing",
|
|
"keeps finite limits on tables and columns",
|
|
"migrates a database made before the catalog existed on its first schema change",
|
|
"inserts bound rows atomically with defaults, required and unique checks",
|
|
"updates by explicit IDs and by filter and bumps only the data revision",
|
|
"deletes by IDs or filter and refuses broad, empty or oversized selections",
|
|
"previews exact count, sample and conflicts without changing anything",
|
|
"refuses a changed revision and never re-evaluates a filter against new rows",
|
|
"applies exactly one of two proposals made on the same revision",
|
|
"replays a row operation by ID and refuses another request under the same ID",
|
|
"leaves no change when the process dies before commit and finds the receipt after commit",
|
|
"reserves the row id label so no column can shadow it",
|
|
"keeps a row table's data across a column drop that rebuilds it",
|
|
"reads selected columns with stable row IDs and typed JSON values",
|
|
"filters with bounded AND/OR trees and every operator, matching a reference evaluator on random trees",
|
|
"escapes LIKE wildcards in text filters",
|
|
"keeps NULL semantics: comparisons never match NULL and is-null finds it",
|
|
"sorts with a stable row ID tie-break and pages through a cursor that stops at a revision change",
|
|
"counts, sums, averages and bounds groups of aggregates",
|
|
"reports a real sum or average that overflows as the typed arithmetic error",
|
|
"never lets a label, operator or value reach SQL as text",
|
|
"honours hard limits on page size, filter depth, conditions, in-lists, sort keys and result bytes",
|
|
"stops a query when the context is cancelled or the deadline passes",
|
|
"encodes all five types as JSON and writes 64-bit integers as strings beyond 2^53",
|
|
"orders datetimes chronologically across fractional seconds and offsets",
|
|
"creates one private WAL database file named by the host resource ID",
|
|
"never lets an opaque ID or a name reach outside the storage directory",
|
|
"refuses a symbolic link as storage directory, database file or ledger",
|
|
"is idempotent by operation ID and never creates a second database",
|
|
"serializes concurrent creation of one operation into one database",
|
|
"recovers creation after a crash on either side of the file, and hides half-built files",
|
|
"renames only the named database and replays a renamed operation without effect",
|
|
"reports an unknown database and creates nothing for it",
|
|
"honours the busy timeout and the per-operation deadline, then succeeds once the lock is gone",
|
|
"encodes its receipts so the host can read them",
|
|
"writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"streams a large table row by row with bounded memory",
|
|
"fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"does not change the database it reads",
|
|
"records the current format of a new store and migrates nothing",
|
|
"migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"leaves no pending line for a change the add-on refused, so the same ID applies the corrected request",
|
|
"records an inverse for an insert and removes exactly those rows on undo",
|
|
"restores the previous values of an update, for the columns it set only",
|
|
"brings deleted rows back with their row IDs and every value, nulls included",
|
|
"is idempotent by operation ID: the same ID returns the same receipt and undoes once",
|
|
"refuses the same operation ID for another change",
|
|
"refuses a stale undo with what changed and overwrites nothing",
|
|
"refuses an undo whose expected revision moved between the read and the apply",
|
|
"unwinds in order: undoing the latest change makes the earlier one undoable again",
|
|
"keeps no change set that is too large and says so at apply time",
|
|
"expires a change set after the retention and drops what it held",
|
|
"keeps the total of change sets of one database bounded by dropping the oldest",
|
|
"answers not found for a change that never existed or belongs to a read",
|
|
"removes a created table again and refuses once it was touched",
|
|
"renames a table or a column back",
|
|
"removes an added column again, with its unique index",
|
|
"restores a dropped column with its data, its type, required and unique flags",
|
|
"restores a dropped table with its columns, rows and row IDs",
|
|
"says a dropped column or table was too large to keep, at apply time",
|
|
"renames the database back only while it still has the new name",
|
|
"undoes a creation only while the database is untouched, and marks that the resource is deleted",
|
|
"keeps the change sets in the database file, so deleting the database removes them"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/tables-schema.json",
|
|
"cases": [
|
|
"starts the real executable through the authenticated handshake and refuses unauthenticated callers",
|
|
"creates a database under the host-assigned ID and lists it only for people who may read it",
|
|
"drops the reservation when the addon refuses the name, and leaves no database",
|
|
"drops a reservation at reconcile when the crash came before the database was created",
|
|
"commits a reservation at reconcile when the crash came after the database was created",
|
|
"never exposes a database that has no host record",
|
|
"renames one database by operation, replays safely, and leaves every other database alone",
|
|
"rejects an undeclared tool, a forged addon binding and an unknown resource",
|
|
"keeps databases and operation receipts across an addon restart",
|
|
"fails closed when the addon cannot answer, and drops only for an addon that is not installed",
|
|
"creates a database from a chat proposal that only the proposer's session confirms",
|
|
"settles reservations at bootstrap by asking the real addon and keeps those of pending proposals",
|
|
"reads and mutates rows with the exact preview, refuses wrong actions and keeps receipts across a restart",
|
|
"declares the row tools and refuses a row tool the manifest does not name",
|
|
"changes the schema as the owner, shows data loss in the preview and refuses an editor at the host and the addon",
|
|
"rejects a stale schema revision, replays an operation and keeps receipts across a restart",
|
|
"declares the schema tools and refuses any schema tool the manifest does not name",
|
|
"applies row changes only on the proposer's confirmation and rejects a proposal whose database moved",
|
|
"offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"tells the model and the chat that a data change can be undone, and undoes it from the person's own tab",
|
|
"never lets a key, a tool call, another session or a stranger undo, so a model cannot undo its own work",
|
|
"refuses a stale undo with what changed, and unwinds from the newest change to the oldest",
|
|
"answers not_found for a change nobody recorded",
|
|
"restores a dropped column with its data and puts a dropped table back",
|
|
"undoes the creation of a database only while nothing touched it, and deletes it then",
|
|
"lets an editor undo a data change but not a schema change"
|
|
]
|
|
}
|
|
],
|
|
"cases": [
|
|
"enforces the size cap on every connection and fails with a typed capacity error",
|
|
"builds a database under a data directory containing percent, question and hash characters",
|
|
"leaves no change and no receipt when the process dies before commit, and the ID can still apply",
|
|
"finds the committed receipt after a crash between commit and reply and never applies twice",
|
|
"replays one operation ID to one receipt and refuses another request under the same ID",
|
|
"applies one change once when the same operation arrives concurrently",
|
|
"keeps a rejected change out of the receipts so its ID is not burnt",
|
|
"encodes the receipt payload so the host can read what changed",
|
|
"creates, renames and drops tables with stable internal identifiers and one revision step each",
|
|
"adds typed columns, renames them without touching identifiers and never uses a label in SQL",
|
|
"validates labels by length, characters and case-insensitive uniqueness",
|
|
"refuses type changes, unknown operations, expressions and unknown types",
|
|
"encodes typed defaults as literals and survives hostile defaults",
|
|
"enforces required columns and refuses unique defaults that would collide",
|
|
"adds a unique column through a unique index and refuses duplicates atomically",
|
|
"drops a column by rebuilding the table and loses exactly what the preview reported",
|
|
"never hands out a row ID again after a column drop rebuilds the table",
|
|
"keeps the row ID counter when a column drop rebuilds a table emptied by deletes",
|
|
"leaves the original table, data and revision intact when a rebuild fails midway",
|
|
"previews exact effects and dependent data loss and changes nothing",
|
|
"refuses a stale expected revision with the current revision and applies nothing",
|
|
"keeps finite limits on tables and columns",
|
|
"migrates a database made before the catalog existed on its first schema change",
|
|
"inserts bound rows atomically with defaults, required and unique checks",
|
|
"updates by explicit IDs and by filter and bumps only the data revision",
|
|
"deletes by IDs or filter and refuses broad, empty or oversized selections",
|
|
"previews exact count, sample and conflicts without changing anything",
|
|
"refuses a changed revision and never re-evaluates a filter against new rows",
|
|
"applies exactly one of two proposals made on the same revision",
|
|
"replays a row operation by ID and refuses another request under the same ID",
|
|
"leaves no change when the process dies before commit and finds the receipt after commit",
|
|
"reserves the row id label so no column can shadow it",
|
|
"keeps a row table's data across a column drop that rebuilds it",
|
|
"reads selected columns with stable row IDs and typed JSON values",
|
|
"filters with bounded AND/OR trees and every operator, matching a reference evaluator on random trees",
|
|
"escapes LIKE wildcards in text filters",
|
|
"keeps NULL semantics: comparisons never match NULL and is-null finds it",
|
|
"sorts with a stable row ID tie-break and pages through a cursor that stops at a revision change",
|
|
"counts, sums, averages and bounds groups of aggregates",
|
|
"reports a real sum or average that overflows as the typed arithmetic error",
|
|
"never lets a label, operator or value reach SQL as text",
|
|
"honours hard limits on page size, filter depth, conditions, in-lists, sort keys and result bytes",
|
|
"stops a query when the context is cancelled or the deadline passes",
|
|
"encodes all five types as JSON and writes 64-bit integers as strings beyond 2^53",
|
|
"orders datetimes chronologically across fractional seconds and offsets",
|
|
"creates one private WAL database file named by the host resource ID",
|
|
"never lets an opaque ID or a name reach outside the storage directory",
|
|
"refuses a symbolic link as storage directory, database file or ledger",
|
|
"is idempotent by operation ID and never creates a second database",
|
|
"serializes concurrent creation of one operation into one database",
|
|
"recovers creation after a crash on either side of the file, and hides half-built files",
|
|
"renames only the named database and replays a renamed operation without effect",
|
|
"reports an unknown database and creates nothing for it",
|
|
"honours the busy timeout and the per-operation deadline, then succeeds once the lock is gone",
|
|
"encodes its receipts so the host can read them",
|
|
"writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"streams a large table row by row with bounded memory",
|
|
"fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"does not change the database it reads",
|
|
"records the current format of a new store and migrates nothing",
|
|
"migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"leaves no pending line for a change the add-on refused, so the same ID applies the corrected request",
|
|
"starts the real executable through the authenticated handshake and refuses unauthenticated callers",
|
|
"creates a database under the host-assigned ID and lists it only for people who may read it",
|
|
"drops the reservation when the addon refuses the name, and leaves no database",
|
|
"drops a reservation at reconcile when the crash came before the database was created",
|
|
"commits a reservation at reconcile when the crash came after the database was created",
|
|
"never exposes a database that has no host record",
|
|
"renames one database by operation, replays safely, and leaves every other database alone",
|
|
"rejects an undeclared tool, a forged addon binding and an unknown resource",
|
|
"keeps databases and operation receipts across an addon restart",
|
|
"fails closed when the addon cannot answer, and drops only for an addon that is not installed",
|
|
"creates a database from a chat proposal that only the proposer's session confirms",
|
|
"settles reservations at bootstrap by asking the real addon and keeps those of pending proposals",
|
|
"reads and mutates rows with the exact preview, refuses wrong actions and keeps receipts across a restart",
|
|
"declares the row tools and refuses a row tool the manifest does not name",
|
|
"changes the schema as the owner, shows data loss in the preview and refuses an editor at the host and the addon",
|
|
"rejects a stale schema revision, replays an operation and keeps receipts across a restart",
|
|
"declares the schema tools and refuses any schema tool the manifest does not name",
|
|
"applies row changes only on the proposer's confirmation and rejects a proposal whose database moved",
|
|
"offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"records an inverse for an insert and removes exactly those rows on undo",
|
|
"restores the previous values of an update, for the columns it set only",
|
|
"brings deleted rows back with their row IDs and every value, nulls included",
|
|
"is idempotent by operation ID: the same ID returns the same receipt and undoes once",
|
|
"refuses the same operation ID for another change",
|
|
"refuses a stale undo with what changed and overwrites nothing",
|
|
"refuses an undo whose expected revision moved between the read and the apply",
|
|
"unwinds in order: undoing the latest change makes the earlier one undoable again",
|
|
"keeps no change set that is too large and says so at apply time",
|
|
"expires a change set after the retention and drops what it held",
|
|
"keeps the total of change sets of one database bounded by dropping the oldest",
|
|
"answers not found for a change that never existed or belongs to a read",
|
|
"removes a created table again and refuses once it was touched",
|
|
"renames a table or a column back",
|
|
"removes an added column again, with its unique index",
|
|
"restores a dropped column with its data, its type, required and unique flags",
|
|
"restores a dropped table with its columns, rows and row IDs",
|
|
"says a dropped column or table was too large to keep, at apply time",
|
|
"renames the database back only while it still has the new name",
|
|
"undoes a creation only while the database is untouched, and marks that the resource is deleted",
|
|
"keeps the change sets in the database file, so deleting the database removes them",
|
|
"tells the model and the chat that a data change can be undone, and undoes it from the person's own tab",
|
|
"never lets a key, a tool call, another session or a stranger undo, so a model cannot undo its own work",
|
|
"refuses a stale undo with what changed, and unwinds from the newest change to the oldest",
|
|
"answers not_found for a change nobody recorded",
|
|
"restores a dropped column with its data and puts a dropped table back",
|
|
"undoes the creation of a database only while nothing touched it, and deletes it then",
|
|
"lets an editor undo a data change but not a schema change"
|
|
]
|
|
},
|
|
"tables-rows": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./addons/tables/internal/store",
|
|
"-ginkgo.json-report=../../../../.cache/addons/logs/tables-rows-store.json"
|
|
],
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./tests/addons/tables",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/tables-rows.json"
|
|
]
|
|
],
|
|
"report": ".cache/addons/logs/tables-rows-store.json",
|
|
"reports": [
|
|
{
|
|
"path": ".cache/addons/logs/tables-rows-store.json",
|
|
"cases": [
|
|
"enforces the size cap on every connection and fails with a typed capacity error",
|
|
"builds a database under a data directory containing percent, question and hash characters",
|
|
"leaves no change and no receipt when the process dies before commit, and the ID can still apply",
|
|
"finds the committed receipt after a crash between commit and reply and never applies twice",
|
|
"replays one operation ID to one receipt and refuses another request under the same ID",
|
|
"applies one change once when the same operation arrives concurrently",
|
|
"keeps a rejected change out of the receipts so its ID is not burnt",
|
|
"encodes the receipt payload so the host can read what changed",
|
|
"creates, renames and drops tables with stable internal identifiers and one revision step each",
|
|
"adds typed columns, renames them without touching identifiers and never uses a label in SQL",
|
|
"validates labels by length, characters and case-insensitive uniqueness",
|
|
"refuses type changes, unknown operations, expressions and unknown types",
|
|
"encodes typed defaults as literals and survives hostile defaults",
|
|
"enforces required columns and refuses unique defaults that would collide",
|
|
"adds a unique column through a unique index and refuses duplicates atomically",
|
|
"drops a column by rebuilding the table and loses exactly what the preview reported",
|
|
"never hands out a row ID again after a column drop rebuilds the table",
|
|
"keeps the row ID counter when a column drop rebuilds a table emptied by deletes",
|
|
"leaves the original table, data and revision intact when a rebuild fails midway",
|
|
"previews exact effects and dependent data loss and changes nothing",
|
|
"refuses a stale expected revision with the current revision and applies nothing",
|
|
"keeps finite limits on tables and columns",
|
|
"migrates a database made before the catalog existed on its first schema change",
|
|
"inserts bound rows atomically with defaults, required and unique checks",
|
|
"updates by explicit IDs and by filter and bumps only the data revision",
|
|
"deletes by IDs or filter and refuses broad, empty or oversized selections",
|
|
"previews exact count, sample and conflicts without changing anything",
|
|
"refuses a changed revision and never re-evaluates a filter against new rows",
|
|
"applies exactly one of two proposals made on the same revision",
|
|
"replays a row operation by ID and refuses another request under the same ID",
|
|
"leaves no change when the process dies before commit and finds the receipt after commit",
|
|
"reserves the row id label so no column can shadow it",
|
|
"keeps a row table's data across a column drop that rebuilds it",
|
|
"reads selected columns with stable row IDs and typed JSON values",
|
|
"filters with bounded AND/OR trees and every operator, matching a reference evaluator on random trees",
|
|
"escapes LIKE wildcards in text filters",
|
|
"keeps NULL semantics: comparisons never match NULL and is-null finds it",
|
|
"sorts with a stable row ID tie-break and pages through a cursor that stops at a revision change",
|
|
"counts, sums, averages and bounds groups of aggregates",
|
|
"reports a real sum or average that overflows as the typed arithmetic error",
|
|
"never lets a label, operator or value reach SQL as text",
|
|
"honours hard limits on page size, filter depth, conditions, in-lists, sort keys and result bytes",
|
|
"stops a query when the context is cancelled or the deadline passes",
|
|
"encodes all five types as JSON and writes 64-bit integers as strings beyond 2^53",
|
|
"orders datetimes chronologically across fractional seconds and offsets",
|
|
"creates one private WAL database file named by the host resource ID",
|
|
"never lets an opaque ID or a name reach outside the storage directory",
|
|
"refuses a symbolic link as storage directory, database file or ledger",
|
|
"is idempotent by operation ID and never creates a second database",
|
|
"serializes concurrent creation of one operation into one database",
|
|
"recovers creation after a crash on either side of the file, and hides half-built files",
|
|
"renames only the named database and replays a renamed operation without effect",
|
|
"reports an unknown database and creates nothing for it",
|
|
"honours the busy timeout and the per-operation deadline, then succeeds once the lock is gone",
|
|
"encodes its receipts so the host can read them",
|
|
"writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"streams a large table row by row with bounded memory",
|
|
"fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"does not change the database it reads",
|
|
"records the current format of a new store and migrates nothing",
|
|
"migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"leaves no pending line for a change the add-on refused, so the same ID applies the corrected request",
|
|
"records an inverse for an insert and removes exactly those rows on undo",
|
|
"restores the previous values of an update, for the columns it set only",
|
|
"brings deleted rows back with their row IDs and every value, nulls included",
|
|
"is idempotent by operation ID: the same ID returns the same receipt and undoes once",
|
|
"refuses the same operation ID for another change",
|
|
"refuses a stale undo with what changed and overwrites nothing",
|
|
"refuses an undo whose expected revision moved between the read and the apply",
|
|
"unwinds in order: undoing the latest change makes the earlier one undoable again",
|
|
"keeps no change set that is too large and says so at apply time",
|
|
"expires a change set after the retention and drops what it held",
|
|
"keeps the total of change sets of one database bounded by dropping the oldest",
|
|
"answers not found for a change that never existed or belongs to a read",
|
|
"removes a created table again and refuses once it was touched",
|
|
"renames a table or a column back",
|
|
"removes an added column again, with its unique index",
|
|
"restores a dropped column with its data, its type, required and unique flags",
|
|
"restores a dropped table with its columns, rows and row IDs",
|
|
"says a dropped column or table was too large to keep, at apply time",
|
|
"renames the database back only while it still has the new name",
|
|
"undoes a creation only while the database is untouched, and marks that the resource is deleted",
|
|
"keeps the change sets in the database file, so deleting the database removes them"
|
|
]
|
|
},
|
|
{
|
|
"path": ".cache/addons/logs/tables-rows.json",
|
|
"cases": [
|
|
"starts the real executable through the authenticated handshake and refuses unauthenticated callers",
|
|
"creates a database under the host-assigned ID and lists it only for people who may read it",
|
|
"drops the reservation when the addon refuses the name, and leaves no database",
|
|
"drops a reservation at reconcile when the crash came before the database was created",
|
|
"commits a reservation at reconcile when the crash came after the database was created",
|
|
"never exposes a database that has no host record",
|
|
"renames one database by operation, replays safely, and leaves every other database alone",
|
|
"rejects an undeclared tool, a forged addon binding and an unknown resource",
|
|
"keeps databases and operation receipts across an addon restart",
|
|
"fails closed when the addon cannot answer, and drops only for an addon that is not installed",
|
|
"creates a database from a chat proposal that only the proposer's session confirms",
|
|
"settles reservations at bootstrap by asking the real addon and keeps those of pending proposals",
|
|
"reads and mutates rows with the exact preview, refuses wrong actions and keeps receipts across a restart",
|
|
"declares the row tools and refuses a row tool the manifest does not name",
|
|
"changes the schema as the owner, shows data loss in the preview and refuses an editor at the host and the addon",
|
|
"rejects a stale schema revision, replays an operation and keeps receipts across a restart",
|
|
"declares the schema tools and refuses any schema tool the manifest does not name",
|
|
"applies row changes only on the proposer's confirmation and rejects a proposal whose database moved",
|
|
"offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"tells the model and the chat that a data change can be undone, and undoes it from the person's own tab",
|
|
"never lets a key, a tool call, another session or a stranger undo, so a model cannot undo its own work",
|
|
"refuses a stale undo with what changed, and unwinds from the newest change to the oldest",
|
|
"answers not_found for a change nobody recorded",
|
|
"restores a dropped column with its data and puts a dropped table back",
|
|
"undoes the creation of a database only while nothing touched it, and deletes it then",
|
|
"lets an editor undo a data change but not a schema change"
|
|
]
|
|
}
|
|
],
|
|
"cases": [
|
|
"enforces the size cap on every connection and fails with a typed capacity error",
|
|
"builds a database under a data directory containing percent, question and hash characters",
|
|
"leaves no change and no receipt when the process dies before commit, and the ID can still apply",
|
|
"finds the committed receipt after a crash between commit and reply and never applies twice",
|
|
"replays one operation ID to one receipt and refuses another request under the same ID",
|
|
"applies one change once when the same operation arrives concurrently",
|
|
"keeps a rejected change out of the receipts so its ID is not burnt",
|
|
"encodes the receipt payload so the host can read what changed",
|
|
"creates, renames and drops tables with stable internal identifiers and one revision step each",
|
|
"adds typed columns, renames them without touching identifiers and never uses a label in SQL",
|
|
"validates labels by length, characters and case-insensitive uniqueness",
|
|
"refuses type changes, unknown operations, expressions and unknown types",
|
|
"encodes typed defaults as literals and survives hostile defaults",
|
|
"enforces required columns and refuses unique defaults that would collide",
|
|
"adds a unique column through a unique index and refuses duplicates atomically",
|
|
"drops a column by rebuilding the table and loses exactly what the preview reported",
|
|
"never hands out a row ID again after a column drop rebuilds the table",
|
|
"keeps the row ID counter when a column drop rebuilds a table emptied by deletes",
|
|
"leaves the original table, data and revision intact when a rebuild fails midway",
|
|
"previews exact effects and dependent data loss and changes nothing",
|
|
"refuses a stale expected revision with the current revision and applies nothing",
|
|
"keeps finite limits on tables and columns",
|
|
"migrates a database made before the catalog existed on its first schema change",
|
|
"inserts bound rows atomically with defaults, required and unique checks",
|
|
"updates by explicit IDs and by filter and bumps only the data revision",
|
|
"deletes by IDs or filter and refuses broad, empty or oversized selections",
|
|
"previews exact count, sample and conflicts without changing anything",
|
|
"refuses a changed revision and never re-evaluates a filter against new rows",
|
|
"applies exactly one of two proposals made on the same revision",
|
|
"replays a row operation by ID and refuses another request under the same ID",
|
|
"leaves no change when the process dies before commit and finds the receipt after commit",
|
|
"reserves the row id label so no column can shadow it",
|
|
"keeps a row table's data across a column drop that rebuilds it",
|
|
"reads selected columns with stable row IDs and typed JSON values",
|
|
"filters with bounded AND/OR trees and every operator, matching a reference evaluator on random trees",
|
|
"escapes LIKE wildcards in text filters",
|
|
"keeps NULL semantics: comparisons never match NULL and is-null finds it",
|
|
"sorts with a stable row ID tie-break and pages through a cursor that stops at a revision change",
|
|
"counts, sums, averages and bounds groups of aggregates",
|
|
"reports a real sum or average that overflows as the typed arithmetic error",
|
|
"never lets a label, operator or value reach SQL as text",
|
|
"honours hard limits on page size, filter depth, conditions, in-lists, sort keys and result bytes",
|
|
"stops a query when the context is cancelled or the deadline passes",
|
|
"encodes all five types as JSON and writes 64-bit integers as strings beyond 2^53",
|
|
"orders datetimes chronologically across fractional seconds and offsets",
|
|
"creates one private WAL database file named by the host resource ID",
|
|
"never lets an opaque ID or a name reach outside the storage directory",
|
|
"refuses a symbolic link as storage directory, database file or ledger",
|
|
"is idempotent by operation ID and never creates a second database",
|
|
"serializes concurrent creation of one operation into one database",
|
|
"recovers creation after a crash on either side of the file, and hides half-built files",
|
|
"renames only the named database and replays a renamed operation without effect",
|
|
"reports an unknown database and creates nothing for it",
|
|
"honours the busy timeout and the per-operation deadline, then succeeds once the lock is gone",
|
|
"encodes its receipts so the host can read them",
|
|
"writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"streams a large table row by row with bounded memory",
|
|
"fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"does not change the database it reads",
|
|
"records the current format of a new store and migrates nothing",
|
|
"migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"leaves no pending line for a change the add-on refused, so the same ID applies the corrected request",
|
|
"starts the real executable through the authenticated handshake and refuses unauthenticated callers",
|
|
"creates a database under the host-assigned ID and lists it only for people who may read it",
|
|
"drops the reservation when the addon refuses the name, and leaves no database",
|
|
"drops a reservation at reconcile when the crash came before the database was created",
|
|
"commits a reservation at reconcile when the crash came after the database was created",
|
|
"never exposes a database that has no host record",
|
|
"renames one database by operation, replays safely, and leaves every other database alone",
|
|
"rejects an undeclared tool, a forged addon binding and an unknown resource",
|
|
"keeps databases and operation receipts across an addon restart",
|
|
"fails closed when the addon cannot answer, and drops only for an addon that is not installed",
|
|
"creates a database from a chat proposal that only the proposer's session confirms",
|
|
"settles reservations at bootstrap by asking the real addon and keeps those of pending proposals",
|
|
"reads and mutates rows with the exact preview, refuses wrong actions and keeps receipts across a restart",
|
|
"declares the row tools and refuses a row tool the manifest does not name",
|
|
"changes the schema as the owner, shows data loss in the preview and refuses an editor at the host and the addon",
|
|
"rejects a stale schema revision, replays an operation and keeps receipts across a restart",
|
|
"declares the schema tools and refuses any schema tool the manifest does not name",
|
|
"applies row changes only on the proposer's confirmation and rejects a proposal whose database moved",
|
|
"offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"records an inverse for an insert and removes exactly those rows on undo",
|
|
"restores the previous values of an update, for the columns it set only",
|
|
"brings deleted rows back with their row IDs and every value, nulls included",
|
|
"is idempotent by operation ID: the same ID returns the same receipt and undoes once",
|
|
"refuses the same operation ID for another change",
|
|
"refuses a stale undo with what changed and overwrites nothing",
|
|
"refuses an undo whose expected revision moved between the read and the apply",
|
|
"unwinds in order: undoing the latest change makes the earlier one undoable again",
|
|
"keeps no change set that is too large and says so at apply time",
|
|
"expires a change set after the retention and drops what it held",
|
|
"keeps the total of change sets of one database bounded by dropping the oldest",
|
|
"answers not found for a change that never existed or belongs to a read",
|
|
"removes a created table again and refuses once it was touched",
|
|
"renames a table or a column back",
|
|
"removes an added column again, with its unique index",
|
|
"restores a dropped column with its data, its type, required and unique flags",
|
|
"restores a dropped table with its columns, rows and row IDs",
|
|
"says a dropped column or table was too large to keep, at apply time",
|
|
"renames the database back only while it still has the new name",
|
|
"undoes a creation only while the database is untouched, and marks that the resource is deleted",
|
|
"keeps the change sets in the database file, so deleting the database removes them",
|
|
"tells the model and the chat that a data change can be undone, and undoes it from the person's own tab",
|
|
"never lets a key, a tool call, another session or a stranger undo, so a model cannot undo its own work",
|
|
"refuses a stale undo with what changed, and unwinds from the newest change to the oldest",
|
|
"answers not_found for a change nobody recorded",
|
|
"restores a dropped column with its data and puts a dropped table back",
|
|
"undoes the creation of a database only while nothing touched it, and deletes it then",
|
|
"lets an editor undo a data change but not a schema change"
|
|
]
|
|
},
|
|
"tables-tools": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/tables_tools.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: tools: the namespace is the brokered add-on tool names only",
|
|
"unit: tools: a proposal result of an add-on tool gives its identifier and nothing else",
|
|
"unit: tools: other kinds, other tools and malformed identifiers give no card",
|
|
"unit: tools: the stored history keeps the reference of a proposal and no row data",
|
|
"unit: tools: the card facts come from the stored proposal and never from model text",
|
|
"unit: tools: stale, expired, blocked and settled proposals cannot be decided",
|
|
"unit: tools: a confirmation names the displayed proposal and its digest and nothing a model supplied",
|
|
"go: accepts the Tables definitions and classifies every model-facing tool",
|
|
"go: keeps the schema bytes of a parsed manifest equal to what the runtime echoes back",
|
|
"go: rejects a definition that declares an identity, role, approval or operation property",
|
|
"go: rejects an undeclared tool, a repeated tool, an unknown kind and a missing or unbounded schema",
|
|
"go: binds every tool kind of a chat call to the chat",
|
|
"go: refuses a call of the chats adapter that names a conversation without its binding",
|
|
"go: refuses an incomplete chat call",
|
|
"go: leaves the calls of other consumers without a binding",
|
|
"go: binds one actor to an executor and serves tools through the broker only",
|
|
"go: refuses to bind an executor when the owner denies the actor",
|
|
"go: routes the add-on namespace to the broker and never to another executor",
|
|
"go: never offers or runs a tool of an MCP session under the add-on namespace",
|
|
"go: reads the opt-in once and answers a surface that has no broker with a typed rejection",
|
|
"go: takes the actor from the trusted request context only",
|
|
"go: classifies every source file that discovers or executes tools",
|
|
"go: flags source that hands sessions to the agent library without the namespace filter",
|
|
"go: installs the namespace filter wherever sessions reach the agent library",
|
|
"go: names a reason and an enforcement for every rejection and an actor for every route, with real files",
|
|
"go: keeps the table of the Tables documentation in step with the matrix",
|
|
"go: lets only the brokered consumers import the adapter",
|
|
"go: has no add-on tool and no add-on route in the admin assistant catalog",
|
|
"go: discovers namespaced tools with schemas from the manifest for enabled running addons only",
|
|
"go: offers nothing for a disabled, stopped or failed addon and nothing when the owner cannot answer",
|
|
"go: has no tool for sharing, deleting a database, purging retained data or approving",
|
|
"go: drops a definition whose namespaced name is not a valid function name or does not fit",
|
|
"go: reads through the gateway with the immutable actor, the listed generation and the resource taken out of the arguments",
|
|
"go: refuses an oversized result instead of truncating it",
|
|
"go: returns file results as private artifact references with no bytes",
|
|
"go: passes a denial, an outage and an unknown outcome through unchanged",
|
|
"go: turns a row change into a proposal reference and never applies",
|
|
"go: proposes schema changes under the schema action and creation with no resource",
|
|
"go: gives every call its own operation ID so one call can never replay another",
|
|
"go: reports a proposal outage with the typed error and no reference",
|
|
"go: rejects forged identity, role, approval and operation fields before anything reaches the owner",
|
|
"go: rejects approval aliases, undefined tools and names outside the namespace",
|
|
"go: rejects arguments that are not exactly one bounded object with known, typed properties",
|
|
"go: has no way to confirm, cancel or resolve a proposal",
|
|
"go: uses the actor of each call and nothing a previous call left behind",
|
|
"go: refuses an actor without a user or credential before any call",
|
|
"go: serves the real gateway type as its backend",
|
|
"go: lists the caller's own pending proposals the same from the owner and every forwarding frontend",
|
|
"go: offers the manifest tools to a permitted user and nothing to a user without the feature or after revocation",
|
|
"go: applies a change a chat makes at once for the chat's user, leaves no proposal, and still refuses a key",
|
|
"go: stores every change as a pending proposal and applies it only on the proposer's own session, exactly once",
|
|
"go: keeps the roles of the host for tool calls and rejects forged fields before the owner sees them",
|
|
"go: lists at most the bound of pending proposals and refuses more than the user's quota",
|
|
"go: gives the model an error result that says the request was invalid, for a read and for a change",
|
|
"go: keeps an outage an error, never the refused result",
|
|
"go: are never offered to a model and are unknown when a model calls them",
|
|
"go: applies a row change for the chat adapter, as the actor, with the digest it just stored",
|
|
"go: says a change can be undone when the add-on kept a change set, with the change ID and what undo does",
|
|
"go: says why a change cannot be undone when the add-on says so, and never trusts an undo note with a bad ID",
|
|
"go: gives a reason when the add-on says nothing about undo",
|
|
"go: keeps the result with the longest undo text small enough for the chat",
|
|
"go: stays under the chat's 2 KiB cap for the tool result even with every excerpt at its largest",
|
|
"go: keeps the result small enough for the chat to store as valid JSON",
|
|
"go: applies a creation and a schema change too",
|
|
"go: never confirms for an adapter that is not the chats one, even over an owner that could",
|
|
"go: keeps a proposal when the owner cannot apply, so nothing is lost",
|
|
"go: withdraws the proposal and reports the error when the apply is refused as stale",
|
|
"go: tells the model the call was invalid when the add-on refuses it, and withdraws the proposal",
|
|
"go: does not withdraw, and does not claim success, when the outcome is unknown",
|
|
"go: does not report a change that the add-on rejected at the apply",
|
|
"go: reads the list of add-ons next to the opt-in and consumes both keys",
|
|
"go: keeps the boolean form unchanged: a nil list offers every add-on",
|
|
"go: offers only the tools of the listed add-ons",
|
|
"go: hides the tools of the named add-ons and refuses a call to them as unknown, whatever the list says",
|
|
"go: offers nothing for an empty list and for ids that match no add-on",
|
|
"go: refuses a call to an add-on that is not listed, as an unknown tool, before the owner is reached",
|
|
"go: applies the list through the provider and keeps the actor binding",
|
|
"go: passes on the reason the add-on gave, such as a missing engine, and not the generic class",
|
|
"go: tells the model a missing permission and an unreachable resource in plain words, for a read and for a change",
|
|
"go: accepts a call whose bound body is exactly 1 MiB, end to end, and refuses one byte more",
|
|
"go: offers an action tool to the chats adapter and to nobody else",
|
|
"go: runs an action tool for the chats adapter as the actor, with the act action, and returns its payload",
|
|
"go: tells an action tool which conversation it runs in, from the chat and never from the model",
|
|
"go: does not run an action tool for any other adapter, and says the tool is unknown",
|
|
"go: is unavailable when the owner cannot act, and never falls back to a read or a proposal",
|
|
"go: keeps the argument rules: an identity argument is refused before anything runs",
|
|
"go: are listed in any state, with the names they replace and whether they run",
|
|
"go: keeps its namespaced name and carries the built-in it shadows, only for a replaceable name",
|
|
"go: names the replacement string for legacy arguments at the chat boundary without sending them",
|
|
"go: synthesizes exactly one strict host read, without enumerating resources at discovery",
|
|
"go: projects only opaque IDs, optional names and caller roles through a normal data envelope",
|
|
"go: returns an array even for empty success and truthfully bounds sorted 100/101 results",
|
|
"go: rejects every input property and non-object rather than resolving selection",
|
|
"go: fails closed without the optional backend interface and never synthesizes for other add-ons",
|
|
"go: rejects a reserved Tables manifest collision in discovery and execution even if not advertised",
|
|
"go: rechecks missing, hidden, disabled, stopped and uninitialized Tables at execution",
|
|
"go: preserves typed credential, feature, owner, forwarding and registry failures after discovery",
|
|
"go: rejects missing principals and malformed projections instead of successful empty data",
|
|
"go: keeps synthesized listing behind consumer allowlists and hidden add-ons",
|
|
"go: does not let a listing-capable provider invent a named-user principal",
|
|
"go: revalidates listing failures through an already-bound consumer without namespace fallback",
|
|
"go: preserves the model read byte bound",
|
|
"go: offers the host read even when Tables has no executable definitions"
|
|
]
|
|
},
|
|
"tables-admin": {
|
|
"kind": "ginkgo",
|
|
"commands": [
|
|
[
|
|
"go",
|
|
"test",
|
|
"-count=1",
|
|
"-p",
|
|
"2",
|
|
"-tags",
|
|
"auth",
|
|
"./tests/addons/tablesadmin",
|
|
"-ginkgo.json-report=../../../.cache/addons/logs/tables-admin.json"
|
|
]
|
|
],
|
|
"report": ".cache/addons/logs/tables-admin.json",
|
|
"cases": [
|
|
"keys a reference by user, conversation and add-on, bounds it per user and in total and expires what is unused",
|
|
"is durable, held by one process, never resets a corrupt file and stops writing after a failed sync",
|
|
"serves concurrent users without losing a reference",
|
|
"keeps the newest bounded number, validates them on load and remaps them with the owner",
|
|
"creates private databases by the person's own action, once per operation, and lists them only for their owner",
|
|
"keeps the owner, editor and viewer matrix on the UI routes and shows each person only their own role",
|
|
"shares whole databases by immutable account ID behind a bounded picker that tells nothing else",
|
|
"keeps sharing disabled in local-owner mode with a typed answer and no named users",
|
|
"waits for a revoked user's admitted work and cancels it before acknowledging the revocation",
|
|
"answers every typed denial exactly as the owner does and carries every mutation to the owner",
|
|
"reports an unknown outcome with the original operation ID and leaves reads plainly unavailable when the owner cannot be reached",
|
|
"answers the sharing denial of local-owner mode the same from a frontend",
|
|
"deletes the data, the grants and the pending proposals only on the owner's typed confirmation and keeps the add-on installed",
|
|
"stops and waits for admitted work of every user before it asks the add-on to delete",
|
|
"makes the add-on refuse its delete tool under every action but the host's delete action",
|
|
"never offers the delete tool to a model, a proposal, a typed read or an agent",
|
|
"denies a stale tab: the generation and the revision the owner saw decide, and nothing is removed",
|
|
"finishes or undoes a deletion that a crash interrupted at every step",
|
|
"keeps the delete tool out of the model tools and their definitions",
|
|
"refuses an admin tool that is also a model tool, has a definition, or is not mapped",
|
|
"documents every route, every emitted field and every typed answer in the Swagger spec",
|
|
"lists every route in the instructions registry, the feature registry and the documentation, with no MCP tool for any",
|
|
"keeps one selection per user, conversation and add-on, across people, conversations and restarts",
|
|
"lets a tool call omit the database in a conversation and resolves it at the owner with typed errors",
|
|
"withdraws the management and the tool path while the add-on is disabled and restores them on enable",
|
|
"answers a revoked, deleted or tampered reference like an unknown database and never reuses it",
|
|
"applies schema and row changes under the roles of the host, once per operation, with a receipt and no proposal",
|
|
"refuses crafted writes by a viewer, an editor's schema change, a revoked editor and an installation administrator",
|
|
"carries a UI change to the owner from a forwarding frontend and answers as the owner does",
|
|
"exports a table with exact bytes and attachment headers over real HTTP and shows no one else the file",
|
|
"keeps a shared database's file private, applies the person's own filter and sort, and denies after the grant is withdrawn",
|
|
"serves the same bytes and headers through a forwarding frontend, and fails the same way for a stranger",
|
|
"answers a result past the export limit as data with no file",
|
|
"binds an output handle to its operation, person and database",
|
|
"fails a truncated, grown or vanished stream and never serves it",
|
|
"fails the transfer when the store cannot write, and when the source is revoked before completion",
|
|
"expires the file only, enforces the quota per person and leaves the database as it was",
|
|
"projects only active owned/shared resources and the caller's own role, never UI management metadata",
|
|
"projects only active owned/shared resources and the caller's own role, never UI management metadata",
|
|
"excludes policy reservations and resources whose deletion has begun",
|
|
"excludes policy reservations and resources whose deletion has begun",
|
|
"rechecks grants after discovery and independently refuses inspect on a revoked database",
|
|
"rechecks grants after discovery and independently refuses inspect on a revoked database",
|
|
"revalidates real credential and feature changes after discovery, not as successful empty lists",
|
|
"revalidates real credential and feature changes after discovery, not as successful empty lists",
|
|
"preserves typed missing resource registry and app registry failures",
|
|
"preserves typed missing resource registry and app registry failures",
|
|
"uses the service's actual 100/101 bound in ID order with truthful truncation and absent names",
|
|
"uses the service's actual 100/101 bound in ID order with truthful truncation and absent names",
|
|
"rechecks credentials at the carrier owner even if the frontend still admits the old principal",
|
|
"reports an unavailable carrier owner after discovery instead of fabricating empty success"
|
|
]
|
|
},
|
|
"tables-ui": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/tables_ui.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: resources: every call carries this add-on and its generation and nothing the add-on chose",
|
|
"unit: resources: an operation identifier chosen by the caller is kept across a retry",
|
|
"unit: resources: nothing is sent once the add-on is withdrawn",
|
|
"unit: resources: a malformed identifier is refused before any request",
|
|
"unit: resources: the request of each call names the route, the method and the own-session confirmation",
|
|
"unit: resources: an unknown operation and a body the host did not shape are refused",
|
|
"unit: resources: typed answers of the host keep their type for the page",
|
|
"unit: resources: the client of a stale answer is told it is stale",
|
|
"unit: resources: a typed read names the resource the person chose and the client sends it",
|
|
"unit: resources: a typed read always carries an operation identifier the owner accepts",
|
|
"unit: resources: the conversation header goes on a chat request that uses add-on tools, and only a well-formed one",
|
|
"unit: batch: typed rows become wire rows and an untouched optional column is left to its default",
|
|
"unit: batch: every cell error is named by row and column and nothing is sent",
|
|
"unit: batch: steps stay inside the add-on bounds",
|
|
"unit: batch: the selection toggles by row identifier and survives paging",
|
|
"unit: layout: Share is offered only where the installation has named accounts",
|
|
"unit: layout: a table with no rows offers Add rows once, in its empty state",
|
|
"unit: layout: a reader, or a table with no columns, is offered no Add rows",
|
|
"unit: errors: each answer of the host gets its own words and recovery",
|
|
"unit: codecs: text keeps what was typed, bounds it, and null is explicit",
|
|
"unit: codecs: integers are exact up to 64 bits and never silently rounded",
|
|
"unit: codecs: reals are finite numbers",
|
|
"unit: codecs: booleans are true, false or empty for an optional column",
|
|
"unit: codecs: datetimes are read as UTC and sent as RFC 3339",
|
|
"unit: codecs: an unknown column type is refused",
|
|
"unit: codecs: the editor round-trips stored values",
|
|
"unit: codecs: grid text and the unchanged-field test",
|
|
"unit: codecs: a datetime with a fraction of a second is not rewritten by editing another field",
|
|
"unit: codecs: datetimes are compared as instants and offsets are normalised",
|
|
"unit: filters: operators follow the column type",
|
|
"unit: filters: a leaf, a list and the null tests are built from typed values",
|
|
"unit: filters: a condition that cannot be sent is an error, never dropped",
|
|
"unit: query: the arguments are the tool schema and nothing else",
|
|
"unit: query: pages go forward by the add-on cursor and back by the ones kept",
|
|
"unit: query: a column header cycles ascending, descending and none",
|
|
"unit: i18n: every language of the host has every key of the English bundle and nothing else",
|
|
"unit: i18n: a translation keeps the placeholders of the English text and carries no markup",
|
|
"unit: build: the bundle is plain JavaScript that names nothing it does not define",
|
|
"unit: build: the module exports createAddon and imports nothing",
|
|
"unit: render: createAddon returns the page, the declared component, a chat action and dispose",
|
|
"unit: render: the list, one database and the picker draw their loading state without a host",
|
|
"unit: render: what the page read is emptied when the add-on is withdrawn, by signal and by dispose",
|
|
"unit: retry: a read that met an unavailable add-on is tried again and then succeeds",
|
|
"unit: retry: it gives the last error back after the bound and never loops",
|
|
"unit: retry: a refusal, a stale answer or an unknown outcome is never repeated",
|
|
"unit: retry: a withdrawn add-on stops the waiting and the reads",
|
|
"go: applies schema and row changes under the roles of the host, once per operation, with a receipt and no proposal",
|
|
"go: refuses crafted writes by a viewer, an editor's schema change, a revoked editor and an installation administrator",
|
|
"go: carries a UI change to the owner from a forwarding frontend and answers as the owner does",
|
|
"tables-ui: a new database is private to its owner and a second person sees nothing of it",
|
|
"tables-ui: the owner builds a schema and rows, shares by name and each role gets its own controls",
|
|
"tables-ui: typed editors, structured filters, sort, paging and bounded batches work on real rows",
|
|
"tables-ui: editing another column leaves a datetime with a fraction of a second byte-identical",
|
|
"tables-ui: a revoke while a person is editing denies the next save and the page says it is unavailable",
|
|
"tables-ui: an installation administrator sees no database of other people and has no data privilege",
|
|
"tables-ui: deleting a database shows the warnings, needs the typed name and removes data and shares",
|
|
"tables-ui: a tab of an older generation is denied after an upgrade and after a disable",
|
|
"tables-ui: the pages work by keyboard, at 400 pixels and in the light and dark themes",
|
|
"tables-ui: logging out clears what was read and the next person on the same tab sees none of it",
|
|
"tables-ui: in local-owner mode sharing is disabled and the owner still manages databases"
|
|
]
|
|
},
|
|
"tables-csv": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/tables_csv.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: artifacts: only a host identifier names a file, and the only link is the host route",
|
|
"unit: artifacts: the card offers a download only for a complete file that has not expired",
|
|
"unit: artifacts: sizes are written with a binary unit",
|
|
"unit: artifacts: a tool result keeps well formed identifiers of its own kind only, at most four",
|
|
"unit: export: the view becomes the arguments of the tool and nothing a page or a cursor",
|
|
"unit: export: the answer is a file, or the reason there is none",
|
|
"go: writes a header and one record per row with RFC 4180 quoting, UTF-8 and the documented value forms",
|
|
"go: prefixes text cells and labels that a spreadsheet would run, never numbers",
|
|
"go: honours columns, the row identifier column, filter, sort and the row limit of the query",
|
|
"go: reads one snapshot: writes that commit while the export streams are not in it, and are not blocked by it",
|
|
"go: streams a large table row by row with bounded memory",
|
|
"go: fails cleanly past the row or byte bound and keeps the bound finite by default",
|
|
"go: stops on cancellation, on its deadline and on a failing destination, and reports each",
|
|
"go: does not change the database it reads",
|
|
"go: answers with one operation-bound CSV output whose bytes the handle streams exactly once",
|
|
"go: refuses a handle from another user, another operation, another database or after expiry, and removes expired files",
|
|
"go: keeps a handle for a retry until the stream completed",
|
|
"go: reports a result past the limit as data without an output, and leaves no file",
|
|
"go: removes the staged file when the export fails and bounds what stays staged",
|
|
"go: is a read that needs the read action and refuses unknown fields and mutation arguments",
|
|
"go: serves the bytes on the protocol output route to the matching envelope only",
|
|
"go: exports a table with exact bytes and attachment headers over real HTTP and shows no one else the file",
|
|
"go: keeps a shared database's file private, applies the person's own filter and sort, and denies after the grant is withdrawn",
|
|
"go: serves the same bytes and headers through a forwarding frontend, and fails the same way for a stranger",
|
|
"go: answers a result past the export limit as data with no file",
|
|
"go: binds an output handle to its operation, person and database",
|
|
"go: fails a truncated, grown or vanished stream and never serves it",
|
|
"go: fails the transfer when the store cannot write, and when the source is revoked before completion",
|
|
"go: expires the file only, enforces the quota per person and leaves the database as it was",
|
|
"go: serves identical bytes and headers from every replica and denies every other way in",
|
|
"tables-artifacts: the person exports the view they see and downloads exact bytes with attachment headers",
|
|
"tables-artifacts: another person is denied exactly like an unknown file, shared or not",
|
|
"tables-artifacts: a viewer exports what they may read and withdrawing the share ends the download",
|
|
"tables-artifacts: a result past the export limit gives a message and no file",
|
|
"tables-artifacts: a person at the file quota is told so and no file is made",
|
|
"tables-artifacts: in local-owner mode the owner exports and downloads with no account",
|
|
"go: refuses columns-add under a write action, on preview and on apply",
|
|
"go: refuses databases-rename under a write action, on preview and on apply",
|
|
"go: refuses tables-create under a write action, on preview and on apply",
|
|
"go: refuses columns-add under the schema action with the wrong scope or no actor",
|
|
"go: refuses databases-rename under the schema action with the wrong scope or no actor",
|
|
"go: refuses tables-create under the schema action with the wrong scope or no actor",
|
|
"go: still previews and applies a schema change under the schema action",
|
|
"go: says in the receipt of a write that it can be undone, and reads and applies the undo",
|
|
"go: rejects a stale undo with a typed code and the words of what changed",
|
|
"go: rejects an unknown change as not_found and a repeated one as already_undone",
|
|
"go: refuses the undo under any other action or scope, and with no actor",
|
|
"go: does not preview the undo: it is applied against the revision the host just read"
|
|
]
|
|
},
|
|
"recovery": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/recovery.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: recovery: the owner's typed refusals keep their type and nothing else is invented",
|
|
"unit: recovery: the banner never reads an unknown state as ready",
|
|
"unit: recovery: upgrade progress follows the journaled phases",
|
|
"unit: recovery: the verification state is a word before it is a colour",
|
|
"unit: recovery: every refusal has words, and an unknown outcome keeps its own",
|
|
"unit: recovery: every locale carries the same recovery keys as English",
|
|
"unit: recovery: a restore needs a stopped add-on, the typed ID and, from another mode, an account",
|
|
"unit: recovery: a purge needs a scope and an add-on that is not running",
|
|
"unit: recovery: the client sends the operation as the confirmation header and types the refusals",
|
|
"go: backs up, publishes the package, migrates, checks health and publishes the generation in that order",
|
|
"go: undoes a failure at every journal phase before the publication and puts the old generation back on its own data",
|
|
"go: finishes an upgrade whose publication was made when a later step failed",
|
|
"go: applies one rule after a restart at any phase: unpublished is undone, published is finished",
|
|
"go: refuses a changed trusted identity and an older data format before it stops or writes anything",
|
|
"go: keeps the add-on unavailable in needs-recovery after a failed migration to a new format and retains the package and the recovery copy",
|
|
"go: restores the backup itself when a migration that keeps the format fails halfway",
|
|
"go: keeps a running add-on unavailable and recoverable when the backup cannot be verified at rollback",
|
|
"go: copies a WAL database consistently with a manifest, digests, restricted permissions and the owner state",
|
|
"go: holds admission and invalidates pending proposals for the add-on while it copies",
|
|
"go: reports a corrupt backup and refuses to use it",
|
|
"go: stops before copying when the storage is too small and leaves no partial backup",
|
|
"go: leaves no partial backup after a cancellation and starts the add-on again",
|
|
"go: starts the add-on again when the copy fails",
|
|
"go: keeps the only verified copy and the upgrade recovery copy under an explicit retention policy",
|
|
"go: never lets age or count remove the newest verified backup when retention is applied on demand",
|
|
"go: restores a local-owner backup to a named account through an explicit mapping",
|
|
"go: needs an administrator, the typed add-on ID, an explicit scope and an add-on that is not running",
|
|
"go: removes the data and its records but keeps the backups unless they are in the scope",
|
|
"go: touches no other add-on",
|
|
"go: finishes a purge that stopped after its journal was written",
|
|
"go: clears needs-recovery when the data it described is purged",
|
|
"go: refuses a backup when the policy cannot drain admitted work",
|
|
"go: refuses a backup of another add-on and touches neither data nor access",
|
|
"go: never lets a manual backup of half migrated data displace the pinned recovery copy",
|
|
"go: puts the data and the owner state back, warns about lost writes and keeps the replaced data as a recovery copy",
|
|
"go: counts the operations applied after the backup as lost writes",
|
|
"go: does not give back access that was taken away or whose account is gone",
|
|
"go: survives a restart that forgets the in-memory state: the revocation log is durable",
|
|
"go: refuses a running add-on, a stranger, an unknown backup and an invalid mapping without changing anything",
|
|
"go: refuses a backup of another trusted identity or of a newer data format",
|
|
"go: resumes or rolls back a restore that stopped at each phase, by one rule",
|
|
"go: holds the resources of one add-on and leaves another add-on alone",
|
|
"go: cancels admitted work and reports a drain that did not finish",
|
|
"go: restores grants through the account directory and the lowerings since the backup, never beyond them",
|
|
"go: keeps a bounded durable log of lowered access",
|
|
"go: keeps a revocation however many later lowerings of another person follow",
|
|
"go: restores the data but no access when the history may have lost a lowering",
|
|
"go: reads a store that is full of lowerings as one whose history may be cut",
|
|
"go: applies a lowering made after the export whatever time the backup is given",
|
|
"go: refuses a change that was authorized just before the hold began",
|
|
"go: cancels a pending proposal and leaves an executing one outcome-unknown after a restore",
|
|
"go: forgets the records of one add-on and no other",
|
|
"go: maps an owner on a restore to a local-owner store only when nothing named is in it",
|
|
"go: migrates the ownership of a stopped store with a backup and an explicit mapping and refuses a populated downgrade",
|
|
"go: records the current format of a new store and migrates nothing",
|
|
"go: migrates every database in its own transaction, records the version last and repeats as a no-op",
|
|
"go: leaves a database whose step fails exactly as it was and resumes on the next run",
|
|
"go: refuses data in a newer format, a downgrade and a version it has no path to, and writes nothing",
|
|
"go: makes a backup only for an administrator's own browser session and lists it",
|
|
"go: restores with warnings and does not give back a share that was revoked after the backup",
|
|
"go: restores only a backup of the add-on in the route and touches nothing otherwise",
|
|
"go: gives a forwarding frontend the same typed answers as the owner",
|
|
"go: purges only with the typed ID, a stopped add-on and an explicit scope, and touches nothing else",
|
|
"go: is never reachable by a model: no tool, no declared name and no route for an API key",
|
|
"go: upgrades an add-on with data through a backup and a migration and keeps its databases",
|
|
"go: undoes an upgrade whose package does not start and runs the old generation on its own data",
|
|
"go: hands retained data only to the same trusted source on a reinstall",
|
|
"go: documents every route and every emitted field in the Swagger spec, the instructions and the feature registry",
|
|
"recovery: an administrator backs up from the manage sheet and the backup is listed as verified",
|
|
"recovery: a person and a key cannot back up, restore or purge, and only the owner session of an administrator can",
|
|
"recovery: the restore dialog warns, asks for the typed ID and a restore does not give back a revoked share",
|
|
"recovery: a second backup, the sole recovery copy is kept and the keyboard reaches every action",
|
|
"recovery: the page shows a needs-recovery banner with restore and purge as the actions (status mocked)",
|
|
"recovery: a purge needs a scope, the typed ID and a stopped add-on, and removes the data and its shares"
|
|
]
|
|
},
|
|
"packaging": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/package_test.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"go: joins every enabled platform leg into one verified index",
|
|
"go: never creates a partial index when an enabled platform has no leg",
|
|
"go: refuses duplicate legs, local-check legs, other versions and extra platforms",
|
|
"go: refuses a merged layout that lost a platform after the merge",
|
|
"go: builds a deterministic platform layout with executable, ui and manifest layers",
|
|
"go: restores the validated executable mode on extraction",
|
|
"go: refuses a platform that the matrix has not enabled unless it is a local check",
|
|
"go: refuses an invalid version, an existing layout and an empty executable",
|
|
"go: rejects a package without its entrypoint",
|
|
"go: rejects a declared UI whose layer or files are missing",
|
|
"go: rejects a package without a required runtime library",
|
|
"go: rejects a manifest whose platform differs from the image",
|
|
"go: rejects an image config or annotation of another platform",
|
|
"go: rejects a manifest version that differs from the release version",
|
|
"go: rejects another artifact type",
|
|
"go: rejects unexpected layers, roles and layer media types",
|
|
"go: rejects an unexpected file in the executable layer",
|
|
"go: rejects a blob whose bytes differ from its digest",
|
|
"go: rejects a receipt that does not match the image",
|
|
"go: rejects invalid extraction permissions",
|
|
"go: rejects a UI file that is executable or outside the declared directory",
|
|
"go: rejects traversal paths, links and duplicates",
|
|
"go: rejects a UI that bundles its own React runtime",
|
|
"go: rejects an icon that is not an image of its type",
|
|
"go: rejects an invalid platform layout marker or index",
|
|
"go: moves development forward and leaves it alone for an older commit",
|
|
"go: accepts a diverged branch head and refuses one commit with two contents",
|
|
"go: moves latest only to a newer stable version",
|
|
"go: refuses reserved or foreign alias names and unpublished digests, leaving aliases unchanged",
|
|
"go: promotes a branch channel under its hashed name",
|
|
"go: treats a force-pushed branch as the new truth for a push to the same ref",
|
|
"go: blocks the alias for anything but a push to the channel's own ref",
|
|
"go: refuses development when its commit is unreachable, even for a push",
|
|
"go: fails on any git error that is not a plain not-ancestor answer",
|
|
"go: tells an unreachable commit from a plain not-ancestor",
|
|
"go: accepts the add-on namespace and refuses every other go-skynet repository",
|
|
"go: reads a YAML list and refuses JSON, unknown fields and a second document",
|
|
"go: refuses missing and backend repositories before any request",
|
|
"go: pushes platform digests then the index, and a retry is digest-identical",
|
|
"go: rejects overwriting an immutable version with different content",
|
|
"go: adopts published content only for the same version and commit",
|
|
"go: refuses reserved aliases and mismatched tags as immutable tags",
|
|
"go: publishes nothing from a partial or local-check layout",
|
|
"go: fails closed when no platform is enabled, the file is absent or empty",
|
|
"go: rejects enabled platforms without a native runner or check, duplicates and unknown fields",
|
|
"go: prints the enabled platforms with their native runners",
|
|
"go: renders digest-pinned entries with an explicit add-on signer identity",
|
|
"go: renders an entry for every first-party add-on from its own template",
|
|
"go: refuses missing inputs, backend repositories, bad channels and unknown placeholders",
|
|
"go: carries placeholders only: no fabricated URL, registry or namespace",
|
|
"go: never publishes from a pull request, whatever the ref",
|
|
"go: maps master alone to development and publishes the commit tag",
|
|
"go: never publishes from a branch push, whatever the branch is named",
|
|
"go: keeps reserved names out of the branch namespace",
|
|
"go: separates refs that normalize to the same label",
|
|
"go: bounds empty, Unicode and very long branch names",
|
|
"go: lets a tag push prepare the immutable version and never move latest",
|
|
"go: promotes latest only for a published, stable, non-draft release",
|
|
"go: rejects unknown events and a malformed commit",
|
|
"go: prints the decision as key=value lines",
|
|
"go: accepts the checked-in workflow",
|
|
"go: rejects pull_request_target",
|
|
"go: rejects secrets in a pull request validation job",
|
|
"go: rejects id-token write outside the publishing job",
|
|
"go: rejects a registry login or publish in an untrusted job",
|
|
"go: rejects publish that does not wait for every platform leg",
|
|
"go: rejects publish that can run after a failed leg",
|
|
"go: rejects publish that does not need validate",
|
|
"go: rejects a package leg that does not need validate",
|
|
"go: rejects a validate job that cannot stop the release",
|
|
"go: rejects a package or promote job that runs after a failed validate",
|
|
"go: keeps validate unprivileged on every event",
|
|
"go: rejects promotion that does not wait for signing",
|
|
"go: rejects alias promotion before signing",
|
|
"go: rejects an alias command inside the publishing job",
|
|
"go: rejects a literal latest tag",
|
|
"go: rejects backend registries and backend workflows",
|
|
"go: rejects a signer identity that is a pattern or the backend workflow",
|
|
"go: rejects signing by tag or without referrers and the new bundle format",
|
|
"go: rejects missing serialization per channel",
|
|
"go: rejects publication that is shared between add-ons",
|
|
"go: rejects a workflow that names one add-on by path or skips an add-on in the matrix",
|
|
"go: rejects a plan that does not refuse an add-on without an enabled platform",
|
|
"go: rejects a plan that does not fail closed on missing configuration",
|
|
"go: rejects a plan that does not exit 1 for an add-on without an enabled platform on a publishing event",
|
|
"go: rejects a plan that treats any matrix error as no legs",
|
|
"go: rejects a publish or promote matrix that stops the other add-ons on a failure",
|
|
"go: rejects a publish job that downloads the layouts of other add-ons",
|
|
"go: rejects a promote job that does not check the digest format",
|
|
"go: fails on a publishing event when an add-on has no enabled platform",
|
|
"go: publishes when every add-on has an enabled platform",
|
|
"go: gives an add-on without an enabled platform no legs on an event that publishes nothing",
|
|
"go: fails on a missing or malformed platform file on every event",
|
|
"go: rejects a checkout of the pull request head or a persisted token",
|
|
"go: rejects write permission at workflow level and a literal platform matrix",
|
|
"go: rejects a publishing job without an environment or a gate",
|
|
"go: does not trust the backend workflow identity in the documented verification",
|
|
"go: installs the package built by package.sh and starts its executable",
|
|
"go: is refused when the signature carries another workflow identity",
|
|
"go: is refused when the owner policy names the backend workflow",
|
|
"go: is refused when the pinned digest is not the published image",
|
|
"go: gives identical digests for two builds of the same inputs",
|
|
"go: refuses a platform the matrix does not enable and a missing executable of another platform",
|
|
"package.sh builds and verifies a local check layout",
|
|
"package.sh refuses a platform the matrix has not enabled",
|
|
"package.sh refuses an existing non-empty layout",
|
|
"package.sh requires its arguments",
|
|
"package.sh refuses an invalid version",
|
|
"package.sh builds and verifies the voice add-on for the host",
|
|
"package.sh refuses a foreign platform without an executable: tables",
|
|
"package.sh refuses a foreign platform without an executable: voice",
|
|
"package.sh refuses a foreign platform without an executable: face",
|
|
"package.sh refuses a foreign platform without an executable: fine-tuning",
|
|
"package.sh refuses a foreign platform without an executable: quantization",
|
|
"package.sh refuses a foreign platform without an executable: studio",
|
|
"package.sh refuses a foreign platform without an executable: talk",
|
|
"package.sh refuses a foreign platform without an executable: telegram",
|
|
"package.sh refuses a foreign platform without an executable: slack",
|
|
"package.sh refuses a foreign platform without an executable for every add-on",
|
|
"package.sh builds Tables with cgo and the pure Go add-ons without",
|
|
"matrix fails closed while no platform is enabled",
|
|
"matrix fails closed without a file",
|
|
"channel.sh: a pull request never publishes",
|
|
"channel.sh: master publishes development",
|
|
"channel.sh: a branch push never publishes, even a branch named latest",
|
|
"channel.sh: a tag push prepares the version and moves no alias",
|
|
"channel.sh: a published stable release promotes latest",
|
|
"channel.sh: a pre-release never promotes latest",
|
|
"channel.sh: a draft release fails",
|
|
"channel.sh: an unknown event fails",
|
|
"channel.sh: a tag that is not a version fails",
|
|
"workflow policy accepts the checked-in workflow",
|
|
"workflow policy rejects pull_request_target",
|
|
"workflow policy rejects a publish job that does not wait for every leg",
|
|
"workflow policy rejects a validate job that cannot stop the release",
|
|
"scripts never push, tag, sign or log in",
|
|
"packaging files never reference backend registries or workflows",
|
|
"go: adds the tool fields to an existing index from the repository manifests, and changes nothing else",
|
|
"go: caps the tool names at MaxEntryTools and keeps the full count",
|
|
"go: declares and packages a loadable, receipt-verified skill without shadows",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: enables a platform exactly when its native check is recorded",
|
|
"go: gives promote an add-on matrix",
|
|
"go: gives publish an add-on matrix",
|
|
"go: hands the guest image digest of the sandbox-image job to the package leg",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has a catalog template",
|
|
"go: has consistent package files for face",
|
|
"go: has consistent package files for fine-tuning",
|
|
"go: has consistent package files for office",
|
|
"go: has consistent package files for quantization",
|
|
"go: has consistent package files for sandbox",
|
|
"go: has consistent package files for slack",
|
|
"go: has consistent package files for studio",
|
|
"go: has consistent package files for tables",
|
|
"go: has consistent package files for talk",
|
|
"go: has consistent package files for telegram",
|
|
"go: has consistent package files for voice",
|
|
"go: has consistent package files for web",
|
|
"go: has no hard-coded add-on path",
|
|
"go: lays the skills of the add-on in their own layer and verifies them with the install rules",
|
|
"go: lets only the release-index job write the contents of the repository",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists every release platform with its runner",
|
|
"go: lists the add-ons in the validate matrix",
|
|
"go: lists the built-in skills an add-on replaces",
|
|
"go: lists the built-in tools an add-on replaces after its tools",
|
|
"go: loops the plan over the same list",
|
|
"go: publishes every add-on to the one documented repository, with its id as the tag prefix",
|
|
"go: refuses --from-manifest for a pinned channel or together with a merged layout",
|
|
"go: refuses to build when the skills folder and the manifest disagree, or a skill breaks a rule",
|
|
"go: rejects a missing skill, mismatched frontmatter, and scripts",
|
|
"go: rejects a repository rule that derives a repository for each add-on",
|
|
"go: renders the development channel as mutable entries: the moving tag, no digest",
|
|
"go: renders the development entries of every enabled platform from the manifest, without a package",
|
|
"go: reports the chat tools of the manifest on each entry and not the admin tools",
|
|
"go: ships a checked-in Tables matrix with at least one enabled platform",
|
|
"go: takes the package legs from the plan",
|
|
"package.sh passes SANDBOX_GUEST_IMAGE to the linker",
|
|
"package.sh refuses a foreign platform without an executable: office",
|
|
"package.sh refuses a foreign platform without an executable: sandbox",
|
|
"package.sh refuses a foreign platform without an executable: web",
|
|
"package.sh refuses a guest image that is not by digest",
|
|
"package.sh refuses a sandbox release build without SANDBOX_GUEST_IMAGE",
|
|
"package.sh stamps the sandbox executable with a guest image in a local check"
|
|
]
|
|
},
|
|
"updates": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/updates.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"unit: updates: a failed, unknown or unreadable check is never current",
|
|
"unit: updates: an upgrade is offered only for a candidate the owner confirmed, with a digest to pin",
|
|
"unit: updates: the owner's typed refusals keep their type and are final answers",
|
|
"unit: updates: the apps list marks an update beside the process state, never in place of it",
|
|
"unit: updates: times are shown as the reader's own and a bad time as nothing",
|
|
"unit: updates: the client sends check and upgrade as the administrator's own action and types the refusals",
|
|
"unit: updates: every locale carries the same update keys as English, and words for every state, reason and refusal",
|
|
"go: offers a digest-only change of the branch-fix-cache channel with an identical version label",
|
|
"go: offers a digest-only change of the development channel with an identical version label",
|
|
"go: offers a digest-only change of the latest channel with an identical version label",
|
|
"go: is up to date when the channel resolves to the installed digest",
|
|
"go: never switches the channel: another channel and other versions are not offered",
|
|
"go: selects the highest compatible greater version of the same major",
|
|
"go: does not cross a major version",
|
|
"go: does not move a stable install to a pre-release and orders pre-releases below their release",
|
|
"go: treats a lower version as nothing to offer",
|
|
"go: reports the same digest as up to date",
|
|
"go: reports a rewritten immutable version as an integrity error, never an update",
|
|
"go: never reports an update it cannot pin to a digest",
|
|
"go: offers the build the tag names now when it moved, pinned to its digest",
|
|
"go: is up to date when the tag still names the installed build",
|
|
"go: resolves the tag only on an explicit check, and the status read reuses that answer",
|
|
"go: reports a tag that cannot be resolved as check-failed, never as an update",
|
|
"go: resolves the tag again at execution, so the upgrade pins what the tag names then",
|
|
"go: names the host, SDK and data format ranges a candidate does not fit",
|
|
"go: refuses a candidate whose data format ends below the installed one",
|
|
"go: reports a platform that is not offered, and prefers the compatible version over a newer incompatible one",
|
|
"go: does not check the SDK range of a candidate that declares no UI",
|
|
"go: reports a failed library as check-failed with the last success, never as up to date",
|
|
"go: names an unavailable source credential and an unreachable library by class",
|
|
"go: reports an add-on the library no longer lists as check-failed",
|
|
"go: returns an error for an add-on that is not installed and for a canceled caller",
|
|
"go: answers a status read from the cache and never evaluates or fetches",
|
|
"go: serves a fresh answer from the cache and evaluates again when it is stale",
|
|
"go: marks a cached answer older than the time to live as stale",
|
|
"go: refreshes the library only on an explicit refresh and applies nothing",
|
|
"go: limits explicit refreshes to one per interval and says so",
|
|
"go: shares one check among concurrent callers",
|
|
"go: never lets an explicit refresh join a plain evaluation that is already in flight",
|
|
"go: keeps the work of a canceled caller from spoiling the answer of the others",
|
|
"go: bounds the cache and forgets the answer of a replaced package",
|
|
"go: redacts the library, channel and digests for a caller who is not an administrator",
|
|
"go: keeps the compatibility hint of an entry and refuses a malformed range",
|
|
"go: lists the releases of one add-on for every platform, from the cache, and refuses a failed library",
|
|
"go: names an unavailable credential reference as a credential failure inside the refresh failure",
|
|
"go: reports a digest-only change of a moving channel, applies nothing and offers the pinned upgrade",
|
|
"go: refuses a second operation ID for the same transition, in flight or done, and applies it once",
|
|
"go: runs concurrent requests with one operation ID once and gives each the same answer",
|
|
"go: serializes conflicting upgrades by the installed digest and refuses the loser without a record",
|
|
"go: refuses a candidate that is not the one the library resolves now",
|
|
"go: refuses an upgrade to the digest that is already installed",
|
|
"go: rechecks compatibility at execution and refuses an incompatible candidate",
|
|
"go: selects a newer immutable version and treats a rewritten version as an integrity error",
|
|
"go: keeps the last good generation when the candidate cannot be staged",
|
|
"go: never switches the library or channel, and a failed check is never up to date",
|
|
"go: lets an administrator refresh and everyone with the feature read a redacted status",
|
|
"go: shows the pending update in the apps list from the cache only",
|
|
"go: does not accept pins without an update checker or on another action",
|
|
"go: keeps the unpinned typed upgrade of an earlier release working",
|
|
"go: is offered when the tag moved, pinned to the build the tag names, and upgrades to exactly that build",
|
|
"go: refuses the upgrade when the tag moved again after the check, and installs nothing",
|
|
"go: gives every caller with the feature the same status from every frontend, redacted for non-administrators",
|
|
"go: checks only for an administrator's own browser session, and applies nothing",
|
|
"go: upgrades only to the checked candidate, with the same typed refusals from every frontend, and never twice",
|
|
"go: runs two concurrent upgrades from two frontends once: the same ID shares the answer, another ID is a conflict",
|
|
"go: refuses an incompatible candidate and a library that cannot be read, with a typed answer",
|
|
"go: reports a lost upgrade as an unknown outcome with its original operation, and a lost status read or check as plainly unavailable",
|
|
"go: keeps the update actions out of the tools and names every field of the status in the Swagger spec",
|
|
"updates: a library with nothing newer is up to date, and a member sees no update mark",
|
|
"updates: a moved channel with the same version label is an update, in the list and as a pending mark",
|
|
"updates: a member, a key and an outsider cannot check or upgrade",
|
|
"updates: the dialog names the library, versions and digests, a cancel sends nothing, and the upgrade backs up and keeps the data",
|
|
"updates: two requests for the same transition under different operations run it once",
|
|
"updates: a page that is behind cannot upgrade over a newer installed package",
|
|
"updates: a candidate this host cannot run shows its reason and has no upgrade",
|
|
"updates: an unreachable library is a failed check, never up to date, and says when it was last read",
|
|
"updates: on a narrow screen the check is reachable and runs from the keyboard",
|
|
"go: ends the checks in flight when it is closed and refuses new ones",
|
|
"go: always names the candidate digest of an update, so the upgrade has something to pin",
|
|
"go: keeps a stale cached notice readable while a plain check says the update is gone"
|
|
]
|
|
},
|
|
"tables-acceptance": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/tables_acceptance.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"go: reports an update only on a check, shows a member no digest, refuses a key and applies one pinned candidate with the data and grants kept",
|
|
"go: refuses a change prepared on an old schema or data revision from two tabs of two people and applies nothing",
|
|
"go: replays an operation ID as one receipt from every node, conflicts on a different request and never applies twice or under a new ID",
|
|
"go: settles a revocation that races a confirmation: one outcome, applied at most once, and no work after the revocation",
|
|
"go: separates owner, editor, viewer, administrator and stranger across the browser routes, the REST routes and the chat tool consumer",
|
|
"go: derives the action of a proposal from the tool kind, so an editor cannot confirm a schema change as a write",
|
|
"go: serves the browser module to every account with the feature and to nobody else, from the owner and each frontend",
|
|
"go: fails every blocked consumer explicitly and never serves add-on tools to it",
|
|
"go: is the administrator's own action on every node and never a key's, a member's or a tool's",
|
|
"go: refuses a corrupt backup and a restore that is not allowed, and leaves the data as it was",
|
|
"go: restores a verified backup: the data goes back, the add-on starts again and access follows the current accounts",
|
|
"go: denies the open tabs of a disabled add-on everywhere and serves them again, with the same data, when it is enabled",
|
|
"go: keeps data and grants when the add-on is removed and installed again, and refuses what the old generation prepared",
|
|
"go: denies the next call of a paused key on every node and accepts it again when resumed",
|
|
"go: denies the browser, the key and the chat everywhere when the add-ons feature is withdrawn",
|
|
"go: lowers an editor to a viewer for the next call everywhere and drops the proposals the editor still held",
|
|
"go: refuses the session and the key of a disabled account on every node",
|
|
"go: ignores actor, forwarding and authority headers and fields on every node",
|
|
"go: denies authority, role and approval fields in the arguments of every consumer and creates nothing",
|
|
"go: applies a proposal only on the confirmation of the proposer's own tab, with its digest, exactly once",
|
|
"go: keeps every acknowledged change and applies no change twice when the Tables process is killed in the middle of a batch",
|
|
"go: keeps every acknowledged change and applies no change twice when the owner is killed in the middle of a batch and restarted",
|
|
"go: blocks every other write while a confirmation is unresolved, keeps reading, and accepts writes again only after the owner role resolves it",
|
|
"go: fails every response type closed with the same typed answer from both frontends, runs nothing there and serves everything again after the restart",
|
|
"go: exports a CSV through a frontend and serves the same bytes from every node to its requester only",
|
|
"go: stops the downloads of a person whose access to the database was revoked, on every node, and keeps the owner's",
|
|
"go: denies downloads while the add-on is disabled and serves a complete file again when it is enabled",
|
|
"go: answers the refusal as invalid_request with status 400 on every route and node and changes nothing",
|
|
"go: does not consume the operation ID of a refused change",
|
|
"go: denies an expired file identically from every node and leaves the data and the backups untouched",
|
|
"go: withdraws a transfer held in flight when the add-on is disabled and leaves no downloadable file",
|
|
"go: reports a change that committed and lost its answer as unknown, finds it by receipt and replays the same receipt once",
|
|
"tables-acceptance: a member opens the databases and a grid through each non-owner frontend and the module comes from the owner by digest",
|
|
"tables-acceptance: deep links keep the proxy path prefix on a non-owner frontend and survive a reload",
|
|
"tables-acceptance: the grid works by keyboard, at 400 pixels and in both themes on a non-owner frontend",
|
|
"tables-acceptance: the page says it is unavailable while the owner is gone and recovers on reload when it is back",
|
|
"manifest: the evidence manifest names the platform, the commands, the package digests and every case"
|
|
]
|
|
},
|
|
"library-sources": {
|
|
"kind": "shell",
|
|
"commands": [
|
|
[
|
|
"sh",
|
|
"scripts/addons/library_ui.sh"
|
|
]
|
|
],
|
|
"cases": [
|
|
"each page lists only its own kind, with a Default badge and no kind filter",
|
|
"adds a model source of your own, which has no Default badge and stays after a reload",
|
|
"turns a default off and removes it: it stays listed as removed, and restoring brings it back",
|
|
"shows the conflict message the store gives next to the source that clashes",
|
|
"turning it off hides the default galleries and shows the defaults as off, and on brings them back"
|
|
]
|
|
}
|
|
}
|