Di akhir panduan ini, Codex CLI akan mengerjakan record channel "Bugs" di salah satu project osFoundry Anda satu per satu. Codex membaca schema channel, menelusuri halaman demi halaman item yang masih berstatus New, membuka setiap item, lalu mengisi Status, Owner, dan Severity. Perubahannya muncul di tab Data channel seperti editan rekan tim lainnya, dan setiap panggilan tercatat di Recent activity (aktivitas terbaru) milik koneksi tersebut. Kalau sebuah nilai tidak cocok dengan field-nya, osFoundry menolak editan itu, dan Codex membiarkan field tersebut untuk diisi manusia alih-alih menebak.
Siapa mengerjakan apa
| Sisi Codex | Sisi osFoundry | |
|---|---|---|
| Login | Login Codex Anda, tidak berubah. Codex menyimpan token OAuth osFoundry | Satu koneksi yang disetujui untuk satu workspace |
| Channel mana | Codex menemukannya dengan list_project_resources
|
Hanya record channel di project yang sudah ditambahkan ke koneksi |
| Aturan field | Codex membacanya dari schema yang dikembalikan list_record_items
|
Tab Schema milik channel: tipe field, Required, opsi select |
| Penulisan |
edit_record_item, setelah prompt persetujuan Codex sendiri |
Nilai divalidasi terhadap field. Tipe yang salah atau opsi yang tidak dikenal ditolak |
| Konflik | Codex membaca ulang item lalu memutuskan lagi |
expected_version harus cocok dengan versi item saat ini |
| Baris dan field | Codex bisa mengubah nilai di item yang sudah ada | Menambah atau menghapus item dan mengubah schema tetap dilakukan di aplikasi |
Setup
Panduan ini mengasumsikan Codex sudah terhubung: tabel [mcp_servers.osfoundry] sudah ada di ~/.codex/config.toml, dan codex mcp login osfoundry sudah berhasil. Langkah-langkah di sini adalah tambahan yang dibutuhkan untuk record channel.
1. Masukkan record channel ke project yang terhubung
Buka Records di sidebar dan pilih channel-nya. Tracker baru dibuat dari Create Record Channel, Record Type Custom, yang akan meminta nama. Di dalam channel, buka tab Settings. Field Project menampilkan "Add to project" selama channel belum masuk ke project mana pun. Pilih project tempat koneksi Codex berada.
Koneksi menjangkau record channel melalui project-nya. Kalau channel dipindah ke project lain, panggilan Codex berikutnya akan ditolak.
2. Periksa schema yang harus dipatuhi Codex
Tab Schema ("Define the fields for this record channel.") adalah kontraknya. Setiap field punya tipe, flag Required opsional, dan untuk Select serta Multi-Select, daftar opsi. Setiap opsi punya nilai yang disimpan dan label. Grid menampilkan label. Codex harus mengirim nilainya.
Example: the Bugs channel
ticket Text Required
title Text Required
status Select Required new · triaged · in_progress · fixed · wont_fix
owner Select aiko · mika · ren
severity Select s1 · s2 · s3 · s4
points Number min 0, max 13
area Multi-Select billing · auth · api · ui
due Date
age_days Formula computed
Contoh: Tab Schema dari record channel Bugs
Field Formula dihitung dari ekspresinya. Tidak ada yang menulis ke field ini, termasuk Codex.
3. Tambahkan koneksi ke project dan periksa tools-nya
Klik ikon kunci di header dan buka Connected. Pilih koneksi Codex. Di bawah Projects, pilih project lalu klik Add to project (tambahkan ke project). Ini membuka konten project yang sudah tersinkron, termasuk record channel, untuk koneksi ini.
Di bagian bawahnya, buka Tools. Checklist menampilkan nama tool dengan spasi, jadi cari "list record items", "read record item", "edit record item", dan "poll resource events". Semua tool yang didukung aktif secara default. Kalau untuk sementara Codex cukup membaca saja, hapus centang "edit record item" lalu klik Save tools (simpan tools).
Contoh: Koneksi Codex CLI dengan project "Product" yang sudah ditambahkan
4. Batasi tool yang ditawarkan ke Codex
Codex juga memfilter tool dari sisinya. Untuk triage, enam tool sudah cukup:
[mcp_servers.osfoundry]
url = "https://api.osfoundry.io/api/v1/external-mcp"
scopes = ["osfoundry:read", "osfoundry:write"]
default_tools_approval_mode = "writes"
enabled_tools = [
"list_granted_resources",
"list_project_resources",
"list_record_items",
"read_record_item",
"edit_record_item",
"poll_resource_events",
]
list_record_items, read_record_item, dan poll_resource_events ditandai read-only di server, jadi dengan "writes" ketiganya berjalan tanpa prompt. Codex bertanya sebelum setiap edit_record_item. Untuk satu putaran 40 item, berarti ada 40 prompt. Itu juga berarti ada 40 kesempatan untuk menghentikannya.
5. Minta dengan aturan yang ditulis jelas
In osFoundry, open the "Bugs" record channel in the Product project.
Go through every item with status "new", newest first.
For each one: read it, then set status to triaged, pick an owner by area
(billing → aiko, auth → mika, everything else → ren) and a severity.
Use the option values from the schema, not the labels.
If osFoundry rejects a value, don't guess. Leave that field and list the
item at the end.
Contoh run nyata
Codex tidak terpasang di mesin tempat artikel ini ditulis, jadi sesi di bawah adalah contoh simulasi. Nama tool dan argumennya adalah yang tercantum di tools/list dari server live. Codex menampilkan tool MCP ke model sebagai mcp__<server>__<tool>. Channel, item, dan jawabannya adalah konten demo.
Example (simulated)
• mcp__osfoundry__list_project_resources {"project_id": "…", "resource_type": "record_channel",
"search": "Bugs"}
← record channel "Bugs", id 4127
• mcp__osfoundry__list_record_items {"record_channel_id": "4127", "limit": 50}
← schema: 11 fields · 50 item previews · more before item 9811
• mcp__osfoundry__list_record_items {"record_channel_id": "4127", "before_id": "9811", "limit": 50}
← schema · 23 item previews · no more pages
(38 of the 73 items have status "new")
• mcp__osfoundry__read_record_item {"record_channel_id": "4127", "item_id": "9874"}
← BUG-1873 "Invoice PDF shows last month's total", area ["billing"], version "…14.208311Z"
• mcp__osfoundry__edit_record_item {"record_channel_id": "4127", "item_id": "9874",
"values": {"status": "triaged", "owner": "aiko", "severity": "s2"},
"expected_version": "…14.208311Z", "idempotency_key": "triage-9874"}
[Codex asks: allow this tool call? → yes]
← saved
… 36 more items …
• mcp__osfoundry__edit_record_item {… "item_id": "9790",
"values": {"status": "triaged", "owner": "ren", "severity": "s3", "points": 20}, …}
← rejected: points must be between 0 and 13
• mcp__osfoundry__read_record_item {… "item_id": "9790"}
• mcp__osfoundry__edit_record_item {… "values": {"status": "triaged", "owner": "ren", "severity": "s3"}, …}
← saved
• mcp__osfoundry__edit_record_item {… "item_id": "9802", …, "expected_version": "…02.551904Z"}
← rejected: the item changed after that version
• mcp__osfoundry__read_record_item {… "item_id": "9802"}
← status "in_progress", owner "mika" (set by Mika in osFoundry a minute ago)
Triaged 37 of 38 new items. BUG-1791's description says "about 20 points",
but Points only goes to 13, so I left it empty. BUG-1805 was already
in progress with Mika, so I didn't touch it.
Dua penolakan yang bekerja di sini. Field Points di contoh ini dibatasi maksimal 13, jadi editan yang membawa angka 20 ditolak seluruhnya. Codex membuang satu field itu dan menyimpan sisanya. Codex tidak memangkas 20 menjadi 13, karena estimasi yang dipangkas terlihat seperti estimasi sungguhan. Penolakan kedua berasal dari pengecekan versi. Mika sudah mengambil item itu di antara saat Codex membaca dan saat Codex menulis. Codex membacanya ulang, melihat status dan owner yang baru, lalu membiarkannya, alih-alih menimpa pekerjaan Mika dengan rencananya sendiri.
Paging dilakukan dengan before_id. Setiap halaman diakhiri item paling lama di halaman itu, dan halaman berikutnya meminta item sebelum item tersebut. Bug yang dilaporkan selama Codex membaca tidak mendorong item lama ke halaman berikutnya, jadi tidak ada yang terbaca dua kali.
Contoh: Tab Data setelah putaran triage, Status dan Owner sudah terisi
Tab Data menampilkan hasilnya seperti biasanya grid ditampilkan. Status muncul sebagai label opsi, "Triaged", dengan warna opsi kalau ada, bukan sebagai nilai tersimpan triaged. Item yang diubah orang lain tetap menyimpan nilai dari orang tersebut.
Di mana batasnya
Schema adalah batas untuk nilai. Codex hanya bisa mengisi field dengan apa yang diterima field itu, dan field select menerima nilai opsinya. Label "In progress" atau "Aiko Tanaka" ditolak, bukan dikonversi. Konversi berarti harus menebak. "major" bisa berarti S2, dan "Won't fix" dan wont_fix hanya terlihat mirip bagi manusia. Kalau Anda ingin Codex berhenti bertanya soal sebuah field, ubah field-nya di tab Schema. Codex tidak bisa melonggarkannya dari luar.
Codex hanya mengedit nilai, tidak lebih. Lewat MCP tidak ada tool untuk menambah item, menghapus item, atau menambah field. Menutup duplikat dan merombak tracker dilakukan di aplikasi, tempat Versions dan riwayat channel menunjukkan siapa yang melakukannya.
Setiap panggilan dicek saat tiba. Status koneksi, project tempat channel berada saat ini, dan hak akses Anda sendiri dievaluasi per panggilan. Token yang diterbitkan sebelumnya tidak membuat akses tetap terbuka setelah Anda menghapus project atau mengklik Revoke connection (cabut koneksi). Hanya channel yang tersinkron dan di-hosting yang bisa dijangkau. Balasan initialize dari server menyebutkan "Local-only data is unavailable to cloud clients."
osFoundry melihat panggilannya, bukan sesinya. Recent activity mencantumkan nama tool, keputusan akses, dan waktunya. Penalaran Codex dan repository Anda tetap di mesin Anda.
Langkah berikutnya
Jalankan prompt yang sama keesokan paginya, tetapi mulai dengan poll_resource_events pada record channel dari sequence yang dicatat Codex di akhir putaran sebelumnya. Tool ini mengembalikan event channel setelah sequence tersebut, jadi Codex cukup membaca ulang beberapa item yang berubah alih-alih seluruh tracker. Tampilan item di sisi osFoundry, lengkap dengan form view dan riwayatnya, ada di halaman detail Records.



Top comments (0)