A weekend agent demo fails when a second screen appears. One read-only status card, fed by one bounded fetch, is enough to show the path. Everything else belongs in a cut log, not in the repository opened on Saturday morning.
This build log keeps that cut explicit. It records what stays in the demo, what is deferred, and what is refused. It does not claim a production agent, a measured latency, or a hosting plan that will still be free next week.
The constraint that actually holds
Side-project agents expand by tool count. A status lookup becomes a ticket writer, then an email draft, then a schema change added for the demo. The room sees motion. The operator cannot point to the single call that was allowed to leave the machine.
Visibility is the constraint that survives the weekend. A stranger should be able to name the input, the output, and the stop condition from one card. When that explanation needs another panel, the scope has already slipped.
Public conversation this week has circled generated portfolios and the cost of trusting generated code. Those posts are topic signals, not sources for this log. The transferable lesson is narrower: a small artifact with a written cut list is easier to defend than a wide demo.
What the build keeps
The kept path is a read-only status card. The input is a local JSON fixture. The transform is a pure admission function. The output is a headline, a detail line, and the remaining call budget.
-
serviceis a short public name, such asbilling-read. -
stateis one ofup,degraded, ordown. -
checked_atis an ISO-8601 timestamp supplied by the fixture, never invented by a model. -
budget_leftis a local counter. It is not a provider invoice and not a token meter.
The card may describe a service state. It may not change that state. Network side effects and multi-step planning stay outside the Saturday repository.
A second service is not a small addition. It doubles the fixture rules, the failure copy, and the chance that a prompt picks up a field nobody reviewed. The build therefore stops at one name.
Where a hosted option is allowed to enter
Disclosure: This article was prepared as part of MonkeyCode's product outreach.
Two availability claims are treated as operator-supplied for this draft: free model access, and a free server option. This log does not name models, invent a token quota, or treat hardware, duration, or pricing as stable. Those details change. The current project page is the source of truth before anyone moves a demo off localhost.
MonkeyCode participates only as an optional host for the one card. The admission logic is ordinary Python and does not require a hosted runtime. A hosted model is worth a look only when the weekend needs a short plain-language headline and the laptop will not stay open. A free server option is worth a look only after the operator confirms, the same day, that the option still exists and that the fixture contains no secrets.
Decision table
| Situation | Decision | Reason |
|---|---|---|
| Fixture holds only public status fields | Local run is enough | No need to spend a hosted call |
| Headline must be one plain sentence | Hosted model is optional | Prompt stays limited to fixture fields |
| Free-server terms are unverified today | Stay on localhost | An availability claim is not a capacity plan |
| Prompt would include keys, customer text, or private logs | Refuse | Free access does not relax data rules |
| Demo needs a write, a payment, or an email send | Refuse this weekend | Out of scope, hosted or local |
| Quota, model name, or uptime is unknown | Do not print a number | Unverified figures go stale quickly |
The table is a gate, not a ranking. It does not claim that one host is faster, cheaper, or more accurate than another. It states when a hosted option may enter the log at all.
The artifact
The module below is a proposed, unexecuted example. It has not been benchmarked, and it does not open a socket. It is the contract the demo should enforce before any hosted request is considered.
Secret rejection happens before the budget increments. A poisoned fixture should not burn the only Saturday admission. Incomplete fixtures are deferred for the same reason: a missing timestamp is a data bug, not a model task.
from dataclasses import dataclass, field
ALLOWED_STATES = {'up', 'degraded', 'down'}
REFUSED_KEYS = {'api_key', 'token', 'password', 'email', 'customer_id'}
@dataclass
class CutLog:
kept: list[str] = field(default_factory=list)
deferred: list[str] = field(default_factory=list)
refused: list[str] = field(default_factory=list)
@dataclass
class Budget:
limit: int = 3
spent: int = 0
def admit(self) -> bool:
if self.spent >= self.limit:
return False
self.spent += 1
return True
def reject_secrets(payload: dict) -> str | None:
found = REFUSED_KEYS.intersection(payload)
if found:
return 'refused:' + ','.join(sorted(found))
return None
def build_card(payload: dict, budget: Budget, log: CutLog) -> dict:
secret = reject_secrets(payload)
if secret:
log.refused.append(secret)
return {'ok': False, 'reason': secret}
state = payload.get('state')
service = payload.get('service')
checked = payload.get('checked_at')
if state not in ALLOWED_STATES or not service or not checked:
log.deferred.append('incomplete-fixture')
return {'ok': False, 'reason': 'incomplete-fixture'}
if not budget.admit():
log.deferred.append('budget-empty')
return {'ok': False, 'reason': 'budget-empty'}
log.kept.append('status-card')
return {
'ok': True,
'headline': f'{service} is {state}',
'detail': f'checked_at={checked}',
'budget_left': budget.limit - budget.spent,
}
A manual driver can sit in the same file. It is still a proposal, not a recorded test from this drafting session.
def _demo():
log = CutLog()
budget = Budget(limit=1)
good = {
'service': 'billing-read',
'state': 'degraded',
'checked_at': '2026-10-10T09:00:00Z',
}
bad = {
'service': 'billing-read',
'state': 'up',
'checked_at': '2026-10-10T09:00:00Z',
'api_key': 'do-not-send',
}
first = build_card(good, budget, log)
second = build_card(good, budget, log)
third = build_card(bad, Budget(), log)
assert first['ok'] and first['budget_left'] == 0
assert second['reason'] == 'budget-empty'
assert third['reason'].startswith('refused:')
assert 'status-card' in log.kept
assert 'budget-empty' in log.deferred
Intended local check, after the file is saved as weekend_card.py:
python -m py_compile weekend_card.py
python -c 'import weekend_card; weekend_card._demo()'
If those asserts hold, the shape is one kept card, one deferred budget miss, and one refused secret. No latency number belongs next to that shape. A green local run also does not prove that a hosted rewrite will preserve the fixture.
Failure messages the card should show
A demo that only shows the happy path hides the gate. The card view should have three visible outcomes, each mapped from the function result.
-
Kept. Headline is the service name plus the state. Detail repeats
checked_atexactly. Budget drops by one. -
Deferred. Reason is
incomplete-fixtureorbudget-empty. The view shows the reason and does not call a model to fill the gap. -
Refused. Reason starts with
refused:. The forbidden field value is not copied into the headline, the log, or a prompt.
That third outcome matters more than the headline. A weekend audience can forgive a dull sentence. It should not be shown a demo that forwards an api_key because the field happened to sit beside a status.
Render the reason in the same panel as the headline. A separate debug console will be ignored once the room is watching the card. If the reason cannot fit on the card, the scope is again too wide.
What this weekend skips
The cut log is part of the demo, not a footnote after the applause.
- No write path. The card cannot open a ticket, restart a service, or edit a file outside the fixture.
- No second tool. Search, shell, and mail stay deferred even if a hosted server would make them easy to attach.
- No model-name theater. String formatting already produces a true headline from the fixture. A hosted model may rephrase that headline later, and only after the gate passes.
- No quota on the slide. If a free allotment exists, its size is whatever the project page says on demo day, not a number frozen into this article.
- No multi-service map. One service name is the whole stage. A second service is a second weekend.
Deferred work can return later. Refused work should not return under a renamed prompt. Renaming api_key to notes is a bypass, not a scope change, and the weekend rule is to stop rather than teach the filter a new synonym list.
Manual test plan
Run this plan before anyone else sees the card.
- Load a fixture with only
service,state, andchecked_at. Confirmokis true andbudget_leftdrops by one. - Repeat the same fixture until the budget returns
budget-empty. Confirm no extra headline is produced. - Add
api_keyto a copy of the fixture. Confirm the reason starts withrefused:and the value never appears inheadline. - Remove
checked_at. Confirm the result isincomplete-fixture, not a guessed timestamp. - Pass an unknown
statesuch asmaybe. Confirm it is deferred, not coerced toup. - If a hosted call is still desired, send only the three allowed fields. Compare the returned sentence with the local headline. Keep the local headline if the hosted one adds a claim that was not in the fixture.
- Re-read the project page the same day for free model access and the free server option. If either claim is gone or newly qualified, leave the demo on localhost.
Step 6 is the only point where a hosted model should see data. If that comparison is skipped, the demo has not tested the host. It has only tested the laptop.
Limitations, and who should walk away
This approach is a weekend gate. It is not an evaluation harness, a security review, or a capacity plan.
- The budget counts local admissions, not provider tokens. A real hosted call can consume more than one unit even when this script records one.
- Free access can be rate-limited, region-limited, or withdrawn. A demo script must not promise that a server will still be free on Monday.
- The secret check is a key-name filter. It misses secrets stored under unusual names, inside nested text, or in a fixture comment. Treat it as a tripwire, not a scanner.
- String formatting can still embarrass the operator if
servicecontains markup. Escape the value before any HTML render. - No accuracy benchmark is claimed. Do not cite this log as evidence that a hosted model is correct.
- The example timestamp is fixture data. It is not a record of a live incident.
Walk away when the audience needs write access, when the fixture holds private data, when compliance requires a named retention period, or when the demo cannot proceed without a guaranteed quota. Those projects need a reviewed environment and a written contract. A Saturday card will not supply either.
Teams that already have a staging gate, a secret scanner, and an on-call path also do not need this log. The module would duplicate lighter checks they already run, without adding the audit trail those systems keep.
How to file the log
Keep three short lines in the repository README, next to the module. Update them when the scope changes. Do not let the README drift ahead of the code.
- Kept: read-only status card from three fixture fields, local budget of one to three admissions.
- Deferred: hosted headline rewrite, second service, any tool beyond the pure function.
- Refused: secrets in the prompt, write actions, printed quotas that were not checked the same day.
If a hosted pass is used, add one more line: the date the project page was read, and whether free model access and the free server option were still stated. Omit the line rather than guess. A missing line is easier to explain than a stale number.
Closing the log
The working demo is the card plus the cut log. The skipped work is the result that matters: a second screen, a write tool, and an unverified number never earned a place in the build. Operators who still want a hosted pass can set MonkeyCode's current free-model and free-server terms beside the decision table, and stop when the page and the table disagree.
Top comments (0)