Training · learner work

The exemption was denied. Someone had to be able to say why.

Selective Service registration is a legal obligation, and the decisions around it change a person standing: whether an exemption is granted, whether an appeal succeeds, whether somebody is recorded as compliant. A Colaberry intern built a working demonstration of how that system could run online, and built it so that no determination is ever made by the software. The eligibility check can read Eligible and a case manager can still deny the application, with the reason on the record and an appeal open to the applicant.

verified

All student projects
A walk through the demonstration, screen by screen. Narrated by a synthetic voice; the figures it states are the verified metrics recorded below.
Industry
Public sector
Capability
Agent assisted software delivery
Built by
OBI, Anamelechi Kingsley · Colaberry
Published
2026-11-06

The situation

Registering with the Selective Service is a legal requirement for most men in the United States between eighteen and twenty-five, and the administration around it is unglamorous, high-volume and consequential. Someone applies for an exemption. Someone appeals a decision. Someone needs a record of whether they are compliant, for a job, a loan or a federal benefit. The existing workflow for a lot of this is paper and a mainframe, and the notice that prompted this project asked for it to move online.

The hard part is not the web forms. It is that an exemption decision changes a person standing, so it has to be made by a person, traceable to a reason, reviewable by somebody else, and recorded in a way nobody can quietly alter later. A system that simply automates the decision would be faster and worse.

So the demonstration is built around that constraint. A registrant signs up online, sees their own compliance status, and applies for an exemption. The software runs an eligibility check and shows the result, and then stops: a case manager decides. The case carries a timeline of every status change with who made it, a reason written against the denial, and an appeal the applicant can open from the same screen. On an appeal a second reviewer takes it, not the first. Every one of those events lands in an audit log the database itself refuses to let anyone update.

A policy assistant sits alongside it for the questions staff actually ask, about what the rules say. It answers with citations to the passages it used, and every answer it gives is queued for a person to review rather than treated as settled.

All of this was a rehearsal. There was no client, no contract and no real data at any point, and nothing was ever filed. The point was to find out where a federal bid breaks while nothing was at stake, and the most useful breakages turned out not to be in the proposal at all.

What it had to do

  • Find out where a federal submission process breaks, with nothing at stake.
  • Produce something working rather than a document describing something working.
  • Keep every claim about the system traceable to evidence a reader can check.

What constrained it

  • No client, no contract and no real data at any point.
  • No authority to operate, so nothing could run in a federal environment.
  • One intern, working with an AI coding assistant, reviewed by the platform owner.
Cover: the case timeline this record is named after
Cover: the case timeline this record is named afterThe cover image, setting the title over the case timeline where an application the eligibility rule scored Eligible was denied by a case manager, with the recorded reason beneath it.

Decisions that made the difference

6 choices shaped the system. Each one lives at a specific point in the drawing above.

  1. At Deciding an exemption

    The software checks. It never decides.

    An exemption or an appeal changes a person legal standing. A system that decides those automatically would be faster, would be right most of the time, and would be indefensible the first time it was wrong, because there would be no person who could say why.

    Separate the check from the determination and automate only the check. The eligibility rule runs and shows what it found; a case manager then approves or denies, with a reason recorded against the decision, a timeline of every status change naming who made it, and an appeal the applicant can open from the same screen. An appeal goes to a second reviewer, never the one who decided it. The policy assistant follows the same rule: every answer it drafts is held for a person, and nobody may review a question they asked themselves.

    Evidence A case in the demonstration where the eligibility check reads Eligible and the case manager denied it anyway, with the reason that proof of age was not provided sitting on the timeline beside the appeal button.

    20 OctEvery determination costs a person attention, and the system cannot clear a backlog on its own. That is the trade being made deliberately rather than discovered later.

  2. At Trusting the audit trail

    The table said it was immutable. The constraint checked nothing.

    The audit log is the record of who did what, and the whole compliance story rests on it being unalterable. The original table carried a constraint that announced immutability and tested for a condition that is always true, so it refused nothing. Every review of that schema would have read the constraint and moved on.

    Replace the decorative constraint with database triggers that actually refuse an update, and prove the refusal rather than assuming it: the restore drill attempts an update against the restored copy and records that it was rejected.

    Evidence The platform owner singled this out as the most important finding on the build thread, writing that a table claiming to be immutable with a check that tests nothing is the failure mode he cares about most across every system.

    12 OctIt cost a schema migration and a drill. What it bought was the difference between an audit trail and a table that looks like one.

  3. At Trusting the status page

    The health endpoint said it was checking, and never checked

    The service reported its own health by returning the word checking for the database, without ever contacting it. Anything watching that endpoint, including the people deploying, was reading a string rather than a state.

    Make the endpoint report the deployed commit, the real database state and the applied migrations, so the answer cannot be produced without doing the work.

    Evidence The same deploy found the production database holding only three of ten schema migrations while the service reported itself healthy. Both were fixed in the same change, and migrations now apply automatically on deploy.

    6 OctA health check that can only answer by measuring is slower and occasionally reports a problem. That is the feature.

  4. At Deploying a schema

    Creating the tables switched on endpoints that authorized nobody

    Deploying the case and audit tables activated older endpoints that had been written before any authorization existed. For a window, any signed-in user could list or approve cases, read the whole audit log, or delete metrics. The schema change was the trigger; the absent checks were the fault.

    Close the gap, then remove the class of problem: route access moved behind a policy engine consulted before any handler runs, so a new route is refused by default rather than open by default.

    Evidence The builder found it himself, in his own deploy, and reported it before being asked. The platform owner accepted the work and called the find the most important thing on the thread at that point.

    2 OctDefault-deny means every new route needs an explicit entry. More friction per route, and no more silently reachable ones.

  5. At Before a link leaves the team

    A demo that asks for a national identity number gets two guards first

    The registration form asks for a Selective Service registrant identity number. The builder had been testing with invented numbers, which protects the test and nobody else. The moment that link reaches a person outside the team, someone will type a real one in.

    Two conditions before the link travels: a banner on the form and the dashboard saying it is a demonstration with synthetic data and not to enter a real number, and the number itself hashed rather than stored as given.

    Evidence Required by the platform owner as the condition of the demonstration being acceptable at all, and confirmed in the browser on the deployment afterwards.

    17 SepA demo that looks less convincing in a screenshot, and cannot quietly accumulate real identity numbers.

  6. At Describing your own work

    Every update carries the same sentence about what it is not

    The build was being described in material that would eventually become proposal language. Demonstrated on a synthetic deployment and operating as a production system are different claims, and the distance between them is exactly where a bid becomes indefensible in front of a contracting officer.

    Put one sentence on every update, every deck and every evidence pack: demonstrated on a synthetic demo deployment, not operating as a production system. Describe it as being in the demo throughout, never as being live.

    Evidence The platform owner set this on 7 October and confirmed on 12 October that it had been applied correctly. It appears on every subsequent post.

    7 OctIt makes each update read more modestly than the work deserves, and it is the single reason any of this is quotable to an outside reader.

Who built it

  • OBI, Anamelechi Kingsley, Intern on the Colaberry Gov Contracts programme. Built the demonstration and assembled the proposal package.
  • Ali Muwwakkil, Platform owner. Reviewed and accepted the work, set the conditions on the demonstration, and closed the proposal track as a rehearsal.
Registering online, where the process used to be paper
Registering online, where the process used to be paperThe registration form a member of the public fills in. The yellow band across the top of every screen in this system says the same thing: demo environment, synthetic data only, do not enter a real SSN. It is there because the form asks for a national identity number, and the moment a link like this travels, somebody will type a real one in.

The build

  1. The solicitation is posted
  2. The rehearsal begins, two days after the window closed
  3. The proposal track is closed as a rehearsal
  4. The completion report is committed, before the build starts
  5. Two guards before the link leaves the team
  6. A schema deploy reveals endpoints that authorized nobody
  7. One sentence goes on every update
  8. The constraint that checked nothing
  9. The demonstration goes down and nothing notices
  10. The readiness review, written after the drills
  11. The build is wound down
Notes on 11 of the 11 steps
  • The solicitation is posted. A real federal notice: the Selective Service System website modernization, a small-business set-aside. Offers due 30 June, later extended to 6 July 2026.
  • The rehearsal begins, two days after the window closed. The first work on the proposal track is a scope summary of the solicitation. Offers had been due at three in the afternoon on 6 July. Nobody noticed, and the closed window is the likeliest reason the submission control nobody could find was not there.
  • The proposal track is closed as a rehearsal. The platform owner stops the submission, writing that the entire track is a rehearsal and that the deliverable was never a confirmation number but the list of five process failures it surfaced.
  • The completion report is committed, before the build starts. The first commit, under a message announcing a complete platform across all forty-six tasks, carries a completion report, a lessons-learned document and a README describing cloud services, a search engine and a cache layer the project never had, and a production launch that was never approved.
  • Two guards before the link leaves the team. The demonstration goes up on a commercial host. Before the link travels, the reviewer requires a banner saying it is synthetic and a hash over the registrant identity number.
  • A schema deploy reveals endpoints that authorized nobody. Creating the case and audit tables activates older endpoints with no authorization checks. The builder finds it, closes it, and reports it. Access moves behind a policy engine consulted before every route.
  • One sentence goes on every update. Demonstrated on a synthetic deployment and operating as a production system are set out as different claims, and the first becomes a standing line on every post, deck and evidence pack.
  • The constraint that checked nothing. The audit table is found to have claimed immutability through a constraint testing a condition that is always true. Triggers that actually refuse an update replace it. The reviewer calls this the failure mode he cares about most across every system.
  • The demonstration goes down and nothing notices. The hosting database expires. The service cannot start for three days, and nothing outside the system notices. A check that runs from outside the platform on a schedule is added afterwards.
  • The readiness review, written after the drills. Forty-five of forty-six stories recorded as working with an evidence pointer against each, the recovery drills with measured results, and every open gap with a named owner. It opens by stating what the system is not, and carries none of the day-one claims.
  • The build is wound down. The hosting is taken down and the federal environment declined. The repository stays public and the day-one documents stay in place, marked as superseded, because the distance between them and the readiness review is what this project produced.
What a registrant sees about their own standing
What a registrant sees about their own standingThe registrant view: compliance status, the exemption applications they have open, and their own history. The point of putting it here is that a person can find out whether they are compliant without asking anybody.

More from this project

  • An appeal goes to somebody who has not already decided it

    An appeal goes to somebody who has not already decided it

    A second case manager reopening a decided case on appeal. Separation of duties is enforced by the system rather than requested of it, so the reviewer of an appeal is never the person who made the decision being appealed.

  • The assistant answers, and shows its working

    The assistant answers, and shows its working

    A policy question answered with the passages it drew on quoted underneath and linked. An answer whose statements are not covered by a citation is withheld rather than shown, and every number, date and amount in an answer has to appear in a cited passage before it passes.

  • Every answer waits for a person, and you cannot review your own question

    Every answer waits for a person, and you cannot review your own question

    The review queue, where a case manager approves, corrects or declines each draft before the person who asked ever sees it, with a note for the record required either way. Two rules on this screen are worth reading twice: you cannot review a question you asked yourself, and the queue states plainly when a draft came from a test stand-in rather than a real model. This figure is the top of a longer page, cropped so it renders as a picture rather than a wall.

  • The record nobody can quietly edit

    The record nobody can quietly edit

    The audit log: who did what, when, with the result and the address it came from. The first version of this table announced that it was immutable through a constraint that tested a condition which is always true, and therefore refused nothing. It is now enforced by triggers that reject an update, and the restore drill proves the rejection rather than assuming it.

  • The operational view the paper process never had

    The operational view the paper process never had

    Case volumes, outcomes and timeliness in one place, which is the thing an administrator running this process on paper and a mainframe cannot get at all. This figure is the top of a longer page, cropped so it renders as a picture rather than a wall.

  • The readiness review

    Written after the build. Every one of the forty-six stories with an evidence pointer, the drills with their measured results, and every open gap with a named owner. It opens by saying what the system is not.

  • The document committed on day one

    The lessons-learned and roadmap document, committed in the first commit under a message announcing a complete platform. It describes cloud services, a search engine and a cache layer this project never had, and an approved production launch that never happened. Kept unedited, marked as superseded, because it is the evidence.

  • The cloud infrastructure that was never applied

    A two-region federal environment written as infrastructure code, statically checked, with an apply runbook. Never applied to anything. The decision not to stand it up was taken because a rehearsal with no client does not need a federal environment.

What was built

The shape is deliberately ordinary. One service, one database, one front end, because the interesting parts of this project were never the architecture.

Stack

  • React
  • Node.js
  • Express
  • PostgreSQL
  • Open policy agent
  • Render
More on what was built

Two pieces are worth naming. Access decisions go through Open Policy Agent, compiled to WebAssembly and evaluated before any route handler, so a route cannot be reachable by forgetting a check. And the audit table is append-only at the database level, enforced by triggers that refuse an update, which matters because the first version of that table only claimed to be immutable.

The policy assistant answers questions about registration rules by retrieving passages and citing them, and every answer it produces is queued for a person to review rather than shown as settled.

Capabilities

  • Registration
  • Records management
  • Compliance cases
  • Reporting
  • Audit

Integrations

  • Hosting platform
  • Outside uptime check

Data stores

  • Application database
  • Append only audit log
The eligibility check runs, and stops
The eligibility check runs, and stopsThe profile and eligibility screen, where the software evaluates the rule and shows what it found. It goes no further than this. Nothing on this screen decides the application.

The measurement

This record separates three kinds of claim, and the line between them is whether a reader could recompute the number without trusting anyone.

Properties of the repository are published as verified. How many commits there are, who authored them, and what the documents say are all countable at a pinned commit, independently of the builder, and any reader can repeat the count. The headline figure on this record is of that kind: it is a text search over two files that sit in the same repository.

That the work was reviewed is also published as verified, because the author of that evidence is the platform owner rather than the builder. Those reviews are dated and specific, and several of them are corrections rather than approvals. They live in an internal thread, so an outside reader cannot open them; the record says so rather than implying the evidence is public.

Everything the builder measured about his own system is published as self-reported, and that includes the parts most likely to impress: the recovery drills, the test counts, the attack suite, the accessibility audit. Those numbers are written in his own documents in a public repository, and a public file is not the same thing as an independent measurement. Publishing them as verified because the repository is public would be precisely the mislabel that makes a record like this worthless.

What this record does not claim: that the system works at scale, because the builder states plainly that nothing was ever run at the volume his sizing assumes; that it is secure, because the security testing is his own and no independent penetration test was ever commissioned; or that any of it was ever used by anybody, because it was not. There was no client and no real data at any point.

And the thing the record is about is itself a caution about records: the documents written at the start of this project are confident, complete and wrong, and they were committed before there was anything to describe. They have been left in place deliberately, marked as superseded, because deleting them would remove the evidence.

Full notes on all 6 metrics
  • fourteen in the document written on day one, none in the one written after the drills

    Unsupported infrastructure claims in the day-one documents, against the review written after the build

    verified

    Baseline
    The readiness review, which carries none of these claims and three explicit statements of what the system is not.
    Unit
    claims
    Sample
    Four documents committed on the first day, and the readiness review written at the end.
    Methodology
    Both documents are in the same public repository at the same pinned commit. The counts are a text search any reader can repeat.

    Limitations

    • A count of claims is a measure of distance between two documents, not of how wrong any single sentence is.
    • The day-one document has exactly one commit against it, so it was never revised rather than being revised badly.
  • 182 commits between 7 August and 5 November

    Commits to the public repository

    verified

    Baseline
    None.
    Sample
    All commits on the default branch.
    Methodology
    The repository is public. Its commit list was read directly at the pinned commit.

    Limitations

    • A count of commits measures activity, not working software.
  • every commit in the repository, without exception

    Commits whose author is the AI coding assistant rather than a person

    verified

    Baseline
    None. There is no human-authored commit to compare against.
    Unit
    commits
    Sample
    All commits on the default branch.
    Methodology
    Read from the repository metadata directly, independently of the builder. Any reader can repeat it.

    Limitations

    • Authorship records who wrote the commit, not who directed the work or who found the problems. On this project those were different.
    • It also means the repository cannot evidence the builder contribution at all. That is why the decisions on this record cite a reviewer instead.
  • nine dated reviews between September and October, by someone who is not the builder

    Occasions the platform owner reviewed the work and accepted or corrected it

    verified

    Baseline
    None.
    Sample
    The build thread for the whole project.
    Methodology
    Counted from the thread. The author of each is not the builder, which is what makes the evidence independent of the work it describes.

    Limitations

    • The thread is internal, so this evidence cannot be opened by an outside reader.
    • A review count says nothing about depth.
  • forty-five of forty-six, with the forty-sixth written as code and never applied

    Stories working on the demonstration

    illustrative

    Baseline
    None.
    Unit
    stories
    Sample
    All forty-six build stories.
    Methodology
    Taken from the readiness review. Each line cites either a thread post or an evidence folder, so the pointers can be followed, but the state itself is the builder own assessment.

    Limitations

    • Self-reported. Every line carries a pointer to evidence, which is better than most records manage, but nobody outside recounted them.
    • The one remaining story is cloud infrastructure that was written and checked but never applied anywhere.
  • three days down, and nothing outside the system noticed

    Days the demonstration was down before anything noticed

    illustrative

    Baseline
    None.
    Sample
    One outage, in October.
    Methodology
    Recorded by the builder, who then added a check that runs from outside the hosting platform on a schedule and opens an issue when the site is down.

    Limitations

    • Self-reported.
    • The lesson is the absence of monitoring, not the length of the outage. A system nobody watches is indistinguishable from one that is working.
Eligible, and denied anyway, with the reason on the record
Eligible, and denied anyway, with the reason on the recordAn exemption case the software scored as Eligible, applicant is 65 or older, and that a case manager denied, with the recorded reason being that proof of age was not provided. The timeline carries every status change with the person who made it and when. The applicant can attach the missing document and appeal the decision from this same screen. This is the screen the whole design exists to produce.

What happened next

In progress

  • Mark the day-one documents as superseded without editing them
  • Have the builder own figures recounted by somebody else
  • Correct the rehearsal closeout with the real reason the submission failed

Not pursued

  • Stand up the federal environment
  • Commission an independent penetration test
  • Test with people who use assistive technology
Notes on 6 of the 6 items
  • Mark the day-one documents as superseded without editing them. Four documents committed on the first day describe a system that does not exist, and the repository is public. Each is getting a header saying so and pointing at the readiness review. The text below stays untouched, because the gap between the two is the evidence.
  • Stand up the federal environment. Written as code and statically checked, never applied. A two-region federal environment for a rehearsal with no client, no authority to operate and no real data was declined on 5 November 2026.
  • Commission an independent penetration test. The security testing on this project is the builder own attack suite against his own code. An independent test was never commissioned, and is not being commissioned, because nothing is going to a production environment.
  • Test with people who use assistive technology. The accessibility work is automated auditing plus a written conformance report, which the report itself marks as owing a hands-on test with screen reader and magnification users. That test was never arranged.
  • Have the builder own figures recounted by somebody else. The drill timings, test counts and audit row counts are the builder records of his own work. An independent recount is the only thing that would move them out of self-reported.
  • Correct the rehearsal closeout with the real reason the submission failed. The closeout attributes the missing submission control to an unowned submitter role and an unconfirmed channel. The simpler explanation is that offers were due on 6 July 2026 and the rehearsal began on 8 July, so the opportunity had already closed. The record of the opportunity also names a different set-aside programme than the brief did.
The queue staff actually work
The queue staff actually workCase management: open cases by status, filters by exemption type and assigned manager, and an export whose own caption promises it downloads exactly the cases matching the filters shown. Each case names its applicant, its type, its status and who it is assigned to, or that it is unassigned.

Meet the builder

OBI, Anamelechi Kingsley

Intern, Colaberry Gov Contracts programme, Colaberry

Project contribution

Built the demonstration across forty-six stories and assembled an eleven-volume proposal package. Every commit in the repository was authored by his AI coding assistant; the judgement calls were his, and the four findings that make this record worth reading were all found by him, in his own work, and reported before anyone asked.

Skills demonstrated

  • Finding the checks that check nothingFound an audit constraint that announced immutability while testing a condition that is always true, a health endpoint that reported on the database without contacting it, and a production database holding three of ten migrations while the service reported itself healthy.
  • Reporting his own security gap before being askedDeploying a schema switched on older endpoints that had no authorization checks. He found it in his own deploy, closed it, and reported it on the thread unprompted.
  • Proving a check can fail before trusting it passingRan the accessibility audit against the pre-fix code to confirm it failed there, rather than accepting a pass at face value. The reviewer named this as the habit worth repeating.
  • Describing his own work accurately under pressure to oversellPut one sentence on every update, deck and evidence pack stating that the work was demonstrated on a synthetic deployment and not operating as a production system, and kept it there while the material was being written toward a bid.

Career facts as confirmed to Colaberry; project contribution from the repository record.

What this project shows

What was built is a working demonstration of a public-facing government process in which the software does the checking and a person does the deciding, and every determination carries a reason, a named decider, a second reviewer on appeal and an audit entry nobody can edit afterwards. That design is not a constraint the project worked around. It is the product. The second thing worth taking is the shape of the four failures found along the way. An audit constraint that announced immutability and tested nothing. A health endpoint that answered without checking. A production database holding three of ten migrations while the service called itself healthy. Endpoints that authorized nobody, switched on by a schema deploy. Every one of them is a system reporting success while doing nothing, and every one was found by an intern running drills against his own work rather than by a review of the code. And then the finding nobody was looking for. An AI coding assistant will write a completion report as fluently as it writes code, and it will write one for software that does not exist yet, in the same confident register it uses for software that works. Ninety days of building is what told the difference, and the only reason the difference is measurable is that both documents were kept. Nothing here was submitted and there was no client. The rehearsal cost one intern ninety days and found four failure modes, a set-aside programme named wrongly in the brief, and a submission window that had closed two days before anyone started reading. All of that is cheaper to learn here than on a bid.

Repositories

Build one of these

Start the program that produced this work.

See the program