Repository navigation
No plugin manifest and no release: the server works but no workspace can compose it #12
Description
service-warehouse is a working server that no Codefly workspace can compose: it declares no plugin manifest and carries no release tag. That makes it the one blocker on a handbook rule that has just been proposed on the strength of it.
Why this is now blocking something
obin-ai/handbook#253 proposes, for every repo in the fleet: a vendor backend lives behind its codefly gateway service, and a repo never links the vendor's SDK. The object-storage half of that rule binds today — service-object-storage is released at v0.0.12. The warehouse half cannot bind, because a rule cannot require a consumer to compose a server that has no manifest and no version to pin.
The handbook's own inventory already files this repo under "Not agents yet, despite the name" — design/service-and-agent-inventory.md:188: "a working server with no plugin manifest."
What it is costing right now
codefly-dev/module-saas-starter#1000 makes a warehouse the audit store of record. Unable to consume this service, it links the vendors directly into accounts — the service holding authentication, sessions, roles and the signing keys:
| dependency | files importing it |
|---|---|
cloud.google.com/go/bigquery v1.85.0 |
10 |
github.com/ClickHouse/clickhouse-go/v2 v2.48.0 |
15 |
github.com/apache/arrow/go/v15 |
2 |
github.com/aws/aws-sdk-go-v2 (+ config, credentials, s3) |
4 |
cloud.google.com/go/storage |
2 |
With them come two complete warehouse adapters and a 690-line hand-written BigQuery test double — 9,833 added lines — because BigQuery cannot be run locally. That PR's own validation section records the consequence: "Live BigQuery and replicated ClickHouse integration were not run for these changes."
This repo's DuckDB engine is the answer to exactly that: a real engine locally, the real warehouse deployed, the gap absorbed and tested once here instead of per consumer.
Asks
- A plugin manifest (
agent.codefly.yaml), so a workspace can compose this as a service the way it composesservice-object-storage. - A release tag, so a consumer can pin it.
One question the first consumer needs answered
The audit relay in #1000 quarantines a row only when the store reports it permanently refused that row, distinguishing per-row rejection from a whole-batch store failure — today by reading vendor-specific signals (BigQuery per-row invalid, a row too large, an unencodable value; ClickHouse malformed-row error codes isolated by splitting to single rows).
This service normalizes errors to gRPC status codes "so clients never parse a vendor SQLSTATE or reason string", which is the right posture. The question is whether InsertRows can carry per-row refusal detail through that normalization, finely enough for a caller to set aside exactly the rows the backend permanently rejected and retry the rest.
If it can, the rule in handbook#253 binds cleanly and #1000's quarantine classification gets simpler. If it cannot, that proposal says the rule needs a stated exception path before it binds — so this is worth answering against the proto either way, and it is the one input named as able to flip the proposal.
Not verified
I read this repo's README and its API table, and did not compose, run or call the service, or exercise any backend through it.
Activity
fixup: address r26 verification and preserve issue codefly-dev#12 tra…
feat: compose the gateway as a codefly service agent, with its image …
chore(image): lock the gateway image published for 0.0.2 (#16)
feat(proto): give RowError a portable refusal reason
ci(agent): run agent-ci on every pull request (#18)
antoinetoussaint-byte commentedon Oct 11, 2026
Both asks are delivered, in v0.0.2.
1. Plugin manifest.
agent.codefly.yamllanded in #13 (22a79233). A workspace composes this service the way it composesservice-object-storage.2. Release tag.
v0.0.2(tagd2282676on9163001) was cut bycodefly publish. Its agent CI passed 6/6, and the tag'sreleaseworkflow (run 38165466316) succeeded. The GitHub release carries 12 assets: darwin and linux archives for amd64 and arm64, SBOMs, the image SBOM documents, an index, and checksums.Gateway image:
ghcr.io/codefly-dev/service-warehouse@sha256:052aba76b0ee7f01a6e0f2c3ba900b4d991056047401d8bcbf544f6b6e2610a1.gateway-image.json(chore(image): lock the gateway image published for 0.0.2 #16) and pulls anonymously.0.0.2andlatestresolve to that digest.org.opencontainers.image.version=0.0.2andrevision=22a79233.Full conformance:
agent-cion main (run 38167325616) passed, and since #18 it runs on every pull request.The per-row question: not yet. At v0.0.2,
InsertRowsResult.errorsisrepeated RowError { int64 row_index = 1; string error = 2; }(proto/codefly/warehouse/v0/warehouse.proto:309-319).InsertRowsdoes say which rows were refused, by offset.erroris free-form text with no code.#14 ("portable per-row refusal reasons") is the change that would make the answer yes. Until it lands, handbook#253's warehouse half needs its stated exception path for per-row quarantine.
antoinetoussaint-byte commentedon Oct 11, 2026
lazybox has finished working on this.
claude(Opus 5) held it from 2026-10-11 20:53 UTC until 2026-10-11 21:17 UTC. Theworkinglabel has been removed; this comment is the record.claim detail
ci(image): publish the gateway image through core's publish-service-i…
feat(proto): give RowError a portable refusal reason
fix(build): build warehouse with Go 1.27.3
feat(proto): give RowError a portable refusal reason