Community研究与数据分析github.com

records-request

通过公共记录请求从美国政府办公室获取特定文件——涵盖网站预查、查找正确办公室和适用法规、排除条款撰写、网页表单陷阱处理、催办跟进以及多年度表格解析。

records-request 是什么?

该技能提供了一套完整的工作流程,用于通过公共记录请求(如FOIA)从美国各级政府办公室获取特定文件。核心价值在于将繁琐的法律程序转化为可复用的工程化步骤,避免因格式错误、法规引用不当或催办缺失而导致请求被拒或无限期拖延。技能支持电子邮件、政府门户网站和邮寄三种渠道,并针对性地处理了常见陷阱:隐藏的字符数限制会静默截断请求内容;Web应用防火墙(WAF)会将撇号等字符误判为SQL注入攻击而拒绝整个请求;绝大多数辖区对请求的法定回复时间模糊,必须主动催办。此外,技能指导用户如何撰写关键的“排除条款”,通过主动引用并声明排除适用的保密法规,迫使办公室从“能否公开”转向“你需要哪份表格”,从而大幅提高成功率。它还涵盖了多表格切换、权限标记以及跨来源数据解析的注意事项,确保最终获取的文件可用且可溯源。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/2016judea/brick-mortar-skills/tree/HEAD/skills/records-request

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

公共记录请求

目标: 以最低成本获取一份指定的文件,同时避免惹恼日后可能还需联系的办公室。完成标志: 文件已保存至本地磁盘并缓存,其来源和权利状态已记录在案——或者收到“我方无此文件”的书面答复,此答复同样视为成功,可了结该文件。

瓶颈:必须由人类发送。 起草文件、核实收件人、归入文件、标明为草稿、然后停止。任何包含验证码和签名勾选框的门户网站,均只能由人类操作。


步骤 0 — 首先查阅网站。这是成本最低的规则。

在起草任何文件前,先在办公室的网站上查找该文件。

已发布的收费标准表只能说明该办公室经常收到此类请求,而不能证明答案必须收费。 曾有报道称,某县以每年34.50美元的价格出售其资本化率研究报告,但该县在其统计页面上免费发布了同份报告过去四年的数据。一次页面抓取既省了钱,也免了三周的等待。

然后核查邻近机构:某个州级机构可能会发布县级机构不提供的汇总数据(但需仔细阅读其实际涵盖范围——一份州级“资本率研究”可能仅包含州评估的公共事业和铁路财产)。此外,需正确确认否定结果:在该办公室已发布的报告中搜索你的关键词。只有确认找不到,才能证明请求是获取信息的唯一途径。

步骤 1 — 找到正确的办公室,并确保名称无误

不同州的办公室名称各不相同。 向错误的机构发送请求将石沉大海。以商业房地产估值为例:

州负责商业物业估值的部门
MN, IA, NE县 评估员 (Assessor)
KS县 估价员 (Appraiser)
ND县 税务平衡主管 (Director of Tax Equalization)
SD县 平衡主管 (Director of Equalization)
WI无县级评估员 — 评估由市级负责,因此应致函市政府

另外:有些州将大城市的评估职能并入县评估员(例如爱荷华州:波尔克县涵盖得梅因市);另一些州则保持独立(例如北达科他州:法戈市和卡斯县彼此独立)。

渠道优先级:电子邮件、门户网站、邮寄。

  • 电子邮件: 只要存在邮件地址,优先使用。需在该办公室的网站上核实地址。
  • 门户网站(如GovQA, NextRequest): 仅当未公布邮件地址时使用。门户网站需要人工操作账户、验证码以及具有法律约束力的签名复选框。
  • 邮寄: 最后手段;在草稿标题中注明其作为备用方案。

有些页面内容通过脚本渲染,curl 获取不到有用信息。可用 Python 去除HTML标签并搜索 @ 符号;若确无邮件地址,则如实说明,切勿猜测。

步骤 2 — 排除条款是整个请求的核心

在信件中亲自指明并声明排除适用的保密法规。 缺少该条款,请求将大概率被直接拒绝,因为办公室会习惯性地援引保密规定。有了该条款,问题将从“我们能否公开这份信息”转变为“您指的是我方哪一张表格”。

仅索取该办公室自身编制的、覆盖全县的汇总表和研究报告,这些文件不含地块层级或所有者可识别的数据,并主动提出可接受已剔除所有者提交部分信息的混合文档。

成功用于评估员请求的法规条款实例(请以现行法律为准):

州依据法规声明排除的法规
MNMinn. Stat. 13.03 subd. 313.51 subd. 2 — 所有者提交的收入/支出、空置率、可出租面积、租约
KSK.S.A. 45-215 et seq. (保管人:45-218)45-221(b) — 提供给估价员的纳税人财务信息
IAIowa Code ch. 2222.7 商业秘密 — 并引用 441.21(3)(a),该条明确要求披露公式或方法,外加 441.19(1)(a)
NENeb. Rev. Stat. 84-71284-712.05(3) 商业秘密/专有信息
NDN.D.C.C. 44-04-1844-04-18.4 商业秘密/商业信息
SDSDCL 1-27-1该州评估官保密条款的对应规定

凡有法律强制要求公开的,务必引用该法条(如上文爱荷华州示例):它可以完全排除保密的惯性思维。

切勿改写已被接受的措辞。 一旦某办公室接受了你的措辞,可将其直接用于其他同类型办公室,仅需替换名称;任何改动都可能引发新一轮的范围确认问题。建议通过哈希校验确认段落未在批量编辑中被无意修改。

步骤 3 — 首封请求信必须包含的三项内容

  1. 要求五年数据,而非一年。 “包含2022至2026评估年度。” 对办公室而言是同样的查询工作,但可获得五倍的数据量——而系列数据本身往往就是产品(能显示办公室如何调整自身费率)。同时添加:“请发送您持有的所有年份;部分答复同样有用。” 这样即使缺少某一年份,也不会导致回复停滞。
  2. 提供一个简便的退出方式。 “若贵办公室不编制此类附表,只需一行文字说明即可了结此事,我将不再跟进。” 书面否定答复即可结案,且仅需对方三十秒,而非撰写正式的拒绝函。
  3. 请求先提供费用估算。 “若办理此请求会产生费用,请先告知估算金额,我将据此缩减请求范围。” 部分办公室按小时收费,且同时按查找和编辑双重计费。

步骤 4 — 批量发送前的检查

  • 检查每个收件人域的MX记录: dig +short MX <domain>。可避免因拼写错误导致十九封邮件被退回。
  • 从头到尾通读一封完整的信件。 读全文,而非看差异。
  • 在同一批请求中保持请求人身份一致(同一个人或同一家公司,同一地址),以便回复能够串联,无需对方反复确认身份。
  • 使用纯文本格式发送。硬折行文本在HTML中会变形。

步骤 4b — 网页表单是充满敌意的渠道。需防范两种陷阱。

  1. 隐藏的字符数限制。 消息字段可能静默截断内容,例如将2000字符的正文截断为1000字符。对于任何网页表单,事先准备好简短版本:包含法规引用、带有年份范围的请求、保密声明、费用估算说明以及联系方式。保密声明是最后才考虑删除的内容。

  2. Web应用防火墙直接拒绝整个请求(Event Type: signature)。原因通常不是长度,而是标点符号:孤立的单引号是标准的SQL注入攻击特征。 需清除正文和主题中的如下字符:' " ( ) & / ; = < > -- 以及非ASCII字符。用“与”代替“&”,去掉法规子节中的括号,说“贵办公室编制的”而非“贵办公室的”。通过代码审核:

    python3 -c "s=open('body.txt').read(); print({c:s.count(c) for c in \"'\"()&/;=<>\" if c in s})"
    

在开始之前就确定备用方案: 隐藏邮件地址的办公室通常仍会公布街道地址。若表单经过三轮尝试仍无法提交,不值得再尝试第四轮;改为邮寄。

步骤 5 — 记录发送操作,否则相当于从未发生

保留法定的主题行 — 记录官员根据主题行路由请求,回复也会在同一主题下串联。将每份草稿的页眉从未发送改为已发送 <日期> 自 <地址>,messageId <ID>,在下方保留正文原文作为记录,并更新你的追踪表。仔细检查批量编辑影响的每一行:全局查找并替换状态列的操作,可能错误地将未发送的网页表单行标记为“已发送”。

步骤 5b — 需要附件的回复

部分邮件管理平台(如 Zoho)不支持附件上传。此时应通过事务性邮件提供商(如 Mailgun)从同一地址发送回复,并设置h:In-Reply-To和h:References为该办公室原始邮件的Message-ID,保留其主题行,以实现线程串联。使用 curl 时,务必对所有头部和正文字段使用**--form-string**——-F会将开头为<(所有Message-ID)或@的值视为“读取此文件”。通过提供商的 events API 确认投递成功。

办公室自有的表单通常在其网站上。 如果是纯PDF表单,可用 reportlab 叠加文本,将详细说明放在第2页,并在发送前将页面渲染为PNG图片并查看(文本落在标签上的情况比想象的更常见)。

在退回表单时缩小请求范围。 收到费用警告时,正是说明已持有哪些信息、仅请求剩余部分并要求先估算费用的时机。

当对方给出软性否定并提及输入数据时,并不等于拒绝提供衍生表格。 “我们使用来自租金调查的数据,这些数据是保密的”这样的答复,仅拒绝了一项以其保密性为理由的项目,而忽略了衍生研究报告。应将跳过项作为是非题重新询问,表示感谢,并再次提供那个简便退出选项。保持礼貌:因为你将来还可能再次联系该办公室。

步骤 6 — 催办,因为通常没有法定截止日期

短暂的法定时限往往并非为你设定。 门户网站标注的“10个工作日”可能仅适用于数据主体查询自身信息。对政府数据的通用请求,通常会得到“合理时间”的回应(例如明尼苏达州法规13.03 subd. 3),这根本没有设定时间限制。持续跟进是唯一施加压力的方式。 在请求发出的当天,就安排大约两周后的催办提醒(参见pending-queue钩子),在催办中包含参考编号、门户路径、联系人姓名,并注明“请勿改动请求内容”。催办只是查询状态;切勿在后续沟通中改变请求范围。

步骤 7 — 收到的文件是否可以重新发布?

在基于该文件构建任何东西之前,必须回答此问题。

  • 明尼苏达州:可以,包括用于商业目的。 除非有明确的法律授权,否则机构必须允许“对该数据的无限制使用,即使出于商业目的”——明尼苏达州总检察长意见书 852 (1995)。
  • 所有地区:事实本身不享有版权 (Feist 案) —— 只有特定的选择或编排才受保护。仅重新发布数字,切勿复制其文件布局。 将其重新表达到你自己的数据模型中。
  • 其他地区,用途方面的规定尚不明确。 在主张权利前,请仔细阅读该州的商业使用条款,并如实标记你自己的文件(使用“尚未获批重新发布”作为标记,这并非办公室的限制——不要将其说成是办公室的限制)。

步骤 8 — 解析收到的文件

将原始文件与解析后的输出一同缓存,记录其 SHA256 哈希值和规范 URL,切勿重新下载。

不同年份的标签会发生变化。 某县在这四年间的年度表格中,自身行标签依次为22、22、18、18,且物业类型消失。请手动编写交叉对照表,并在每条记录中逐字保留原始标签。切勿使用模糊匹配 —— 这是导致错误数据看似正确的常见原因。数据类型的消失应表示为缺失,而非零值。

不要依赖对 pdftotext 输出进行正则匹配来判断数据结构。 一个字符类可能因缺少数字而错误截断 Warehouse <25% Office / >20K 中的 2,从而将四行静默合并为两行。在相信你的提取结果之前,先核对行数与源文件是否一致。

在声称可以关联跨来源数据之前,先用第二个来源证明关联的有效性。 同一州的县、同一类型的文件,其确切的物业类型名称可能无一匹配。

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

2016judea/ascii-charts

Build charts as plain Unicode-block text — bar, range, bullet, gap-bracket, star-histogram, heatmap, line, Venn, pie, donut and scatter — with a dependency-free Python script, for anywhere only monospace text survives (newsletter code blocks, Markdown, terminals, plain-text email, chat). Use when a chart has to embed as literal text instead of an image or a third-party chart service, or when you want a hand-made terminal look with no branding footer.

2016judea/buffett-checklist

Apply Warren Buffett's investment framework as a discipline lens when weighing a buy, hold, or sell decision — circle of competence, economic moat, owner earnings & intrinsic value, margin of safety, management/capital-allocation quality, and market psychology (Mr. Market, fear vs greed, temperament). Use when asked to "run this through Buffett", "what would Buffett say", "does this pass the moat test", "is this cheap enough", or for a second, more skeptical read on a name being evaluated or already held. This is a discipline overlay, not a replacement for a strategy — it applies the Buffett lens to how someone actually invests, rather than issuing generic advice.

2016judea/image-riff

Turn one or more reference images into original art in that reference's own visual language, then cut it to whatever surface it's for. Use when you paste or point at art and say "use this as the base image", "generate art from this", "riff on this", "some creative ideation with these images", "make me a channel banner / avatar / cover / plate", "wilder version of this", or want a spread of options off one piece of reference. This is the TASK skill; the engine is the `make-art` tool skill.

2016judea/leonardo

Draw the way Leonardo da Vinci drew — a study sheet, a notebook folio, a red-chalk or silverpoint study, a machine cutaway, a storm of vortices — in his real materials and page-logic, generated with the make-art engine and anchored on fifteen of his actual (public-domain) sheets. Use when you say "Leonardo", "da Vinci", "like his notebooks", "a codex page of X", "draw this as one of his study sheets", "sanguine", "silverpoint", or wants a design, diagram, or illustration in that hand. Also a reading guide to his notebooks (Richter's 1883 public-domain translation) for "what did Leonardo say about shadow / trees / water". This is a TASK skill; the engine is `make-art`.

2016judea/mcp-stack

Which free MCP server or framework to reach for, and its traps — finance/gov data (SEC EDGAR, Yahoo, SAM.gov, USAspending), web research (Exa, Firecrawl, Crawl4AI, Jina reader), design/art/brand (Canva, Inkscape, Penpot, Figma, Orshot, Hugging Face image gen, vectorizing, charts), data/spatial (DuckDB spatial, live ArcGIS layers, OpenStreetMap/Overpass, Census, MapLibre), and ops (PostHog, iMessage, context7 docs). Use when making a social post, OG card, poster, logo/vector, chart, map, or brand asset; when querying parquet/geojson/duckdb or a city's open-data layer; when an MCP "needs authentication" or fails; or when asked "what tools do we have", "is there an MCP for X", "should we add X".

2016judea/sms-native-product

Build a product whose interface is text messages rather than an app or a website — "no app, no website", "they just text a number", "chat with our agent natively in Text Messages", "can we do this over text", "an SMS bot", "a Telegram bot", "make it a group chat", "minimum viable friction". Fires equally when it has already gone wrong — "my campaign got rejected", "our number is blocked", "the texts aren't arriving", "why do I need to register". Covers the gate that decides whether such a product can send at all (US A2P 10DLC registration, SHAFT content rules, permanent rejection codes), group MMS from code, what each channel can't do, an architecture that survives losing the channel, and guarding model-rewritten user content.

2016judea/vertical-market-agent

Build a chat agent that knows one industry in one metro better than any general model because it carries a precomputed digest of real public records (or a mined review corpus) and can pull live records mid-conversation — finding the moat, building a byte-stable substrate, enumerating what the records can't, the data traps that produce plausible wrong numbers, deterministic math in tools, measured prompt cost and cache TTL, shipping as an ad destination, an off-sector ending, and a precomputed spatial "what is this next to" layer. Use when building a vertical AI agent grounded in records rather than general knowledge.

相关技能