Management Hub sitemap

Every page and action of the Trung tâm điều hành: what goes in, what it reads, what it writes, and where the result goes next. Click any name to jump to it. Italic teal items are background Jobs or external inputs the hub hands off to.

13 areas50 pages 108 action groups15 Jobs & inputs Mapped from code 2026-09-26

Main flows

Stream A: event to post
Stream B: plan to post
Survey to student
Student record
Reports & alerts
Donors & finance

Hub page Job / external Phase A holds throughout: nothing reaches Facebook without a human approve and a human post.

Pages by area

Login & shell Đăng nhập

/login, /logout · right: none (public) / any signed-in user

One login for every area. A fail-closed session middleware gates every path below, including the mounted sub-apps (/care, /review, /finance). The sidebar only shows the areas the user's role grants (RBAC rights).

Đăng nhập (login)

GET /login
Input
username, password, remember-me
Reads
hub_users + roles (Postgres, care_auth)
Output
Signed session cookie; redirect to Tổng quan
2 actions
RouteInputResult
POST /loginusername, passwordSession cookie set
GET /logout-Cookie cleared, back to /login

Đặt mật khẩu (set password)

GET /dat-mat-khau/{token}
Input
Signed invite token from the email link; new password twice
Reads
Token (HMAC, expiring)
Output
User password set (hub_users)

Public, token-authed. Reached from the invite email sent by Quản trị > Tài khoản.

1 action
RouteInputResult
POST /dat-mat-khau/{token}password, password2Password stored

Không có quyền (no permission)

GET /khong-co-quyen
Input
-
Reads
-
Output
Notice page when a user opens an area their role does not grant
Fed by
  • entry point
Flows to
  • end of flow

Health probes

GET /livez, GET /readyz
Input
-
Reads
readyz: each configured data mount (hub_reads.readiness)
Output
JSON ok / not-ready (Cloud Run probes)
Fed by
  • entry point
Flows to
  • end of flow

Tổng quan Overview

/ · right: any signed-in user; each tile only if the user holds that area's right

Landing page. Action-strip counts stitched in Python from independent reads (never a cross-database join), cached briefly.

Hoạt động Activities (Stream A intake)

/trips, /presence · right: trips.view

Where an event/activity is registered and turned into a post. Creating an activity makes the Drive intake folder + brief.yaml (same path as the Google brief Form). Photos then flow through ingest-watch and the pipeline Job into the review queue.

Sổ hoạt động (activity ledger)

GET /trips
Input
-
Reads
Dashboard Sheet rows + media registry (hub_reads.trip_ledger); the user's own unsent drafts (registry.activity_draft)
Output
Every activity with its state (cho-upload / dang-xu-ly / cho-duyet / ...) and unsent drafts
1 action
RouteInputResult
POST /trips/deleteselected slugs (debug mode)Bulk hard delete: Drive folder trashed, Dashboard row + registry event removed

Thêm hoạt động (new activity)

GET /trips/new
Input
Brief fields (date, name, place, programme, activity type, participants from care.person, direction), optional photos/videos
Reads
Own draft (registry.activity_draft); care.person search for participants
Output
Drive 1_Hoat-dong-truyen-thong/vao/<YYYY-MM-DD>__<slug>/{photos,videos}/ + brief.yaml; Dashboard row (state cho-upload); uploads routed by MIME into photos/ or videos/; draft deleted
4 actions
RouteInputResult
POST /trips/draftwhole form (autosave every few seconds)Upsert registry.activity_draft
POST /trips/draft/{draft_id}/delete-Draft discarded
GET /trips/participants/searchqJSON list of care.person matches
POST /trips/newbrief fields + photosEvent folder + brief.yaml + Dashboard row

Chi tiết hoạt động (activity detail)

GET /trips/{event_slug}
Input
event_slug
Reads
brief.yaml (hub_reads.brief_view); Drive photos/ listing + cached thumbs; comment thread
Output
Brief panel, photo set, 'Yêu cầu viết bài' (request story) button, góp ý thread
4 actions
RouteInputResult
POST /trips/{slug}/request-storydirection note, chosen photos, cover photoIf bundle exists: triggers the pipeline Job (cull, retouch, caption, QC). If not: kicks ingest-watch first and asks to retry
POST /trips/{slug}/commentcomment bodyRow in Postgres comments
GET /trips/{slug}/media/thumbfile_idCached thumbnail (GCS thumb cache)
POST /trips/{slug}/delete- (debug mode)Hard delete one activity

Hiện diện mạng xã hội (social presence)

GET /presence
Input
-
Reads
registry.post rows (hub_reads.presence_summary)
Output
Published-post counts and cadence; zeros until posts exist (no invented numbers)
Flows to
  • end of flow

Khảo sát Candidate survey & selection

/survey · right: survey.view (+ edit rights for writes)

Pre-admission. A candidate family is registered, surveyed (form + field photos), reviewed at the selection meeting, then admitted (mints a student_code, hands over to Quản lý học sinh) or rejected (row kept for audit). Never feeds the media pipeline.

Danh sách ứng viên (candidate list)

GET /survey
Input
-
Reads
Postgres survey.candidate (hub_reads.survey_candidates)
Output
Candidates by state: cho-xet-chon / da-chon / tu-choi
2 actions
RouteInputResult
GET /survey/exportschool, batchNative Google Sheet of cases awaiting the họp xét meeting
POST /survey/bulk-deleteselected case_ids (debug mode)Hard delete

Thêm ứng viên (new candidate)

GET /survey/new
Input
Phiếu khảo sát fields: child name, DOB (dd/mm/yyyy), school, carer, family members, circumstances, ghi chú
Reads
Existing cases (duplicate check)
Output
Case id ung-vien-NNNN; Drive 2_Hoc-sinh/Khao-sat/<date>__ung-vien-NNNN/anh/ + phieu-khao-sat.yaml; survey.candidate row (cho-xet-chon); care.person for the child + matched-or-created carer relation
1 action
RouteInputResult
POST /survey/newformCandidate created (same path as the survey-folder Service)

Nhập danh sách (bulk import)

GET /survey/import
Input
Excel/CSV, one row per child (template downloadable)
Reads
Existing cases
Output
One candidate per row via the same create_survey_folder path
2 actions
RouteInputResult
GET /survey/import/template-Blank .xlsx template
POST /survey/importfileCandidates created; per-row result table

Hồ sơ ứng viên (candidate detail)

GET /survey/{case_id}
Input
case_id
Reads
Postgres survey.candidate + edit log; Drive Khao-sat/<case>/anh/ media; care.person family context + match suggestions; comments
Output
Full phiếu, photos, 'family already surveyed' banner, decision buttons
9 actions
RouteInputResult
POST /survey/{case}/admitprogramme, admitted_byMints student_code (HSYYYYNNNN), seeds care.child + Ho-so/<code>.md, reuses the same care.person, copies the góp ý thread as a note; best-effort Drive step moves the Khảo sát folder into the student folder, catalogues the survey, builds the sổ tay
POST /survey/{case}/rejectby, reasonstate tu-choi; row + folder kept (audit)
POST /survey/{case}/link-personperson_id, relation, by_personcare.person_relation row (human-confirmed match)
POST /survey/{case}/batchbatch numberImport batch reassigned
POST /survey/{case}/portraitfile_idcare.person.portrait_file_id
POST /survey/{case}/portrait/clear-Portrait cleared
POST /survey/{case}/commentbodyComment row
GET /survey/{case}/media/thumb, /mediafile_idThumbnail / full proxy from Drive
GET /survey/{case}/delete-preview, POST /delete- (debug mode)Preview then hard delete incl. admission footprint

Chụp ảnh thực địa (field capture, phone PWA)

GET /survey/{case_id}/capture
Input
Photos/videos from the phone camera, optional description
Reads
Candidate summary
Output
Files PUT straight from the browser to the private GCS relay bucket; on finalize the survey-media-commit Job converts and files them
7 actions
RouteInputResult
POST /survey/{case}/capture/gcs-sessionfile name, size, typeResumable upload URL
POST /survey/{case}/capture/gcs-statusobject nameUpload-complete check
POST /survey/{case}/capture/finalizebatch file listTriggers survey-media-commit Job
POST /survey/{case}/capturedescription onlyActivity log entry
POST /survey/{case}/media/descriptionfile_id, descriptionDrive file description
POST /survey/{case}/media/deletefile_idDrive file trashed
GET /survey/manifest.webmanifest-PWA manifest (installable)

Quản lý học sinh Beneficiary care (mounted at /care)

/care · right: care.view (+ care edit rights for writes)

The enrolled-student record. Every fact is written to the care store with a source_ref; human-readable copies live in the student's Drive folder 2_Hoc-sinh/Ho-so/<mã> - <Tên>/. Reports render off-request in the care-report-render Job.

Danh sách học sinh (roster)

GET /care/
Input
q, school, status, programme, grade, group, page
Reads
Postgres care.* (child, enrolment, school, programme); needs-review count
Output
Filtered roster, grouped; sidebar sub-links per programme
2 actions
RouteInputResult
GET /care/roster.csvsame filtersUTF-8 CSV export
GET /care/roster/si-so.xlsxsame filtersSchool x class headcount .xlsx

Chuyển trạng thái hàng loạt (bulk transition)

POST /care/children/bulk-transition/preview
Input
Selected student codes + action (graduate / transfer / pause / withdraw / new class) and its fields
Reads
Current child rows
Output
Preview of who changes and who is skipped; apply writes all in one transaction: child update, ghi_danh enrolment, one dated profile_entry per student
1 action
RouteInputResult
POST /care/children/bulk-transition/applysame formAll-or-nothing commit

Hồ sơ học sinh (student dossier)

GET /care/children/{student_code}
Input
student_code
Reads
Postgres care.*: child, enrolment milestones, benefits, profile_entry journal, school_report transcript, source_doc; care.person family + match suggestions; registry Hành trình posts featuring the student; survey photos
Output
Dossier, newest-first history lists (latest 3 open), action forms
12 actions
RouteInputResult
POST /care/children/{code}/entriestitle, source, by_person, petal, bodyBlock-3 note appended to Ho-so/<code>.md + profile_entry row
POST /care/benefitscode, date, programme, category, petal, description, amount / in-kind, signed_by, delivered_by, funding_sourcebenefit row + So-phuc-loi ledger entry
POST /care/children/{code}/transitionaction + graduation/exit/class/school fieldschild status + enrolment + dated note
POST /care/children/{code}/correct-date, /entered-on, /entries/{id}/datenew date, byDate corrected with edit history
POST /care/children/{code}/link-personperson_id, relationcare.person_relation
POST /care/children/{code}/portrait (/clear)media refchild.portrait_ref
POST /care/children/{code}/so-tay-Background: rebuild the sổ tay Google Doc
GET /care/children/{code}/ho-so-Redirect to the student's Drive folder
POST /care/children/{code}/reportaudience, guidancereport_index row (dang-tao) + care-report-render Job
POST /care/children/{code}/student-docdoc kind, file, school year, occasion, score, noteFile saved, source_doc row, essay_score and/or profile_entry
GET /care/children/{code}/media/{doc_id}, /journey-media/{slug}/{name}-Streams a source_doc original / a published rendition
GET /debug-tools/purge-student/{code} (+POST)echo code, include benefits (debug)Preview, then hard delete of a mistaken enrolment (refused if money is linked)

Nhập học bạ / sổ điểm (single school document)

GET /care/children/{student_code}/school-doc
Input
doc_type (hoc-ba, so-diem, chuyen-can, hop-phu-huynh, ...) + PDF
Reads
PDF, Opus extraction engine
Output
Review form pre-filled with the extraction; on commit: school_report row + Block-3 note (confirmed_by = the coordinator)
3 actions
RouteInputResult
POST .../school-doc/extractdoc_type, pdfPDF saved to intake, extraction shown
GET .../school-doc/pdfrelServes the uploaded PDF beside the form
POST .../school-doc/commitedited fields (term, GPA, rank, conduct, attendance, comment...)school_report + profile_entry

Nhập bảng điểm hàng loạt (bulk score cards)

GET /care/score-cards
Input
School + doc_type + many PDFs
Reads
School roster for name matching
Output
Batch with each PDF name-matched; background extraction; per-item review then commit to the chosen student
Fed by
  • entry point
4 actions
RouteInputResult
POST /care/score-cardsschool_slug, doc_type, pdfsBatch created, extraction queued
GET /care/score-cards/{batch}-Queue with progress
GET /care/score-cards/{batch}/item/{item} (+/pdf)-Review one item
POST /care/score-cards/{batch}/item/{item}/commitstudent_code + fieldsschool_report + profile_entry

Tải ảnh/video học sinh (student media upload)

GET /care/children/{student_code}/upload-media
Input
Photos/videos
Reads
Child row
Output
Browser PUTs to the GCS relay; finalize triggers survey-media-commit with the student code: WebP re-encode (EXIF/GPS strip), named <code>__anh__<năm-học>__<NNN>, filed in Ho-so/.../Tai-lieu-goc/, catalogued as source_doc
2 actions
RouteInputResult
POST .../upload-media/gcs-session, /gcs-status, /finalizefile metadata / batchResumable URL, completion check, Job trigger
GET /care/children/{code}/tai-lieu-goc-Tài liệu gốc panel: Drive folder listing merged with the catalogue

Báo cáo tiến bộ hằng năm (annual sponsor report)

GET /care/children/{student_code}/annual-report
Input
nam_hoc; builder fields; photo picks or uploads; action save / AI draft / render
Reads
Child record digest for the year, petal counts, media
Output
annual_report_store config; AI draft (Opus); render queued as report_index kind=annual (HTML + PDF)
2 actions
RouteInputResult
POST .../annual-reportdo = save | draft | render ...Config saved / draft / report queued
GET /care/reports/annual/{report_id}-Print-ready HTML view

Phân tích (analytics)

GET /care/analytics
Input
-
Reads
Postgres care.* (GPA, petals, benefits by school/year) + finance ledger read-only (received by year)
Output
Programme-wide charts and tables
Fed by
  • entry point

Báo cáo (reports)

GET /care/reports
Input
School + năm học / programme + cohort year / năm học
Reads
care.report_index (status list)
Output
Queues a report; list shows dang-tao then a link when da-xong (or loi)
5 actions
RouteInputResult
POST /care/reports/schoolschool_slug, nam_hocQueued per-school report
POST /care/reports/cohortprogramme, cohort_year, nam_hocQueued cohort report
POST /care/reports/yearnam_hocQueued Foundation-wide year report
GET /care/reports/summarykey, scope, nam_hocStudent summary as a public-link Google Sheet
GET /care/reports/filerelDownload .docx / .md

Theo dõi an toàn (safeguarding watchlist)

GET /care/watchlist
Input
-
Reads
Open watchlist items raised by the watchlist Jobs
Output
Items to review; close / escalate with a note
2 actions
RouteInputResult
POST /care/watchlist/{item}/actionaction, note, byItem closed/escalated
POST /care/watchlist/bulk-actionitem ids, action, noteSame, in bulk

Sổ tay học sinh (handbook Google Doc)

(Drive) So-tay · <mã> · <Tên>
Input
Triggered from the dossier or nightly by care-handbook-refresh
Reads
Whole care record for one student
Output
Branded native Google Doc in the student folder (identity, enrolment, transcript, benefits, journal, Tài liệu gốc index, update log)

Tài liệu thay đổi Source-file changes

/source-changes · right: source_changes.view

Queue of Drive source files that changed after being catalogued, raised nightly by care-source-review. An admin approves (re-extract) or rejects each.

Tài liệu thay đổi (changed sources)

GET /source-changes
Input
-
Reads
Pending source_file_review rows
Output
Approve / reject per row, bulk approve for backlog
3 actions
RouteInputResult
POST /source-changes/{id}/approve-Change accepted, re-processed
POST /source-changes/{id}/rejectnoteRejected; stored mtime refreshed
POST /source-changes/bulk-approve-Approve a capped batch

Kế hoạch nội dung Content plan (Stream B)

/plan · right: plan.view

Evergreen/awareness planning. The content-strategist agent proposes ideas; a human promotes idea to planned; only a planned slot can be drafted into a Stream-B bundle.

Kế hoạch nội dung (content plan)

GET /plan
Input
-
Reads
content-plan.yaml (directions, 12-month roadmap, 3-month board) + registry.post coverage flags (petal gaps, 80/20, observances, orphan trips)
Output
Board with read-time flags
Fed by
  • entry point
4 actions
RouteInputResult
POST /plan/add-ideatitle, stream, petal, observance, target week, rationale, byNew idea slot
POST /plan/roadmap/save (/delete)month, theme, petals, noteRoadmap month upserted / removed
POST /plan/{slot}/promotebyidea to planned (human tick)
POST /plan/{slot}/request-draftdirectionStream-B bundle drafted via the pipeline Job, lands in review

Bài đợi duyệt Review queue (mounted at /review)

/review · right: review.view

The Phase-A gate. Approving is the gate-8 dignity confirmation; it writes the caption back, stamps the SAFEGUARDING line, packs the ready-to-post files and archives outputs to Drive. A human posts to Facebook by hand. Nothing auto-publishes.

Bài viết (bundle)

GET /review/bundle/{slug}
Input
slug
Reads
STATUS.md gate findings, copy/facebook.md, renditions
Output
Caption editor + photos + decision form
3 actions
RouteInputResult
POST /review/bundle/{slug}/decisiondecision duyet | sua | tu-choi, edited caption, note, byduyet: caption written back, SAFEGUARDING line, state approved, publish_pack (packed), story_archive. sua: state revising, draft re-runs. tu-choi: moved to _rejected/
GET /review/bundle/{slug}/pack-Zip of the ready-to-post pack
GET /review/bundle/{slug}/media/{channel}/{name}-Rendition file

Tài trợ & tài chính Donors & finance (mounted at /finance)

/finance · right: finance.view

Read views over the finance registry (so-tai-chinh.sqlite on the gcsfuse mount), entity-aware (Hoa Mặt Trời / Thanh Nhân). Data arrives from the donor-input form Service and the finance-mail bank-notification Job, not from these pages.

Hiện vật (in-kind)

GET /finance/inkind
Input
entity
Reads
in-kind table
Output
In-kind gifts list
Fed by
  • entry point
Flows to
  • end of flow

Sao kê (statements)

GET /finance/sao-ke
Input
-
Reads
Statements directory on the mount
Output
Evidence files for preview / download (GET /finance/sao-ke/file)
Fed by
  • entry point
Flows to
  • end of flow

Báo cáo tháng (monthly transparency)

GET /finance/monthly/{YYYY-MM}
Input
month, kind, entity
Reads
Finance registry for the month
Output
Monthly transparency report view
Flows to
  • end of flow

Danh sách (recipient lists)

GET /finance/lists/{list_slug}
Input
list_slug
Reads
Finance registry lists
Output
One list
Fed by
  • entry point
Flows to
  • end of flow

Danh mục Master data

/danh-muc · right: per-section rights (GET /danh-muc redirects to the first section allowed)

Shared reference lists every other area reads: schools, programmes, alert rules, people.

Trường (schools)

GET /danh-muc/truong
Input
display name, partner flag, province, level, notes
Reads
care school table + usage counts (students, survey cases)
Output
School rows used by roster, survey, reports, score cards
1 action
RouteInputResult
POST /danh-muc/truong/them | {slug}/sua | {slug}/xoafieldsAdd / edit / delete (delete refused while referenced)

Chương trình (programmes)

GET /danh-muc/chuong-trinh
Input
display name, code, active, requires partner school, notes
Reads
care programme table
Output
Programme rows used by admission, benefits, reports, sidebar filters
1 action
RouteInputResult
POST /danh-muc/chuong-trinh/them | {slug}/sua | {slug}/xoafieldsAdd / edit / delete (refused while referenced)

Cảnh báo (alert rules)

GET /danh-muc/canh-bao
Input
Thresholds + per-signal toggles
Reads
care.alert_config
Output
Rules read by the watchlist Jobs and the per-school report
2 actions
RouteInputResult
POST /danh-muc/canh-bao/luuformConfig saved
POST /danh-muc/canh-bao/chay-lai-Triggers care-watchlist-monthly now

Người (people master)

GET /danh-muc/nguoi
Input
q; add form: full name, DOB, address, contact, note
Reads
care.person + relations; match suggestions
Output
Two-step add (check for matches, then confirm); person detail with gallery (survey + student + direct photos), portrait, relations
6 actions
RouteInputResult
POST /danh-muc/nguoi/kiem-traperson fieldsMatch suggestions shown
POST /danh-muc/nguoi/themperson fieldscare.person created
POST /danh-muc/nguoi/{id}/sua | /xoafieldsEdit / delete (refused if linked)
POST /danh-muc/nguoi/{id}/anh/tai-lenphotosWebP to Drive 6_Nguoi/NG<id>__<slug>/ + care.person_photo
POST /danh-muc/nguoi/{id}/anh/{photo}/xoa-Photo trashed
POST /danh-muc/nguoi/{id}/chan-dung (/xoa)file_idPortrait set / cleared

Nhà tài trợ (placeholder)

GET /danh-muc/nha-tai-tro
Input
-
Reads
-
Output
Points to /finance/donors (donor master still lives in the finance registry)
Fed by
  • entry point

Quản trị Administration

/quan-tri, /debug-tools · right: admin rights per tab

Accounts and roles, legal/governance records, admin tools, the schema catalogue, and the debug-only maintenance tools.

Tài khoản (user accounts)

GET /quan-tri/nguoi-dung
Input
username, display name, email, role, modules, invite or password
Reads
hub_users, roles, audit
Output
Account created; invite email with a set-password link
6 actions
RouteInputResult
POST /quan-tri/nguoi-dung/themaccount fieldsUser + optional invite email
POST .../{user}/moi-Re-send invite
POST .../{user}/trang-thai | /quyen | /mat-khau | /thong-tin | /vai-trofieldActive flag, modules, password, info, role (all audited)
POST .../{user}/quyen-rieng (/xoa)right_code, allow/deny, reasonPer-user override
POST .../{user}/xoa-Delete (blocked if referenced)
GET /quan-tri/nguoi-dung/{user}-Effective rights + audit trail

Vai trò & quyền (roles & rights)

GET /quan-tri/vai-tro
Input
role key, label, right codes
Reads
roles + role_rights
Output
Which sidebar areas and actions each role can use
Fed by
  • entry point
1 action
RouteInputResult
POST /quan-tri/vai-tro/them | {role}/quyen | /doi-ten | /xoafieldsRole added / rights set / renamed / deleted

Công cụ (admin tools)

GET /quan-tri/cong-cu
Input
-
Reads
tools/INDEX.md; survey-sanitise sweep state
Output
Tool index; buttons for on-demand Jobs
Fed by
  • entry point
3 actions
RouteInputResult
POST /quan-tri/cong-cu/sanitise-sweep-Triggers care-survey-media-sanitise Job
GET /quan-tri/cong-cu/anh-khong-hien-thi-Survey photos a browser cannot render
POST .../anh-khong-hien-thi/convertselected itemsConverted to WebP in place

Cơ sở dữ liệu (schema catalogue)

GET /quan-tri/csdl
Input
-
Reads
Live Postgres schema + column descriptions
Output
Every schema / table / column with type and meaning
Fed by
  • entry point
Flows to
  • end of flow

Debug tools (debug mode only)

/debug-tools/*
Input
Session toggle GET /debug-tools/on | /off
Reads
Varies
Output
Orphaned-comment purge; people backfill (dry run then apply, triage file); university-enrolment split; family-relations backfill (Opus draft, per-case review, apply via care-family-relations-backfill Job); student purge

Trợ giúp Help & document templates

/tro-giup · right: any signed-in user (edit: admin)

Curated links to help pages and branded document templates, grouped by section.

Trợ giúp (help)

GET /tro-giup
Input
section, title, description, URL, group
Reads
Help items (registry DB)
Output
Grouped link list with view / make-a-copy URLs
Fed by
  • entry point
Flows to
  • end of flow
1 action
RouteInputResult
POST /tro-giup/them | {id}/sua | {id}/xoafieldsItem CRUD

Ops API /v1 JSON (session cookie or X-API-Key)

/v1 · right: service key or signed-in session

Machine interface over the same core functions the pages use. The decision endpoint is the same Phase-A gate; nothing here publishes.

Endpoints

/v1/*
Input
JSON bodies
Reads
Same stores as the matching page
Output
JSON
6 actions
RouteInputResult
POST /v1/survey, /v1/survey/{case}/admit, /rejectcandidate / decisionAs Khảo sát
POST /v1/students/{code}/entries; POST|DELETE /v1/students/{code}/photonote / refAs the dossier
POST /v1/reports/child/{code}, /school, /cohort; GET /v1/reports/{id}scopeQueue + poll a report
GET /v1/content/bundles (/{slug}); POST .../decision, .../posted-iddecision / posted idAs Bài đợi duyệt; posted-id marks published + archives the as-posted Doc
POST /v1/pipeline/events/{slug}/draftphotos, directionTriggers the pipeline Job (202)
GET /v1/system/status-Config presence + Postgres probe

Jobs & external inputs

Cloud Run Jobs, Services and forms that feed the hub or run work it requests.

pipeline (Job)

Cloud Run Job
Trigger
Yêu cầu viết bài, plan request-draft, or /v1/pipeline
Input
Bundle source photos + brief.yaml (Stream A) or a planned slot (Stream B)
Output
EXIF/GPS strip, cull, retouch + brand chrome, STATUS.md + publish.yaml, Opus caption, QC gates. Clean: awaiting-approval (cho-duyet); blocking: in-review. Dashboard row synced

Survey form + survey-folder (Service)

External input
Trigger
Survey form submitted
Input
Phiếu khảo sát answers
Output
Same candidate + Khảo sát folder as Thêm ứng viên

care-survey-media-sanitise (Job)

Cloud Run Job
Trigger
Công cụ button
Input
Survey media already on Drive
Output
Sweep that strips any surviving metadata
Flows to
  • end of flow

care-intake-convert (hourly) + care-mail (email lane)

Scheduled Job
Trigger
Hourly; care-mail daily 04:00 plus Gmail push via mail-hook
Input
Raw drops in Tai-lieu-vao/<week>/ (prose, school PDFs, email attachments)
Output
profile_entry / school_report rows (confirmed_by = auto); unclear items to _needs-review

care-family-relations-backfill (Job)

Cloud Run Job
Trigger
Debug tools > family relations
Input
Free-text family members on candidates
Output
draft: staged review rows; apply: care.person + relations

donor-input (Service) + finance-mail (Job)

External input
Trigger
Donor form submit; bank notification emails
Input
Donor details; bank credit emails
Output
donor / contribution rows in the finance registry; evidence to Drive