ByteVeda / ByteVeda/flexiq

epic: the wire contract stops at enqueue and read

Open
#842 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

area/wire epic P1
Dominant language
Rust
Stars
20
Forks
2
Avg merge
5h 10m
Merged PRs (30d)
127

Description

Why

The producer door does enqueue, batch, read, cancel, count and workflow submission. That is the
whole network contract. Everything else FlexiQ can do — pause a queue, replay a dead letter,
drain a worker, change a rate limit, edit a periodic task — is reachable only from the dashboard
or from a process with the core compiled into it.

So automation is worse off than a human. An operator can drain a worker by clicking; a script
cannot, unless the script is written in one of three languages and given a database connection.
That inverts the usual order and it is the largest functional hole in the server story.

Four smaller holes sit beside it. A remote client that wants a result has to poll
GET /v1/jobs/{id}, because job.result() has no wire equivalent. The listener does not
terminate TLS at all — crates/flexiq-server/README.md says so plainly and points at a sidecar.
Token scopes are two bits, produce and execute, so "read-only", "this queue only" and "this
task only" cannot be expressed. And nothing records which token enqueued what.

Shape

  • flexiq.admin.v1 — a third service beside flexiq.v1 and flexiq.executor.v1, carrying
    the operations the dashboard already performs.
  • WatchJobs — a server stream, so awaiting a result is not a poll loop.
  • TLS and mTLS in-process, for the deployments that are not behind a mesh.
  • Finer scopes — read-only, per-queue, per-task, on top of the namespace binding that
    already exists.
  • An audit trail of token-attributed writes.
  • Per-namespace quotas — namespaces exist as a tenancy boundary with no limits attached.

What this is not

Not a proxy over Storage. #710 rejected that and the reasoning still holds: the trait is
~110 methods with a three-backend parity obligation each, and mirroring it into RPCs inherits
the whole internal admin surface including the settings KV. The admin service exposes the
operations an operator performs, named as operations, not the rows behind them.

Not a second authorization model. Scopes get finer; the namespace binding at mint time
stays exactly as it is. A token minted for one namespace is refused by a listener serving
another, and nothing here weakens that.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with crates/flexiq-server/README.md and trace the existing flexiq.v1 and flexiq.executor.v1 services, the dashboard operations, and GET /v1/jobs/{id}. Define the scope and implementation boundaries for flexiq.admin.v1, WatchJobs, TLS/mTLS, finer token scopes, audit attribution, and namespace quotas; done requires an agreed plan or coordinated implementation across these areas.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
authorization, backend-api-design, security
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.