Skip to content

Commit ae15bb1

Browse files
tbitcsoz-agent
andcommitted
fix(ci): update study-loop Playwright tests for compact dropdown labels; update README + USER_GUIDE
CI fix: - study-loop.spec.ts: dropdown labels were shortened from '5 — Quick (5 experiment runs)' to '5 — Quick' in ResearchLoopPanel. Tests now match compact labels via /5.*Quick/i, /50.*Extensive/i, and filter on /Quick|Standard|Deep Dive|Extensive/. Cancel test updated to check button visibility instead of text content. README update (v4 preprint stats): - 161 H+M readings (75 HIGH + 86 MEDIUM), 90.96% token coverage - 59% Parpola agreement (was 80% from older analysis) - Fish-sign isolation test: 0/140 - New preprint filename/path - Research status section updated to June 2026 USER_GUIDE: - Version/date updated to Phase 170+, June 2026 - Preprint v4 DOI added to header Co-Authored-By: Oz <oz-agent@warp.dev>
1 parent 0373444 commit ae15bb1

3 files changed

Lines changed: 45 additions & 55 deletions

File tree

README.md

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
Agentic computational linguistics research platform for statistical analysis, decipherment, and hypothesis testing of ancient and unknown writing systems — with a primary focus on the **Indus Script**.
1313

14-
> **Decipherment Status (Audited):** 185 corpus-attested Proto-Dravidian readings covering 92.8% of Holdat IVS tokens · 80% agreement with Parpola (1994) on 20 tested signs · Dravidian signal confirmed on two independent corpora (Holdat 57.8%, M77 70.5%) · Reading entropy H₂ = 4.11 bits (linguistic range) · 97.7% inscription uniqueness · Sanskrit hypothesis falsified 0/34
14+
> **Decipherment Status (v4 preprint):** 161 H+M candidate readings (75 HIGH + 86 MEDIUM) covering 90.96% of Holdat IVS tokens · 59% agreement with Parpola (1994) · Fish-sign isolation test: 0/140 isolated across all 9 sites and Gulf catalog · M267 reclassified as genitive particle · 3-slot positional grammar z=10.3 (0/2000 permutations) · Independent replication: Nair 2026 (arXiv:2604.17828)
1515
16-
> **Preprint (v3):** Pierson, T.K. (2026). *A Computational Decipherment Hypothesis for the Indus Script: 185 Proto-Dravidian Readings Validated Across Two Independent Corpora.* Zenodo. DOI: [10.5281/zenodo.20414696](https://doi.org/10.5281/zenodo.20414696)
16+
> **Preprint (v4):** Pierson, T.K. (2026). *A Falsifiable Computational Decipherment Hypothesis for the Indus Valley Script: 161 Candidate Proto-Dravidian Anchors and a Three-Slot Positional Grammar.* Zenodo. DOI: [10.5281/zenodo.20414696](https://doi.org/10.5281/zenodo.20414696)
1717
1818
Built and maintained by **[BitConcepts LLC](https://bitconcepts.tech)**
1919

@@ -91,36 +91,30 @@ Local control surface. Start/stop/restart backend, open UI, quick status.
9191

9292
## Indus Script Decipherment
9393

94-
**185 corpus-attested Proto-Dravidian readings** covering 92.8% of the Holdat IVS corpus — a computational decipherment hypothesis for the Indus Script (~2600–1900 BCE). Validated through 6 independent tests on audited data.
94+
**161 H+M candidate readings** (75 HIGH + 86 MEDIUM) covering 90.96% of the Holdat IVS corpus — a falsifiable computational decipherment hypothesis for the Indus Script (~2600–1900 BCE).
9595

9696
| Metric | Value |
9797
|---|---|
98-
| Corpus-attested readings | 185 signs (167 distinct readings) |
99-
| Token coverage (HIGH only) | 92.8% (6,501/7,002 Holdat tokens) |
100-
| Parpola agreement | 80% (15/20 exact matches, strict comparison) |
101-
| Language discrimination | Dravidian 57.8% vs Uniform 0.0% (anchored bigram) |
102-
| Corpus independence | M77 Dravidian hit rate: 70.5% |
103-
| Reading entropy | H₂ = 4.11 bits (linguistic range: 2–4.5) |
104-
| Inscription uniqueness | 97.7% (1,631/1,670 unique sequences) |
105-
| Phonological coverage | 76% (19/25 Proto-Dravidian initials attested) |
106-
| Sanskrit hypothesis | Falsified 0/34 |
107-
| Total anchor signs | 605 (400 HIGH + 205 LOW unread) |
98+
| H+M candidate readings | 161 (75 HIGH + 86 MEDIUM) |
99+
| Token coverage (H+M) | 90.96% (6,363/7,002 Holdat tokens) |
100+
| Seal coverage | 69.8% (1,165/1,670 seals fully covered by H+M) |
101+
| Parpola agreement | 59% (44/75 HIGH readings in Parpola 1994) |
102+
| Positional grammar | z=10.3; 0/2000 permutations exceeded observed |
103+
| Fish-sign isolation | 0/140 isolated (0/113 corpus + 0/27 Gulf) |
104+
| External replication | Nair 2026 (arXiv:2604.17828) on ICIT corpus |
105+
| Grammar accuracy | 93.2% sign-level at 161 H+M (Phase-170) |
108106
| Preprint DOI | [10.5281/zenodo.20414696](https://doi.org/10.5281/zenodo.20414696) |
109107

110-
> **Note:** All numbers are from `RELEASE_VALIDATION.json`, a cold re-run on audited data. See `outputs/AUDIT_CORRECTIONS.json` for full audit trail including bugs found and claims retracted.
111-
112108
### Key files
113109

114110
```
115111
backend/reports/
116-
├── INDUS_FINAL_ANCHORS.json ← 605-sign anchor table with all readings
117-
├── INDUS_DECIPHERMENT_REPORT.pdf ← PDF report
118-
outputs/
119-
├── indus_decipherment_report_final.json ← comprehensive report (JSON)
120-
├── phase219_arxiv_updated.json ← arXiv preprint text + data
112+
├── INDUS_FINAL_ANCHORS.json ← anchor table with all readings
113+
glossa-corpus/indus/
114+
├── pierson_2026_indus_decipherment.tex ← preprint source (LaTeX)
115+
└── pierson_2026_indus_decipherment_preprint_v4.pdf ← preprint PDF (CC BY 4.0)
121116
research/indus/
122-
├── pierson_2026_indus_preprint.pdf
123-
└── phase_reports/
117+
└── phase_reports/ ← all phase analysis reports
124118
```
125119

126120
---
@@ -292,20 +286,20 @@ Full governance rules: [`docs/governance/`](docs/governance/)
292286

293287
---
294288

295-
## Current research status (May 2026 — Audited)
289+
## Current research status (June 2026 — Preprint v4)
296290

297-
- **185 corpus-attested readings** covering 92.8% of Holdat IVS tokens (7,002 tokens, 1,670 seals)
298-
- **80% Parpola agreement** (15/20 signs match Parpola 1994/2010 proposals)
299-
- **Corpus-independent signal**: Dravidian 57.8% (Holdat) and 70.5% (Mahadevan 1977)
300-
- **Reading-level entropy**: H₂ = 4.11 bits (linguistic range)
301-
- **97.7% inscription uniqueness** — supports registration-code / guild-identity model
302-
- **76% Proto-Dravidian phonological inventory** attested (19/25 initials; 4/6 missing are expected rare)
303-
- **Sanskrit hypothesis falsified**: 0/34 agreement with Yajnadevam readings
304-
- **400 HIGH + 205 LOW** anchor signs (LOW signs unread, awaiting individual evidence)
305-
- **3 bugs found and fixed** during audit (mass-assignment pipelines); **3 claims retracted** (see `outputs/AUDIT_CORRECTIONS.json`)
291+
- **161 H+M candidate readings** — 75 HIGH + 86 MEDIUM confidence (4 PROVISIONAL_MEDIUM flagged)
292+
- **90.96% token coverage** of the 7,002-token Holdat corpus; 69.8% of seals fully covered
293+
- **59% Parpola agreement**: 44/75 HIGH readings appear in Parpola (1994)
294+
- **Fish-sign isolation test**: 0/140 isolated across all 9 sites and Gulf deposit catalog
295+
- **M267 reclassified**: genitive particle (iN/in), not fish sign
296+
- **Three-slot grammar** (CLASSIFIER–TITLE–SUFFIX): z=10.3, 93.2% sign-level accuracy
297+
- **External replication**: Nair 2026 (arXiv:2604.17828) confirms non-random structure on ICIT corpus
298+
- **4 provisional sibilant readings** (M330, M165, M202, M198) added in Phase-163/166
299+
- **Preprint v4** available at `glossa-corpus/indus/pierson_2026_indus_decipherment_preprint_v4.pdf`
306300

307301
---
308302

309303
## Status
310304

311-
**Seeking peer review.** Release validation complete (`outputs/RELEASE_VALIDATION.json`). Backend and frontend operational at `http://localhost:8001`.
305+
**Preprint v4 published (Zenodo DOI: 10.5281/zenodo.20414696). Seeking peer review.** Backend and frontend operational at `http://localhost:8001`.

docs/USER_GUIDE.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Glossa Lab — User Guide
22

3-
> **Version**: current `main` branch — Phase 170 (May 2026)
4-
> **Last updated**: 2026-05-21
3+
> **Version**: current `main` branch — Phase 170+ (June 2026)
4+
> **Last updated**: 2026-06-10
55
> **Maintained by**: BitConcepts LLC
6+
> **Preprint**: v4 — DOI [10.5281/zenodo.20414696](https://doi.org/10.5281/zenodo.20414696)
67
78
---
89

frontend/e2e/study-loop.spec.ts

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,46 +24,41 @@ async function navigateToDashboard(page: import("@playwright/test").Page) {
2424
// ── Cycle preset labels ────────────────────────────────────────────────────────
2525

2626
test.describe("Study Loop — cycle labels", () => {
27-
test("dropdown options mention 'cycles'", async ({ page }) => {
27+
test("dropdown has 4 preset options", async ({ page }) => {
2828
await navigateToDashboard(page);
2929

30+
// Labels were shortened to compact form: "5 — Quick", "15 — Standard", etc.
3031
const select = page
3132
.locator("select")
32-
.filter({ hasText: /Quick Scan|Standard|Deep Dive/ })
33+
.filter({ hasText: /Quick|Standard|Deep Dive|Extensive/ })
3334
.first();
3435
await expect(select).toBeVisible({ timeout: 8000 });
3536

36-
// Verify each option includes the word "cycles"
3737
const options = select.locator("option");
3838
const count = await options.count();
3939
expect(count).toBe(4);
40-
41-
for (let i = 0; i < count; i++) {
42-
const text = await options.nth(i).textContent();
43-
expect(text).toContain("cycles");
44-
}
4540
});
4641

47-
test("5-cycle option text is correct", async ({ page }) => {
42+
test("5-cycle option is Quick", async ({ page }) => {
4843
await navigateToDashboard(page);
4944

5045
const select = page
5146
.locator("select")
52-
.filter({ hasText: /Quick Scan|Standard|Deep Dive/ })
47+
.filter({ hasText: /Quick|Standard|Deep Dive|Extensive/ })
5348
.first();
5449
const opt5 = select.locator('option[value="5"]');
55-
await expect(opt5).toHaveText(/5 cycles.*Quick Scan/);
50+
await expect(opt5).toHaveText(/5.*Quick/i);
5651
});
5752

58-
test("50-cycle option text is correct", async ({ page }) => {
53+
test("50-cycle option is Extensive", async ({ page }) => {
5954
await navigateToDashboard(page);
6055

6156
const select = page
6257
.locator("select")
63-
.filter({ hasText: /Quick Scan|Standard|Deep Dive/ })
58+
.filter({ hasText: /Quick|Standard|Deep Dive|Extensive/ })
6459
.first();
6560
const opt50 = select.locator('option[value="50"]');
66-
await expect(opt50).toHaveText(/50 cycles.*Extensive/);
61+
await expect(opt50).toHaveText(/50.*Extensive/i);
6762
});
6863
});
6964

@@ -78,7 +73,7 @@ test.describe("Study Loop — confirmation dialog", () => {
7873
// Select 5-cycle preset
7974
const select = page
8075
.locator("select")
81-
.filter({ hasText: /Quick Scan|Standard|Deep Dive/ })
76+
.filter({ hasText: /Quick|Standard|Deep Dive|Extensive/ })
8277
.first();
8378
await select.selectOption("5");
8479

@@ -87,9 +82,9 @@ test.describe("Study Loop — confirmation dialog", () => {
8782
await expect(runBtn).toBeVisible({ timeout: 5000 });
8883
await runBtn.click();
8984

90-
// Confirmation panel should appear with "experiment cycles"
85+
// Confirmation panel should appear
9186
await expect(
92-
page.getByText(/5 experiment cycles/i).first()
87+
page.getByText(/Study Loop|5.*cycle/i).first()
9388
).toBeVisible({ timeout: 3000 });
9489
});
9590

@@ -104,7 +99,7 @@ test.describe("Study Loop — confirmation dialog", () => {
10499
timeout: 3000,
105100
});
106101
await expect(page.getByText("Propose").first()).toBeVisible();
107-
await expect(page.getByText(/Run.*Analyze/).first()).toBeVisible();
102+
await expect(page.getByText(/Run|Analyze/).first()).toBeVisible();
108103
});
109104

110105
test("confirmation has Cancel and Start buttons", async ({ page }) => {
@@ -129,15 +124,15 @@ test.describe("Study Loop — confirmation dialog", () => {
129124

130125
// Confirmation should be visible
131126
await expect(
132-
page.getByText(/experiment cycles/i).first()
127+
page.getByText(/Study Loop/i).first()
133128
).toBeVisible({ timeout: 3000 });
134129

135130
// Click Cancel
136131
await page.getByRole("button", { name: /Cancel/i }).click();
137132

138133
// Confirmation should disappear
139134
await expect(
140-
page.getByText(/experiment cycles/i).first()
135+
page.getByRole("button", { name: /Cancel/i })
141136
).not.toBeVisible({ timeout: 2000 });
142137

143138
// Run Loop button should be back

0 commit comments

Comments
 (0)