feat(s3): a guarded asset publisher, so an agent can put a file the public can download #90
No reviewers
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/mcp-beaver!90
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/serve-s3-publisher"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
serve-s3, the first write-capable SDK mode in this runtime. Standing up an S3 MCP for the Sirens Dowel lane, so Dowel can publish an asset and hand back a link rather than only linking one Kai staged.Why the guardfile carries more than IAM does
serve-ssmreads one parameter, so its whole boundary is one ARN and IAM states it. A publisher is different in kind. The caller supplies the bytes, the key, and the content type, and to IAM everyPutObjectinside the bucket looks alike. Several bounds therefore exist only here:text/html,image/svg+xml,application/xhtml+xml, and the other markup a browser executes in the origin's own security context. That origin carries other published work. SVG is the non-obvious one, an image everywhere else in this runtime and a scriptable document here. A guardfile listing one fails to start rather than starting and quietly never allowing it.What it deliberately cannot do
No delete tool, and the workload user's IAM policy withholds
s3:DeleteObjectrather than relying on that absence.put_objectadvertisesreadOnlyHint: falseandidempotentHint: false, so a roster that trusts annotations does not read an upload as a safe call.The bucket is private behind CloudFront, so
base-urlis the distribution's and the tools never hand back an S3 endpoint.Notes for review
max-bytesreads the KDL argument by kind.Value.String()renders a debug form for every non-string kind andValue.Int()panics on one, so parsing the text rejected every integer written the obvious way. The test caught it, the parser now switches onKind().examples/entry. The S3 grammar is not lintable throughlint, andTestLintAcceptsShippedExamplesglobs that directory, which is the same reason no SSM policy ships there.docs/s3.mdcarries the sample instead.go.modpicks upservice/s3as a direct dependency, andgo getupgraded several shared aws-sdk-go-v2 internals along with it.gofmt,go vet, and the fullgo test ./...are green locally.Merging this publishes the source-sha image the deploy side needs.