## Inspiration

City packets change. Page 47 watches what you care about.

A public decision can remain technically available while becoming much harder to follow. A matter may return in another packet, move from the regular agenda to consent, appear under a less specific title, or receive a replacement attachment.

Unless someone keeps checking, the change is easy to miss.

I built Page 47 for residents, neighborhood groups, local journalists, and civic organizations that care about a place but do not have time to monitor every council agenda, packet, attachment, and revision.

I did not want to build another civic chatbot or latest-document summarizer. I wanted to build a system that remembers what it saw and helps people notice when the public record deserves another look.

What it does

A resident chooses a city, an area, and an email address. Page 47 stores the watch on the server, so the browser can close while monitoring continues in the background.

A scheduled collector checks configured public sources and preserves each observation with:

  • the source URL
  • captured document bytes
  • capture time
  • HTTP status
  • SHA-256 hash
  • available source metadata

When a document changes at the same URL, the earlier and later versions remain distinguishable.

Page 47 compares how a matter was presented over time. It keeps the evidence dimensions separate:

  • title wording
  • agenda placement
  • document substance
  • trustworthy timing

The result can be:

  • clearer
  • less clear
  • mixed
  • unchanged
  • cannot determine

Opposing signals do not cancel into an unexplained risk score. If the available public record is incomplete, Page 47 says so.

Each finding shows what Page 47 knows, what it observed, what was reconstructed from the public record, what remains uncertain, and which primary sources support the claim.

The final brief gives the resident evidence and no more than three useful questions to ask. It does not tell anyone how to vote, determine motive, make a legal finding, or recommend a political position.

How we built it

Page 47 uses a shared product and comparison layer with separate city adapters for Seattle and Denver.

The collector runs on an always-on Amazon Lightsail host. Captured records are retained locally and backed up to private, versioned Amazon S3 storage after integrity verification.

The deterministic comparison layer owns the directional semantics. It handles title changes, agenda placement, document substance, mixed directions, replacement hashes, missing evidence, and abstention.

The investigation graph uses five focused Strands roles:

  • Archivist, for matter history and capture chronology
  • Substance, for concrete provisions in captured documents
  • Process, for titles, public bodies, and agenda placement
  • Skeptic, for rejecting unsupported interpretations
  • Brief Writer, for producing the resident-facing review

Amazon Bedrock provides the model calls for bounded document and evidence reading. The Strands graph runs in Amazon Bedrock AgentCore Runtime.

AWS Distro for OpenTelemetry instruments managed investigations. Amazon CloudWatch receives runtime and collector signals. AWS Systems Manager keeps deployment parameters outside the source tree. Amazon SES provides the evidence-linked transactional alert path.

Public documents are treated as untrusted data. Instructions embedded inside a government document are never treated as commands to the agents.

Challenges we ran into

The hardest problem was not extracting text. It was deciding what Page 47 could honestly claim.

Public-record systems often replace documents at the same URL, expose incomplete historical information, provide unreliable timestamps, or remove intermediate versions. A current record cannot prove that Page 47 witnessed an earlier transition.

That forced a strict distinction between:

  • Observed by Page 47
  • Reconstructed from public record
  • Current public record
  • Cannot determine

The forward-observation verifier only permits an observed transition when Page 47 has distinct, ordered captures with qualifying collector provenance. Historical records are never relabeled as live observations.

Another challenge was preventing contradictory evidence from disappearing. A title can become less specific while agenda placement becomes more visible. Page 47 reports that as mixed instead of allowing one signal to cancel the other.

We also had to keep the agents from turning plausible explanations into unsupported accusations. The Skeptic can reject an interpretation when the evidence does not establish it.

Finally, real historical records are difficult to evaluate fairly. Many cases do not preserve enough comparable history to support a directional label. We separated the evaluation into random historical abstention, an independently reviewed real-data challenge cohort, controlled transformations, and prospective monitoring.

SES production access is currently under AWS review, so the deployed account remains subject to sandbox recipient verification until AWS approves the request.

Accomplishments that we're proud of

Page 47 is a working product, not only an architecture diagram. A resident can create a server-side watch, inspect captured reviews, follow evidence links, and stop the watch.

Seattle is the deep deployment, and Denver works through a separate city adapter using the same monitoring and review abstractions.

The evidence pipeline preserves document versions, source URLs, capture times, hashes, and provenance. The evidence is also backed up to private, versioned S3 storage.

The controlled evaluation contains 28 frozen transformations. Page 47 matched all 28 expected comparator states, including reversal pairs, mixed directions, missing evidence, changed hashes, duplicates, unsupported motive claims, and instruction-like document text.

The independently reviewed historical challenge cohort contains 37 real Seattle matters. Two independent reviewers agreed on all 37 cases, and all 89 adjudicated evidence records passed provenance checks. The current comparator surfaced two supported directional cases and no control cases. This is a challenge cohort, not a representative accuracy claim.

A separate 100-matter historical audit returned cannot determine for every case because the available records did not preserve enough comparable history. We kept that result visible because restraint is part of the product.

A real stored Seattle matter completed through the deployed AgentCore Runtime with all five Strands roles. The retained run includes a searchable trace with 51 span events, and the resulting review was saved back into Page 47.

What we learned

The first lesson was that observation must come before interpretation. If a system only keeps the latest document, it cannot honestly say that it saw a change.

The second was that abstention is not a weakness to hide. For civic software, an incomplete public record should produce a clear boundary rather than a confident accusation.

The third was that agents are most useful when their responsibilities are clear. The deterministic comparator handles the decision semantics, while the agents read different parts of the evidence and challenge one another’s interpretations.

The fourth was that the finding page matters as much as the backend. Residents need to understand what changed, where the evidence came from, what was rejected, and what Page 47 cannot establish.

What's next for Page47

The forward collector will continue running. Page 47 will only claim a prospective positive finding after it naturally witnesses an ordered change itself.

The next improvements are focused on evidence coverage, long-term observation, and dependable delivery rather than adding more agents or more scope.

That means continuing to improve the city adapters, expanding the range of clearly retained evidence, monitoring the SES production-access request, and using real feedback from residents and reviewers to make the findings even easier to understand.

Page 47 does not tell residents what to think.

It makes sure they know when the public record deserves another look.

Built With

Share this project:

Updates

Submission history