{"id":1156,"date":"2026-07-28T05:29:35","date_gmt":"2026-07-28T13:29:35","guid":{"rendered":"https:\/\/salemdata.net\/johnpress\/?p=1156"},"modified":"2026-07-28T05:29:35","modified_gmt":"2026-07-28T13:29:35","slug":"digesting-the-salem-city-council-hearing-record-for-july-27-2026","status":"publish","type":"post","link":"https:\/\/salemdata.net\/johnpress\/?p=1156","title":{"rendered":"Digesting the Salem City Council Hearing Record for July 27, 2026"},"content":{"rendered":"<p>Public testimony is often technically available but practically inaccessible. I downloaded the hearing record, removed duplicates, redacted contact information, summarized each submission, classified the testimony, and linked every entry back to its source page.<\/p>\n<p>The Salem City Council convened on July 27, 2026, at 6:00 p.m.\u00a0 The Agenda and supplemental packets can be obtained at <a href=\"https:\/\/www.cityofsalem.net\/government\/city-council-mayor\/city-council-meetings\/city-council-meeting-agendas-and-minutes\">here<\/a>. Here is a screenshot of the page you will encounter, it is designed to look like a calendar and has entries in blue bars on a given date:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-1160 aligncenter\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_045112_Tue.png\" alt=\"\" width=\"521\" height=\"380\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_045112_Tue.png 1394w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_045112_Tue-300x219.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_045112_Tue-768x560.png 768w\" sizes=\"auto, (max-width: 521px) 100vw, 521px\" \/><\/p>\n<p>The &#8220;helpful&#8221; interface requires you to hover and click a given blue bar on a given day.\u00a0 Here&#8217;s what you will see (as of Tuesday, 7\/28\/26 at 4:50 AM PDT):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1157 aligncenter\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_043743_Tue.png\" alt=\"\" width=\"913\" height=\"394\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_043743_Tue.png 913w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_043743_Tue-300x129.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_043743_Tue-768x331.png 768w\" sizes=\"auto, (max-width: 913px) 100vw, 913px\" \/><\/p>\n<p>I numbered the choices, <strong data-start=\"18\" data-end=\"32\">whose names have had the<\/strong>\u00a0<strong data-start=\"47\" data-end=\"85\">middle truncated and replaced with an ellipsis<\/strong> so that the entries are not unique, e.g. &#8220;07-27-26 Cou&#8230;pdf&#8221;, and I downloaded all five entries into a directory ~\/work\/Salem\/20260727.\u00a0 If you hover over the blue characters of any entry, you get a mouse pop-up that distnguishes the entry:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-1161\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042937_Tue.png\" alt=\"\" width=\"469\" height=\"171\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042937_Tue.png 774w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042937_Tue-300x109.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042937_Tue-768x280.png 768w\" sizes=\"auto, (max-width: 469px) 100vw, 469px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-1162\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042909_Tue.png\" alt=\"\" width=\"460\" height=\"191\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042909_Tue.png 780w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042909_Tue-300x125.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042909_Tue-768x319.png 768w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1163 aligncenter\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042843_Tue.png\" alt=\"\" width=\"461\" height=\"200\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042843_Tue.png 803w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042843_Tue-300x130.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/07\/20260728_042843_Tue-768x333.png 768w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/p>\n<p>I do not know whether this interface satisfies applicable accessibility requirements, but its dependence on hovering, truncated filenames, and precise mouse movement raises obvious usability and accessibility concerns. A plain-text list with complete filenames would be substantially easier to navigate.<\/p>\n<p>Here is a listing of the files downloaded with their size and page number (along with the shell script that extracted the page count):<\/p>\n<pre><span style=\"color: #00cd00;\"><b>jlpoole@jp<\/b><\/span><span style=\"color: #9d9df7;\"><b> ~\/work\/Salem\/20260727 $<\/b><\/span> date; printf '%-60s %12s %8s\\n' 'FILE' 'SIZE' 'PAGES'\r\nfind . -maxdepth 1 -type f -iname '*.pdf' -print0 |\r\nwhile IFS= read -r -d '' file; do\r\n    size=$(du -h --apparent-size \"$file\" | awk '{print $1}')\r\n    pages=$(pdfinfo \"$file\" 2&gt;\/dev\/null | awk '\/^Pages:\/ { print $2 }')\r\n\r\n    printf '%-60s %12s %8s\\n' \\\r\n        \"${file#.\/}\" \\\r\n        \"$size\" \\\r\n        \"${pages:-ERROR}\"\r\ndone\r\nTue Jul 28 04:57:54 PDT 2026\r\nFILE                                                                 SIZE    PAGES\r\n07-27-26 Council Written Testimony #2.pdf                             36M      361\r\n07-27-26 Council Additions 1.pdf                                     836K       22\r\nAgenda - FullPackage City Council _Jul27_2026.pdf                     89M      386\r\n07-27-26 Council Written Testimony 1.pdf                              61M      319\r\nAgenda - Agenda City Council _Jul27_2026.pdf                         503K        8\r\n<span style=\"color: #00cd00;\"><b>jlpoole@jp<\/b><\/span><span style=\"color: #9d9df7;\"><b> ~\/work\/Salem\/20260727 $<\/b><\/span> \r\n<\/pre>\n<p>I then submitted this prompt to OpenAI&#8217;s Codex:<\/p>\n<p>~\/work\/Salem\/20260727 contains 5 PDFs relating to the City of Salem hearing on same date. Would you please digest the PDFs providing a table of people who appeared with a colum [<em>sic<\/em>] of their name &amp; address, if provided, their email, and then a concise summary in 1-3 sentences of the substance of their submission? The table would be relevant to &#8220;Additions&#8221; which is a powerpoint presentation and &#8220;Agenda &#8211; Agenda&#8221; which is solely the Agenda. The goal here is to provide an executive summary, along with count of testimony submissions, so one can get an overview without having to read 600+ sheets.<\/p>\n<p>The response was:<\/p>\n<div>\n<div>\n<div>\n<div>\n<div>\n<div>\n<p>5:11 AM<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div>Worked for 4m 12s<\/div>\n<\/div>\n<div>\n<div>\n<div>\n<div>\n<p>Done. I created the digest here:<\/p>\n<p>[salem_2026-07-27_testimony_digest.md](\/home\/jlpoole\/work\/Salem\/20260727\/salem_2026-07-27_testimony_digest.md)<\/p>\n<p>Key counts from the digest:<\/p>\n<ul>\n<li><strong>187<\/strong> public testimony records counted after deduping repeated PDF text and removing staff-only wrapper\/reply records.<\/li>\n<li><strong>173<\/strong> approximate unique submitter identities by name\/email pair.<\/li>\n<li>Classification: <strong>129 opposed or seriously concerned<\/strong>, <strong>1 directly supportive<\/strong>, <strong>5 focused on\/supportive of process motions<\/strong>, <strong>52 questions or mixed process comments<\/strong>.<\/li>\n<\/ul>\n<p>I treated <code>Agenda - Agenda<\/code> and <code>07-27-26 Council Additions 1.pdf<\/code> as the agenda\/context anchors, and did not separately count <code>Agenda - FullPackage...<\/code> because it appears to duplicate agenda\/supporting material and would risk double counting.<\/p>\n<\/div>\n<div>\n<p>5:15 AM<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Here are the results (I had Codex remove addresses and emails from the table):<\/p>\n<p><a href=\"https:\/\/salemdata.net\/CityOfSalem\/salem_2026-07-27_testimony_digest_redacted_v1.html\">https:\/\/salemdata.net\/CityOfSalem\/salem_2026-07-27_testimony_digest_redacted_v1.html<\/a><\/p>\n<p>The resulting digest contains 187 materially distinct testimony records representing approximately 167 submitters. Of those records, 129 opposed or expressed serious concern about the proposal, one directly supported it, five focused on the proposed public-process motions, and 52 consisted of questions or mixed process comments.<\/p>\n<p>This method is not limited to data centers or Salem. Residents, journalists, neighborhood associations, and public officials can use the same approach whenever testimony is buried in large agenda packets. The essential safeguards are preserving the source documents, explaining the methodology, protecting private information, and linking summaries back to the record.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Public testimony is often technically available but practically inaccessible. I downloaded the hearing record, removed duplicates, redacted contact information, summarized each submission, classified the testimony, and linked every entry back to its source page. The Salem City Council convened on July 27, 2026, at 6:00 p.m.\u00a0 The Agenda and supplemental packets can be obtained at [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gfmr_meta_descriptions":[],"_gfmr_multilingual_taxonomy_terms":[],"footnotes":""},"categories":[12],"tags":[],"class_list":["post-1156","post","type-post","status-publish","format-standard","hentry","category-salem-oregon"],"_links":{"self":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/1156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1156"}],"version-history":[{"count":5,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/1156\/revisions"}],"predecessor-version":[{"id":1171,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/1156\/revisions\/1171"}],"wp:attachment":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}