From b77e59a36e36cf81dd22c66b2ea8fb34d6886807 Mon Sep 17 00:00:00 2001 From: Joaquim Costa Date: Wed, 20 May 2026 07:14:30 -0400 Subject: [PATCH 1/2] Add skrebe-translator-workflow preset (20 entries) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Catalog's seed preset — 20 entries covering Skrebe translator workflow vocabulary (editor verbs, workflow nouns, function-word traps). Policy mix: 4 must, 13 should, 3 avoid. The 3 avoids mirror the existing Skrebe ALUPEC linter calque rules (MAS, PORQUE, NAO) so the preset and the linter speak the same vocabulary. Four entries (translation, translate, close, save) are flagged in the README as bootstrap-curated Portuguese-to-ALUPEC calques pending community review before 1.0.0. Domain: tech. Dialect: santiago. License: MIT. --- index.json | 39 +++- .../skrebe-translator-workflow/.cspell.json | 6 + .../skrebe-translator-workflow/CHANGELOG.md | 23 +++ presets/skrebe-translator-workflow/README.md | 56 +++++ .../skrebe-translator-workflow/glossary.json | 192 ++++++++++++++++++ .../skrebe-translator-workflow/manifest.json | 32 +++ 6 files changed, 345 insertions(+), 3 deletions(-) create mode 100644 presets/skrebe-translator-workflow/.cspell.json create mode 100644 presets/skrebe-translator-workflow/CHANGELOG.md create mode 100644 presets/skrebe-translator-workflow/README.md create mode 100644 presets/skrebe-translator-workflow/glossary.json create mode 100644 presets/skrebe-translator-workflow/manifest.json diff --git a/index.json b/index.json index 2f1485a..6b8c39a 100644 --- a/index.json +++ b/index.json @@ -1,8 +1,41 @@ { "schemaVersion": 1, - "generatedAt": "2026-05-20T03:00:26.849Z", + "generatedAt": "2026-05-20T14:38:50.031Z", "catalogName": "papia-presets", "catalogVersion": "0.1.0", - "domains": [], - "presets": [] + "domains": [ + "tech" + ], + "presets": [ + { + "id": "skrebe-translator-workflow", + "name": "Skrebe Translator Workflow", + "description": "Core vocabulary a Skrebe user encounters while translating English into Kriolu: editor verbs (open, save, read, write), workflow nouns (document, word, sentence, project), the conjunctions that trip up Portuguese speakers (and, but, because, not, more), and second-person register distinctions. The catalog's seed preset.", + "domain": "tech", + "latestVersion": "0.1.0", + "entryCount": 20, + "dialects": [ + "santiago" + ], + "sourceLanguage": "en", + "targetLanguage": "kea", + "authors": [ + { + "name": "Papia Studio", + "github": "@deznode" + } + ], + "alupecValidated": false, + "featured": false, + "tags": [ + "seed", + "translator-workflow", + "computing", + "conjunctions" + ], + "manifestUrl": "https://raw.githubusercontent.com/deznode/papia-presets/main/presets/skrebe-translator-workflow/manifest.json", + "glossaryUrl": "https://raw.githubusercontent.com/deznode/papia-presets/main/presets/skrebe-translator-workflow/glossary.json", + "updatedAt": "2026-05-19" + } + ] } diff --git a/presets/skrebe-translator-workflow/.cspell.json b/presets/skrebe-translator-workflow/.cspell.json new file mode 100644 index 0000000..1a912d1 --- /dev/null +++ b/presets/skrebe-translator-workflow/.cspell.json @@ -0,0 +1,6 @@ +{ + "import": ["@papia/cspell-kea/cspell-ext.json"], + "overrides": [ + { "filename": "**/{*.kea,kea}.{md,mdx}", "dictionaries": ["kea"] } + ] +} diff --git a/presets/skrebe-translator-workflow/CHANGELOG.md b/presets/skrebe-translator-workflow/CHANGELOG.md new file mode 100644 index 0000000..1721ebd --- /dev/null +++ b/presets/skrebe-translator-workflow/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog — skrebe-translator-workflow + +All notable changes to this preset will be documented in this file. Format loosely follows [Keep a Changelog](https://keepachangelog.com/). Bump the version in `manifest.json` according to [semver](https://semver.org/): + +- **Patch** (1.0.0 → 1.0.1) — typo fixes, note clarifications +- **Minor** (1.0.0 → 1.1.0) — new entries added, no breaking changes +- **Major** (1.0.0 → 2.0.0) — terms removed or preferred translation changed (breaks downstream approvals) + +--- + +## [0.1.0] — 2026-05-19 + +### Added + +- Initial draft of the catalog's seed preset (20 entries, Santiago dialect). +- 4 `must` entries codifying non-negotiable rules: the four-way "and" conjunction (`ku` / `y` / `i` / never-`e`), `but` → `ma`, `ALUPEC` (verbatim), `Kriolu` (with `Kabuverdianu` as accepted alternative). +- 13 `should` entries covering editor verbs (open, save, read, write, close, translate, help), workflow nouns (document, word, sentence, project, translation), and the second-person pronoun with register distinctions (`bo` / `nhu` / `nha`). +- 3 `avoid` entries mirroring the existing Skrebe linter calque rules: `because` → `porque`/`porkê` (ALUPEC_CALQUE_PORQUE), `not` → `não`/`nao` (ALUPEC_CALQUE_NAO), `more` → `más` (ALUPEC_CALQUE_MAS). + +### Known limitations + +- Four entries (`translation`, `translate`, `close`, `save`) are bootstrap calques constructed via Portuguese-to-ALUPEC mappings rather than directly attested in a published Kriolu source. They are flagged for community review in the README and will be revisited before `1.0.0`. +- No `nameKriolu` field in the manifest yet — pending a community-reviewed translation of "Skrebe Translator Workflow". diff --git a/presets/skrebe-translator-workflow/README.md b/presets/skrebe-translator-workflow/README.md new file mode 100644 index 0000000..90aec4a --- /dev/null +++ b/presets/skrebe-translator-workflow/README.md @@ -0,0 +1,56 @@ +# Skrebe Translator Workflow + +The catalog's seed preset — a small, dense vocabulary covering the words a Skrebe user actually encounters while translating English Markdown into Cape Verdean Kriolu. Twenty entries, Santiago dialect, MIT-licensed. + +This preset exists for two reasons: + +1. **Marketplace seed.** The `papia-presets` catalog needs to ship with at least one credible preset so that Skrebe's marketplace UI has something to render. This is that preset. +2. **Pedagogical anchor.** Several entries codify rules the Skrebe ALUPEC linter already enforces — the four-way "and" trap (`ku` / `y` / `i` / never `e`), the `mas` / `ma` / `más` distinction, the forbidden Portuguese calques (`porque`, `não`, `más`). Installing this preset makes the linter's vocabulary visible to translators inside the glossary panel. + +## Audience + +Anyone using Skrebe to translate English-source Markdown into Kriolu. The vocabulary is intentionally narrow: + +- **Editor verbs**: open, save, read, write, close, translate, help +- **Workflow nouns**: document, word, sentence, project, translation +- **Function words**: the "and" conjunction family, "but", "you" (with register distinctions) +- **Calque traps**: forbidden Portuguese forms of "because", "not", "more" +- **Proper nouns**: ALUPEC, Kriolu + +It is **not** a general English-Kriolu dictionary. Pair it with a domain preset (health, education, civic-government) when you need vocabulary for a specific field. + +## Dialect notes + +All entries reflect Santiago (Badiu) usage. Where alternative dialect forms exist (e.g. São Vicente `salva` vs. Santiago `guarda` for "save"), they are mentioned in the entry's `notes` field but not encoded as separate targets — that's for a future multi-dialect preset. + +## Pedagogical highlights + +- **Entry "and"** — the catalog's most-cited rule, with `ku` / `y` / `i` as the three valid choices and a notes-field warning that `e` (the copula "is") must never be used as "and". This is the single most common Portuguese-interference bug in Kriolu writing. See [ADR-0013](https://github.com/deznode/papia-studio/blob/main/docs/adr/0013-alupec-and-conjunction-design.md). +- **Entry "you"** — exercises the `register` field with `bo` (neutral), `nhu` (formal, masculine), `nha` (formal, feminine). +- **The three "avoid" entries** (`because`, `not`, `more`) mirror exactly the three calque rules the Skrebe linter already enforces: `ALUPEC_CALQUE_PORQUE`, `ALUPEC_CALQUE_NAO`, `ALUPEC_CALQUE_MAS`. Installing this preset puts those rules into the glossary panel where translators see them at lookup time, not only at lint time. + +## Bootstrap-curated entries (flagged for community review) + +This being the catalog's first preset, several computing-domain terms are **constructed from Portuguese-to-ALUPEC mappings** rather than attested in a published Kriolu source. They are listed below; pull requests refining them with native-speaker input are welcome. + +| Entry | Proposed target | Why it's flagged | +|---|---|---| +| `translation` → `tradusan` | Mechanical mapping (PT *tradução* → ALUPEC `ç→s`, `ão→an`) | No published attestation; `tradusu` / `tradusion` are plausible alternatives | +| `translate` → `traduzi` | Regular `-i` verb pattern | Not in Peace Corps dictionary; pattern is regular but the specific lemma isn't attested | +| `close` → `fitxa` | Extended from "lock" sense | Peace Corps lists `fitxa` primarily as "lock"; the document-close sense is an extrapolation | +| `save` → `guarda` | Extended from "protect/keep" sense | Computing/UI extension of a general verb; the alternative `salva` exists | + +A maintainer will ask a native Kriolu speaker to review these before tagging `1.0.0`. + +## Sources + +- `docs/glossary.md` in [`deznode/papia-studio`](https://github.com/deznode/papia-studio) — project-normative terms (ALUPEC, Kriolu, dialect names, ASR/TM). +- [ADR-0013](https://github.com/deznode/papia-studio/blob/main/docs/adr/0013-alupec-and-conjunction-design.md) — canonical "and" conjunction design. +- Resolução n.º 48/2005 and Decreto-Lei n.º 67/98 — Cape Verde government ALUPEC spec. +- [Peace Corps Kriolu Dictionary](https://files.peacecorps.gov/multimedia/pdf/library/CV_Kriolu.pdf) — general lexicon (entries 6, 7, 13, 14, 15, 16). +- [Omniglot Cape Verdean Creole](https://www.omniglot.com/writing/caboverdean.htm) — ALUPEC quick reference. +- `arkhe/eval/gemini-2.5-flash-baseline.json` in `deznode/papia-studio` — community-reviewed gold translations. + +## License + +Released under the [MIT License](../../LICENSE). See `manifest.json` for authorship. diff --git a/presets/skrebe-translator-workflow/glossary.json b/presets/skrebe-translator-workflow/glossary.json new file mode 100644 index 0000000..806667f --- /dev/null +++ b/presets/skrebe-translator-workflow/glossary.json @@ -0,0 +1,192 @@ +{ + "schemaVersion": 1, + "entries": [ + { + "source": "and", + "targets": [ + { "term": "ku", "preferred": true }, + { "term": "y" }, + { "term": "i" } + ], + "policy": "must", + "partOfSpeech": "conjunction", + "notes": "Four-way choice. Use `ku` to coordinate noun phrases (e.g. \"Pandas ku NumPy\", \"pai ku mai\"). Use `y` (ALUPEC spec form per Decreto-Lei n.º 67/98) or `i` (community-accepted alternative) for clausal coordination (e.g. \"El ta lé i ta skrebi\"). NEVER use `e` — that is the copula \"is\" and flips meaning: \"Fásil di lé e skrebi\" misreads as \"easy to read IS write\". See ADR-0013." + }, + { + "source": "but", + "targets": [ + { "term": "ma", "preferred": true } + ], + "policy": "must", + "partOfSpeech": "conjunction", + "notes": "Kriolu \"but\" is `ma`, not `mas`. The unaccented `mas` is the comparative \"more\" (\"mas grandi ki kel\" = \"bigger than that\"). The accented `más` is Portuguese interference and never used in ALUPEC. Linter rule: ALUPEC_CALQUE_MAS." + }, + { + "source": "ALUPEC", + "targets": [ + { "term": "ALUPEC", "preferred": true } + ], + "policy": "must", + "partOfSpeech": "abbreviation", + "notes": "Preserve verbatim, uppercase. Stands for Alfabeto Unificado para a Escrita do Caboverdiano (Resolução n.º 48/2005). Do not translate, lowercase, or hyphenate." + }, + { + "source": "Kriolu", + "targets": [ + { "term": "Kriolu", "preferred": true }, + { "term": "Kabuverdianu" } + ], + "policy": "must", + "partOfSpeech": "noun", + "notes": "Cape Verdean Creole, ISO 639-3 `kea`. Both `Kriolu` and `Kabuverdianu` are accepted endonyms. Do NOT use Portuguese `Crioulo` — even without the cedilla it carries PT orthography assumptions." + }, + { + "source": "write", + "targets": [ + { "term": "skrebi", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "The verb that gives Skrebe its name. ALUPEC starts with `sk-` (not `esc-`) and ends in `-i` (not Portuguese `-er`). Example: \"El ta skrebi tudu dia\" (\"He writes every day\")." + }, + { + "source": "read", + "targets": [ + { "term": "lé", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "The acute accent on the stressed vowel is mandatory. Pairs idiomatically with `skrebi`: \"Fásil di lé i skrebi\" (\"easy to read and write\"). Do not write the Portuguese infinitive `ler`." + }, + { + "source": "open", + "targets": [ + { "term": "abri", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "Standard verb in both general and UI senses (\"abri un dokumentu\" = \"open a document\"). Final `-i`, not Portuguese `-ir`." + }, + { + "source": "save", + "targets": [ + { "term": "guarda", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "Used for \"save\" in the software/UI sense. Peace Corps lists the core meaning as \"protect/keep\" — naturally extended to the file-save context. The alternative `salva` exists but reads more Portuguese. Community review encouraged." + }, + { + "source": "close", + "targets": [ + { "term": "fitxa", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "ALUPEC digraph `tx` (not `ch`). Peace Corps lists the primary sense as \"lock\"; the document-close sense is a natural extension. Example: \"Fitxa kel dokumentu\". Community review encouraged." + }, + { + "source": "translate", + "targets": [ + { "term": "traduzi", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "Kriolu drops the Portuguese infinitive ending: PT *traduzir* → Kr *traduzi*. Follows the same `-i` verb pattern as `skrebi`, `abri`, `parti`. Not directly attested in Peace Corps — bootstrap term, pending community review." + }, + { + "source": "translation", + "targets": [ + { "term": "tradusan", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Bootstrap calque from PT *tradução* with ALUPEC mappings (`ç` → `s`, `ão` → `an`). Not directly attested — pending community review. Alternative forms `tradusu` and `tradusion` exist in informal usage." + }, + { + "source": "document", + "targets": [ + { "term": "dokumentu", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Standard Portuguese cognate with ALUPEC mapping (`c` → `k`, final `-o` → `-u`). Used in the computing/UI sense for any text artifact (e.g. a Skrebe `.papia.json` bundle)." + }, + { + "source": "word", + "targets": [ + { "term": "palávra", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Acute on the stressed vowel; directly attested in the Peace Corps wordlist. Used for linguistic units in editor UI (e.g. word count)." + }, + { + "source": "sentence", + "targets": [ + { "term": "frazi", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Directly attested. Used by Skrebe's sentence-segmentation pipeline when surfaced in UI." + }, + { + "source": "project", + "targets": [ + { "term": "projektu", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Directly attested. ALUPEC uses `k` (not Portuguese `c` or `-ct-`). Used for a Skrebe translation project or workspace." + }, + { + "source": "help", + "targets": [ + { "term": "djuda", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "ALUPEC digraph `dj-` (not Portuguese `j-`). Attested in the project eval baseline (\"Obrigadu pa djuda-m oji\" = \"thanks for helping me today\"). Works as both verb (\"to help\") and noun (\"help\"). Do NOT use the Portuguese-leaning `ajuda`." + }, + { + "source": "you", + "targets": [ + { "term": "bo", "preferred": true, "register": "neutral" }, + { "term": "nhu", "register": "formal" }, + { "term": "nha", "register": "formal" } + ], + "policy": "should", + "partOfSpeech": "pronoun", + "notes": "`bo` is the default 2nd-person singular. `nhu` (addressing a man) and `nha` (addressing a woman) are the respectful forms used with elders or in formal address. Avoid Portuguese `você` (Brazilian PT influence)." + }, + { + "source": "because", + "targets": [ + { "term": "porque" }, + { "term": "porkê" } + ], + "policy": "avoid", + "partOfSpeech": "conjunction", + "notes": "Both forms are Portuguese interference. Use Kriolu `pamodi` or `pabia` instead. Enforced by linter rule ALUPEC_CALQUE_PORQUE. Example: \"N ka kre ba pamodi sa ta txobe\" (\"I don't want to go because it's raining\")." + }, + { + "source": "not", + "targets": [ + { "term": "não" }, + { "term": "nao" } + ], + "policy": "avoid", + "partOfSpeech": "adverb", + "notes": "Both forms are Portuguese (the tilde in `não` is ALUPEC-forbidden anyway). Kriolu negation is `ka`, placed before the verb (\"N ka kre ba\" = \"I don't want to go\"). Enforced by linter rule ALUPEC_CALQUE_NAO." + }, + { + "source": "more", + "targets": [ + { "term": "más" } + ], + "policy": "avoid", + "partOfSpeech": "adverb", + "notes": "The accented `más` is Portuguese interference. Kriolu \"more\" is `mas` (unaccented): \"mas grandi ki kel\" = \"bigger than that\". Beware: this same `mas` is correct for \"more\" but NEVER for \"but\" — for \"but\" use `ma` (see the \"but\" entry)." + } + ] +} diff --git a/presets/skrebe-translator-workflow/manifest.json b/presets/skrebe-translator-workflow/manifest.json new file mode 100644 index 0000000..c5f1199 --- /dev/null +++ b/presets/skrebe-translator-workflow/manifest.json @@ -0,0 +1,32 @@ +{ + "schemaVersion": 1, + "id": "skrebe-translator-workflow", + "name": "Skrebe Translator Workflow", + "description": "Core vocabulary a Skrebe user encounters while translating English into Kriolu: editor verbs (open, save, read, write), workflow nouns (document, word, sentence, project), the conjunctions that trip up Portuguese speakers (and, but, because, not, more), and second-person register distinctions. The catalog's seed preset.", + "domain": "tech", + "version": "0.1.0", + "license": "MIT", + "entryCount": 20, + "dialects": ["santiago"], + "sourceLanguage": "en", + "targetLanguage": "kea", + "authors": [ + { + "name": "Papia Studio", + "github": "@deznode", + "url": "https://papia.studio" + } + ], + "maintainers": ["@deznode"], + "sources": [ + "docs/glossary.md (deznode/papia-studio) — project-normative terminology for ALUPEC, Kriolu, dialect names, and ASR/TM concepts.", + "ADR-0013 (deznode/papia-studio) — canonical four-way 'and' conjunction design (ku / y / i / never-e).", + "Resolução n.º 48/2005 and Decreto-Lei n.º 67/98 — Cape Verde government ALUPEC orthography specifications.", + "Peace Corps Kriolu Dictionary — https://files.peacecorps.gov/multimedia/pdf/library/CV_Kriolu.pdf (general lexicon attestation).", + "Omniglot Cape Verdean Creole — https://www.omniglot.com/writing/caboverdean.htm (ALUPEC quick reference).", + "Gemini 2.5 Flash translation eval baseline (deznode/papia-studio, arkhe/eval/gemini-2.5-flash-baseline.json) — community-reviewed gold translations used for regression scoring." + ], + "createdAt": "2026-05-19", + "updatedAt": "2026-05-19", + "tags": ["seed", "translator-workflow", "computing", "conjunctions"] +} From f007c40bcb25aa0377af67c32f3067b20f92fa93 Mon Sep 17 00:00:00 2001 From: Joaquim Costa Date: Wed, 20 May 2026 09:57:16 -0400 Subject: [PATCH 2/2] docs: document local smoke-test workflow and --base-url TODO Captures the manual workflow used to smoke-test the catalog's seed preset against a local Skrebe dev server (http-server + hand-rewritten tmp-local-index.json), and files a TODO to replace it with a --base-url flag on build-index. Also adds tmp-local-index.json to .gitignore now that the workaround has a documented home. --- .gitignore | 1 + README.md | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/.gitignore b/.gitignore index a426688..13e6298 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ dist/ # Use pnpm only — npm/yarn lockfiles are accidental package-lock.json yarn.lock +tmp-local-index.json diff --git a/README.md b/README.md index b0c47e8..43c826c 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,30 @@ scripts/ ← validate, build-index, new-preset index.json ← auto-generated; do not edit by hand ``` +## Local smoke testing against Skrebe + +`scripts/build-index.ts` hardcodes the per-preset `manifestUrl` and `glossaryUrl` +in `index.json` to `https://raw.githubusercontent.com/deznode/papia-presets/main/...`. +That means pointing Skrebe at a locally-served `index.json` still sends it to +GitHub for the manifest and glossary — which defeats the point of testing +unmerged changes. + +Current workaround: + +1. `npx http-server . -p 8765 --cors -c-1 -s` +2. Copy `index.json` to `tmp-local-index.json` and hand-rewrite the GitHub raw + URLs to `http://localhost:8765/...`. (`tmp-local-index.json` is gitignored.) +3. In Skrebe → Settings → Advanced, set the custom catalog URL to + `http://localhost:8765/tmp-local-index.json`. + +### TODO: `--base-url` flag for `build-index` + +Replace the manual `tmp-local-index.json` step with +`pnpm build-index --base-url http://localhost:8765`, which writes the same +`index.json` but with every URL rooted at the given base. Five-line change in +`scripts/build-index.ts:22`. Worth doing the next time someone smoke-tests +the install flow or a second preset author needs a local dev loop. + ## License All presets and documentation in this repository are licensed under the [MIT License](./LICENSE). You're free to use, modify, and redistribute the content — including in commercial and closed-source products — with attribution as the MIT license requires.