CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

CivicNotice

CivicNotice is the CivicSuite module for public hearing notices, legal notices, bid notices, vacancy notices, statutory publication deadlines, statutory rule checks, notice drafting templates, accessibility and language-readiness review, publication-readiness review, channel planning, subscriber delivery planning, archive/handoff packets, and notice-record export checklists.

Release state: the latest published GitHub release is v0.1.1. The current in-tree source is v0.2.0, the notice-compliance foundation aligned to the civiccore v1.2.0 release wheel; v0.2.0 is bundled source, not yet published as a GitHub release (it ships only through the Windows Local city-core profile's commit-pinned bundle). This repo provides a FastAPI package, health/root endpoints, documentation gates, deterministic sample notice registry, CivicCore-backed statutory deadline plans, deterministic statutory rule checks, notice drafting templates, accessibility and language-readiness review packets, optional database-backed registry/deadline/publication-proof workpapers, publication-readiness checklists, channel-planning helpers, subscriber delivery planning, archive/handoff packets, notice/records export checklist, and accessible public sample UI at /civicnotice. It does not ship legal sufficiency decisions, legal advice, live LLM calls, official notice publication, publication-system write-back, or notice system-of-record integrations.

What CivicNotice Does

  • Create sample notice registry stubs.
  • Build statutory publication deadline reminder plans using the shared CivicCore notice helper.
  • Check notice packets against deterministic staff-review rule packs for common notice types.
  • Build staff-editable notice templates with required fields and unresolved placeholders.
  • Build accessibility, plain-language, and human-approved translation readiness packets.
  • Persist notice registry, deadline-plan, and publication-proof workpapers when CIVICNOTICE_WORKPAPER_DB_URL is configured.
  • Store staff-reviewed publication proof packets linked to upstream Clerk, procurement, board, or manual source records.
  • Assemble publication-readiness checklists for staff review.
  • Plan notice channels and accessibility-review needs.
  • Build subscriber delivery plans without sending notices or storing subscriber PII.
  • Assemble archive/handoff packets for Clerk, Procure, Boards, Records, and manual staff files.
  • Produce notice and records export checklists.
  • Demonstrate a public notice-support UI at /civicnotice.

What CivicNotice Does Not Do

  • It does not decide legal sufficiency.
  • It does not publish official notices.
  • It does not provide legal advice.
  • It does not call live LLMs in v0.2.0.
  • It does not write back to publication systems.
  • It does not replace a notice system of record.

API Surface

  • GET / returns the shipped/planned boundary.
  • GET /health returns package and CivicCore versions.
  • GET /civicnotice returns the accessible public sample UI.
  • GET /docs opens the interactive FastAPI API documentation for local deployments.
  • GET /openapi.json returns the machine-readable API schema, including accepted request and error shapes.
  • POST /api/v1/civicnotice/registry returns a sample notice registry stub.
  • GET /api/v1/civicnotice/registry/{record_id} retrieves a persisted notice registry record.
  • POST /api/v1/civicnotice/deadlines returns statutory deadline reminders.
  • GET /api/v1/civicnotice/deadlines/{plan_id} retrieves a persisted deadline plan.
  • POST /api/v1/civicnotice/rule-check checks a notice packet against deterministic staff-review rules.
  • POST /api/v1/civicnotice/templates returns a staff-editable notice template.
  • POST /api/v1/civicnotice/publication-proof stores a durable publication proof workpaper.
  • GET /api/v1/civicnotice/publication-proof/{proof_id} retrieves a persisted publication proof workpaper.
  • POST /api/v1/civicnotice/publication-check returns a publication-readiness checklist.
  • POST /api/v1/civicnotice/accessibility-review returns accessibility and language-readiness flags.
  • POST /api/v1/civicnotice/channels returns channel planning flags.
  • POST /api/v1/civicnotice/subscribers/plan returns a subscriber delivery plan.
  • POST /api/v1/civicnotice/archive-packet returns archive and handoff readiness for a notice file.
  • POST /api/v1/civicnotice/export returns a notice and records export checklist.

Start and Smoke-Check CivicNotice

Install the package with its development dependencies, start the ASGI app target civicnotice.main:app, and open the local /health and /civicnotice routes. A fresh user can reach the core stateless API and public sample UI without a database, model server, account, or API key.

Minimal workflow to smoke-check after startup:

  1. Confirm /health reports service: civicnotice, version 0.2.0, and CivicCore 1.2.0.
  2. Post a registry stub to /api/v1/civicnotice/registry without a database and confirm the response includes record_id: null, registry notes, and the staff-responsibility disclaimer.
  3. Open /docs or /openapi.json to inspect accepted fields, then post a rule check to /api/v1/civicnotice/rule-check with a supported notice type, event date, publication dates, channels, content fields, and statutory basis. Unsupported notice types return a 422 response with supported choices.
  4. Open /civicnotice and confirm the page is a static public sample with boundary copy, not an official publication workflow.

Persistence and Durable Writes

Without CIVICNOTICE_WORKPAPER_DB_URL, CivicNotice runs in deterministic stateless mode: registry and deadline POST requests return transient payloads, persisted GET routes return actionable 503 responses, and publication-proof storage is unavailable.

With CIVICNOTICE_WORKPAPER_DB_URL, registry, deadline, and publication-proof workpapers are durable. Persistence-backed write routes also require CIVICNOTICE_TRUSTED_WRITE_TOKEN and the matching X-CivicNotice-Write-Token request header. This is a minimal trusted-mode guard for local deployments; it is not a replacement for a production identity system.

Local Development

python -m pip install -e ".[dev]"
python -m pytest -q
bash scripts/verify-release.sh

The release gate requires CIVICNOTICE_POSTGRES_TEST_URL so PostgreSQL persistence coverage cannot be skipped. Plain unit tests may still run without PostgreSQL for local development.

License

Code is Apache License 2.0. Documentation is CC BY 4.0.

About

CivicNotice statutory publication and public notice support module for CivicSuite

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages