← back to AbramsOS
AbramsOS claims: apply migration 0016, fix parser (Estimated/embedded-$/no-claim headings), id kind, George-path corpus ingester; ingest Aug 8-12 Dan mailers (42 claims/22 open); stage 5 no-proof breach fill-not-submit briefs
6fb5271e109a4c1e311bd1bbb44d6bd50e808d58 · 2026-08-12 14:39:35 -0700 · Steve Abrams
Files touched
A data/claim-fill-queue/claim_01kzvyd76gk24xz5883cgkrjwg.jsonA data/claim-fill-queue/claim_01kzvyd76n94qcsh7ks4ek676f.jsonA data/claim-fill-queue/claim_01kzvyhm96rdqm58r3g4w00m5k.jsonA data/claim-fill-queue/claim_01kzvyhm9nzrh6d9kqpfnek6bd.jsonA data/claim-fill-queue/claim_01kzvyhm9tkqn03j5thd6vnxc1.jsonA data/mode-emails-new.jsM lib/ids.jsM lib/mode-claims.jsA scripts/ingest-mode-claims-corpus.jsA scripts/stage-eligible-claims.js
Diff
commit 6fb5271e109a4c1e311bd1bbb44d6bd50e808d58
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Aug 12 14:39:35 2026 -0700
AbramsOS claims: apply migration 0016, fix parser (Estimated/embedded-$/no-claim headings), id kind, George-path corpus ingester; ingest Aug 8-12 Dan mailers (42 claims/22 open); stage 5 no-proof breach fill-not-submit briefs
---
.../claim_01kzvyd76gk24xz5883cgkrjwg.json | 36 +++++++
.../claim_01kzvyd76n94qcsh7ks4ek676f.json | 36 +++++++
.../claim_01kzvyhm96rdqm58r3g4w00m5k.json | 36 +++++++
.../claim_01kzvyhm9nzrh6d9kqpfnek6bd.json | 36 +++++++
.../claim_01kzvyhm9tkqn03j5thd6vnxc1.json | 36 +++++++
data/mode-emails-new.js | 107 +++++++++++++++++++++
lib/ids.js | 1 +
lib/mode-claims.js | 28 +++++-
scripts/ingest-mode-claims-corpus.js | 65 +++++++++++++
scripts/stage-eligible-claims.js | 47 +++++++++
10 files changed, 423 insertions(+), 5 deletions(-)
diff --git a/data/claim-fill-queue/claim_01kzvyd76gk24xz5883cgkrjwg.json b/data/claim-fill-queue/claim_01kzvyd76gk24xz5883cgkrjwg.json
new file mode 100644
index 0000000..3dd5d6b
--- /dev/null
+++ b/data/claim-fill-queue/claim_01kzvyd76gk24xz5883cgkrjwg.json
@@ -0,0 +1,36 @@
+{
+ "kind": "settlement-claim-fill",
+ "generated_at": "2026-08-12T21:39:16.682Z",
+ "claim": {
+ "id": "claim_01kzvyd76gk24xz5883cgkrjwg",
+ "name": "EMM Loans Data Breach Settlement",
+ "slug": "emm-loans-data-breach-class-action-settlement",
+ "mode_url": "https://modeclassactionsdaily.com/emm-loans-data-breach-class-action-settlement/",
+ "admin_url": null,
+ "payout_text": "Up to $4,000 or $50",
+ "deadline": "2026-08-17T07:00:00.000Z",
+ "eligibility_question": "Received a notice about the EMM Loans data breach? You can choose a $50 cash payment with no proof required, or claim up to $4,000 for documented losses."
+ },
+ "prefill": {
+ "full_name": "Steve Abrams",
+ "email": "steveabramsdesigns@gmail.com",
+ "phone": null,
+ "address": "18406 Bessemer St, Reseda, CA 91335"
+ },
+ "steps": [
+ "Open https://modeclassactionsdaily.com/emm-loans-data-breach-class-action-settlement/ and follow through to the OFFICIAL settlement administrator's claim site.",
+ "Locate the online claim form. If the settlement is \"no claim required / automatic\", STOP — nothing to file; just verify the mailing address is current.",
+ "Fill the form using ONLY the prefill identity above plus facts Steve has explicitly confirmed.",
+ "Choose the \"no proof required\" / flat cash option when eligible and available.",
+ "Advance to the final review screen, screenshot it, and STOP for Steve to attest + submit."
+ ],
+ "guardrails": [
+ "DO NOT click the final Submit / File Claim button. Stop at the review/attestation screen.",
+ "DO NOT check any \"I declare under penalty of perjury / I certify\" box — that is Steve's to check.",
+ "DO NOT invent, guess, or embellish eligibility facts (purchase, breach notice, employment, stock lot).",
+ "If the form asks for proof Steve has not supplied, stop and report what is missing.",
+ "Capture a screenshot of the fully-prefilled review screen and save its path in the result."
+ ],
+ "engine": "openclaw-real-chrome",
+ "fill_state_on_success": "prefilled_awaiting_submit"
+}
\ No newline at end of file
diff --git a/data/claim-fill-queue/claim_01kzvyd76n94qcsh7ks4ek676f.json b/data/claim-fill-queue/claim_01kzvyd76n94qcsh7ks4ek676f.json
new file mode 100644
index 0000000..a503eba
--- /dev/null
+++ b/data/claim-fill-queue/claim_01kzvyd76n94qcsh7ks4ek676f.json
@@ -0,0 +1,36 @@
+{
+ "kind": "settlement-claim-fill",
+ "generated_at": "2026-08-12T21:39:16.681Z",
+ "claim": {
+ "id": "claim_01kzvyd76n94qcsh7ks4ek676f",
+ "name": "Oak View Group Settlement",
+ "slug": "oak-view-group-824000-data-breach-settlement",
+ "mode_url": "https://modeclassactionsdaily.com/oak-view-group-824000-data-breach-settlement/",
+ "admin_url": null,
+ "payout_text": "Up to $5,000",
+ "deadline": "2026-08-15T07:00:00.000Z",
+ "eligibility_question": null
+ },
+ "prefill": {
+ "full_name": "Steve Abrams",
+ "email": "steveabramsdesigns@gmail.com",
+ "phone": null,
+ "address": "18406 Bessemer St, Reseda, CA 91335"
+ },
+ "steps": [
+ "Open https://modeclassactionsdaily.com/oak-view-group-824000-data-breach-settlement/ and follow through to the OFFICIAL settlement administrator's claim site.",
+ "Locate the online claim form. If the settlement is \"no claim required / automatic\", STOP — nothing to file; just verify the mailing address is current.",
+ "Fill the form using ONLY the prefill identity above plus facts Steve has explicitly confirmed.",
+ "Choose the \"no proof required\" / flat cash option when eligible and available.",
+ "Advance to the final review screen, screenshot it, and STOP for Steve to attest + submit."
+ ],
+ "guardrails": [
+ "DO NOT click the final Submit / File Claim button. Stop at the review/attestation screen.",
+ "DO NOT check any \"I declare under penalty of perjury / I certify\" box — that is Steve's to check.",
+ "DO NOT invent, guess, or embellish eligibility facts (purchase, breach notice, employment, stock lot).",
+ "If the form asks for proof Steve has not supplied, stop and report what is missing.",
+ "Capture a screenshot of the fully-prefilled review screen and save its path in the result."
+ ],
+ "engine": "openclaw-real-chrome",
+ "fill_state_on_success": "prefilled_awaiting_submit"
+}
\ No newline at end of file
diff --git a/data/claim-fill-queue/claim_01kzvyhm96rdqm58r3g4w00m5k.json b/data/claim-fill-queue/claim_01kzvyhm96rdqm58r3g4w00m5k.json
new file mode 100644
index 0000000..ba35df8
--- /dev/null
+++ b/data/claim-fill-queue/claim_01kzvyhm96rdqm58r3g4w00m5k.json
@@ -0,0 +1,36 @@
+{
+ "kind": "settlement-claim-fill",
+ "generated_at": "2026-08-12T21:39:16.683Z",
+ "claim": {
+ "id": "claim_01kzvyhm96rdqm58r3g4w00m5k",
+ "name": "Ciuni & Panichi Data Breach Settlement",
+ "slug": "claim-125-cash-ciuni-panichi-data-breach-settlement",
+ "mode_url": "https://modeclassactionsdaily.com/claim-125-cash-ciuni-panichi-data-breach-settlement/",
+ "admin_url": null,
+ "payout_text": "Estimated $125 Cash",
+ "deadline": "2026-08-18T07:00:00.000Z",
+ "eligibility_question": null
+ },
+ "prefill": {
+ "full_name": "Steve Abrams",
+ "email": "steveabramsdesigns@gmail.com",
+ "phone": null,
+ "address": "18406 Bessemer St, Reseda, CA 91335"
+ },
+ "steps": [
+ "Open https://modeclassactionsdaily.com/claim-125-cash-ciuni-panichi-data-breach-settlement/ and follow through to the OFFICIAL settlement administrator's claim site.",
+ "Locate the online claim form. If the settlement is \"no claim required / automatic\", STOP — nothing to file; just verify the mailing address is current.",
+ "Fill the form using ONLY the prefill identity above plus facts Steve has explicitly confirmed.",
+ "Choose the \"no proof required\" / flat cash option when eligible and available.",
+ "Advance to the final review screen, screenshot it, and STOP for Steve to attest + submit."
+ ],
+ "guardrails": [
+ "DO NOT click the final Submit / File Claim button. Stop at the review/attestation screen.",
+ "DO NOT check any \"I declare under penalty of perjury / I certify\" box — that is Steve's to check.",
+ "DO NOT invent, guess, or embellish eligibility facts (purchase, breach notice, employment, stock lot).",
+ "If the form asks for proof Steve has not supplied, stop and report what is missing.",
+ "Capture a screenshot of the fully-prefilled review screen and save its path in the result."
+ ],
+ "engine": "openclaw-real-chrome",
+ "fill_state_on_success": "prefilled_awaiting_submit"
+}
\ No newline at end of file
diff --git a/data/claim-fill-queue/claim_01kzvyhm9nzrh6d9kqpfnek6bd.json b/data/claim-fill-queue/claim_01kzvyhm9nzrh6d9kqpfnek6bd.json
new file mode 100644
index 0000000..f669595
--- /dev/null
+++ b/data/claim-fill-queue/claim_01kzvyhm9nzrh6d9kqpfnek6bd.json
@@ -0,0 +1,36 @@
+{
+ "kind": "settlement-claim-fill",
+ "generated_at": "2026-08-12T21:39:16.686Z",
+ "claim": {
+ "id": "claim_01kzvyhm9nzrh6d9kqpfnek6bd",
+ "name": "FMC Health Data Breach Settlement",
+ "slug": "fmc-health-data-breach-settlement",
+ "mode_url": "https://modeclassactionsdaily.com/fmc-health-data-breach-settlement/",
+ "admin_url": null,
+ "payout_text": "Estimated $75 Cash",
+ "deadline": "2026-08-31T07:00:00.000Z",
+ "eligibility_question": null
+ },
+ "prefill": {
+ "full_name": "Steve Abrams",
+ "email": "steveabramsdesigns@gmail.com",
+ "phone": null,
+ "address": "18406 Bessemer St, Reseda, CA 91335"
+ },
+ "steps": [
+ "Open https://modeclassactionsdaily.com/fmc-health-data-breach-settlement/ and follow through to the OFFICIAL settlement administrator's claim site.",
+ "Locate the online claim form. If the settlement is \"no claim required / automatic\", STOP — nothing to file; just verify the mailing address is current.",
+ "Fill the form using ONLY the prefill identity above plus facts Steve has explicitly confirmed.",
+ "Choose the \"no proof required\" / flat cash option when eligible and available.",
+ "Advance to the final review screen, screenshot it, and STOP for Steve to attest + submit."
+ ],
+ "guardrails": [
+ "DO NOT click the final Submit / File Claim button. Stop at the review/attestation screen.",
+ "DO NOT check any \"I declare under penalty of perjury / I certify\" box — that is Steve's to check.",
+ "DO NOT invent, guess, or embellish eligibility facts (purchase, breach notice, employment, stock lot).",
+ "If the form asks for proof Steve has not supplied, stop and report what is missing.",
+ "Capture a screenshot of the fully-prefilled review screen and save its path in the result."
+ ],
+ "engine": "openclaw-real-chrome",
+ "fill_state_on_success": "prefilled_awaiting_submit"
+}
\ No newline at end of file
diff --git a/data/claim-fill-queue/claim_01kzvyhm9tkqn03j5thd6vnxc1.json b/data/claim-fill-queue/claim_01kzvyhm9tkqn03j5thd6vnxc1.json
new file mode 100644
index 0000000..bc95e9d
--- /dev/null
+++ b/data/claim-fill-queue/claim_01kzvyhm9tkqn03j5thd6vnxc1.json
@@ -0,0 +1,36 @@
+{
+ "kind": "settlement-claim-fill",
+ "generated_at": "2026-08-12T21:39:16.679Z",
+ "claim": {
+ "id": "claim_01kzvyhm9tkqn03j5thd6vnxc1",
+ "name": "Comcast $117.5M Data Breach Settlement",
+ "slug": "claim-50-comcast-117-5-million-data-breach-settlement",
+ "mode_url": "https://modeclassactionsdaily.com/claim-50-comcast-117-5-million-data-breach-settlement/",
+ "admin_url": null,
+ "payout_text": "Estimated $50",
+ "deadline": "2026-08-14T07:00:00.000Z",
+ "eligibility_question": null
+ },
+ "prefill": {
+ "full_name": "Steve Abrams",
+ "email": "steveabramsdesigns@gmail.com",
+ "phone": null,
+ "address": "18406 Bessemer St, Reseda, CA 91335"
+ },
+ "steps": [
+ "Open https://modeclassactionsdaily.com/claim-50-comcast-117-5-million-data-breach-settlement/ and follow through to the OFFICIAL settlement administrator's claim site.",
+ "Locate the online claim form. If the settlement is \"no claim required / automatic\", STOP — nothing to file; just verify the mailing address is current.",
+ "Fill the form using ONLY the prefill identity above plus facts Steve has explicitly confirmed.",
+ "Choose the \"no proof required\" / flat cash option when eligible and available.",
+ "Advance to the final review screen, screenshot it, and STOP for Steve to attest + submit."
+ ],
+ "guardrails": [
+ "DO NOT click the final Submit / File Claim button. Stop at the review/attestation screen.",
+ "DO NOT check any \"I declare under penalty of perjury / I certify\" box — that is Steve's to check.",
+ "DO NOT invent, guess, or embellish eligibility facts (purchase, breach notice, employment, stock lot).",
+ "If the form asks for proof Steve has not supplied, stop and report what is missing.",
+ "Capture a screenshot of the fully-prefilled review screen and save its path in the result."
+ ],
+ "engine": "openclaw-real-chrome",
+ "fill_state_on_success": "prefilled_awaiting_submit"
+}
\ No newline at end of file
diff --git a/data/mode-emails-new.js b/data/mode-emails-new.js
new file mode 100644
index 0000000..5bf2ff7
--- /dev/null
+++ b/data/mode-emails-new.js
@@ -0,0 +1,107 @@
+// Fixture: raw Mode Class Actions newsletter bodies pulled via George (steve-personal),
+// 2026-08-08 → 2026-08-12. Extends data/mode-emails-raw.js (which ends 2026-08-07).
+// Same {id,date,body} shape. Fed through lib/mode-claims.parseModeEmail by the corpus ingester.
+module.exports = [
+{ id:'19fe3095345c23d8', date:'2026-08-08', body:`
+Country Bank for Savings $495K Settlement
+Had a consumer deposit account and were charged certain overdraft or NSF fees? If you're part of the settlement class, no claim form is required. Eligible class members will automatically receive an account credit, check, or other payment after final approval.
+https://modeclassactionsdaily.com/country-bank-overdraft-fee-495000-settlement/?utm_source=email
+
+Stonegate Meadows Automatic Rent Refunds
+Former tenants in Kansas City may be included in one of four settlements totaling nearly $4 million. Most eligible tenants do not need to file a claim, but if you've moved since living there, it's a good idea to update your mailing address.
+https://modeclassactionsdaily.com/stonegate-meadows-tenant-settlements-eligible-tenants-may-receive-a-partial-rent-refund/?utm_source=email
+` },
+{ id:'19fe82fb60dd9f06', date:'2026-08-09', body:`
+Keller Williams & RE/MAX $28.5M Home Buyer Settlement
+Bought a home listed on a Multiple Listing Service (MLS)? This nationwide settlement claims certain real estate broker commissions were kept artificially high.
+Deadline: August 25, 2026
+https://modeclassactionsdaily.com/keller-williams-re-max-28-5m-home-buyer-class-action-settlement/?utm_source=email
+
+Ciuni & Panichi Data Breach Settlement – Estimated $125 Cash
+Eligible class members may claim an estimated $125 cash and up to $5,000 for documented losses.
+Deadline: August 18, 2026
+https://modeclassactionsdaily.com/claim-125-cash-ciuni-panichi-data-breach-settlement/?utm_source=email
+
+YouTube TV Auto-Renewal Settlement – Estimated $92
+Paid for a YouTube TV renewal while living in California? You may receive an estimated $92.26 payment.
+Deadline: August 30, 2026
+https://modeclassactionsdaily.com/youtube-tv-7-5-million-auto-renewal-settlement/?utm_source=email
+
+FMC Health Data Breach Settlement – Estimated $75 Cash
+Eligible class members may choose from up to $5,000 for documented losses, an estimated $75 cash payment, or two years of data monitoring. Some claims can be submitted without documenting losses.
+Deadline: August 31, 2026
+https://modeclassactionsdaily.com/fmc-health-data-breach-settlement/?utm_source=email
+
+Labcorp AMCA Data Breach Settlement – Up to $5,000
+Benefits may include up to $5,000 for documented losses, an estimated alternative cash payment, and two years of medical monitoring.
+Deadline: September 3, 2026
+https://modeclassactionsdaily.com/labcorp-amca-data-breach-settlement-claim-up-to-5000-from-the-35-million-settlement/?utm_source=email
+
+Duke Health Privacy $3.74M Settlement
+If you used the Duke MyChart patient portal or MyDuke Health app, you could receive a share of the settlement fund.
+Deadline: August 16, 2026
+https://modeclassactionsdaily.com/duke-health-privacy-settlement/?utm_source=email
+` },
+{ id:'19fed560c1446e91', date:'2026-08-10', body:`
+Jiffy Lube Washington Job Posting Settlement – Estimated $1,519
+This settlement claims certain job postings didn't include the wage or salary information required under Washington law. Some approved claims could receive up to $5,000, depending on the final distribution.
+Deadline: August 21, 2026
+https://modeclassactionsdaily.com/claim-an-estimated-1519-jiffy-lube-washington-job-posting-settlement/?utm_source=email
+
+HSBC Direct Savings Account Settlement – At Least $10
+Opened an HSBC Direct Savings Account? The lawsuit claims HSBC delayed when interest began accruing on certain online deposits. At least $10 for approved claims; current account holders receive an account credit, while former customers may receive a check or electronic payment.
+Deadline: August 20, 2026
+https://modeclassactionsdaily.com/hsbc-bank-savings-account-interest-class-action-settlement/?utm_source=email
+` },
+{ id:'19ff27c66f00f79a', date:'2026-08-11', body:`
+Big Al's $450,000 Settlement – No Claim Required
+Worked for Big Al's in Washington? You may be included in a settlement, and no claim form is required. Eligible employees will automatically receive a share of the net settlement fund once the settlement receives final approval. Make sure the settlement administrator has your current mailing address.
+https://modeclassactionsdaily.com/big-als-450000-noncompetition-class-action-settlement/?utm_source=email
+
+Mt. Baker Imaging $3.3M Data Breach Settlement – Up to $5,000
+Received a notice about the Mt. Baker Imaging data breach? Up to $5,000 for documented, unreimbursed losses, a pro rata cash payment from the remaining settlement fund, and two years of medical identity theft protection. Documentation is required for the reimbursement portion, but eligible class members can also request the other available benefits.
+Deadline: August 19, 2026
+https://modeclassactionsdaily.com/mt-baker-imaging-data-breach-settlement/?utm_source=email
+` },
+{ id:'19ff7a2bea63c5af', date:'2026-08-12', body:`
+Mission Community Hospital Settlement – Up to $5,100
+People who received a notice about the May 2023 data breach may qualify. You could get up to $5,000 for documented losses, a $100 California payment for eligible residents, additional cash, and two years of medical monitoring.
+Deadline: August 12, 2026
+https://modeclassactionsdaily.com/up-to-5100-mission-community-hospital-deanco-healthcare-data-breach-settlement/?utm_source=email
+
+Navistar International Motors Wellness Program Surcharge Settlement – No Claim Form Required
+Current and former health plan participants who paid a tobacco surcharge may be included. No claim form is required to receive your share, although you can submit a payment election form for an electronic payment option.
+Deadline: August 13, 2026
+https://modeclassactionsdaily.com/international-motors-wellness-program-surcharge-settlement/?utm_source=email
+
+Virgin Galactic $8.5M Stock Settlement
+Investors who bought or acquired Virgin Galactic (SPCE) or Social Capital Hedosophia Holdings Corp. (IPOA) stock during the qualifying period may qualify.
+Deadline: August 13, 2026
+https://modeclassactionsdaily.com/virgin-galactic-8-5-million-securities-class-action-settlement/?utm_source=email
+
+Comcast $117.5M Data Breach Settlement – Estimated $50
+Customers who received a data breach notice may qualify. Up to $10,000 for documented losses, lost-time compensation, or an estimated $50 alternative payment with no proof required, plus three years of identity protection.
+Deadline: August 14, 2026
+https://modeclassactionsdaily.com/claim-50-comcast-117-5-million-data-breach-settlement/?utm_source=email
+
+Oak View Group Settlement – Up to $5,000
+People who received a notice may qualify. Up to $5,000 for documented losses, an estimated $150 for eligible California residents or $50 for residents of other states, plus two years of identity protection.
+Deadline: August 15, 2026
+https://modeclassactionsdaily.com/oak-view-group-824000-data-breach-settlement/?utm_source=email
+
+EMM Loans Data Breach Settlement – Up to $4,000 or $50
+People whose information was affected by the 2024 EMM Loans data breach may qualify for up to $4,000 for documented losses or a $50 alternative cash payment with no proof required, plus two years of credit monitoring.
+Deadline: August 17, 2026
+https://modeclassactionsdaily.com/emm-loans-data-breach-class-action-settlement/?utm_source=email
+
+SolarEdge Securities Settlement – About $1.49 Per Damaged Share
+Investors who purchased SolarEdge Technologies common stock may qualify for a payment. An estimated average net recovery of about $1.49 per damaged share from the $55 million settlement.
+Deadline: August 17, 2026
+https://modeclassactionsdaily.com/solaredge-securities-settlement-investors-may-claim-part-of-55-million-fund/?utm_source=email
+
+Bestway Spa Pump Settlement – Up to $75
+Get up to $75 if you purchased certain Bestway AirJet or HydroJet Spa Pumps. Anyone who received a replacement pump through the recall will also get a one-year warranty extension automatically. No claim form required for that benefit.
+Deadline: August 17, 2026
+https://modeclassactionsdaily.com/bestway-2-million-spa-pump-class-action-settlement/?utm_source=email
+` },
+];
diff --git a/lib/ids.js b/lib/ids.js
index ae8c36b..d2d124b 100644
--- a/lib/ids.js
+++ b/lib/ids.js
@@ -21,6 +21,7 @@ const PREFIX = {
reading: 'hr',
asset: 'ast',
biometric: 'bio',
+ claim: 'claim',
};
function id(kind) {
diff --git a/lib/mode-claims.js b/lib/mode-claims.js
index d1afcb6..4a25ae3 100644
--- a/lib/mode-claims.js
+++ b/lib/mode-claims.js
@@ -55,14 +55,32 @@ function categorize(text) {
const isBullet = (l) => /^\s*[•\-\*·]/.test(l);
// a heading = "<name> <dash> <payout>" or "<payout> per <thing>"
+// A heading names a settlement + (usually) its payout. Mode writes payouts many ways:
+// "Name – Up to $X" | "Name — $X Per Ticket" | "Name – Estimated $92" | "Name – At Least $10"
+// "Name – About $1.49 Per Share" | "Comcast $117.5M Data Breach Settlement – Estimated $50"
+// embedded, no dash: "Virgin Galactic $8.5M Stock Settlement" | "Country Bank ... $495K Settlement"
+// no payout at all: "Navistar ... Settlement – No Claim Form Required" (automatic, nothing to file)
+// Old logic only accepted a dash followed immediately by "$"/"up to $", silently dropping ~half.
function headingMatch(line) {
const l = line.trim();
if (!l || isBullet(l)) return null;
- if (/^(deadline|more details|available benefits|hey|hi |don'?t|- dan|received|if you|bought|plus|check your)/i.test(l)) return null;
- // Name – Up to $X | Name — $X Per Ticket | Name - $X
- let m = l.match(/^(.{4,120}?)\s*[–—-]\s*((?:up to\s*)?\$[\d,]+(?:\.\d{2})?.*)$/i);
- if (m && /settlement|claim|payment|refund|credit|cash|per\b|\$/i.test(l)) return { name: m[1].replace(/\s+settlement$/i, ' Settlement').trim(), payout: m[2].trim() };
- return null;
+ // Skip greetings, deadlines, benefit prose, and eligibility/sentence lines (they end with a period).
+ if (/^(deadline|more details|available benefits|what you|make sure|hey|hi |don'?t|- ?dan|- ?emma|received|if you|bought|plus|check your|this |that |these |those |worked|opened|current|former|people|investors|eligible|documentation|benefits|both|most|payments? will|final|some )/i.test(l)) return null;
+ if (/[.]\s*$/.test(l)) return null; // full sentences end with a period
+ if (!/settlement|class action/i.test(l)) return null; // a heading always names the settlement
+ const money = l.match(/\$\s?[\d,]+(?:\.\d{2})?\s*(?:million|billion|[mkb])?\b/i);
+ const noClaimish = /no claim|no action|automatic/i.test(l);
+ if (!money && !noClaimish) return null; // no $ and not an automatic → not a heading
+ // Split name / payout on a dash if one separates them; otherwise the whole line is the name.
+ let name = l, payout = null;
+ const dash = l.match(/^(.{4,120}?)\s+[–—]\s+(.+)$/) || l.match(/^(.{4,120}?)\s+-\s+([A-Z0-9$].+)$/);
+ if (dash) { name = dash[1].trim(); payout = dash[2].trim(); }
+ // Prefer a dollar-figure payout; if the dash side has no "$", fall back to the first $ on the line.
+ if ((!payout || !/\$/.test(payout)) && money) payout = money[0].trim();
+ if (!payout) payout = noClaimish ? 'No claim required (automatic)' : 'See settlement notice';
+ name = name.replace(/\s+/g, ' ').replace(/\s*[–—-]\s*$/, '').trim();
+ if (name.length < 4) return null;
+ return { name, payout };
}
/**
diff --git a/scripts/ingest-mode-claims-corpus.js b/scripts/ingest-mode-claims-corpus.js
new file mode 100644
index 0000000..4188897
--- /dev/null
+++ b/scripts/ingest-mode-claims-corpus.js
@@ -0,0 +1,65 @@
+#!/usr/bin/env node
+// Corpus (George-path) ingester: reads the local Mode newsletter corpus files
+// (data/mode-emails-raw.js + data/mode-emails-new.js — bodies pulled via George), parses them
+// with lib/mode-claims, and upserts distinct settlements into settlement_claim.
+//
+// This is the durable fallback for when the Gmail OAuth *connector* isn't set up yet
+// (connector_account has 0 rows), which is why scripts/ingest-mode-claims.js can't run.
+// Same schema + same idempotent UNIQUE(user_id,slug) upsert as that script. No submits, no browser. $0.
+//
+// Usage: node scripts/ingest-mode-claims-corpus.js
+const path = require('path');
+const db = require('../lib/db');
+const { parseModeEmail } = require('../lib/mode-claims');
+const { id } = require('../lib/ids');
+
+const USER = process.env.ABRAMSOS_USER_ID || 'user_steve';
+
+function loadCorpus() {
+ const out = [];
+ for (const f of ['../data/mode-emails-raw.js', '../data/mode-emails-new.js']) {
+ try { const arr = require(f); if (Array.isArray(arr)) out.push(...arr); }
+ catch (e) { console.warn(`[corpus] skip ${f}: ${e.message}`); }
+ }
+ // de-dupe emails by id, newest wins
+ const byId = new Map();
+ for (const e of out) byId.set(e.id, e);
+ return [...byId.values()];
+}
+
+async function main() {
+ const emails = loadCorpus();
+ console.log(`[corpus] ${emails.length} newsletter bodies loaded`);
+ let seen = 0, inserted = 0, updated = 0;
+ for (const e of emails) {
+ for (const c of parseModeEmail(e.body, { emailId: e.id, emailDate: e.date })) {
+ seen++;
+ const r = await db.query(
+ `INSERT INTO settlement_claim
+ (id,user_id,slug,name,mode_url,payout_text,payout_max_cents,deadline,proof_required,
+ no_claim_required,eligibility_question,category,source_email_id,source_email_date,raw_block)
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15)
+ ON CONFLICT (user_id,slug) DO UPDATE SET
+ mode_url=COALESCE(EXCLUDED.mode_url,settlement_claim.mode_url),
+ name=COALESCE(EXCLUDED.name,settlement_claim.name),
+ deadline=COALESCE(EXCLUDED.deadline,settlement_claim.deadline),
+ payout_text=COALESCE(EXCLUDED.payout_text,settlement_claim.payout_text),
+ payout_max_cents=GREATEST(COALESCE(EXCLUDED.payout_max_cents,0),COALESCE(settlement_claim.payout_max_cents,0)),
+ proof_required=COALESCE(settlement_claim.proof_required,EXCLUDED.proof_required),
+ no_claim_required=(settlement_claim.no_claim_required OR EXCLUDED.no_claim_required),
+ eligibility_question=COALESCE(settlement_claim.eligibility_question,EXCLUDED.eligibility_question),
+ updated_at=now()
+ RETURNING (xmax=0) AS inserted`,
+ [id('claim'), USER, c.slug, c.name, c.mode_url, c.payout_text, c.payout_max_cents, c.deadline,
+ c.proof_required, c.no_claim_required, c.eligibility_question, c.category, c.source_email_id, c.source_email_date, c.raw_block]);
+ if (r.rows[0]?.inserted) inserted++; else updated++;
+ }
+ }
+ // auto-expire past-deadline rows that were never acted on
+ const exp = await db.query(
+ `UPDATE settlement_claim SET fill_state='expired',updated_at=now()
+ WHERE user_id=$1 AND deadline < current_date AND fill_state IN ('none','queued')`, [USER]);
+ console.log(`[corpus] parsed ${seen} blocks → ${inserted} new, ${updated} updated; ${exp.rowCount} expired past-deadline`);
+ process.exit(0);
+}
+main().catch(e => { console.error('FATAL', e); process.exit(1); });
diff --git a/scripts/stage-eligible-claims.js b/scripts/stage-eligible-claims.js
new file mode 100644
index 0000000..a9c6d8d
--- /dev/null
+++ b/scripts/stage-eligible-claims.js
@@ -0,0 +1,47 @@
+#!/usr/bin/env node
+// Stage openclaw fill-not-submit briefs for a chosen set of OPEN settlement_claim rows.
+// Default set = data-breach settlements that offer a FLAT no-proof alternative cash payment
+// (Comcast $50, EMM Loans $50, FMC Health $75, Ciuni & Panichi $125, Oak View $50/$150-CA).
+//
+// Marks each eligibility_state='eligible' (Steve elected to pursue the no-proof set), then calls
+// lib/openclaw-claim-filler.stage() which writes the fill brief to data/claim-fill-queue/ AND
+// ~/.claude/yolo-queue/pending-approval/. The brief PREFILLS identity and HARD-STOPS before the
+// penalty-of-perjury attestation + Submit. Nothing is filed here; nothing is submitted, ever.
+//
+// Usage: node scripts/stage-eligible-claims.js ["name regex"]
+const db = require('../lib/db');
+const filler = require('../lib/openclaw-claim-filler');
+
+const USER = process.env.ABRAMSOS_USER_ID || 'user_steve';
+const DEFAULT_RE = 'comcast|emm loans|fmc health|ciuni|oak view';
+const nameRe = process.argv[2] || DEFAULT_RE;
+
+// Prefill identity — pulled from AbramsOS person(self); address lives in notes, email set today.
+// phone intentionally null (not on file); openclaw brief flags any missing required field.
+const PROFILE = {
+ full_name: 'Steve Abrams',
+ email: 'steveabramsdesigns@gmail.com',
+ phone: null,
+ address: '18406 Bessemer St, Reseda, CA 91335',
+};
+
+async function main() {
+ const { rows } = await db.query(
+ `SELECT * FROM settlement_claim
+ WHERE user_id=$1 AND name ~* $2
+ AND (deadline IS NULL OR deadline >= current_date)
+ ORDER BY deadline NULLS LAST`, [USER, nameRe]);
+ if (!rows.length) { console.log('no matching open claims for /' + nameRe + '/'); process.exit(0); }
+ console.log(`staging ${rows.length} claim(s):`);
+ for (const c of rows) {
+ await db.query(`UPDATE settlement_claim SET eligibility_state='eligible', updated_at=now() WHERE id=$1`, [c.id]);
+ c.eligibility_state = 'eligible';
+ const { local } = filler.stage(c, PROFILE);
+ await db.query(`UPDATE settlement_claim SET fill_state='queued', updated_at=now() WHERE id=$1`, [c.id]);
+ console.log(` • ${c.name} [${c.deadline || 'no deadline'}] ${c.payout_text}`);
+ console.log(` brief → ${local}`);
+ }
+ console.log('\nAll briefs are FILL-NOT-SUBMIT. Steve verifies breach membership + attests + submits.');
+ process.exit(0);
+}
+main().catch(e => { console.error('FATAL', e); process.exit(1); });
← 7ff4ec3 AbramsOS: class-action settlement claim-filler (Mode feed →
·
back to AbramsOS
·
chore: lint ✓, refactor ✓ (no code changes), v0.5.0 (session 5cf00ea →