diff --git a/docs/information/org-metadata-sync.md b/docs/information/org-metadata-sync.md index 0ef39f2..e406c8b 100644 --- a/docs/information/org-metadata-sync.md +++ b/docs/information/org-metadata-sync.md @@ -3,14 +3,14 @@ "schema": "wellmanifest.docs/document/v1", "id": "org-metadata-sync", "kind": "information", - "version": 2, + "version": 3, "title": "Synchronizacja metadanych przez wspólny koordynator", "status": "implemented", "owner": "semcod/.github", "created": "2026-09-06", - "updated": "2026-09-06", - "review_after": "2026-09-13", - "source_revision": "406fb4b692680b3d69d25ee9570e81869afbd0c5", + "updated": "2026-10-23", + "review_after": "2026-10-30", + "source_revision": "135a1e5faf567678c80d9ad8cfce0dc18646b277", "affected_repositories": [ "semcod/.github" ], @@ -32,7 +32,7 @@ Koordynator rozpoznaje pełną tożsamość repozytorium i synchronizuje wyłąc ## Zakres -Właścicielem mechanizmu jest semcod/.github. Lista zarządzanych zewnętrznych repozytoriów znajduje się w [org-sync/managed-repositories.json](../../org-sync/managed-repositories.json). Początkowo obejmuje autogrammar/code2schema, autogrammar/imgl, autogrammar/op3 i autogrammar/toonic. Lista jest zamknięta; nie oznacza całej organizacji. Inne instalacje koordynatora zachowują zakres własnej organizacji. +Właścicielem mechanizmu jest semcod/.github. Lista zarządzanych zewnętrznych repozytoriów znajduje się w [org-sync/managed-repositories.json](../../org-sync/managed-repositories.json). Obejmuje autogrammar/code2schema, autogrammar/imgl, autogrammar/nlp2cmd, autogrammar/op3 i autogrammar/toonic. Lista jest zamknięta; nie oznacza całej organizacji. Inne instalacje koordynatora zachowują zakres własnej organizacji. ## Dowody @@ -42,7 +42,7 @@ Wersja źródłowa jest przypięta w metadanych. [Nieudana synchronizacja imgl]( ## Działanie i obsługa -Istniejący harmonogram `17 */6 * * *` wykonuje synchronizację Semcod oraz czterech jawnie zarządzanych projektów Autogrammar. Ich opisy i tematy aktualizuje tryb `--metadata-only --skip-profile`; adresy WWW, GitHub Pages i profil organizacji pozostają poza tym trybem. Dla Semcod zachowano dotychczasową synchronizację wraz z profilem i kontrolą widoczności repozytorium przed konfiguracją Pages. +Istniejący harmonogram `17 */6 * * *` wykonuje synchronizację Semcod oraz pięciu jawnie zarządzanych projektów Autogrammar. Ich opisy i tematy aktualizuje tryb `--metadata-only --skip-profile`; adresy WWW, GitHub Pages i profil organizacji pozostają poza tym trybem. Dla Semcod zachowano dotychczasową synchronizację wraz z profilem i kontrolą widoczności repozytorium przed konfiguracją Pages. Repozytoria zarządzane centralnie nie potrzebują lokalnego triggera ani ORG_SYNC_PAT. Sekret istniejącego koordynatora musi mieć rzeczywiste uprawnienia do modyfikacji wskazanych celów. Nie kopiujemy osobistego tokena operatora do repozytoriów członkowskich. @@ -73,3 +73,8 @@ Format dokumentu przyjęto z wellmanifest/docs 0.1.1. Sam ten dokument nie dekla ## Utrzymanie Dodanie projektu wymaga jawnej pozycji w katalogu, konfiguracji organizacji, testu zakresu oraz udanego podglądu, wykonania i odczytu wartości. Przy zmianie zachowania zwiększ wersję tego dokumentu. Rollback: cofnij zmianę koordynatora i przywróć poprzedni trigger dopiero po przygotowaniu jego uwierzytelniania i poprawnego odbiorcy. + +### Historia wersji + +- Wersja 2 (2026-09-06): cztery cele Autogrammar; dowody wykonania dla imgl pozostają powyżej. +- Wersja 3 (2026-10-23): dodano autogrammar/nlp2cmd i test pełnej tożsamości oraz ograniczeń wykonania. [Zgłoszenie #5](https://github.com/semcod/.github/issues/5) śledzi wdrożenie. Weryfikacja zapisu dla nlp2cmd jest osobnym krokiem po scaleniu; wcześniejszy sukces imgl nie jest dowodem uprawnień dla nowego celu. diff --git a/org-sync/managed-repositories.json b/org-sync/managed-repositories.json index 2d50df1..cfb7001 100644 --- a/org-sync/managed-repositories.json +++ b/org-sync/managed-repositories.json @@ -4,6 +4,7 @@ "scheduled_repositories": [ "autogrammar/code2schema", "autogrammar/imgl", + "autogrammar/nlp2cmd", "autogrammar/op3", "autogrammar/toonic" ] diff --git a/org-sync/tests/test_routing.py b/org-sync/tests/test_routing.py index 171985b..28b7dbc 100644 --- a/org-sync/tests/test_routing.py +++ b/org-sync/tests/test_routing.py @@ -18,6 +18,28 @@ def select(self, kind, body, coordinator='semcod/.github'): def test_preserves_foreign_owner_with_same_name(self): self.assertEqual(self.select('repository_dispatch', {'action': 'org-repo-changed', 'client_payload': {'repository': 'autogrammar/imgl'}}), (['autogrammar/imgl'], False)) + def test_nlp2cmd_enrollment_preserves_full_identity(self): + target = 'autogrammar/nlp2cmd' + self.assertIn(target, self.select('schedule', {})[0]) + self.assertNotIn('semcod/nlp2cmd', self.select('schedule', {})[0]) + self.assertEqual(self.select('repository_dispatch', { + 'action': 'org-repo-changed', 'client_payload': {'repository': target} + }), ([target], False)) + for dry_run in (True, False): + with self.subTest(dry_run=dry_run): + self.assertEqual(self.select('workflow_dispatch', { + 'inputs': {'repository': target, 'dry_run': dry_run} + }), ([target], dry_run)) + with patch.object(run_event.subprocess, 'run', return_value=subprocess.CompletedProcess([], 0)) as call: + self.assertEqual(run_event.run_targets([target], dry_run, 'semcod/.github'), 0) + self.assertEqual(call.call_count, 1) + args = call.call_args.args[0] + self.assertEqual(args[args.index('--org') + 1], 'autogrammar') + self.assertEqual(args[args.index('--repository') + 1], 'nlp2cmd') + self.assertIn('--metadata-only', args) + self.assertIn('--skip-profile', args) + self.assertEqual('--dry-run' in args, dry_run) + def test_rejects_unmanaged_foreign_repository(self): with self.assertRaises(ValueError): self.select('repository_dispatch', {'action': 'org-repo-changed', 'client_payload': {'repository': 'other/imgl'}}) diff --git a/project/ticket-005/README.md b/project/ticket-005/README.md new file mode 100644 index 0000000..0c89a9f --- /dev/null +++ b/project/ticket-005/README.md @@ -0,0 +1,13 @@ +# ticket-005 — nlp2cmd central metadata enrollment + +Status: IN_PROGRESS / PUBLICATION + +Allocated by [issue #5](https://github.com/semcod/.github/issues/5). Owner: codex-nlp2cmd-metadata-20261023. Workstream: org-sync. + +SESSION_EXECUTION_AUTHORIZATION: the user requested continuation, dependency repairs, tests and autonomous protected merge through Willman/Subactor. + +Bounded scope: admit only autogrammar/nlp2cmd, prove dispatch/schedule/manual routing and metadata-only foreign execution, update the [canonical operator document](../../docs/information/org-metadata-sync.md). Existing org configuration already covers autogrammar. Preserve homepage, Pages, profile and existing topics. + +Acceptance: coordinator unit suite and exact-head protected review pass; central target-only dry-run/apply and API readback succeed before separately retiring the consumer trigger. Do not copy credentials or broaden the allowlist to the whole organization. + +Validation: 20 coordinator unit tests passed; diff whitespace check passed. Publication uses the deployed exact-head independent Validator profile requiring `test`. diff --git a/project/ticket-005/intent.json b/project/ticket-005/intent.json new file mode 100644 index 0000000..2d19576 --- /dev/null +++ b/project/ticket-005/intent.json @@ -0,0 +1,22 @@ +{ + "ticket": "ticket-005", + "summary": "Enroll autogrammar/nlp2cmd in central metadata synchronization", + "allowedPaths": [ + "org-sync/managed-repositories.json", + "org-sync/tests/test_routing.py", + "docs/information/org-metadata-sync.md", + "project/ticket-005/**" + ], + "forbiddenPaths": [ + ".github/workflows/**", + ".env", + "org-sync/config/**" + ], + "authorization": "SESSION_EXECUTION_AUTHORIZATION", + "issue": "https://github.com/semcod/.github/issues/5", + "status": "IN_PROGRESS", + "phase": "PUBLICATION", + "maxActiveMinutes": 120, + "acceptedBaseSha": "135a1e5faf567678c80d9ad8cfce0dc18646b277", + "outcome": "Publish enrollment through independent Validator; verify target-only dry-run, apply and metadata readback before consumer trigger retirement." +}