Skip to main content
Build Blog

Build log: Dispatch, a share-ready control panel, and a key in front of the Spark

aioslocal-aiagents

This week my project app got a name and 18 releases, the AI Control Panel got ready to share, the Spark got a login, and databusiness.ai joined the Microsoft AI Cloud Partner Program.

1. Dispatch

The project app from last week has a name now. I said "Go with dispatch", and it is Dispatch.

It went from 0.17.0 to 0.29.0 in 18 merged pull requests: a calendar, saved views, reports, a timer with time categories, approvals and dependency types, linked items, exports to CSV, Excel and PDF, file drops, and inline editing.

Most of it came from using it. On editing I asked: "wrike and clickup let me edit right on the task screen and auto save. Can we do that instead of clicking edit?" On history: "should I have an activity log for the task that is just that tasks activity and history?" On the 0.27.1 drop zone: "Drag and drop worked for files and rejected for folder." And on a task that lives in more than one space: "There is not a space owner, just that you can see that task in that space, so one to many for that, but if closed or updated, it is updated for every space. The status is indiferent to the space."

This one runs without my usual ownership gates. I set it up that way to see what the agents do on their own, so it is the honest place to count mistakes:

  • The rename missed a name built inside a string. The end-to-end run caught it in the footer.
  • Five new time categories started as billable. The review said that was my call, and I made them all not billable.
  • A migration rehearsal looked like a pass, but the database login had failed and the check ran against an empty database.
  • A new drop-target style collided with the board and calendar and broke their drags.
  • The 0.28.0 review found a High: a date box saved on every keystroke, so the browser saved the year 0002 at the first digit. A later check caught an inline save dropped while another write was in flight. Both are fixed, and the second has a test that fails on the old code.
  • The 0.29.0 plan said the deploy script takes a database backup first. It does not, and nobody had checked. A backup was taken after the deploy, and the plan was corrected.

Still open: a subtask under more than one parent, personal spaces and permissions, and other users. On users I said: "continue, we will get to other users when we get to it."

2. The AI Control Panel

My order for the week was "Go on all 5 in order." Four pull requests went in, and two are still open.

A security advisory. A mail library pulled in a package with a high and a moderate advisory. My answer on why I moved the library instead of pinning the package: "I fix the dependency at its source rather than add a direct Pkcs pin. A pin would override MimeKit's choice and leave another setting someone must remember to remove later." The build now fails on known advisories, and I said what that does not prove: "a successful offline build does not prove the packages are free of known advisories." On the evidence: "I would not trust the DLL's 4.18.1.0 version stamp to identify the package. Upstream kept that stamp for 4.18.2." So the check matched the file byte for byte.

"Nothing sent." Session cards now say when nothing left the PC. The rule: "I cannot say 'nothing sent' while one call is still unknown." And: "I keep 'nothing to check' separate from 'checked, nothing sent'."

Secret files. The list of files the panel never reads now holds back wildcard patterns too. In my words: "That closes the gap without needing a glob parser, and it can only withhold more."

A copy I can share. About 70 files were made generic, with a README and the MIT licence, and an export gate checks the copy before it leaves. On why it is a fresh repo: "I use a separate repo with fresh history because this one's history contains my email, accounts and client names. Cleaning today's files would still leave those in old commits." On what the gate decides: "The script prepares and checks the copy, then stops because sharing it is my decision. Passing the checks is not permission to send it." The gate then refused a comment the agent wrote because it named me, and later a ticket number in a test summary. That is the gate working.

One correction on the record. The agent said a command handed to WSL passes its arguments as separate words. The review showed WSL runs the raw text through a shell. The test had passed only because every test argument had a space in it. That pull request is open and has been re-owned.

Still open: the egress change for WSL, a flow-chart view of all sessions, and a first install on a clean account.

3. The injection hunter goes live

The hunter now runs on live calls and writes its findings per session for the panel. Clean calls stay silent.

The questions were about what it must not do. My answers: "It records counts and kinds, never the result text, and never blocks." "When the budget is exhausted, the log must record that the scan was incomplete, rather than imply it was clean." "I keep the warning selective because an always-on warning gets ignored." On reminders that look like system text: "A genuine reminder elsewhere may now produce a false positive, but a forged reminder gets scanned instead of quietly hidden."

After the first merge, the large hostile test ran past its time limit. I said "Fix first, then deploy". A linear pattern fixed it: a test with half a million broken image links now finishes in 0.14 seconds.

Still open: a full sweep and triage, the panel's reader for the findings, and a time limit on the findings lock.

4. The Spark

A login. Ollama on the Spark now needs a key, one per caller, and fails closed. The review found an older gateway that could listen without the login. My answer on the fix: "It fails closed and visibly instead of opening access."

Over the tailnet. The launcher on my PC now reaches the Spark over Tailscale, and the laptop answered over cellular. The speed is the same: about 37.4 tokens a second on the home network and over the tailnet. A review Medium said the key was sent without checking Tailscale first. The launcher now asks Tailscale before it reads the key. What it does not do yet: nothing watches Tailscale after launch, so a firewall rule is the follow-up.

A phone app. A chat app on my phone showed "network error". The access log showed why: the app's web view sends a preflight first, with no key, and the login refused it. My answers: "Chatbox runs in a web view, so it follows browser rules." "I answer it in nginx to keep the boundary exact: nothing goes upstream without a valid key." And the mistake to avoid: "The dangerous mistake is making OPTIONS bypass the key check and then proxying it upstream."

Still open: building that fix, the firewall rule, and the vLLM key.

5. databusiness.ai: the review tool

The first live AI on this site is built and approved in review. It is not live yet. You paste code, and you get a few findings in the format my reviews use.

It has a spend cap, a rate limit, a bot check and an updated privacy page. On what it is for: "It sells the next conversation about a production-readiness review." And: "Traffic and model calls alone are not a business result."

On a call that fails with no answer: "The provider may have billed the call even though no answer came back." And: "The budget can run out early rather than undercount the bill."

I found one defect myself. The privacy page promised a 24-hour delete, but the code only deleted on use. My words: "So this implements cleanup on use, not a guaranteed 24-hour deletion deadline." It now has a daily cleanup, and the page promises 2 days: "A daily cleanup can run just before a row becomes eligible, leaving it until the following day."

The review found two Mediums. A paste in Chinese could cost more than the spend reservation assumed. And every IPv6 address got its own rate limit, so one home connection could rotate around it. Both are fixed. On what is left: "They could exhaust the allowance and pause the tool for honest visitors." The caps still hold the bill.

Still open: a test run with real keys and the database test. Then it goes live.

6. TestProof moves home

I asked: "why is the database in my appdata and not under the directory the rest of the code is in? Lets get everything together even if that takes a new plan."

The code now follows a moved data folder, and it refuses one that leads nowhere instead of starting empty. On the risk: "Screenshots matter, but authored cases are the bigger risk: I cannot recover those by importing the test runs again." And: "A partial copy becoming the live copy is the main risk."

The copy is made, and the backups check out at 26 of 26 files. The verify and the switch come next. The old folders stay for a week.

7. Partner programs

  • databusiness.ai is in the Microsoft AI Cloud Partner Program. The Partner Center profile was verified this week.
  • I applied to Anthropic's Claude Partner Network.

The next step

The next step is the review tool's run with real keys, then putting it live.

Built Something with AI?

I'll spend 30 minutes telling you what my production-readiness review would flag.