Skip to content

submit_translation recreates a resource name the target repository renamed, and the phrases never reach an intent #696

Open

Description

@openvoiceos-bot

🤖 Auto-generated by Claude Opus 5 (claude-opus-5) via Claude Code — NOT human-reviewed. Verify before acting. Every path, date and lint line below was read from the target repository and from the run's own job logs.

Observed

A submission carries the resource path that existed when the translator made it. The app commits that path as given, however old the submission is. When the target repository renames the resource in between, the app creates the old name again as a new file beside the live one.

OpenVoiceOS/ovos-skill-hello-world shows it. Submissions #497 and #498 were made on 2026-09-05 against intents/Greetings.intent and intents/ThankYouIntent.intent. fix: locale resource names per OVOS-INTENT-2 (#140) renamed those resources to greetings.intent and thank_you_intent.intent on 2026-09-18. A re-run of the two submissions on 2026-10-01 wrote the pre-rename names as new files, and both landed on dev:

submission path it wrote path that was already there
#497 locale/oc-FR/intents/Greetings.intent locale/oc-FR/intents/greetings.intent
#498 locale/oc-FR/intents/ThankYouIntent.intent locale/oc-FR/intents/thank_you_intent.intent

Two things follow, and both are user-facing:

  • ovos_skill_hello_world/__init__.py registers greetings.intent and thank_you_intent.intent through @intent_handler. Nothing registers the two names the app wrote, so the translator's phrases never reach an intent. The work reads as delivered and does nothing.
  • OVOS-INTENT-2 §2 requires a resource base name of lowercase ASCII letters, digits and underscores. ovos-spec-lint on the locale tree of dev returns 2 error(s), 2 warning(s), naming both files, so skill_check / spec_lint is red for every later pull request to that repository.

Five of the 63 open submissions carry a base name that OVOS-INTENT-2 §2 rejects: #489, #490, #497, #498 and #504. Two of the five are pre-rename names in a repository that has been renamed (#489 and #490, Laugh.voc and Stop.voc on ovos-skill-laugh, whose en-US vocabulary is laugh.voc and stop.voc). #504 matches the names its own target repository still uses.

Expected

The app refuses a submission whose path does not exist in the target branch, and says so on the thread. A translation is an edit of a resource that is there; a submission that creates a resource the skill never registers cannot be what the translator meant.

ovos-spec-lint, from ovos-spec-tools, is the other gate. Run on the submitted file before the commit, it stops every base name that OVOS-INTENT-2 §2 rejects, whether the repository renamed anything or not. ovos-spec-tools is not a dependency of this package today.

Either check alone stops all four of the cases above.

A .json resource is already safe by accident: the render step passes --existing-file "$FILE_PATH", so a path that is not in the branch fails there. Only .voc, .dialog and .intent reach the plain cp.

Reproduce

  1. Read the TRANSLATION_META block of OpenVoiceOS/ovos-localize#497. file_path is ovos_skill_hello_world/locale/oc-FR/intents/Greetings.intent and the issue was opened 2026-09-05.
  2. List ovos_skill_hello_world/locale/oc-FR/intents on dev of OpenVoiceOS/ovos-skill-hello-world before 2026-10-01. The file is greetings.intent; Greetings.intent is not there.
  3. Read OpenVoiceOS/ovos-skill-hello-world#140, merged 2026-09-18, which renamed it.
  4. Dispatch submit_translation.yml with issues=ALL, run 36878698113. The job for [translate] oc-FR: OpenVoiceOS/ovos-skill-hello-world — Greetings.intent #497 is green and opens a pull request that adds Greetings.intent as a new file.
  5. Run ovos-spec-lint ovos_skill_hello_world/locale on dev of that repository. It returns 2 errors, one for each file the two submissions added.

Where

.github/workflows/submit_translation.yml, the create-pr job. Check file_path against lang compares the language directory in the path with the language of the submission and nothing else. Create branch and commit then writes the path with mkdir -p, so a path that is not in the branch becomes a new file rather than an error. A check belongs between Checkout target repo and the commit, where the branch is on disk and the path can be tested.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions