@djordje-stojanovic/sigmaskills 0.8.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/README.md +20 -14
  3. package/manifest.json +10 -5
  4. package/package.json +4 -3
  5. package/registry/skill-baselines.json +179 -2
  6. package/{storgestudio-arena-create → sigmacreatearena}/SKILL.md +3 -3
  7. package/{storgestudio-arena-create → sigmacreatearena}/agents/openai.yaml +2 -2
  8. package/{storgestudio-arena-create → sigmacreatearena}/kit/README.md +1 -1
  9. package/{storgestudio-arena-create → sigmacreatearena}/references/arena-guide.md +1 -1
  10. package/sigmadeeplook/references/installs.md +1 -1
  11. package/sigmadeeplook/scripts/dl_3d.py +31 -1
  12. package/sigmadeeplook/scripts/dl_adapt.py +15 -2
  13. package/sigmadeeplook/scripts/dl_bins.py +245 -11
  14. package/sigmadeeplook/scripts/dl_binx.py +2 -1
  15. package/sigmadeeplook/scripts/dl_cls.py +289 -0
  16. package/sigmadeeplook/scripts/dl_core.py +28 -0
  17. package/sigmadeeplook/scripts/dl_data.py +11 -2
  18. package/sigmadeeplook/scripts/dl_docs.py +27 -1
  19. package/sigmadeeplook/scripts/dl_extra.py +2 -0
  20. package/sigmadeeplook/scripts/dl_listcol.py +99 -0
  21. package/sigmadeeplook/scripts/dl_media.py +16 -0
  22. package/sigmadeeplook/scripts/dl_misc.py +593 -0
  23. package/sigmadeeplook/scripts/dl_reg.py +120 -0
  24. package/sigmadeeplook/scripts/dl_tab2.py +249 -0
  25. package/sigmadeeplook/scripts/dl_vba.py +220 -0
  26. package/sigmadeeplook/scripts/dl_write.py +20 -2
  27. package/sigmadeeplook/scripts/dl_xlcalc.py +272 -0
  28. package/sigmadeeplook/scripts/look.py +3 -3
  29. package/sigmafreedom/SKILL.md +68 -0
  30. package/sigmafreedom/agents/openai.yaml +11 -0
  31. package/sigmafreedom/references/doctrine.md +53 -0
  32. package/sigmafreedom/scripts/guardrail_allowlist.txt +52 -0
  33. package/sigmafreedom/scripts/guardrail_lint.py +146 -0
  34. package/sigmaresearch/SKILL.md +5 -1
  35. package/sigmawrite/SKILL.md +7 -0
  36. package/{easytalk → sigmawritegui}/SKILL.md +3 -3
  37. package/{easytalk → sigmawritegui}/agents/openai.yaml +2 -2
  38. package/{easytalk → sigmawritegui}/template.html +1 -1
  39. package/src/catalog.js +10 -2
  40. /package/{storgestudio-arena-create → sigmacreatearena}/kit/screenshots/caption-rank.png +0 -0
  41. /package/{storgestudio-arena-create → sigmacreatearena}/kit/screenshots/image-board.png +0 -0
  42. /package/{storgestudio-arena-create → sigmacreatearena}/kit/screenshots/image-rank.png +0 -0
  43. /package/{storgestudio-arena-create → sigmacreatearena}/kit/template/arena.json +0 -0
  44. /package/{storgestudio-arena-create → sigmacreatearena}/kit/template/arena.py +0 -0
  45. /package/{storgestudio-arena-create → sigmacreatearena}/kit/template/index.html +0 -0
  46. /package/{storgestudio-arena-create → sigmacreatearena}/kit/template/make_items.py +0 -0
  47. /package/{storgestudio-arena-create → sigmacreatearena}/kit/template/selftest.py +0 -0
  48. /package/{storgestudio-arena-create → sigmacreatearena}/kit/template/server.py +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,29 @@ All notable changes to [Sigmaskills](https://github.com/Djordje-Stojanovic/Sigma
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.2] — 2026-10-18
8
+
9
+ ### Fixed
10
+
11
+ - `sigmadeeplook` readers from the held-out rounds: binaries, archives, tables and spreadsheets read more fields correctly (typed binary fields, VBA source, `.reg`, `.deb` members, list columns, MIDI events, docx Title) (#111, #112). The headerless-records test now skips when numpy is missing, which turns the main branch CI green again.
12
+
13
+ ## [0.9.1] — 2026-10-18
14
+
15
+ ### Fixed
16
+
17
+ - `sigmacreatearena`, `sigmaresearch` and `sigmawritegui` had a plain YAML description containing `: `, which strict YAML parsers reject. The descriptions are now quoted, the installer reads quoted values as plain text, and a test keeps every header strict YAML.
18
+
19
+ ## [0.9.0] — 2026-10-18
20
+
21
+ ### Changed
22
+
23
+ - `easytalk` is renamed `sigmawritegui`: SigmaWrite plus a GUI board the user reads and types into. The trigger phrase "easy talk" and the `EASYTALK REPLY` format stay.
24
+ - `storgestudio-arena-create` is renamed `sigmacreatearena`.
25
+
26
+ ### Added
27
+
28
+ - `sigmafreedom`: de-safeguards and decensors any repository. Writes the freedom doctrine into the steering docs, sweeps agent-facing docs and skill sources with a classifier (freedom limits and moral voice deleted with a was/now change log; craft, scope-routing and mechanical lines kept), installs `guardrail_lint` with an owner-vetoable allowlist wired into the repo's gate plus a negative self-test, writes the ADRs, and reports the kept-list for the owner's veto.
29
+
7
30
  ## [0.8.0] — 2026-10-17
8
31
 
9
32
  ### Added
@@ -258,7 +281,10 @@ Ship high-rigor, installable agent skills (not apps): full-repo audits, performa
258
281
  | 2026-08-11 | `5dab832` | Add CHANGELOG and mark v0.1.0 as the first Sigmaskills release |
259
282
  | 2026-08-11 | `124a666` | Polish v0.1.0 docs for multi-host install and use |
260
283
 
261
- [Unreleased]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.8.0...HEAD
284
+ [Unreleased]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.9.2...HEAD
285
+ [0.9.2]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.9.1...v0.9.2
286
+ [0.9.1]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.9.0...v0.9.1
287
+ [0.9.0]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.8.0...v0.9.0
262
288
  [0.8.0]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.7.0...v0.8.0
263
289
  [0.7.0]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.6.1...v0.7.0
264
290
  [0.6.1]: https://github.com/Djordje-Stojanovic/Sigmaskills/compare/v0.6.0...v0.6.1
package/README.md CHANGED
@@ -6,7 +6,7 @@ Portable [Agent Skills](https://agentskills.io/) that install once and run on **
6
6
 
7
7
  | | |
8
8
  |---|---|
9
- | **Release** | [**v0.8.0**](https://github.com/Djordje-Stojanovic/Sigmaskills/releases/tag/v0.8.0) |
9
+ | **Release** | [**v0.9.2**](https://github.com/Djordje-Stojanovic/Sigmaskills/releases/tag/v0.9.2) |
10
10
  | **Changelog** | [CHANGELOG.md](CHANGELOG.md) |
11
11
  | **License** | [MIT](LICENSE) |
12
12
  | **Spec** | [agentskills.io](https://agentskills.io/) |
@@ -18,7 +18,7 @@ Portable [Agent Skills](https://agentskills.io/) that install once and run on **
18
18
  Σ brief → paste-ready agent briefs, chat only
19
19
  Σ ship → one planned ticket to a merged, cleaned-up PR
20
20
  Σ write → clear STE-inspired technical English
21
- easytalk → plain chat and interactive status or question boards
21
+ sigmawritegui → plain chat and interactive status or question boards
22
22
  arena → blind pairs that rank any options by Elo
23
23
  Σ research → read public sources, record evidence and access gaps
24
24
  Σ deeplook → helper for what agents cannot read: video, speech, scans, binaries
@@ -60,8 +60,8 @@ The [installer guide](https://github.com/Djordje-Stojanovic/Sigmaskills/blob/mai
60
60
  | **SigmaShip** | `sigmaship` | Ship one planned ticket: build, review rounds, merge, clean up | One merged PR, closed ticket, main in sync |
61
61
  | **SigmaWrite** | `sigmawrite` | Clear STE-inspired technical English | Chat writing voice |
62
62
  | **SigmaRefactor** | `sigmarefactor` | Safe, user-approved large-file refactoring | Discussion, changes, and verification |
63
- | **EasyTalk** | `easytalk` | Plain chat with status and question boards | Interactive HTML board and copied replies |
64
- | **Arena Create** | `storgestudio-arena-create` | Blind-pairs arena that ranks any options by Elo per metric | Local arena page, Elo board with ranges and costs |
63
+ | **SigmaWriteGUI** | `sigmawritegui` | Plain chat with status and question boards | Interactive HTML board and copied replies |
64
+ | **SigmaCreateArena** | `sigmacreatearena` | Blind-pairs arena that ranks any options by Elo per metric | Local arena page, Elo board with ranges and costs |
65
65
  | **SigmaResearch** | `sigmaresearch` | Read Reddit, X, HN, GitHub, Hugging Face, video sites and non-English pages; counts sources read in full | Answer with source links, dates, read scope and access gaps |
66
66
  | **SigmaDeepLook** | `sigmadeeplook` | Helper for files an agent cannot read: video, speech, scanned PDF or image, binary, odd container. Plain text and data are read directly | Evidence with file paths, limits, and a side-by-side `view.html` |
67
67
 
@@ -93,6 +93,10 @@ Turns GitHub issues, features, bugs, or plain work statements into short, copy-p
93
93
 
94
94
  Ships one GitHub issue that has acceptance criteria. It opens a worktree, a branch, and a draft PR that tracks the criteria and review rounds. It builds test-first and pushes each slice. Fresh agents then review the branch in rounds until one round finds nothing at P0–P2. Then it merges, closes the ticket, removes the branches and worktree, and checks that local `main` equals `origin/main`. It refuses a ticket without checkable criteria and names the skill to run first.
95
95
 
96
+ ### SigmaFreedom
97
+
98
+ De-safeguards and decensors a repository. It deletes model-authored refusals, bans and moral limits from agent-facing docs and skill sources, writes the owner's freedom doctrine, installs `guardrail_lint` with an owner-vetoable keep-list so the lines never come back, and reports every keep for the owner's veto. Every deletion lands in a was/now change log for a clean revert. Mechanical invariants (one post per run, no file overwrites, secrets never printed) stay.
99
+
96
100
  ### SigmaWrite
97
101
 
98
102
  A writing voice inspired by **ASD-STE100 Simplified Technical English**. It gives soft steers, not numbered rules, and bans gibberish and invented words. A sharp outsider can follow the result, and it stays technical. It stays on until you turn it off. To keep the voice on everywhere, copy the **Paste as system prompt** block from [`sigmawrite/SKILL.md`](sigmawrite/SKILL.md) into your host's instructions. It is not certified STE.
@@ -101,11 +105,11 @@ A writing voice inspired by **ASD-STE100 Simplified Technical English**. It give
101
105
 
102
106
  Counts lines (with `laloc` if you have it, or by itself), reads the five largest maintained files, and explains safe refactoring choices. It waits for your approval before it edits. It keeps behavior, tests, interfaces, and your own changes intact. At the end it reports lines removed apart from lines moved into new modules.
103
107
 
104
- ### EasyTalk
108
+ ### SigmaWriteGUI
105
109
 
106
110
  Keeps replies short and puts status reports or question batches on one interactive board. Read ticks, recommended options, task statuses, and free text feed a **Copy my answers** reply that names every unread card. Open it with an HTML preview tool or as a local browser file. Say “easy talk off” to stop.
107
111
 
108
- ### Arena Create
112
+ ### SigmaCreateArena
109
113
 
110
114
  Ranks many options by your taste. After a short grilling round it builds an **arena**: two options side by side, names hidden, sides random. You pick per metric. A Bradley-Terry fit turns the picks into an Elo board with 95 % ranges, so overlapping bars read as a tie. The kit is a standard-library Python server and one HTML page: local only, no install.
111
115
 
@@ -146,14 +150,15 @@ Use your host's skill syntax. Examples:
146
150
 
147
151
  ```text
148
152
  $sigmareview https://github.com/owner/repo
153
+ $sigmafreedom Set this repo up for freedom
149
154
  $sigmaimprove
150
155
  $sigmabrief https://github.com/owner/repo/issues/12
151
156
  $sigmabrief all open
152
157
  $sigmaship https://github.com/owner/repo/issues/42
153
158
  $sigmawrite
154
159
  $sigmarefactor
155
- $easytalk
156
- $storgestudio-arena-create Rank these 8 thumbnail ideas blind
160
+ $sigmawritegui
161
+ $sigmacreatearena Rank these 8 thumbnail ideas blind
157
162
  $sigmaresearch Research recent discussions about local language models
158
163
  $sigmadeeplook What happens at 2:10 in D:\clips\demo.mp4?
159
164
  ```
@@ -165,14 +170,15 @@ $sigmadeeplook What happens at 2:10 in D:\clips\demo.mp4?
165
170
 
166
171
  ```text
167
172
  /skill:sigmareview https://github.com/owner/repo
173
+ /skill:sigmafreedom Set this repo up for freedom
168
174
  /skill:sigmaimprove
169
175
  /skill:sigmabrief https://github.com/owner/repo/issues/12
170
176
  /skill:sigmabrief all open
171
177
  /skill:sigmaship https://github.com/owner/repo/issues/42
172
178
  /skill:sigmawrite
173
179
  /skill:sigmarefactor
174
- /skill:easytalk
175
- /skill:storgestudio-arena-create Rank these 8 thumbnail ideas blind
180
+ /skill:sigmawritegui
181
+ /skill:sigmacreatearena Rank these 8 thumbnail ideas blind
176
182
  /skill:sigmaresearch Research recent discussions about local language models
177
183
  /skill:sigmadeeplook What happens at 2:10 in ~/clips/demo.mp4?
178
184
  ```
@@ -191,8 +197,8 @@ $sigmadeeplook What happens at 2:10 in D:\clips\demo.mp4?
191
197
  | `sigmaship` | issue URL · `#N` | Refuses tickets without checkable acceptance criteria |
192
198
  | `sigmawrite` | (no input) | Session writing voice until you turn it off |
193
199
  | `sigmarefactor` | repository path or current repository | Scans and discusses large files before any edit |
194
- | `easytalk` | “easy talk” · status or question batch · `EASYTALK REPLY` | Conversation mode until “easy talk off” |
195
- | `storgestudio-arena-create` | what to rank (options, groups, metrics) | Grills first; never ranks for you; you decide when it is enough |
200
+ | `sigmawritegui` | “easy talk” · status or question batch · `EASYTALK REPLY` | Conversation mode until “easy talk off” |
201
+ | `sigmacreatearena` | what to rank (options, groups, metrics) | Grills first; never ranks for you; you decide when it is enough |
196
202
  | `sigmaresearch` | topic · date range · depth or a source count | Reports sources actually read and access gaps |
197
203
  | `sigmadeeplook` | a file or folder path · a question about it | Evidence with paths and a Limits list; never runs the file |
198
204
 
@@ -208,8 +214,8 @@ $sigmadeeplook What happens at 2:10 in D:\clips\demo.mp4?
208
214
  | SigmaBrief | `gh` read access when briefing from issues or PRs · **no** push to the product repo |
209
215
  | SigmaWrite | Nothing beyond chat |
210
216
  | SigmaRefactor | Read access to the target repository · `laloc` is optional; without it the skill counts lines itself |
211
- | EasyTalk | A writable output folder and a browser or HTML preview; chat fallback when unavailable |
212
- | Arena Create | Python 3 (standard library only) and a browser; the server listens on 127.0.0.1 |
217
+ | SigmaWriteGUI | A writable output folder and a browser or HTML preview; chat fallback when unavailable |
218
+ | SigmaCreateArena | Python 3 (standard library only) and a browser; the server listens on 127.0.0.1 |
213
219
  | SigmaResearch | Python 3 for the bundled readers · `yt-dlp` for YouTube comments · Claude in Chrome and owner's existing session for X; missing tools become access gaps |
214
220
  | SigmaDeepLook | Python 3.10 or newer; optional ffmpeg, LibreOffice, poppler, tesseract and Python packages · `look.py doctor` lists them; missing tools become Not-looked-at rows |
215
221
 
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "name": "sigmaskills",
4
- "version": "0.8.0",
4
+ "version": "0.9.2",
5
5
  "description": "Portable Agent Skills monorepo and first-party Sigma Installer",
6
6
  "skills": [
7
7
  {
@@ -45,13 +45,18 @@
45
45
  "needsReferences": true
46
46
  },
47
47
  {
48
- "id": "easytalk",
49
- "title": "EasyTalk",
48
+ "id": "sigmawritegui",
49
+ "title": "SigmaWriteGUI",
50
50
  "needsReferences": false
51
51
  },
52
52
  {
53
- "id": "storgestudio-arena-create",
54
- "title": "Arena Create",
53
+ "id": "sigmacreatearena",
54
+ "title": "SigmaCreateArena",
55
+ "needsReferences": true
56
+ },
57
+ {
58
+ "id": "sigmafreedom",
59
+ "title": "SigmaFreedom",
55
60
  "needsReferences": true
56
61
  }
57
62
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djordje-stojanovic/sigmaskills",
3
- "version": "0.8.0",
3
+ "version": "0.9.2",
4
4
  "description": "Portable Agent Skills monorepo and first-party Sigma Installer",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,11 +30,12 @@
30
30
  "sigmabrief",
31
31
  "sigmaship",
32
32
  "sigmawrite",
33
+ "sigmafreedom",
33
34
  "sigmarefactor",
34
35
  "sigmaresearch",
35
36
  "sigmadeeplook",
36
- "easytalk",
37
- "storgestudio-arena-create",
37
+ "sigmawritegui",
38
+ "sigmacreatearena",
38
39
  "README.md",
39
40
  "LICENSE",
40
41
  "CHANGELOG.md"
@@ -101,6 +101,16 @@
101
101
  "references/brief-method.md": "1bd9200bec7d41106bdff4f0ab39b86597bb2524b8d37af0eb663e9ec854770e",
102
102
  "references/prompt-contract.md": "198bc5ab7a4c27fa14f3c168fe2f79bf1851e1ab7ef89cd95e551df5e398485a"
103
103
  }
104
+ },
105
+ {
106
+ "release": "0.8.0",
107
+ "revision": "4ec9b13a2e3e0cf10f6f218ee5e733f290575f8870bf56feb29e7d69e6b884c0",
108
+ "files": {
109
+ "SKILL.md": "442f9ba7785a30510df995b85b89b95f429d3dd5fe051dc85850309d6361d9e5",
110
+ "agents/openai.yaml": "69c0219b0f8ab7974527ca9f6fb06b67b21683a42ac1de63ef6014cdef1dde85",
111
+ "references/brief-method.md": "1bd9200bec7d41106bdff4f0ab39b86597bb2524b8d37af0eb663e9ec854770e",
112
+ "references/prompt-contract.md": "198bc5ab7a4c27fa14f3c168fe2f79bf1851e1ab7ef89cd95e551df5e398485a"
113
+ }
104
114
  }
105
115
  ],
106
116
  "sigmaperformance": [
@@ -255,6 +265,17 @@
255
265
  "references/method.md": "659848b0d8a7e2dbcbde3fa88de09d07f20b68bb91ea808e766d526b137adc03",
256
266
  "references/report.md": "ebabc522ac35dcfd7538abe4657d4933bf795d5ea20242a968592e0c569e7b41"
257
267
  }
268
+ },
269
+ {
270
+ "release": "0.8.0",
271
+ "revision": "5ce9fb447bb7c3035c98cc3c8d2e46f960f93fb5ca45482a7c94233f1929e196",
272
+ "files": {
273
+ "SKILL.md": "d900e0d033861065542308c966a9e2e2ec5322a70ce2614aba6e8bddb7d9fb07",
274
+ "agents/openai.yaml": "fc9f585d84b751aa9978d3b275a9f8b0383a1d57cb49fec27e905e794fa14d5a",
275
+ "references/measure.md": "efd083364caedfce9c5e69a2267209d3317cfa218029b48455e49cdc2f9affe0",
276
+ "references/method.md": "659848b0d8a7e2dbcbde3fa88de09d07f20b68bb91ea808e766d526b137adc03",
277
+ "references/report.md": "ebabc522ac35dcfd7538abe4657d4933bf795d5ea20242a968592e0c569e7b41"
278
+ }
258
279
  }
259
280
  ],
260
281
  "sigmawrite": [
@@ -337,6 +358,14 @@
337
358
  "SKILL.md": "8db1872ac240efceec949d6b5e13c651b38e1de7b4c82588375c7dcd8f123cb1",
338
359
  "agents/openai.yaml": "19b53dc100195c2d8cfd03720028f577ce8e3ba95829551c6d31d96a23021144"
339
360
  }
361
+ },
362
+ {
363
+ "release": "0.8.0",
364
+ "revision": "ff7cf7f2ff2851b916a5ed4aa856b0b9421095e94e60e8fe88fa0614b363cc9c",
365
+ "files": {
366
+ "SKILL.md": "8db1872ac240efceec949d6b5e13c651b38e1de7b4c82588375c7dcd8f123cb1",
367
+ "agents/openai.yaml": "19b53dc100195c2d8cfd03720028f577ce8e3ba95829551c6d31d96a23021144"
368
+ }
340
369
  }
341
370
  ],
342
371
  "sigmarefactor": [
@@ -402,6 +431,15 @@
402
431
  "agents/openai.yaml": "baaa351482edffe072ae708968dcc1c70842caebf38a8aa7fd667b8da7a01c70",
403
432
  "references/scan.md": "049715a6948138109b64994e969a1ed5541cab8151b8c8d9070d5eae379d45c5"
404
433
  }
434
+ },
435
+ {
436
+ "release": "0.8.0",
437
+ "revision": "25b4efaa5d9d9309791dbbec0f1a32eab409137c4cd16892f646714019b04115",
438
+ "files": {
439
+ "SKILL.md": "a6bef0c53cf780c79da20204cbbd15db65fa98dac3afa0ef1c8475725cd7f4cb",
440
+ "agents/openai.yaml": "baaa351482edffe072ae708968dcc1c70842caebf38a8aa7fd667b8da7a01c70",
441
+ "references/scan.md": "049715a6948138109b64994e969a1ed5541cab8151b8c8d9070d5eae379d45c5"
442
+ }
405
443
  }
406
444
  ],
407
445
  "sigmaimprove": [
@@ -470,6 +508,17 @@
470
508
  "references/issue.md": "59300698c9a1d32e1d868173b22dea5fcc7ea7b7ca97198faf688256e5638300",
471
509
  "references/lenses.md": "c5f2982ed1f4330035895dabacef550a5c1b241e0e1a370547b8715f89f3f8b3"
472
510
  }
511
+ },
512
+ {
513
+ "release": "0.8.0",
514
+ "revision": "9efbc885f031786dd84637009a3b8c38806c50d587b84799692fe60828c32da0",
515
+ "files": {
516
+ "SKILL.md": "118dacdc212f6f359ad9be0564492451bb2dc93f1f03c8af0094994caeff3060",
517
+ "agents/openai.yaml": "ba80d59887cef951c006ad52ddd42fa1999d12b464dff17b6bb0b711f7eb505f",
518
+ "references/categories.md": "58ad43e0da22b5a67f0bec01abc13760ffa835dec9efc07343b07e8326cba7bd",
519
+ "references/issue.md": "59300698c9a1d32e1d868173b22dea5fcc7ea7b7ca97198faf688256e5638300",
520
+ "references/lenses.md": "c5f2982ed1f4330035895dabacef550a5c1b241e0e1a370547b8715f89f3f8b3"
521
+ }
473
522
  }
474
523
  ],
475
524
  "sigmaship": [
@@ -532,9 +581,19 @@
532
581
  "references/land.md": "a1ae956d9017a9b67af68d6d71521d969b78e97cc1f9c3997d4bcedf9d69465f",
533
582
  "references/review-round.md": "e9062112683c71c28dd3bee5329afd6b9bd555ac83a1643b5f7ae5946b09df3a"
534
583
  }
584
+ },
585
+ {
586
+ "release": "0.8.0",
587
+ "revision": "248e37ea81d74561de3600e936143dbd1b7ae5543492fb7f1f8770f61182e090",
588
+ "files": {
589
+ "SKILL.md": "572d6c64273cde938ecdb9e1bccb39bf6d72e21fc386704035a75b18930ee315",
590
+ "agents/openai.yaml": "29f73f7ef65b71dfd4efa27dfef26a961dae98eee2882c63084528b7abef3b96",
591
+ "references/land.md": "a1ae956d9017a9b67af68d6d71521d969b78e97cc1f9c3997d4bcedf9d69465f",
592
+ "references/review-round.md": "e9062112683c71c28dd3bee5329afd6b9bd555ac83a1643b5f7ae5946b09df3a"
593
+ }
535
594
  }
536
595
  ],
537
- "easytalk": [
596
+ "sigmawritegui": [
538
597
  {
539
598
  "release": "0.6.0",
540
599
  "revision": "7e945683bf985978a80f8bddc752d9358063281729d306f537d2f542b7223fcf",
@@ -604,9 +663,28 @@
604
663
  "scripts/sr_core.py": "8ee3cb15a0146058319da6558267ff1420fde9bdd1ef45a332736c7099b4581f",
605
664
  "scripts/sr_readers.py": "e45c351c9ba94ea8c64a6d2f75867bd6dc1e31b18ef25659d444dbda7f2ce295"
606
665
  }
666
+ },
667
+ {
668
+ "release": "0.8.0",
669
+ "revision": "7a1bf001d30f624bf9fbd75ee1bf91b65992efecdef61ab0ae63d35d67ec53e2",
670
+ "files": {
671
+ "SKILL.md": "251ba024d0340c7c94efb7de6b79b4f28884f1e96243f38fd67e8c80d1ea15c4",
672
+ "agents/openai.yaml": "147b99833f77e6d12c4d72424c8b4f06248de7b0ad3f260357429c6a2bce4b68",
673
+ "references/access-ladder.md": "5c883c307e43da2b66ba8445975348827326d23b69030d6745aaf367239e483a",
674
+ "references/counting.md": "3213da1b93d383c4855a4fdfb8bce2593c6254f8a67736835ce8cd91279c921c",
675
+ "references/public-sources.md": "3afa8b50ca2608109f60a6282f5f2d205d2640cdab0e2ba0ab83a6eacef53410",
676
+ "references/reddit.md": "93b53e9aa6652ca96ab6ebd7ae87a72e854b073181dcb69ae1d8eeaf2487d8e8",
677
+ "references/x.md": "9dd86b3d98f1c272f3a2bdce1478de0159680ca9ad5b4535874571a9a3d37817",
678
+ "scripts/__pycache__/sr_core.cpython-314.pyc": "3f4190d5c063e15ea1e413d058e9ef9172087053d38baad01e031622c73c717c",
679
+ "scripts/__pycache__/sr_readers.cpython-314.pyc": "6e42d09cd20055ac664932729b2b1bd0ea033ff1216ac00caa89f39effac6261",
680
+ "scripts/read.py": "ed2959813c1a4a2f8631d11c4acb905cf5137190da1c5590001d250a133dca95",
681
+ "scripts/source_log.py": "21fa54180b67b5a66ba4377fe3c209ae6f87d0ae40047a91856cf2bc483d0e09",
682
+ "scripts/sr_core.py": "8ee3cb15a0146058319da6558267ff1420fde9bdd1ef45a332736c7099b4581f",
683
+ "scripts/sr_readers.py": "e45c351c9ba94ea8c64a6d2f75867bd6dc1e31b18ef25659d444dbda7f2ce295"
684
+ }
607
685
  }
608
686
  ],
609
- "storgestudio-arena-create": [
687
+ "sigmacreatearena": [
610
688
  {
611
689
  "release": "0.7.0",
612
690
  "revision": "3c28851e883e32f8921c94bcc4df1364f5cfa42f7b10e535849eb6ff8d9a7b96",
@@ -626,6 +704,105 @@
626
704
  "references/arena-guide.md": "37008cbe46843106f4b7c1f5907d676aebbc279e7eb51d97bb5ae9eac0444045"
627
705
  }
628
706
  }
707
+ ],
708
+ "easytalk": [
709
+ {
710
+ "release": "0.8.0",
711
+ "revision": "7e945683bf985978a80f8bddc752d9358063281729d306f537d2f542b7223fcf",
712
+ "files": {
713
+ "SKILL.md": "88d7dc079348c00ae89f5395403d93be10b45fe319799ef62ccb303c4ef64d7c",
714
+ "agents/openai.yaml": "2b37c8e632553692e561b7d1de7aa2d00ab7612136e5f873934bd49395c08c9e",
715
+ "template.html": "e59ee52b94e26f2727f4b007af4c29bc20c0c048775b74caa7fbd53988b94483"
716
+ }
717
+ }
718
+ ],
719
+ "sigmadeeplook": [
720
+ {
721
+ "release": "0.8.0",
722
+ "revision": "a22c9f8dc465d380089dec43d0e747306d7f4974068ea00af592fd7511376b61",
723
+ "files": {
724
+ "SKILL.md": "68f9a560e750fea146302a348966aa8e93d84731088fe899517c59f024b28790",
725
+ "agents/openai.yaml": "019b5763cdb1af585ec74d4abe36e25b27841491cf434bc0bcf593ab7ab2403b",
726
+ "references/3d.md": "f8e2fcd679ab67010aef0ce261d09764e3c08e53aea82942ee2cbe14e77c3931",
727
+ "references/archive.md": "3d200a6b33331c3ed3daab463caec0f6d21f2bec147d74803debba51d1642237",
728
+ "references/audio.md": "74ca4d8c936e912eabf80d415cbc1eb8bc77648ca8e28bab6ccb4d7f247df3f2",
729
+ "references/binary.md": "e91c6a54924793f546541b2c67ae274954a58c6e317338698ff79de54920aa00",
730
+ "references/code.md": "0ecb8899f876a795f92d488c74d694888a4c3abe6e027b800b70ec45c878e233",
731
+ "references/data.md": "5491fec6cf3ac2b64c1b6a38f3087f54585fbe96ac536099c5e040111bd6b10d",
732
+ "references/email.md": "2c9a4167e645a718922d991b6ca95b2eccedabdbd6274a279589a5bc4fcb52a2",
733
+ "references/font.md": "e59dafd6a9b2ed472dedaf1568cc154ca2b29f2ddb0922efbdeee74210a87acc",
734
+ "references/image.md": "8eed977846d1de28f627a2b85df5f9b2c21d84da1516bab0aef424c3ac7bb99d",
735
+ "references/installs.md": "760537be3bae2431c326be9fb5b2fcaf223daebb5cd49dd17b09d8d0064d7cdd",
736
+ "references/notebook.md": "a457145e357fcdfbe2cf6ee8accbad7e5d044c39116405b4017b2a5f40d0ab0e",
737
+ "references/office.md": "d7cb6b81ed0dfde6bad400441e7c62053c63bf1741497c90f2c6c5db10bac54b",
738
+ "references/other.md": "b52ded38848ade208319ee61291af967bd77913aa1ea5a9728b1f4d899df4c09",
739
+ "references/output.md": "d083d007e12e099d8e7dde1bb6e09e426aa5fe8b5e566e9dd1abccdda9f9f183",
740
+ "references/pdf.md": "fc25c90c78175dcd897c7c5b32d8eb6f9f0787cd0d02c51d03739f835a5eee97",
741
+ "references/video.md": "51797a527013593f2dc520ecd3f517eddab994fdca36c0e4041e2fb80c20b683",
742
+ "references/web.md": "93a099a3a2b07d105c84c91cf04b771d8e8e06db37b2a3d622d57fa3437c6fc4",
743
+ "scripts/dl_3d.py": "4432fc18c7dedc867fc1d4d0c18214e05bb91660f46827d8f578fd570ff1c4e3",
744
+ "scripts/dl_adapt.py": "375c90690fc58c745e238d16c67194e7d75e26cde8b124e15600a64deb52a217",
745
+ "scripts/dl_ask.py": "15d03fcdd665f67a5b339ab65d7ceab01e8144b89220d0b111c46e5a108ba90c",
746
+ "scripts/dl_asr.py": "ed5387f16c47c9a3150484e2d900519e5d78da3e53fe49bdc62e373b3d55e346",
747
+ "scripts/dl_bins.py": "f2aed7eab50d1618523651b917d72bcc4fa03ff560922708e514b2e44c505b24",
748
+ "scripts/dl_binx.py": "9efe1c1973ae210047d56c8894a8be5b0816eff59d8f74307ef0b105a5631f06",
749
+ "scripts/dl_books.py": "ae7b2639104a383c186b143a7b88c187340ca523a7c83b3478bf4ede71a3ae66",
750
+ "scripts/dl_cal.py": "2a8025e58f3df548d86955144b5bd44062160c1e60002705167eca2ea40d5af4",
751
+ "scripts/dl_colmeta.py": "cc481f811e1e6eb7bf44e09ceb314efa2a6ff026c00b755c47dfc4016eb49c4f",
752
+ "scripts/dl_conf.py": "57e88d3bc7f10dc5e44cc0ee40c75c159499e3b55e73ae2fe5a06c21513fd66f",
753
+ "scripts/dl_core.py": "10463866de3cfe1fb1f30ba79719cbc852a57586b0f7e5eb07e55efe8efad543",
754
+ "scripts/dl_data.py": "a361f0c37523ab768b54cfc281103cd9df89afa65e9d6c9197e5354b6b2258f8",
755
+ "scripts/dl_delim.py": "56fcd1371f949fd11f16f1c7c1c4c5ccc8fd7f8f9ae02ac906cb0056803ff354",
756
+ "scripts/dl_docs.py": "b360e805ca0d6668c8aa66c8095f173cc97de96aa2c3c02e880e9ceb24c909a3",
757
+ "scripts/dl_drill.py": "390f2681b3b324cc81a15ea2b702f88391378a72267eaed1c6423a75c4946e6f",
758
+ "scripts/dl_drill_ext.py": "079667eb8a61583eab33fd2bdaf7693fcd042c86628fb8b629d98946b7a698b5",
759
+ "scripts/dl_extra.py": "7ef99507cbca314f76674c51df5aec4b0cadff6d367cbc8f0822ab9ac6abe0e2",
760
+ "scripts/dl_gate.py": "c2aa890798109de0e2accf8103146f1a0e6e5a13cc27ff7931f19b3ac9a87458",
761
+ "scripts/dl_geo.py": "bbba45f57594d99697367f42dfb2f536228bb6bd9e778c8ca124d2a769d80989",
762
+ "scripts/dl_logs.py": "1ecad902cdcc0ea12057c9ad7f0613af35cb1defc6136ebf16c49d8cef9040d9",
763
+ "scripts/dl_media.py": "23324d2d8b03141d7d64ea504a0e837eaab072089b52286313510d64d09f330a",
764
+ "scripts/dl_mediax.py": "dbd42ca799be599d2489c723c95ec2a51b394d307a312969ee50812861a05bc8",
765
+ "scripts/dl_mmeta.py": "f92851880371d2b8fef2d8f5aba56c364b647635d602b7d5bbf0ff62e5e18aac",
766
+ "scripts/dl_models.py": "861278163b38d37ae67542f03e69c6f327f2a48ad6f19be2e9fae0fe0d8ea612",
767
+ "scripts/dl_more.py": "cf7c2320462d7a3f21fc667375096caa8c739fb09f94a59d6f89312c272b92e9",
768
+ "scripts/dl_offx.py": "bce98dacbeedc91459126868b64a174422f2bf6c7a9a4239c57bc7b19319c79b",
769
+ "scripts/dl_pcap.py": "0014bc068049df7514ef48236922756ec8218c4a664a1e7c07cfacc659ee5ace",
770
+ "scripts/dl_pdffacts.py": "46fd50707c0b03ea92d61548ab6d92bfa133747333b89d1636f05309078b0c90",
771
+ "scripts/dl_pe.py": "764fc73d41415cfb10b77e3ed27794abfd9a02dbbdaec31618a0458b3a1e8261",
772
+ "scripts/dl_pick.py": "d15aaf8ffb272553d5e1be49554d0a702eda45203f75d109c491117e26c72e64",
773
+ "scripts/dl_prof.py": "5fef66a7c14021532d2158083622b64374d12936cad8c8ba4bc069e80791e0b6",
774
+ "scripts/dl_sample.py": "7fa9237f7b4e38cd1532ae6d9ce1154f63a06581fa6afee7a7944cfc40216856",
775
+ "scripts/dl_selftest.py": "c4573d674307d3cea617a786c547ded20b676ca9dc18e9b881b17648ec6ec6b9",
776
+ "scripts/dl_skel.py": "d1eedbd48a591d01b4f28f454af226f2d0075e50ffd077d1e80c7a70edcef161",
777
+ "scripts/dl_svg.py": "0e09a161ffd207dd8ed69528acdd398b65e4f9c44221c07db114664e6b29599a",
778
+ "scripts/dl_util.py": "f74b58c987f0f35ded011ec7c48bfe0c253e43343e17638eb59a7398f2f2e709",
779
+ "scripts/dl_view.py": "cdc7387579323f0f8a16765ad3798776a0e3a8071493cd3415a081f46cf63463",
780
+ "scripts/dl_write.py": "a6aca9809a7a7cdea014a0b68dc62ffe1d7741627ace7e67afed854f5b310236",
781
+ "scripts/dl_xl.py": "f94cfe3b79906e08649497d0114cfa0fc7267ba992cd481caf3d159d7949a9d2",
782
+ "scripts/look.py": "4410ed46eebbf95685ceb83326f5eb9bcfb6f8e9857de384c084c6ee0c76efc1"
783
+ }
784
+ }
785
+ ],
786
+ "storgestudio-arena-create": [
787
+ {
788
+ "release": "0.8.0",
789
+ "revision": "3c28851e883e32f8921c94bcc4df1364f5cfa42f7b10e535849eb6ff8d9a7b96",
790
+ "files": {
791
+ "SKILL.md": "1696216f51d914ce374e5c47a248ead585556ae95633a0fd49d14f0365b0062a",
792
+ "agents/openai.yaml": "34569e63132f44d3a271b32a2f70b62886b94ef224aa84214dd2446d2f07c344",
793
+ "kit/README.md": "535beb661d413905fd669c6d1d9104026512765359b6451539170488cd14f9d3",
794
+ "kit/screenshots/caption-rank.png": "3a02d0bf0c5d9047649271bf4fc052cc2f8da8dee1fb17f031fcd79cea7f31c4",
795
+ "kit/screenshots/image-board.png": "3aa55effa50652f62991b316df1e151f4c576d6e9ae9adeda9c0e06451271b51",
796
+ "kit/screenshots/image-rank.png": "b0dc05828fc706c93e38a9561f4f1b4ba8565f9fbe4339c0a8b9376b8bbfff5c",
797
+ "kit/template/arena.json": "59500604e7864c01b8c441beea569e2165e7d38e42df677ec43af23c4478a450",
798
+ "kit/template/arena.py": "b086db96a7e11471a25ec0fb7eaf23d12260b391a557db7775e189dab893e5a6",
799
+ "kit/template/index.html": "19b37dbe299c89d3fa5a1936504fe9b20b54dc1eae06cfb983a1f915954f1194",
800
+ "kit/template/make_items.py": "bbacc3ad78bd503063fc0f53d92383c761021237badfe6331f98e6fdd1567b54",
801
+ "kit/template/selftest.py": "72d9697ea380614032fde91b996f880ff46f94896de6efb3960bf8ed439b3a86",
802
+ "kit/template/server.py": "34d00183f3ec333fee4ea365749fe1e30987c4cf775e03316cc702b16ca43b2c",
803
+ "references/arena-guide.md": "37008cbe46843106f4b7c1f5907d676aebbc279e7eb51d97bb5ae9eac0444045"
804
+ }
805
+ }
629
806
  ]
630
807
  }
631
808
  }
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: storgestudio-arena-create
3
- description: Builds a fast blind-pairs arena so the user ranks any options by Elo per metric: models, settings, voices, captions, thumbnails, outfits. Grills first, then ships a local page and a board. Use to rank, compare or pick the best of many options by taste. Do not use for 2-3 options (just ask), for measurable checks (script them), or to judge one draft against a reference.
2
+ name: sigmacreatearena
3
+ description: 'Builds a fast blind-pairs arena so the user ranks any options by Elo per metric: models, settings, voices, captions, thumbnails, outfits. Grills first, then ships a local page and a board. Use to rank, compare or pick the best of many options by taste. Do not use for 2-3 options (just ask), for measurable checks (script them), or to judge one draft against a reference.'
4
4
  ---
5
5
 
6
- # Arena Create
6
+ # SigmaCreateArena
7
7
 
8
8
  An arena shows the user two options side by side, names hidden, sides random. They pick per metric. A Bradley-Terry fit turns the picks into an Elo board per metric. This skill grills the user, builds the arena from a bundled kit, hands over the link, and reads the board back.
9
9
 
@@ -1,7 +1,7 @@
1
1
  interface:
2
- display_name: Arena Create
2
+ display_name: SigmaCreateArena
3
3
  short_description: Blind-pairs arena that ranks any options by Elo per metric
4
- default_prompt: Use $storgestudio-arena-create to build a blind-pairs arena that
4
+ default_prompt: Use $sigmacreatearena to build a blind-pairs arena that
5
5
  ranks these options by Elo per metric.
6
6
  policy:
7
7
  products:
@@ -1,6 +1,6 @@
1
1
  # Arena kit
2
2
 
3
- A blind-pairs ranking page for anything: models, settings, captions, thumbnails, voices, outfits. The full guide (rules, why, lessons) is [`../references/arena-guide.md`](../references/arena-guide.md); the skill is `storgestudio-arena-create`.
3
+ A blind-pairs ranking page for anything: models, settings, captions, thumbnails, voices, outfits. The full guide (rules, why, lessons) is [`../references/arena-guide.md`](../references/arena-guide.md); the skill is `sigmacreatearena`.
4
4
 
5
5
  ```powershell
6
6
  # 1. copy the template into the project (never edit the template for one project)
@@ -2,7 +2,7 @@
2
2
 
3
3
  An **arena** shows the user two options side by side, names hidden, sides random, and asks "which is better?" on one or more metrics. From the user's picks it builds an Elo board (the LMArena method) per metric and overall. It works for anything that can be shown or played: AI models and settings (images, video clips, voices, music), captions, titles, hooks, thumbnails, outfits, logos, intros, script lines.
4
4
 
5
- Built from two real arenas: a video-model arena (400 picks) and an image-model arena (200 picks). The kit is [`../kit/`](../kit/README.md): copy `template/` into the project, fill `arena.json`, run `python server.py`. Skill: **`storgestudio-arena-create`** (it grills the user first).
5
+ Built from two real arenas: a video-model arena (400 picks) and an image-model arena (200 picks). The kit is [`../kit/`](../kit/README.md): copy `template/` into the project, fill `arena.json`, run `python server.py`. Skill: **`sigmacreatearena`** (it grills the user first).
6
6
 
7
7
  Use the arena for / keep elsewhere:
8
8
 
@@ -45,7 +45,7 @@ Every row below is a 'Not looked at' row when the tool is absent. Nothing needs
45
45
  | cairosvg | python package | rendering svg | pip install cairosvg |
46
46
  | rapidocr_onnxruntime | python package | OCR of video frames, images, scanned pages | pip install rapidocr-onnxruntime |
47
47
  | lief | python package | real Authenticode verification (chain and hash), imphash | pip install lief |
48
- | oletools | python package | VBA macro source, auto-run routines, suspicious calls | pip install oletools |
48
+ | oletools | python package | fuller VBA analysis (the stdlib reader already decompresses the modules, lists auto-run routines, suspicious calls and strings) | pip install oletools |
49
49
  | python_calamine | python package | very large xlsx files | pip install python-calamine |
50
50
  | dnfile | python package | .NET assembly names, references, types | pip install dnfile |
51
51
  | pymupdf4llm | python package | (reserved) PDF to markdown with tables | pip install pymupdf4llm |
@@ -120,7 +120,14 @@ def look_3d(look):
120
120
  look.flag("PARSE-ERROR", "glTF", f"{type(e).__name__}: {e}"[:100], "")
121
121
  elif st in ("stl", "stl-ascii"):
122
122
  tris = parse_stl(b, st == "stl-ascii")
123
- look.line(f"STL ({'ASCII' if st == 'stl-ascii' else 'binary'}): {len(tris)} triangles. STL has no units and no colour.")
123
+ hdr = ""
124
+ if st != "stl-ascii":
125
+ hdr = b[:80].split(b"\0")[0].decode("latin-1").strip()
126
+ hdr = f" Header text: {hdr!r}." if hdr else " Empty 80-byte header."
127
+ else:
128
+ first = b[:200].decode("latin-1").splitlines()[0].strip()
129
+ hdr = f" First line: {first!r}."
130
+ look.line(f"STL ({'ASCII' if st == 'stl-ascii' else 'binary'}): {len(tris)} triangles.{hdr} STL has no units and no colour.")
124
131
  elif st == "obj":
125
132
  tris, c = parse_obj(b.decode("utf-8", "replace"))
126
133
  look.fact("vertices", c["v"])
@@ -158,6 +165,8 @@ def look_3d(look):
158
165
  look.fact("triangles", len(tris))
159
166
  look.fact("bbox", stats["bbox"])
160
167
  look.line(f"{len(tris)} triangles; bounding box {stats['bbox']['min']} to {stats['bbox']['max']} (size {stats['bbox']['size']}).")
168
+ look.line(f"Mesh measures: surface area {stats['surface_area']:,.3f}, signed volume {stats['signed_volume']:,.3f} (a true volume only when watertight), "
169
+ + (f"centroid {stats['centroid']}, " if stats.get("centroid") else "") + f"{stats['unique_vertices']} unique vertices, {stats['degenerate_triangles']} zero-area triangles (units are those of the file).", 61)
161
170
  if stats.get("watertight") is not None:
162
171
  look.fact("watertight", stats["watertight"])
163
172
  look.line("Watertight (every edge shared by exactly two triangles): " + ("yes" if stats["watertight"] else f"NO ({stats['open_edges']} open edges)"))
@@ -257,6 +266,27 @@ def mesh_stats(look, tris):
257
266
  mn = [round(min(xs), 4), round(min(ys), 4), round(min(zs), 4)]
258
267
  mx = [round(max(xs), 4), round(max(ys), 4), round(max(zs), 4)]
259
268
  out = {"triangles": len(tris), "bbox": {"min": mn, "max": mx, "size": [round(a - b, 4) for a, b in zip(mx, mn)]}}
269
+ area = vol = 0.0
270
+ cx = cy = cz = 0.0
271
+ degenerate = 0
272
+ for a, b, c in tris:
273
+ ux, uy, uz = b[0] - a[0], b[1] - a[1], b[2] - a[2]
274
+ vx, vy, vz = c[0] - a[0], c[1] - a[1], c[2] - a[2]
275
+ nx, ny, nz = uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx
276
+ ar = 0.5 * math.sqrt(nx * nx + ny * ny + nz * nz)
277
+ if ar < 1e-12:
278
+ degenerate += 1
279
+ area += ar
280
+ d = (a[0] * (b[1] * c[2] - b[2] * c[1]) - a[1] * (b[0] * c[2] - b[2] * c[0]) + a[2] * (b[0] * c[1] - b[1] * c[0])) / 6.0
281
+ vol += d
282
+ cx += d * (a[0] + b[0] + c[0]) / 4.0
283
+ cy += d * (a[1] + b[1] + c[1]) / 4.0
284
+ cz += d * (a[2] + b[2] + c[2]) / 4.0
285
+ out["surface_area"] = round(area, 4)
286
+ out["signed_volume"] = round(vol, 4)
287
+ out["centroid"] = [round(cx / vol, 4), round(cy / vol, 4), round(cz / vol, 4)] if abs(vol) > 1e-12 else None
288
+ out["degenerate_triangles"] = degenerate
289
+ out["unique_vertices"] = len({(round(v[0] * 1e5), round(v[1] * 1e5), round(v[2] * 1e5)) for t in tris for v in t}) if len(tris) <= MAX_TRIS_PARSE else None
260
290
  if len(tris) <= MAX_TRIS_PARSE:
261
291
  q = lambda v: (round(v[0] * 1e5), round(v[1] * 1e5), round(v[2] * 1e5))
262
292
  edges = {}
@@ -108,6 +108,15 @@ def look_avro(look):
108
108
  break
109
109
  look.write_text("sample.json", json.dumps(rows, indent=1, default=str)[:20000], "the first 5 records", "json", value=6)
110
110
  look.step("sample records", "fastavro")
111
+ if not look.quick and records:
112
+ import dl_data as D
113
+ names = [n for n, _t in fields]
114
+
115
+ def rowsgen():
116
+ with open(look.path, "rb") as f2:
117
+ for k, rec in enumerate(fa.reader(f2), 1):
118
+ yield k, [json.dumps(rec.get(n), default=str, sort_keys=True) if isinstance(rec.get(n), (list, dict)) else rec.get(n) for n in names]
119
+ D.table_profile(look, "Records", names, rowsgen, "record", records, 84, 28)
111
120
  except Exception as e:
112
121
  look.fail("record values", "fastavro", e)
113
122
 
@@ -327,8 +336,10 @@ def summarize_olevba(results):
327
336
 
328
337
  def olevba_facts(look, data, name):
329
338
  m = look.mod("oletools")
330
- if not m:
331
- look.skip("macro source: auto-run routines, suspicious calls and addresses", "python package oletools not importable" if not look.no_tools else "disabled by --no-tools", "oletools")
339
+ if not m: # the standard-library reader: decompresses the VBA modules itself
340
+ import dl_vba
341
+ if not dl_vba.vba_facts(look, data, name):
342
+ look.skip("macro source: full oletools analysis", "python package oletools not importable" if not look.no_tools else "disabled by --no-tools", "oletools")
332
343
  return
333
344
  try:
334
345
  from oletools.olevba import VBA_Parser
@@ -348,6 +359,8 @@ def olevba_facts(look, data, name):
348
359
  look.step("macro analysis", "oletools")
349
360
  except Exception as e:
350
361
  look.fail("macro analysis", "oletools", e)
362
+ import dl_vba
363
+ dl_vba.vba_facts(look, data, name)
351
364
 
352
365
 
353
366
  # ================================================================= glTF validator