Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions docs/information/org-metadata-sync.md
Original file line number Diff line number Diff line change
Expand Up @@ -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"
],
Expand All @@ -32,7 +32,7 @@ Koordynator rozpoznaje pełną tożsamość repozytorium i synchronizuje wyłąc
<!-- docs:section scope -->
## 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.

<!-- docs:section evidence -->
## Dowody
Expand All @@ -42,7 +42,7 @@ Wersja źródłowa jest przypięta w metadanych. [Nieudana synchronizacja imgl](
<!-- docs:section content -->
## 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.

Expand Down Expand Up @@ -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.
1 change: 1 addition & 0 deletions org-sync/managed-repositories.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"scheduled_repositories": [
"autogrammar/code2schema",
"autogrammar/imgl",
"autogrammar/nlp2cmd",
"autogrammar/op3",
"autogrammar/toonic"
]
Expand Down
22 changes: 22 additions & 0 deletions org-sync/tests/test_routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'}})
Expand Down
13 changes: 13 additions & 0 deletions project/ticket-005/README.md
Original file line number Diff line number Diff line change
@@ -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`.
22 changes: 22 additions & 0 deletions project/ticket-005/intent.json
Original file line number Diff line number Diff line change
@@ -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."
}
Loading