diff --git a/scripts/addons/prerequisites_test.sh b/scripts/addons/prerequisites_test.sh index c46979e7d..c1a65f98a 100644 --- a/scripts/addons/prerequisites_test.sh +++ b/scripts/addons/prerequisites_test.sh @@ -135,10 +135,15 @@ reject contracts-empty 'Ginkgo report' env PATH="$fixture/bin:$PATH" FIXTURE_REP reject contracts-skipped 'Ginkgo report' env PATH="$fixture/bin:$PATH" FIXTURE_REPORT='[{"SuiteSucceeded":true,"SpecReports":[{"State":"skipped","LeafNodeType":"It","LeafNodeText":"sqlite transaction"}]}]' sh "$verify" contracts # Every gateway report is mandatory, including a missing second report. cat > "$fixture/scripts/addons/suites.json" <<'JSON' -{"gateway":{"kind":"ginkgo","commands":[["go","test","-count=1","-tags","auth","./fixture"]],"cases":["sqlite transaction","http"],"report":".cache/report.json","reports":[{"path":".cache/report.json","cases":["sqlite transaction"]},{"path":".cache/second.json","cases":["http"]}]}} +{"gateway":{"kind":"ginkgo","commands":[["go","test","-count=1","-tags","auth","./fixture"]],"report":".cache/report.json","reports":[{"path":".cache/report.json","cases":["sqlite transaction"]},{"path":".cache/second.json","cases":["http"]}]}} JSON reject gateway-missing-report 'Ginkgo report' env PATH="$fixture/bin:$PATH" FIXTURE_REPORT='[{"SuiteSucceeded":true,"SpecReports":[{"State":"passed","LeafNodeType":"It","LeafNodeText":"sqlite transaction"}]}]' sh "$verify" gateway reject gateway-skipped-report 'Ginkgo report' env PATH="$fixture/bin:$PATH" FIXTURE_REPORT='[{"SuiteSucceeded":true,"SpecReports":[{"State":"skipped","LeafNodeType":"It","LeafNodeText":"sqlite transaction"}]}]' sh "$verify" gateway +# The same cases listed at the top level and per report would drift apart. +cat > "$fixture/scripts/addons/suites.json" <<'JSON' +{"gateway":{"kind":"ginkgo","commands":[["go","test","-count=1","-tags","auth","./fixture"]],"cases":["sqlite transaction"],"report":".cache/report.json","reports":[{"path":".cache/report.json","cases":["sqlite transaction"]}]}} +JSON +reject cases-listed-twice 'lists its cases twice' env PATH="$fixture/bin:$PATH" sh "$verify" gateway # Pin/browser setup fixtures never build or download: make their disk # prerequisite deterministic without bypassing the real preparation gate. cat > "$fixture/bin/df" <<'TOOL' diff --git a/scripts/addons/suites.json b/scripts/addons/suites.json index 83fa22eff..92153ec10 100644 --- a/scripts/addons/suites.json +++ b/scripts/addons/suites.json @@ -37,6 +37,7 @@ "contracts-skipped", "gateway-missing-report", "gateway-skipped-report", + "cases-listed-twice", "ui-report-failed", "ui-report-skipped", "ui-report-flaky", @@ -132,435 +133,6 @@ "-ginkgo.json-report=.cache/addons/logs/contracts-architecture.json" ] ], - "cases": [ - "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", - "validates every enum pair and normalizes nonavailable isolation", - "missing isolation", - "missing readiness", - "bad readiness", - "bad isolation", - "duplicate", - "unknown field", - "outputs", - "trailing", - "null", - "null explanation", - "empty explanation", - "oversized explanation", - "markup", - "control", - "direction", - "oversized payload", - "bridges validation into the existing pure model boundary", - "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", - "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", - "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", - "accepts a read tool that names no resource", - "still accepts a read tool that requires its resource", - "refuses a read tool that offers the resource without requiring it", - "refuses a write or schema tool without a resource", - "still accepts a write or schema tool that requires its resource", - "keeps a create tool free of the resource argument", - "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", - "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", - "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", - "has the same IDs as the registry of the React UI", - "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", - "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 replaceable skills and tools apart, so one pin map holds both", - "cuts a long name on a character boundary", - "Explanation markup", - "Readiness override", - "uppercase enums", - "Explanation control", - "Explanation oversized", - "benign explanation alias", - "isolation override", - "Alias empty", - "Label null", - "ID override", - "Page variant", - "Icon variant", - "provider Tools", - "provider StatusTool", - "provider mixed duplicate", - "operation Required", - "operation Optional", - "operation mixed duplicate", - "provider entry variant", - "provider entry mixed duplicate", - "operations entry variant", - "operations entry mixed duplicate", - "commands entry variant", - "commands entry mixed duplicate", - "preserves arbitrary valid locale keys at the localized map boundary", - "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", - "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", - "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 independent service tool page and chat capabilities", - "requires the existence tool of an addon whose resources are created or deleted", - "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", - "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", - "reserves the segments of the navigation routes", - "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", - "preserves all three declarations through manifest and capability echo", - "keeps old manifests free of extension keys", - "bounds commands and operation requests at their declared limits", - "accepts localized string labels, packaged icons and explicit non-navigation pages", - "root enum excludes objects", - "root required property excludes empty objects", - "root type excludes objects", - "optional constrained properties accept empty objects", - "keywords for other types do not constrain objects", - "non bash execution tool", - "empty optional alias", - "null optional alias", - "empty optional page", - "null optional label", - "empty optional icon", - "unknown command key", - "duplicate command key", - "invalid alias", - "missing id", - "duplicate id", - "undeclared page", - "no default destination", - "foreign icon", - "long label", - "bad locale", - "markup label", - "duplicate locale", - "status schema open", - "status wrong kind", - "empty provider", - "unknown execution tool", - "duplicate execution binding", - "same status binding", - "non UI status", - "status required input", - "status resource", - "empty requests", - "duplicate requests", - "wildcard request", - "unknown request key", - "audits actual host calls and strict package contract for face", - "audits actual host calls and strict package contract for fine-tuning", - "audits actual host calls and strict package contract for office", - "audits actual host calls and strict package contract for quantization", - "audits actual host calls and strict package contract for sandbox", - "audits actual host calls and strict package contract for slack", - "audits actual host calls and strict package contract for studio", - "audits actual host calls and strict package contract for tables", - "audits actual host calls and strict package contract for talk", - "audits actual host calls and strict package contract for telegram", - "audits actual host calls and strict package contract for voice", - "audits actual host calls and strict package contract for web", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "lists every release platform with its runner", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "enables a platform exactly when its native check is recorded", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "has a catalog template", - "publishes every add-on to the one documented repository, with its id as the tag prefix", - "fails on a publishing event when an add-on has no enabled platform", - "publishes when every add-on has an enabled platform", - "gives an add-on without an enabled platform no legs on an event that publishes nothing", - "fails on a missing or malformed platform file on every event", - "joins every enabled platform leg into one verified index", - "never creates a partial index when an enabled platform has no leg", - "refuses duplicate legs, local-check legs, other versions and extra platforms", - "refuses a merged layout that lost a platform after the merge", - "renders digest-pinned entries with an explicit add-on signer identity", - "renders the development channel as mutable entries: the moving tag, no digest", - "renders the development entries of every enabled platform from the manifest, without a package", - "refuses --from-manifest for a pinned channel or together with a merged layout", - "renders an entry for every first-party add-on from its own template", - "reports the chat tools of the manifest on each entry and not the admin tools", - "caps the tool names at MaxEntryTools and keeps the full count", - "lists the built-in skills an add-on replaces", - "lists the built-in tools an add-on replaces after its tools", - "adds the tool fields to an existing index from the repository manifests, and changes nothing else", - "refuses missing inputs, backend repositories, bad channels and unknown placeholders", - "carries placeholders only: no fabricated URL, registry or namespace", - "reads a YAML list and refuses JSON, unknown fields and a second document", - "has no hard-coded add-on path", - "lists the add-ons in the validate matrix", - "gives promote an add-on matrix", - "gives publish an add-on matrix", - "takes the package legs from the plan", - "loops the plan over the same list", - "has consistent package files for face", - "has consistent package files for fine-tuning", - "has consistent package files for office", - "has consistent package files for quantization", - "has consistent package files for sandbox", - "has consistent package files for slack", - "has consistent package files for studio", - "has consistent package files for tables", - "has consistent package files for talk", - "has consistent package files for telegram", - "has consistent package files for voice", - "has consistent package files for web", - "refuses missing and backend repositories before any request", - "pushes platform digests then the index, and a retry is digest-identical", - "rejects overwriting an immutable version with different content", - "adopts published content only for the same version and commit", - "refuses reserved aliases and mismatched tags as immutable tags", - "publishes nothing from a partial or local-check layout", - "fails closed when no platform is enabled, the file is absent or empty", - "rejects enabled platforms without a native runner or check, duplicates and unknown fields", - "prints the enabled platforms with their native runners", - "ships a checked-in Tables matrix with at least one enabled platform", - "moves development forward and leaves it alone for an older commit", - "accepts a diverged branch head and refuses one commit with two contents", - "treats a force-pushed branch as the new truth for a push to the same ref", - "blocks the alias for anything but a push to the channel's own ref", - "refuses development when its commit is unreachable, even for a push", - "fails on any git error that is not a plain not-ancestor answer", - "tells an unreachable commit from a plain not-ancestor", - "moves latest only to a newer stable version", - "refuses reserved or foreign alias names and unpublished digests, leaving aliases unchanged", - "promotes a branch channel under its hashed name", - "accepts the checked-in workflow", - "rejects pull_request_target", - "rejects secrets in a pull request validation job", - "rejects id-token write outside the publishing job", - "lets only the release-index job write the contents of the repository", - "hands the guest image digest of the sandbox-image job to the package leg", - "rejects a registry login or publish in an untrusted job", - "rejects publish that does not wait for every platform leg", - "rejects publish that can run after a failed leg", - "rejects publish that does not need validate", - "rejects a package leg that does not need validate", - "rejects a validate job that cannot stop the release", - "rejects a package or promote job that runs after a failed validate", - "keeps validate unprivileged on every event", - "rejects promotion that does not wait for signing", - "rejects alias promotion before signing", - "rejects an alias command inside the publishing job", - "rejects a literal latest tag", - "rejects backend registries and backend workflows", - "rejects a signer identity that is a pattern or the backend workflow", - "rejects signing by tag or without referrers and the new bundle format", - "rejects missing serialization per channel", - "rejects publication that is shared between add-ons", - "rejects a workflow that names one add-on by path or skips an add-on in the matrix", - "rejects a plan that does not refuse an add-on without an enabled platform", - "rejects a plan that does not exit 1 for an add-on without an enabled platform on a publishing event", - "rejects a plan that treats any matrix error as no legs", - "rejects a repository rule that derives a repository for each add-on", - "rejects a publish or promote matrix that stops the other add-ons on a failure", - "rejects a publish job that downloads the layouts of other add-ons", - "rejects a promote job that does not check the digest format", - "rejects a plan that does not fail closed on missing configuration", - "rejects a checkout of the pull request head or a persisted token", - "rejects write permission at workflow level and a literal platform matrix", - "rejects a publishing job without an environment or a gate", - "does not trust the backend workflow identity in the documented verification", - "loads exactly the historical grants through the actual host loader", - "explicitly selects the shipped policy in the final Docker runtime stage", - "accepts the add-on namespace and refuses every other go-skynet repository", - "rejects a package without its entrypoint", - "rejects a declared UI whose layer or files are missing", - "rejects a package without a required runtime library", - "rejects a manifest whose platform differs from the image", - "rejects an image config or annotation of another platform", - "rejects a manifest version that differs from the release version", - "rejects another artifact type", - "rejects unexpected layers, roles and layer media types", - "rejects an unexpected file in the executable layer", - "rejects a blob whose bytes differ from its digest", - "rejects a receipt that does not match the image", - "rejects invalid extraction permissions", - "rejects a UI file that is executable or outside the declared directory", - "rejects traversal paths, links and duplicates", - "rejects a UI that bundles its own React runtime", - "rejects an icon that is not an image of its type", - "rejects an invalid platform layout marker or index", - "lays the skills of the add-on in their own layer and verifies them with the install rules", - "refuses to build when the skills folder and the manifest disagree, or a skill breaks a rule", - "builds a deterministic platform layout with executable, ui and manifest layers", - "restores the validated executable mode on extraction", - "refuses a platform that the matrix has not enabled unless it is a local check", - "refuses an invalid version, an existing layout and an empty executable", - "never publishes from a pull request, whatever the ref", - "maps master alone to development and publishes the commit tag", - "never publishes from a branch push, whatever the branch is named", - "keeps reserved names out of the branch namespace", - "separates refs that normalize to the same label", - "bounds empty, Unicode and very long branch names", - "lets a tag push prepare the immutable version and never move latest", - "promotes latest only for a published, stable, non-draft release", - "rejects unknown events and a malformed commit", - "prints the decision as key=value lines", - "keeps official addon identities out of generic CLI and config policy code", - "keeps provider and Home dispatch independent of official addon IDs", - "bounds model actions to one mapping per supported capability", - "declares only owning model actions for existing addon destinations", - "round trips declared model destinations without changing protocol or SDK", - "accepts SDK route segment and combined path boundaries", - "unknown field", - "duplicate field", - "case field", - "case page", - "case path", - "duplicate capability", - "missing page", - "undeclared page", - "unknown capability", - "native chat", - "native completion", - "aggregate LLM", - "any capability", - "noncanonical capability", - "absolute", - "URL", - "traversal", - "dot", - "encoded traversal", - "query", - "hash", - "backslash", - "empty segment", - "trailing slash", - "empty path", - "null path", - "long segment", - "too many segments", - "long combined route", - "rejects noncanonical modelActions entry keys and duplicate keys", - "wrong object", - "additional properties true", - "additional properties absent", - "required", - "enum", - "unknown schema keyword", - "malformed required", - "resource", - "admin", - "status uiOnly", - "status kind", - "action uiOnly", - "action kind", - "shadow", - "accepts empty arguments with optional property constraints", - "refuses protected or reserved plain names, whatever the add-on id", - "keeps embedded names protected or reserved without requiring a slot fallback", - "does not promise a core fallback for document provider names", - "packages all four document slots with the actual validator and no core fallback", - "proves every source block and local reference without Git or network", - "installs unchanged PDF helpers and their license with a build-time fixture check", - "declares and packages a loadable, receipt-verified skill without shadows", - "rejects a missing skill, mismatched frontmatter, and scripts" - ], "report": ".cache/addons/logs/contracts.json", "reports": [ { @@ -1317,103 +889,6 @@ "-ginkgo.json-report=../../../.cache/addons/logs/runtime-protocol.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", - "requires exact typed capability equality on authenticated registration health", - "keeps all typed declarations on automatic crash restart with a fresh incarnation", - "replays typed and legacy receipts across process restarts", - "refuses missing wire tool discriminators before any read", - "serializes exact identity admission with withdrawal and never dispatches the replacement", - "cannot observe a restarted same-generation process through the captured client", - "rejects output handles before they can reach storage or output-open", - "settles callback denial as failure even if the addon returns a valid positive payload", - "cleans up after cancellation and rejects repeat correlation", - "keeps an ordinary concurrent read authorized while an observation is pending", - "error", - "malformed/artifact payload", - "success", - "timeout", - "cancels an admitted observation when the runtime withdraws", - "encodes a payload", - "reads the tool of a request", - "empty tool", - "no tool", - "not an object", - "no arguments", - "decodes arguments into a closed struct", - "unknown field", - "trailing value", - "wrong type", - "bad request", - "too large", - "not found", - "conflict", - "feature", - "scope", - "keeps any other failure as it is", - "ends the context when the owner closes the startup channel, so Run can return", - "serves /act for a runtime that implements ActRuntime, under the act scope only", - "has no /act for a runtime that does not act", - "serves /connector for a runtime that implements ConnectorRuntime, behind the incarnation credential", - "answers a refusal of the add-on as a bad request", - "has no /connector for a runtime that carries no connector", - "refuses without the protocol flag and builds no runtime", - "echoes model actions and typed declarations together separately and absent over authenticated health", - "sends the reason of a bad request on, so the owner can tell the person what to fix", - "keeps the plain answer for a bad request without a reason", - "closes the runtime with a bounded context before it exits, once", - "exits when the owner closes the startup channel", - "still exits when the runtime does not return in time", - "exits at once for a runtime with nothing to close" - ], "report": ".cache/addons/logs/runtime.json", "reports": [ { @@ -1572,395 +1047,6 @@ "-ginkgo.json-report=../../../../.cache/addons/logs/gateway-session-scope.json" ] ], - "cases": [ - "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", - "fails closed without current identity or resource policy and reports the original ID of an unknown mutation outcome", - "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", - "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", - "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", - "rejects unknown lifecycle argument fields before touching the owner journal", - "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", - "reports an account store outage as unavailable and a refused account as forbidden", - "propagates interrupted progress cancellation through the receiving frontend", - "round trips installed typed home metadata over mTLS with owner actor visibility and immutable asset URLs", - "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", - "validates finite relay budgets and prevents disabling polling bounds", - "treats every action except the known reads as a mutation", - "reads typed status and preserves named tool and host operation IDs through a supervised process", - "rejects a captured supervised client after same generation replacement before carrier dispatch", - "rejects a late supervised carrier observation after replacement before owner consumption", - "serves only declared installed generation assets and rejects traversal", - "builds a carrier only from complete pinned identities", - "types an unknown mutation outcome as unavailable without losing its operation", - "passes through owner-resolved bindings with distinct provider and status names", - "rejects a CA signed peer without a pin on the owner side", - "refuses an owner whose CA signed certificate is not the pinned owner", - "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", - "never expires the response deadline after the relay returned", - "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", - "refuses at ingest a file result larger than the relay file bound so nothing unservable is staged", - "preserves bounded owner admission refusals over mTLS without frontend grants", - "rejects untrusted peers wrong audience body expiry replay and revoked credentials", - "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", - "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", - "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", - "denies private relays without host resolution and admission", - "resolves only the authenticated claim over actual mTLS", - "fails closed on unsupported owners and mismatched binding replies", - "serves declared assets of the current enabled generation by package digest only", - "bounds progress, asset and file relays by their own limit", - "reads the exact uiOnly status tool locally and over authenticated mTLS", - "refuses forged identities tools current selections and incarnations without dispatch", - "rejects stale carrier replies and frontend authority fields without dispatch", - "refuses forged observations through the real carrier and ignores ordinary dispatch attempts", - "does not relay a captured old binding to a same-generation replacement", - "settles parent cancellation and owner permission loss as unknown", - "does not grant owner selection authority through wire capability support", - "rejects duplicate noncanonical and nested authority keys in observation DTOs", - "withdraws a positive late reply when exact-client admission becomes stale", - "adopts read outputs as private artifacts inside admission and replaces a forged resource identity", - "rotates the enforced audience on restart and rejects captured requests", - "keeps resolved resources under admission for JSON and attachment bytes", - "closes interrupted output and releases admission on disconnect", - "rechecks revoked credentials during attachment copying", - "alternates real owner journal status and terminates coarse progress without submitting again", - "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 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", - "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", - "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", - "reports an unclassified account check error as unavailable on every path and a wrapped denial as forbidden", - "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", - "keeps one scope through prompt/status/egress and isolates priming and subsequent turns", - "closes pending observations at the real turn boundary (stop=false)", - "closes pending observations at the real turn boundary (stop=true)", - "gives a person's own call the whole home and no chat", - "refuses a person's access for a fenced actor or an actor of a chat", - "builds a view only of folders inside the access, at no more than their mode", - "a sibling", - "the home", - "a name that starts like the folder", - "a parent spelled inside", - "another home", - "a relative path", - "refuses an empty request and a missing store", - "names the work folder in the prompt and makes it only when it is used", - "names the work folder in the prompt and makes it only when it is used", - "gives two chats with the same title two folders before either is made", - "gives two chats with the same title two folders before either is made", - "renames a folder name that has no folder yet", - "renames a folder name that has no folder yet", - "names no work folder when the product does not ask", - "marks the working files of the chat's file list", - "puts the kind of each file on the card of a call", - "closes an idle chat and opens it again", - "does not close a chat in use by the janitor", - "gives the same type for the common text files on every host", - "file tools time out", - "the output cap stops the process", - "backend missing", - "backend missing, first failure", - "cooling down", - "cooling down for minutes", - "load failed", - "model not found", - "provider error", - "upstream key", - "upstream path", - "upstream host", - "timeout", - "cancelled", - "refused", - "quota", - "context", - "unknown", - "does not tell the user to check the backend of a provider that failed", - "does not read a deadline as a context that is too small", - "ignores a model name that is not plain", - "removes addresses, paths, secrets and stacks", - "drops the internal marks", - "cuts a long text", - "keeps a well formed app", - "refuses a bad reference", - "drops an oversize input or result but keeps the reference", - "drops invalid JSON", - "CapText cuts on a rune boundary", - "Summarize picks the first useful argument", - "tells uploads, model and tool writes apart", - "follows a rename of the chat folder", - "are not found for another user", - "give an empty prompt without files and a capped one with many", - "gets the actor and the input source", - "offers no sandbox tools without a sandbox", - "keeps the turn events when full", - "drops the oldest text", - "does not drop answer text in a reasoning flood", - "opens a chat and finishes a turn", - "gives the model the user's text and the guest paths, as before", - "gives the model only the list when there is no text", - "puts the text read from the files between the words and the list", - "leaves a message without files alone", - "splits what ComposeMessage wrote back into the words, the note and the files", - "splits a message that has only files", - "splits a voice note without words", - "splits waiting messages joined into one, each with its files", - "keeps text that only looks like the list", - "shows the user's words of an old message that holds the list", - "leaves the other lines alone", - "gives the model the list of a message stored with its files apart", - "tells the user when a turn has no harness after a restart failure", - "refuses to open a chat as the workspace administrator", - "keeps the order of the conversation in the transcript summary", - "maps every home spelling to the primary mount", - "maps /workspace/chat to the chat folder", - "keeps the home spelling of the chat folder that attachment lists use", - "refuses parents, NUL and control characters wherever they point", - "takes encoded and look-alike separators as literal names", - "refuses a /workspace path that is no mount, case-sensitively", - "maps the skill layers read only", - "never resolves outside its mounts", - "is empty for a view without mounts", - "names a file of the chat folder where the commands see it", - "keeps the home spelling for a file outside the chat folder and in an unscoped chat", - "keeps the stored spelling, which SplitMessage reads back", - "needs a chat ID and keeps the owner without the fence", - "takes a new fence at the next open even when the view is the same", - "makes the folder of a chat that is not open, once, as the user", - "builds a scoped access with the view builder of every chat", - "gives a command runner the turn's view and the skill layers the actor can read", - "gives the same access to another chat of the user", - "gives a refused model request a reason the user can act on", - "context too small with numbers", - "context too small without numbers", - "the model calls a tool that is not offered", - "model keeps failing", - "keeps the fence on its actor and drops it for the owner", - "refuses an actor without a valid principal", - "reaches the client", - "names its files by the place and leaves out files outside its folders", - "mounts the folder at home and the chat folder at chat", - "keeps today's view for an unscoped chat", - "refuses a primary folder outside the fence as a missing home", - "mounts shared folders read only for a scoped view", - "renames a shared folder called chat", - "tells a scoped chat only its folders and no page hint", - "names the whole home for a scoped chat whose folder is the home", - "keeps today's prompt for an unscoped chat", - "validates current selection and authenticated actor", - "rejects aliases, duplicate fields and null claims", - "accepts canonical bindings and rejects aliases and duplicates", - "projects private policy safely", - "forwards authenticated owner decisions", - "validates strict request payloads", - "checks CAS and administrator authority", - "uses owner CAS pins for execution and typed status and fails closed on policy outage", - "resolves local-owner SQLite using current chat and agent reads", - "resolves named SQLite chats and rechecks current accounts and credentials", - "selects the oldest real provider then pins a second distinct manifest and runtime", - "binds the actual renamed running provider and rejects forged bindings and foreign actors", - "observes the actual renamed provider through the Studio typed adapter and withdraws stale facts", - "validates current pins and chat switches without historical ABA guarantees", - "denies foreign chat access and invalid named credentials", - "uses current agent grants and denies unattended actions", - "rejects stale runtime incarnations without owner callback nonces", - "uses the ordinary chat store interface", - "rejects noncanonical and mismatched selected tool identities", - "wrong object", - "additional properties true", - "additional properties absent", - "required", - "enum", - "unknown schema keyword", - "malformed required", - "resource", - "admin", - "status uiOnly", - "status kind", - "action uiOnly", - "action kind", - "shadow", - "nil", - "empty", - "materialize", - "read", - "prefix only", - "future suffix", - "mixed grants", - "unrelated operations", - "bare workspace", - "similar prefix", - "accepts before a slow backup, detaches the request and polls through either frontend" - ], "report": ".cache/addons/logs/gateway.json", "reports": [ { @@ -2557,260 +1643,6 @@ "-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", - "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", - "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" - ], "report": ".cache/addons/logs/proposals.json", "reports": [ { @@ -3114,295 +1946,6 @@ "-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", - "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", - "fails closed without current identity or resource policy and reports the original ID of an unknown mutation outcome", - "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", - "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", - "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", - "rejects unknown lifecycle argument fields before touching the owner journal", - "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", - "reports an account store outage as unavailable and a refused account as forbidden", - "propagates interrupted progress cancellation through the receiving frontend", - "round trips installed typed home metadata over mTLS with owner actor visibility and immutable asset URLs", - "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", - "validates finite relay budgets and prevents disabling polling bounds", - "treats every action except the known reads as a mutation", - "reads typed status and preserves named tool and host operation IDs through a supervised process", - "rejects a captured supervised client after same generation replacement before carrier dispatch", - "rejects a late supervised carrier observation after replacement before owner consumption", - "serves only declared installed generation assets and rejects traversal", - "builds a carrier only from complete pinned identities", - "types an unknown mutation outcome as unavailable without losing its operation", - "passes through owner-resolved bindings with distinct provider and status names", - "rejects a CA signed peer without a pin on the owner side", - "refuses an owner whose CA signed certificate is not the pinned owner", - "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", - "never expires the response deadline after the relay returned", - "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", - "refuses at ingest a file result larger than the relay file bound so nothing unservable is staged", - "preserves bounded owner admission refusals over mTLS without frontend grants", - "rejects untrusted peers wrong audience body expiry replay and revoked credentials", - "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", - "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", - "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", - "denies private relays without host resolution and admission", - "resolves only the authenticated claim over actual mTLS", - "fails closed on unsupported owners and mismatched binding replies", - "serves declared assets of the current enabled generation by package digest only", - "bounds progress, asset and file relays by their own limit", - "reads the exact uiOnly status tool locally and over authenticated mTLS", - "refuses forged identities tools current selections and incarnations without dispatch", - "rejects stale carrier replies and frontend authority fields without dispatch", - "refuses forged observations through the real carrier and ignores ordinary dispatch attempts", - "does not relay a captured old binding to a same-generation replacement", - "settles parent cancellation and owner permission loss as unknown", - "does not grant owner selection authority through wire capability support", - "rejects duplicate noncanonical and nested authority keys in observation DTOs", - "withdraws a positive late reply when exact-client admission becomes stale", - "adopts read outputs as private artifacts inside admission and replaces a forged resource identity", - "rotates the enforced audience on restart and rejects captured requests", - "keeps resolved resources under admission for JSON and attachment bytes", - "closes interrupted output and releases admission on disconnect", - "rechecks revoked credentials during attachment copying", - "alternates real owner journal status and terminates coarse progress without submitting again", - "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 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", - "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", - "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", - "reports an unclassified account check error as unavailable on every path and a wrapped denial as forbidden", - "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", - "projects private policy safely", - "forwards authenticated owner decisions", - "validates strict request payloads", - "checks CAS and administrator authority", - "validates current selection and authenticated actor", - "accepts canonical bindings and rejects aliases and duplicates", - "rejects aliases, duplicate fields and null claims", - "wrong object", - "additional properties true", - "additional properties absent", - "required", - "enum", - "unknown schema keyword", - "malformed required", - "resource", - "admin", - "status uiOnly", - "status kind", - "action uiOnly", - "action kind", - "shadow", - "accepts before a slow backup, detaches the request and polls through either frontend" - ], "report": ".cache/addons/logs/artifacts.json", "reports": [ { @@ -3757,282 +2300,6 @@ "-ginkgo.json-report=../../../../.cache/addons/logs/apps-http.json" ] ], - "cases": [ - "lists installed enabled addons for users and adds installed disabled ones only for administrators", - "carries the install time to the list and the management view, and none for an old record", - "derives display fields, the main page and the icon URL from the verified manifest only", - "describes the immutable UI assets of an enabled addon by the package digest and never otherwise", - "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", - "lists the host controls an add-on is entitled to, whatever its ID", - "projects two non-Studio addon pages without identity dispatch", - "projects home commands with resolved declared pages display metadata immutable icons and generation", - "keeps disabled home apps installed without UI and never invents a destination", - "projects typed model actions without sharing manifest or view slices", - "keeps unavailable installed records and omits unavailable or absent model metadata", - "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", - "persists and recovers model actions and declarations through install manual and automatic upgrades and real activation rollback", - "does not retain the caller's map or prefix slices", - "keeps an explicitly empty startup policy immutable", - "publishes identical bytes and digests with sorted archive entries for unchanged inputs and transforms", - "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", - "requires exact typed capability equality on authenticated registration health", - "keeps all typed declarations on automatic crash restart with a fresh incarnation", - "replays typed and legacy receipts across process restarts", - "refuses missing wire tool discriminators before any read", - "serializes exact identity admission with withdrawal and never dispatches the replacement", - "cannot observe a restarted same-generation process through the captured client", - "rejects output handles before they can reach storage or output-open", - "settles callback denial as failure even if the addon returns a valid positive payload", - "cleans up after cancellation and rejects repeat correlation", - "keeps an ordinary concurrent read authorized while an observation is pending", - "error", - "malformed/artifact payload", - "success", - "timeout", - "cancels an admitted observation when the runtime withdraws", - "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", - "installs upgrades and uninstalls the actual Sandbox document skills through verified receipts", - "finishes a real backup and commit after the submitting request is cancelled", - "polls and retries during a blocked backup, rejects conflicting IDs, and retains the receipt on restart", - "reconciles durable accepted work to interrupted without replay", - "Close cancels and joins an accepted owner worker before releasing storage", - "traces completion, retries, detach, interruption and late delivery without replay", - "keeps terminals immutable for every event and gives each active state a terminal exit", - "Close cancels a backup in flight and joins its cleanup before releasing ownership", - "serializes synchronous disable against an accepted upgrade without overwriting its journal" - ], "report": ".cache/addons/logs/apps.json", "reports": [ { @@ -4731,127 +2998,6 @@ "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", - "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", - "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" ] }, "tables-schema": { @@ -5011,127 +3157,6 @@ "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", - "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", - "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" ] }, "tables-rows": { @@ -5291,127 +3316,6 @@ "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", - "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", - "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" ] }, "tables-tools": { diff --git a/scripts/addons/verify.sh b/scripts/addons/verify.sh index 696dfec29..4f7ae8fdd 100644 --- a/scripts/addons/verify.sh +++ b/scripts/addons/verify.sh @@ -12,7 +12,12 @@ inventory = json.loads((root / 'scripts/addons/suites.json').read_text()) if suite not in inventory: sys.exit('unknown or unavailable suite: ' + suite) entry = inventory[suite] -if not entry.get('commands') or not entry.get('cases'): +# A suite with per-report inventories takes its required cases from them, so +# a case is listed once. A second list drifts and breaks the gate. +if 'reports' in entry and 'cases' in entry: + sys.exit('suite lists its cases twice: drop the top-level cases, the reports carry them') +expected = [c for r in entry['reports'] for c in r['cases']] if 'reports' in entry else entry.get('cases') +if not entry.get('commands') or not expected: sys.exit('empty command/test inventory') cache = root / '.cache/addons' (cache / 'logs').mkdir(parents=True, exist_ok=True) @@ -65,7 +70,7 @@ from ginkgo_report import ginkgo_report seen = [] if entry['kind'] == 'ginkgo': - reports = entry.get('reports', [dict(path=entry['report'], cases=entry['cases'])]) + reports = entry['reports'] if 'reports' in entry else [dict(path=entry['report'], cases=entry['cases'])] if not reports: sys.exit('empty report inventory') for report in reports: (root/report['path']).unlink(missing_ok=True) for command in entry['commands']: @@ -80,7 +85,7 @@ for command in entry['commands']: if entry['kind'] == 'ginkgo': seen = [] for report in reports: seen.extend(ginkgo_report(root/report['path'], report['cases'], report.get('focus'))) -if sorted(seen) != sorted(entry['cases']): +if sorted(seen) != sorted(expected): sys.exit('required case inventory mismatch: '+repr(seen)) # Run real readiness only after the shell test inventory has passed. run(['sh', 'scripts/addons/prepare.sh', '--check'])