// 史料表 —— 《汉书·百官公卿表上》的官制事实,抠成可查询的常量。 // // 定位:与 dynasties.js / talents.js 同级的【纯常量表 + 纯函数】。无 IO、无 DB、无 LLM。 // // 用途:这是「注」的数据源。dynasties.js 的正文是【推演】(性格×制度→位阶), // 本表是【原文】。推演可以错,原文不能错——所以这张表的规矩比别处严。 // // ══════════════════════════════════════════════════════════════════════════ // 【封条已摘】2026-07-16 —— 本表已用 curl 拿生 HTML 逐字目验,两个独立见证比对。 // // 本表 2026-07 之前是【封存】状态,因为它是用 WebFetch 抠的,而 WebFetch 不给逐字原文, // 它把页面交给一个小模型转述——那个模型在本功能历史上被抓到过多次编造。抠它的 agent // 自己在报告里写:「我始终没能拿到逐字原文……仍非逐字目验」。 // // 本轮(2026-07-16)做的事: // 1. curl -sk 拿【生 HTML】,自己剥标签,自己断句。全程没有任何模型转述原文。 // 2. 取【两个独立见证】比对: // 见证 A:漢川草廬 https://www.sidneyluo.net/a/a02/019.htm (正文 + 注混排) // 见证 B:ctext https://ctext.org/han-shu/bai-guan-gong-qing-biao-shang/zh (只有正文) // B 只收正文、不收注,这一点【本身就是一个可用的判别器】:凡在 A 里出现而 B 里没有的 // 句子,就是注不是正文。下面「真二千石」「御史大夫中二千石」两条就是这么判出来的。 // 3. 把 A 的注(師古曰/應劭曰/臣瓚曰……共 213 条、12 家)程序化剥掉,得到 A 的正文, // 再与 B 的正文【逐字对齐**diff**】。全卷 41 段,实际分歧只有下面「两本异文」那几处。 // // ⚠ 两个见证【不是】点校本,是网络转录本。它们各自都有手民之误(互不相同,这恰好说明 // 二者是独立转录、不是同一份数字祖本): // · A 作「文帝一年復置一丞相」,B 作「文帝二年」——B 是。 // · B 作「易敘宓羲、神農、皇帝」,A 作「黃帝」——A 是。 // · B 作「更置二輔都尉」,A 作「三輔」——A 是(三辅=京兆尹/左冯翊/右扶风)。 // · A 作「吏員自佐史至丞相,十三萬二百八十五人」,B 作「十二萬」——未决,本表不收此句。 // → 所以本表的 confidence 仍然有意义:它标的是「两个网络转录本能证到什么程度」, // 【不是】「点校本核过了」。要引用到出版物级别,仍需目验中华书局点校本。 // // ══════════════════════════════════════════════════════════════════════════ // 【两本异文,未决】—— 这两处两个见证读法不同,本表取【保守读法】并如实标注 // // 一、大司马条的「初」字: // A 作「成帝綏和元年【初】賜大司馬金印紫綬」,B 作「成帝綏和元年賜大司馬金印紫綬」。 // 本表 quote 取 B(不带「初」)——【保守:不把只有一个见证有的字写进引文】。 // variant 字段记着 A 的读法。confidence='需核实'。 // 二、大司空条的「金印紫綬」四字: // B 作「成帝綏和元年更名大司空,【金印紫綬】,祿比丞相……」,A 无此四字。 // 本表 quote 取 A(不带这四字)——【保守:不把只有一个见证有的字写进引文】。 // variant 字段记着 B 的读法。confidence='需核实'。 // // ⚠ 保守读法【不等于】判定另一个见证是错的。两处都是【未决】,不许在别处当定论用。 // // ══════════════════════════════════════════════════════════════════════════ // 【字形(异体字)的处理口径】 // // 两个见证的字形不一致(这是转录本的常态,不是异文): // A: 衞 隷 厨 衆 羣 菀 蹏 B: 衛 隸 廚 眾 群 苑 蹄 // 本表【统一取 B 的字形】(通行字形),因为 B 是只收正文的那个见证,且与本仓已有代码一致。 // 这是【本项目的排版选择,不是校勘结论】——异体字无义别,不影响任何一条秩石。 // ⚠ 但「比千石 vs 千石」「二千石 vs 中二千石 vs 比二千石」【不是字形问题,是史实问题】, // 那几个字一个都不许动。见下「本表的三条铁律」第二条。 // // ══════════════════════════════════════════════════════════════════════════ // 法务 // // · 引文原文属【公有领域】:班固卒于公元 92 年,《汉书》原文早已过任何著作权期限。 // · 引文的【标点为本项目所加】。原文无标点;今人点校本(中华书局本等)的标点与分段 // 是受保护的独创性表达,本表【未采用】任何点校本的标点。本表统一只用「。」断句、 // 「、」列举——这是本项目自己的断句体例,与 ctext 的「,。」体例、与中华书局本的 // 体例均不相同。改本表引文时不许照抄任何点校本的逗号位置。 // ⚠ 本轮的 curl 比对【进一步证实了这条法务口径的必要性】:两个见证的标点各不相同, // 而它们的【字】几乎完全一样——标点确实是人加的、各家不同的,正因如此才不能抄。 // · 本表抠取的是【事实】:官名、秩石、员额、沿革、职掌。依思想/事实与表达二分法, // 事实不受著作权保护。 // · 每条引文控制在数十字以内,属最小必要引用。省略处用「……」标出,不作暗省。 // // ══════════════════════════════════════════════════════════════════════════ // 本表的三条铁律 // // 一、【原文没写的,留空,不许补】。rank 为 '' 就是原文真没写,不是漏抠。 // 丞相、太尉、御史大夫、大司马、大司空——本表【都没有秩石】,只记印绶。 // 「祿比丞相」是俸禄比拟,不是秩石名目。 // // 二、【四个秩名严格分开】:中二千石 ≠ 真二千石 ≠ 二千石 ≠ 比二千石。 // 一个「比」字差一级,混了就是硬伤。本表全部照原文用字。 // // 三、【本表只记西汉】。era 一律 xihan,donghan 一条都没有——本卷记的是西汉制度。 // ✗ 不许把本表的秩石安到东汉头上。这个坑本产品已经踩过一次(见下)。 // // ══════════════════════════════════════════════════════════════════════════ // 【正文 vs 注 —— 本表最重要的一条纪律】 // // 本卷在网页上(见证 A)是【正文与注混排】的。注有 12 家: // 師古(顏師古,唐,卒 645)、應劭(东汉)、臣瓚(晋)、如淳、張晏、服虔、 // 文穎、孟康、伏儼、晉灼、鄧展、荀悅。 // 【只有班固正文进本表。注一个字都不进 quote。】理由:注是后人对汉制的解释与考证, // 不是汉制本身;顏師古注尤其——他是唐人,隔了六百年。 // // ⚠ 但「注不进 quote」不等于「可以假装注不存在」。下面三条是本轮 curl 目验的【新发现】, // 它们纠正了本表上一版的说法(上一版是 WebFetch 抠的,看不见注): // // ① 「三公万石」有出处,出处是【顏師古注】: // 卷首即有「師古曰:『漢制,三公號稱萬石,其俸月各三百五十斛穀。其稱中二千石者 // 月各百八十斛……』」——这就是坊间「丞相万石」的来历。 // → 不许拿它当汉制史料:(a) 唐人注,不是班固正文;(b) 它自己说的是「號【稱】萬石」 // 与【月俸斛数】,本来就不是本表的秩石名目。丞相条的 rank 仍然留空。 // ② 「御史大夫中二千石」有出处,出处是【臣瓚注引《茂陵書》】: // 御史大夫条下有「臣瓚曰:『茂陵書御史大夫秩中二千石。』」 // → 见证 B(只收正文)里【没有这一句】,可证它是注不是正文。 // → 不许拿它当班固正文;但也【不许再说「本表无据」】(上一版就是这么说的,错了)。 // 准确说法:班固正文未记御史大夫秩石;本卷臣瓚注引《茂陵書》作「秩中二千石」, // 注非正文,且《茂陵書》已佚,无从覆核。 // ③ 「真二千石」在本卷【出现过一次】,也在【臣瓚注引《茂陵書》】里: // 詹事条下有「臣瓚曰:『茂陵書詹事秩真二千石。』」 // → 见证 B 正文里没有,可证是注。 // → 上一版说「真二千石在本表未出现」——【不准确】,见下「不许复活」。 // // ══════════════════════════════════════════════════════════════════════════ // 【已删除的错误说法,不许复活】 // // ── A. 经本轮 curl 目验,仍然成立的禁令 ── // // · ✗「县令秩千石至六百石、县长秩五百石至三百石」是【东汉】制 → 错,是【西汉】制, // 出处正是本表(两见证一致)。东汉制在《续汉书·百官志五》,作三等定值 // (令千石/长四百石/长三百石),是另一回事,【不可合并】。 // dynasties.js 的东汉阶梯里已明令禁用本表这一条——本表的 era='xihan' 与 // test/shiliao.test.js 的回归断言一起守着这个坑。 // · ✗「奉常/太常条本身写着中二千石」→ 错。九卿【各条都不写秩石】(两见证一致)。 // 见下「中二千石的来历」。 // · ✗ 郡府属吏(决曹、功曹、五官掾、督邮等)在本表 → 错,本表【全无】。 // 本轮已把全卷 41 段正文逐段过了一遍,确认没有这些官名。那些在《续汉书·百官志》, // 且是东汉制。要郡府属吏必须换史源,不能拿来充西汉。 // · ✗ 县尉「大县二人、小县一人」之类员额在本表 → 错,本表无(本轮目验确认)。 // 那是《续汉书·百官志》的写法。本表明确记了员额的只有大夫「皆無員、多至數十人」、 // 侍御史「員十五人」、博士「員多至數十人」、謁者「員七十人」等有限几处。 // · ✗ 把「御史大夫」的秩石写进 rank → 仍然禁止。班固正文【只给】它记 // 「位上卿、銀印青綬」。rank 只收正文,注不进 rank。 // (但禁令的【理由变了】,见下 B 组第 3 条——不许再用「本表无据」这个理由。) // // ── B. 本轮 curl 目验【推翻了的、上一版自己写下的】说法,同样不许复活 ── // ⚠ 这一组特别危险:它们是上一版以「已订正」「已验证」的口气写死的, // 读起来比真结论还硬。而它们错了。 // // · ✗「大司马条原文【无「初」字】,前一轮误增,已订正」→ 【不成立】。 // 见证 A 明明作「成帝綏和元年【初】賜大司馬金印紫綬」。上一版是把【一个见证的读法】 // 当成了「原文」,还反过来把另一个读法判成「误增」并「订正」掉。 // 真相:两本异文,未决。本表取保守读法(不带「初」)并在 variant 里记着 A 的读法。 // → 教训:一个见证读不出某个字,只能说明这个见证没有,不能说明原文没有。 // // · ✗「大司空条作『成帝綏和元年更名大司空。金印紫綬。祿比丞相……』」→ 【只有一个见证这么读】。 // 见证 B 有「金印紫綬」四字,见证 A 没有。上一版把它写进 quote 且标 confidence='原文明载'。 // 本表改取保守读法(不带这四字),confidence='需核实',variant 里记着 B 的读法。 // // · ✗「『御史大夫中二千石』坊间说法,本表无据」→ 【说法不准确,不许再这么写】。 // 本卷臣瓚注引《茂陵書》正有此说。禁令(不进 rank)不变,但理由必须换成 // 「注非正文」,不能说成「本表无据」——那会让人以为翻遍本卷都找不到这四个字, // 而实际上一翻就能翻到,一旦被人翻到,本表的可信度就全塌了。 // // · ✗「『真二千石』在本表未出现(已掺假验证)」→ 【不准确】。 // 班固正文确实未出现(两见证一致,这部分是对的);但本卷【臣瓚注引《茂陵書》】 // 有「詹事秩真二千石」。准确说法见上「正文 vs 注」③。 // (officesByRank('xihan','真二千石') 仍然返回 [],因为本表 rank 只收正文—— // 这个行为是对的,错的只是那句话的说法。) // // · ✗「二十等爵第三级用字两轮核查不一致,暂从『簪褭』」→ 【已解决】。 // 两个见证【一致】作「三簪裊」(A 的顏師古注亦作「裊音乃了反」)。 // 本表从「簪裊」。「簪褭」是常见异体写法,本项目所核两本均未见—— // 这是异体字问题,不是史实问题,两者所指同一级爵。 // // ══════════════════════════════════════════════════════════════════════════ // 【中二千石的来历——用本表的九卿秩石时必须交代这条推导链】 // // 九卿各条【本身都不写秩石】(两见证一致)。中二千石出自紧接「中尉(執金吾)」条之后、 // 自成一段的一句总述: // 「自太常至執金吾,秩皆中二千石,丞皆千石。」 // // ★ 本轮 curl 的结构性收获:把全卷正文按段列出来之后,「自太常至執金吾」这个范围 // 【是可以数出来的】,不再是靠印象。本卷正文段序(两见证一致)是: // ① 相國、丞相 ② 太尉/大司馬 ③ 御史大夫 ④ 太傅 ⑤ 太師、太保 // ⑥ 前後左右將軍 // ⑦ 奉常/太常(博士系此条下) ⑧ 郎中令/光祿勳 ⑨ 衛尉 ⑩ 太僕 ⑪ 廷尉 // ⑫ 典客/大鴻臚 ⑬ 宗正 ⑭ 治粟內史/大司農 ⑮ 少府 ⑯ 中尉/執金吾 // ⑰ ★「自太常至執金吾,秩皆中二千石,丞皆千石。」← 总述句在这里 // ⑱ 太子太傅…(以下另起,另有「自太子太傅至右扶風,皆秩二千石,丞六百石」一句总述) // → 所以「自太常至執金吾」覆盖的正好是 ⑦–⑯ 这【十条】,一条不多一条不少。 // 本表把这十条【全部收齐】了,就是为了让这个范围可以被数、被验,而不是被信。 // → 御史大夫是 ③,排在 ⑦ 太常【之前】,中间还隔着太傅、太师太保、前后左右将军 // 三段。它【根本不在】这句总述的范围里——这是可以数出来的结构事实,不是判断。 // // 所以: // · 太常、執金吾 是这句【点名的两个端点】→ confidence='原文明载'。 // · 郎中令、衛尉、太僕、廷尉、典客、宗正、治粟內史、少府 等【在范围内但未被点名】 // → 要靠「条目次序」才能套进去,是【总述句 + 条目次序】推出来的 // → confidence='需核实'。 // · 但十条【全部】rankDerived=true —— 因为没有任何一条是【本条直书】秩石的。 // 端点也不是本条直书,端点只是被总述句点了名。 // 前端拿九卿秩石做朝代对照时,【必须显示这条推导链】,不许伪装成本条直书。 // rankNote 字段就是给前端显示这个用的。 // ══════════════════════════════════════════════════════════════════════════ /** * 一条官制记录。 * * name 官名(本表用字) * aliases 异名/更名后的名(findOffice 按此匹配) * era 'qin' | 'xihan' | 'donghan' —— 本表全部 'xihan',见下方 eraNote * origin 沿革,尽量用原文的词(如「秦官」) * rank 秩石【原文用字】。原文没写 = '',不许推测。⚠ 只收班固正文,注不进 rank * rankDerived true = 这个 rank 不是本条直书,是从总述句推出来的(前端必须提示) * rankNote 推导链说明 / 秩石的限定语 * duty 职掌,尽量用原文的词。原文未记则明说「本表未记」 * quote 支撑本条的原文片段。⚠ 标点为本项目所加;省略处用「……」标出 * quoteRank 秩石另出总述句时,总述句的原文 * source 出处 * confidence '原文明载' | '需核实' * caveat 给「注」用的限定语——注的价值全在这里 * variant 两个见证读法不同时,另一个见证的读法。有 variant = 这条【未决】 * verified 何时、用什么方法核的 */ const SRC = '《汉书·卷十九上·百官公卿表上》'; // 本轮核实的口径:curl 生 HTML + 两个独立见证比对 + 程序化剥注 + 逐字 diff。 // 每条都标,是为了让「哪些条是这么核过的」可以被 grep、被断言,而不是靠这段注释背书。 const V = '2026-07-16 curl 逐字目验'; // ⚠ era 为什么全是 xihan: // 本表大量条目写「某官,秦官」,那是在记【沿革的起点】,不是说这条记的是秦制。 // 班固是以汉表记汉制,顺带注明哪些官承自秦。所以 era 一律 xihan,秦的部分进 origin。 // 【存疑,已知的编例问题】:像「郡守,秦官,掌治其郡,秩二千石」这种,字面无法断定 // 这个「二千石」是秦制之秩、还是汉制之秩系于秦官名下——本表未作分别。本表按 // 「汉表记汉制」标 xihan,但这是【编例判断,不是原文明说】。相关条目已在 caveat 里交代。 // 若将来要做秦汉对照,这批条目两边都能挂,必须注明。 export const OFFICES = [ // ── 三公及其属官 ── { id: 'chengxiang', name: '相国、丞相', aliases: ['丞相', '相国', '相國', '大司徒'], era: 'xihan', origin: '秦官。高帝即位置一丞相,十一年更名相国;哀帝元寿二年更名大司徒', rank: '', // ⚠ 本表【不记】丞相秩石,只记印绶。「丞相万石」出顏師古注,不是正文,不许补 rankDerived: false, rankNote: '本表正文只记「金印紫綬」,未记秩石。' + '✗ 不许补「万石」——「三公號稱萬石」出【顏師古注】(卷首「師古曰:漢制,三公號稱萬石,' + '其俸月各三百五十斛穀」),是唐人注,不是班固正文;且它说的是「號稱」与月俸斛数,' + '本来就不是本表的秩石名目。', duty: '掌丞天子,助理万机', // 省略处(「孝惠、高后置左右丞相……有兩長史,秩千石。」)用「……」标出: // 一是长史另立条;二是那段里的「文帝一年/二年」两个见证读法不同,本表不碰。 quote: '相國、丞相皆秦官。金印紫綬。掌丞天子助理萬機。秦有左右。高帝即位。置一丞相。十一年更名相國。綠綬。……哀帝元壽二年更名大司徒。', source: SRC, confidence: '原文明载', verified: V, caveat: '本表未给丞相记秩石,只记印绶。以此条做「三公=万石」的依据是没有的——' + '「三公號稱萬石」那句是顏師古注(唐人),且是「号称」与月俸,不是秩石名目。', }, { id: 'chengxiang_zhangshi', name: '丞相长史', aliases: ['丞相长史', '丞相長史'], era: 'xihan', origin: '丞相属官,两员', rank: '千石', // ⚠ 是「千石」不是「比千石」——两见证一致,原文无「比」字 rankDerived: false, rankNote: '原文作「秩千石」,【无「比」字】。两个见证一致。前一轮抠取曾误作「比千石」,已订正。', duty: '(本表未记职掌)', quote: '有兩長史。秩千石。', source: SRC, confidence: '原文明载', verified: V, caveat: '一个「比」字差一级。此条曾被误抄为「比千石」,本轮两个见证逐字确认均作「秩千石」。' + '⚠ 又:本卷记「有長史,秩千石」的【不止丞相】——太尉/大司马条、前后左右将军条各有一句' + '「有長史,秩千石」。所以「长史秩千石」不是丞相长史独有,引用时必须说清是哪个府的长史。', }, { id: 'sizhi', name: '丞相司直', aliases: ['司直'], era: 'xihan', origin: '武帝元狩五年初置', rank: '比二千石', rankDerived: false, rankNote: '', duty: '掌佐丞相举不法', quote: '武帝元狩五年初置司直。秩比二千石。掌佐丞相舉不法。', source: SRC, confidence: '原文明载', verified: V, caveat: '「比二千石」,非「二千石」。本条在本表中系于丞相条内,不另立条。两个见证一字不差。', }, { id: 'taiwei', name: '太尉', aliases: [], era: 'xihan', origin: '秦官。武帝建元二年省', rank: '', // ⚠ 本表不记太尉秩石,只记印绶(两见证一致) rankDerived: false, rankNote: '本表只记「金印紫綬」,未记秩石。', duty: '掌武事', quote: '太尉秦官。金印紫綬。掌武事。武帝建元二年省。', source: SRC, confidence: '原文明载', verified: V, caveat: '西汉太尉屡置屡省,非常设。本表未记其秩石。两个见证一字不差。', }, { id: 'dasima', name: '大司马', aliases: ['大司馬'], era: 'xihan', origin: '武帝元狩四年初置,以冠将军之号;成帝绥和元年赐金印紫绶、置官属、去将军', rank: '', // 「禄比丞相」是俸禄比拟,不是秩石名目 → 留空 rankDerived: false, rankNote: '本表作「祿比丞相」——那是【俸禄比拟】,不是秩石名目,故 rank 留空,不许写成「万石」。', duty: '(本表未以职掌语记之,只记印绶、官属与沿革)', // ⚠ 两本异文:见证 A 作「綏和元年【初】賜大司馬金印紫綬」,见证 B 无「初」字。 // 本表取保守读法(不带「初」),异文记在 variant。详见文件头「两本异文,未决」。 // 省略处是「宣帝地節三年置大司馬。不冠將軍。亦無印綬官屬。」——用「……」标出,不作暗省 quote: '元狩四年初置大司馬。以冠將軍之號。……成帝綏和元年賜大司馬金印紫綬。置官屬。祿比丞相。去將軍。', variant: '「成帝綏和元年賜大司馬金印紫綬」一句,见证 A(漢川草廬)作「成帝綏和元年【初】賜大司馬金印紫綬」,' + '多一「初」字;见证 B(ctext)无。两本异文,未决——本表取不带「初」的保守读法。', source: SRC, confidence: '需核实', // 「初」字两本异文,未决 verified: V, caveat: '⚠ 本条有【两本异文,未决】:「綏和元年(初)賜大司馬金印紫綬」的「初」字,一个见证有、一个没有。' + '本表取不带「初」的保守读法,但这【不是判定 A 错】——请以中华书局点校本复核。' + '⚠ 又:本表上一版曾断言「原文无『初』字,前一轮误增,已订正」——那是把一个见证的读法当成了原文,' + '不许复活这个说法。' + '大司马本冠于将军号上,成帝绥和元年才去将军号成为独立官;「祿比丞相」是俸禄比拟,不是秩石。', }, { id: 'yushi_dafu', name: '御史大夫', aliases: ['御史大夫'], era: 'xihan', origin: '秦官。成帝绥和元年更名大司空;哀帝建平二年复为御史大夫,元寿二年复为大司空', rank: '', // ⚠⚠ 班固正文【不记】御史大夫秩石。注里的「中二千石」不进 rank rankDerived: false, rankNote: '班固正文只记「位上卿、銀印青綬」,【未记秩石】。' + '✗ 不许把「中二千石」写进 rank,两条独立理由:' + '(1)【结构】御史大夫在本卷正文段序中排第 ③,在 ⑦ 太常【之前】(中间隔着太傅、太师太保、' + '前后左右将军三段),根本不在「自太常至執金吾,秩皆中二千石」这句总述的范围内;' + '(2)【正文 vs 注】「御史大夫秩中二千石」确实出现在本卷,但它在【臣瓚注引《茂陵書》】里,' + '不是班固正文——只收正文的见证 B 里没有这一句,可证其为注。rank 只收正文。', duty: '掌副丞相', quote: '御史大夫秦官。位上卿。銀印青綬。掌副丞相。', source: SRC, confidence: '原文明载', // 正文读法两见证一致;不确定的是注,不是正文 verified: V, caveat: '⚠ 关于「御史大夫中二千石」,必须【同时】说清两件事,少一件都会翻车:' + '① 班固【正文】未记御史大夫秩石,只写「位上卿、銀印青綬」——这是两个见证一致的。' + '② 但「中二千石」这四个字【本卷确实有】:御史大夫条下有「臣瓚曰:茂陵書御史大夫秩中二千石」。' + '那是【注引已佚的《茂陵書》】,不是班固正文,本表不采(注不进 rank),且《茂陵書》已佚无从覆核。' + '✗ 不许再说「中二千石本表无据」——本表上一版就是这么说的,错了:一翻本卷就能翻到那四个字,' + '说「无据」反而会把本表自己的可信度赔进去。准确说法是「注有、正文无,本表只收正文」。' + '又:结构上「自太常至執金吾」的范围也够不到它(它排在太常之前)。', }, { id: 'yushi_zhongcheng', name: '御史中丞', aliases: ['中丞', '御史长史', '御史長史'], era: 'xihan', origin: '御史大夫两丞之一。哀帝元寿二年更名御史长史', rank: '千石', rankDerived: false, rankNote: '', duty: '在殿中兰台,掌图籍秘书,外督部刺史,内领侍御史员十五人,受公卿奏事,举劾按章', quote: '有兩丞。秩千石。一曰中丞。在殿中蘭臺。掌圖籍祕書。外督部刺史。內領侍御史員十五人。', source: SRC, confidence: '原文明载', verified: V, caveat: '「外督部刺史、内领侍御史」——中丞秩千石而督秩六百石的刺史(本表:部刺史「秩六百石,員十三人」,' + '成帝绥和元年更名牧、秩二千石),且刺史所察者为二千石郡守。以卑临尊是汉代的常态,秩石不等于实权。' + '⚠ 引文在「內領侍御史員十五人」处止,原文其下尚有「受公卿奏事。舉劾按章。」——已录入 duty,未入引文(最小必要引用)。', }, { id: 'dasikong', name: '大司空', aliases: ['大司空', '司空'], era: 'xihan', origin: '成帝绥和元年由御史大夫更名;哀帝建平二年复为御史大夫,元寿二年复为大司空', rank: '', // 「禄比丞相」同上,不是秩石 rankDerived: false, rankNote: '本表作「祿比丞相」,是俸禄比拟,不是秩石名目,故留空。', duty: '官职如故(即职掌同御史大夫)', // ⚠ 两本异文:见证 B 作「更名大司空,【金印紫綬】,祿比丞相……」,见证 A 无这四字。 // 本表取保守读法(不带这四字),异文记在 variant。 quote: '成帝綏和元年更名大司空。祿比丞相。置長史如中丞。官職如故。', variant: '见证 B(ctext)作「成帝綏和元年更名大司空,【金印紫綬】,祿比丞相,置長史如中丞,官職如故」,' + '多「金印紫綬」四字;见证 A(漢川草廬)无。两本异文,未决——本表取不带这四字的保守读法。' + '⚠ 本表上一版把「金印紫綬」写进了引文并标「原文明载」——那是单见证读法当定论,已降级为「需核实」。', source: SRC, confidence: '需核实', // 「金印紫綬」四字两本异文,未决 verified: V, caveat: '⚠ 本条有【两本异文,未决】:「金印紫綬」四字一个见证有、一个没有。本表取保守读法(不带),' + '但这不是判定 B 错——请以中华书局点校本复核。' + '⚠ 时代:自元寿二年(前 1)以后为大司空,东汉三公作司空。拿「御史大夫」当东汉官名是时代错置。', }, // ── 九卿 + 执金吾:「自太常至執金吾」总述句覆盖的【十条】,全部收齐 ── // ⚠ 这十条是【一个整体】。收齐的目的是让「自太常至執金吾」的范围可以被【数出来】, // 而不是靠印象相信。少收一条,这个范围就又变回一句需要读者信任我们的话。 // 十条的次序就是本卷正文的段序,不许重排。 { id: 'taichang', name: '奉常、太常', aliases: ['太常', '奉常', '秩宗'], era: 'xihan', origin: '秦官。景帝中六年更名太常。王莽改太常曰秩宗', rank: '中二千石', rankDerived: true, // 端点,被总述句点名 → 但仍非本条直书 rankNote: '⚠ 秩石【不在本条】。奉常/太常条本身不写秩石(两个见证一致)。' + '中二千石出自紧接「中尉(執金吾)」条之后、自成一段的总述句' + '「自太常至執金吾,秩皆中二千石,丞皆千石。」——太常是这句【点名的起点】,' + '故可靠性高于范围内未点名的诸卿。', duty: '掌宗庙礼仪', quote: '奉常秦官。掌宗廟禮儀。有丞。景帝中六年更名太常。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '原文明载', // 端点,被总述句点名 verified: V, caveat: '秩石来自总述句「自太常至執金吾」,【不是本条直书】。太常是该句点名的起点,故此条秩石可靠。丞千石。' + '又:「王莽改太常曰秩宗」一句在本卷系于【博士条】末尾,不在奉常条内。', }, { id: 'langzhongling', name: '郎中令、光禄勋', aliases: ['光禄勋', '光祿勳', '郎中令'], era: 'xihan', origin: '秦官。武帝太初元年更名光禄勋', rank: '中二千石', rankDerived: true, rankNote: '⚠ 秩石【不在本条】,且郎中令【未被总述句点名】。它是靠「条目次序在太常与執金吾之间」' + '(本卷正文段序第 ⑧,在 ⑦ 太常与 ⑯ 執金吾之间)才套进「自太常至執金吾,秩皆中二千石」的' + '——这是【总述句 + 条目次序】的推导,不是原文直书。故 confidence 标「需核实」。', duty: '掌宫殿掖门户', quote: '郎中令秦官。掌宮殿掖門戶。有丞。武帝太初元年更名光祿勳。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', // 秩石靠推导,非本条直书 verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。用此条秩石时必须一并说明推导链。', }, { id: 'weiwei', name: '卫尉', aliases: ['衛尉', '衞尉', '中大夫令'], era: 'xihan', origin: '秦官。景帝初更名中大夫令,后元年复为卫尉', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑨)。', duty: '掌宫门卫屯兵', quote: '衛尉秦官。掌宮門衛屯兵。有丞。景帝初更名中大夫令。後元年復為衛尉。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, // ⚠ 上下卷矛盾 —— 本轮已【目验下卷】确认,不再是传闻 caveat: '⚠ 上下卷矛盾,【本轮已目验下卷确认,未解决也不许调和】:' + '本表(上卷)作「景帝初更名中大夫令。後元年復為衛尉」(后元年=前 143);' + '而下卷(公卿年表)在景帝中六年(前 144)一栏作「中大夫令直不疑更為衞尉」,差一年。' + '下卷同栏还有「奉常利更為太常」「廷尉瑕更為大理」,与上卷「景帝中六年更名太常/更名大理」' + '对得上——可证下卷那一栏确系【中六年】,故矛盾是真的,不是错栏。' + '本条只录上卷原文,【不采下卷年份】,也不替两卷调和。要用精确年份请先目验中华书局点校本两卷。' + '(又:秩石亦系推导,非本条直书。)', }, { id: 'taipu', name: '太仆', aliases: ['太僕', '太仆'], era: 'xihan', origin: '秦官', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑩)。', duty: '掌舆马', quote: '太僕秦官。掌輿馬。有兩丞。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。' + '本条收入本表的理由是【让「自太常至執金吾」的范围可以被数出来】:它是范围内的第 ⑩ 段。' + '又:本表另记「中太僕掌皇太后輿馬,不常置」,与太仆非一官。', }, { id: 'tingwei', name: '廷尉', aliases: ['大理', '作士'], era: 'xihan', origin: '秦官。景帝中六年更名大理,武帝建元四年复为廷尉,哀帝元寿二年复为大理。王莽改曰作士', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑪)。', duty: '掌刑辟', // 省略处是「宣帝地節三年初置左右平。秩皆六百石。」——另立条(tingwei_ping),故用「……」标出 quote: '廷尉秦官。掌刑辟。有正、左右監。秩皆千石。景帝中六年更名大理。武帝建元四年復為廷尉。……哀帝元壽二年復為大理。王莽改曰作士。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。廷尉自身的秩石与其属官正/左右监的「秩皆千石」不是一回事,别混。', }, { id: 'dianke', name: '典客、大鸿胪', aliases: ['典客', '大鸿胪', '大鴻臚', '大行令', '典乐', '典樂'], era: 'xihan', origin: '秦官。景帝中六年更名大行令,武帝太初元年更名大鸿胪。王莽改大鸿胪曰典乐', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑫)。', duty: '掌诸归义蛮夷', quote: '典客秦官。掌諸歸義蠻夷。有丞。景帝中六年更名大行令。武帝太初元年更名大鴻臚。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。' + '⚠ 本卷有两个「大行令」:一是景帝中六年典客更名的大行令(本条);二是武帝太初元年' + '「更名行人為大行令」的大行令,那是大鸿胪的【属官】。两者不是一官,别混。', }, { id: 'zongzheng', name: '宗正', aliases: ['宗正', '宗伯'], era: 'xihan', origin: '秦官。平帝元始四年更名宗伯。王莽并其官于秩宗', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑬)。', duty: '掌亲属', quote: '宗正秦官。掌親屬。有丞。平帝元始四年更名宗伯。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。「更名宗伯」是平帝元始四年事,与太常之改称「秩宗」(王莽)不是一回事。', }, { id: 'zhisu_neishi', name: '治粟内史、大司农', aliases: ['治粟內史', '治粟内史', '大司农', '大司農', '大农令', '大農令', '羲和', '纳言', '納言'], era: 'xihan', origin: '秦官。景帝后元年更名大农令,武帝太初元年更名大司农。王莽改大司农曰羲和,后更为纳言', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑭)。', duty: '掌谷货', quote: '治粟內史秦官。掌穀貨。有兩丞。景帝後元年更名大農令。武帝太初元年更名大司農。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。「景帝後元年」是景帝后元元年,不是「景帝后·元年」,别断错。', }, { id: 'shaofu', name: '少府', aliases: ['少府', '共工'], era: 'xihan', origin: '秦官。王莽改少府曰共工', rank: '中二千石', rankDerived: true, rankNote: '⚠ 同郎中令:秩石不在本条,靠总述句 + 条目次序推出(本卷正文段序第 ⑮)。', duty: '掌山海池泽之税,以给共养', quote: '少府秦官。掌山海池澤之稅。以給共養。有六丞。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '需核实', verified: V, caveat: '秩石系由总述句加条目次序推出,本条未直书。' + '⚠ 尚书在本表是少府的【属官】之一(「屬官有尚書、符節、太醫……」),本表【未记尚书秩石】,' + '也没有「尚书令」这个条目——要尚书台的秩石必须换史源,不能拿本表充数。', }, { id: 'zhongwei', name: '中尉、执金吾', aliases: ['执金吾', '執金吾', '中尉'], era: 'xihan', origin: '秦官。武帝太初元年更名执金吾', rank: '中二千石', rankDerived: true, // 端点,被点名 rankNote: '⚠ 秩石不在本条,出自【紧接本条之后】、自成一段的总述句。' + '執金吾是该句【点名的终点】,故可靠性高于范围内未点名的诸卿。', duty: '掌徼循京师', quote: '中尉秦官。掌徼循京師。有兩丞、候、司馬、千人。武帝太初元年更名執金吾。', quoteRank: '自太常至執金吾。秩皆中二千石。丞皆千石。', source: SRC, confidence: '原文明载', // 端点,被总述句点名 verified: V, caveat: '「自太常至執金吾」这句总述【紧接在本条之后、自成一段】——位置与结构自洽,' + '这是本表中二千石一句的定位依据(本轮 curl 按段列出全卷正文后确认)。' + '⚠ 本条的「中尉」与诸侯王国的「中尉」、与主爵中尉,是三个不同的官,别混。', }, // ── 光禄勋属官:大夫、郎、博士 ── { id: 'dafu', name: '大夫', aliases: ['大夫'], era: 'xihan', origin: '郎中令(光禄勋)属官,秦官', rank: '', rankDerived: false, rankNote: '「大夫」是类名,其下太中大夫/光禄大夫/谏大夫各有秩,见各条。类名本身无秩。', duty: '掌论议。皆无员,多至数十人', quote: '大夫掌論議。有太中大夫、中大夫、諫大夫。皆無員。多至數十人。', source: SRC, confidence: '原文明载', verified: V, caveat: '「皆無員、多至數十人」是本表【明记】的员额写法,可信。本表记员额的地方极少,别处不许仿造。', }, { id: 'guanglu_dafu', name: '光禄大夫', aliases: ['光祿大夫', '中大夫'], era: 'xihan', origin: '本名中大夫(郎中令属官,秦官)。武帝太初元年更名中大夫为光禄大夫', rank: '比二千石', rankDerived: false, rankNote: '「比二千石」,非「二千石」。', duty: '掌论议', quote: '太初元年更名中大夫為光祿大夫。秩比二千石。', source: SRC, confidence: '原文明载', verified: V, caveat: '职掌承自「大夫掌論議」一句,非本句自带。' + '⚠ 光禄大夫虽秩比二千石,却【无印绶】:本卷末总述「凡吏秩比二千石以上,皆銀印青綬,光祿大夫無」' + '——秩石与印绶在本表里不是一一对应的,这条是本表自己给出的反例。', }, { id: 'taizhong_dafu', name: '太中大夫', aliases: ['太中大夫'], era: 'xihan', origin: '郎中令属官,秦官。太初元年改制时「如故」不变', rank: '比千石', rankDerived: false, rankNote: '', duty: '掌论议', quote: '太中大夫秩比千石如故。', source: SRC, confidence: '原文明载', verified: V, caveat: '「如故」=太初元年改制时此秩不变。职掌承自「大夫掌論議」。', }, { id: 'jian_dafu', name: '谏大夫', aliases: ['諫大夫'], era: 'xihan', origin: '武帝元狩五年初置', rank: '比八百石', rankDerived: false, rankNote: '', duty: '掌论议', quote: '武帝元狩五年初置諫大夫。秩比八百石。', source: SRC, confidence: '原文明载', verified: V, // ⚠ 前一轮抠取给此条 origin 补了「(非秦官)」——那是【推论】不是原文。 // 本表作「屬官有大夫、郎、謁者,皆秦官」,「皆秦官」说的是大夫/郎/谒者这三个【类】, // 与「谏大夫武帝初置」并不直接冲突(类是秦官,此一具体职名为武帝所置)。 // 班固未作分别,我们也不作——已删去「非秦官」三字。 caveat: '⚠ 不许写「谏大夫非秦官」。本表作「屬官有大夫、郎、謁者,皆秦官」,' + '「皆秦官」指大夫/郎/谒者三个【类】;「武帝元狩五年初置諫大夫」指这一具体职名。' + '班固未就二者关系作分别,这是原文的留白,不是可以替他填的空。' + '⚠ 又:本卷末记「成帝陽朔二年除八百石、五百石秩」。此条作「比八百石」——' + '「比八百石」是否随「八百石」同废,【本表未明言】,不许替它下结论。', }, { id: 'yilang_zhonglang', name: '议郎、中郎', aliases: ['议郎', '議郎', '中郎'], era: 'xihan', origin: '郎中令属官。郎,秦官', rank: '比六百石', rankDerived: false, rankNote: '', duty: '掌守门户,出充车骑。皆无员,多至千人', quote: '議郎、中郎秩比六百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '职掌承自「郎掌守門戶、出充車騎」一句,非本句自带。' + '⚠ 中郎与「中郎将」不是一官:本表另记「中郎有五官、左、右三將。秩皆比二千石」——' + '中郎将比二千石,中郎比六百石,差得远,别混。', }, { id: 'shilang', name: '侍郎', aliases: ['侍郎'], era: 'xihan', origin: '郎中令属官。郎,秦官', rank: '比四百石', rankDerived: false, rankNote: '原文作「侍郎比四百石」,【无「秩」字】——与前句「議郎、中郎秩比六百石」共用一个「秩」。', duty: '掌守门户,出充车骑', quote: '侍郎比四百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '职掌承自「郎掌守門戶、出充車騎」一句。两个见证一字不差。', }, { id: 'langzhong', name: '郎中', aliases: ['郎中'], era: 'xihan', origin: '郎中令属官。郎,秦官', rank: '比三百石', rankDerived: false, rankNote: '原文作「郎中比三百石」,【无「秩」字】,同侍郎。', duty: '掌守门户,出充车骑', quote: '郎中比三百石。', source: SRC, confidence: '原文明载', verified: V, // ⚠ 注意:dynasties.js 的【东汉】阶梯里有「郎,比三百石」。那一条【不许】拿本条当依据—— // 本条是西汉制。东汉的郎中比三百石另出《续汉书·百官志二》,两处数字碰巧相同, // 但史源不同、时代不同。数字相同不等于可以互相引用。 caveat: '⚠ 本条是【西汉】制。dynasties.js 的东汉阶梯亦作「郎,比三百石」,数字虽同,' + '但那须以《续汉书·百官志二》为据,【不可拿本条充数】。数字巧合不是史源。' + '⚠ 又:郎中与「郎中令」不是一官,与郎中三将(车、户、骑,秩皆比千石)也不是一官。', }, { id: 'boshi', name: '博士', aliases: ['博士'], era: 'xihan', origin: '秦官。属太常。武帝建元五年初置五经博士;宣帝黄龙元年稍增员十二人', rank: '比六百石', rankDerived: false, rankNote: '', duty: '掌通古今。员多至数十人', quote: '博士秦官。掌通古今。秩比六百石。員多至數十人。', source: SRC, confidence: '原文明载', verified: V, caveat: '博士在本表属【太常】条下(太常条明记「又博士及諸陵縣皆屬焉」),不属光禄勋。' + '「員多至數十人」是本表明记的员额。' + '⚠ 分段提示:见证 A 把博士另起一段,见证 B 把它并在太常段末——【文字完全相同】,' + '只是分段不同。分段是今人排版的产物,不是原文自带的,两者不构成异文。' + '⚠ 又:博士秩比六百石却【无印绶】(本卷末「秩比六百石以上,皆銅印黑綬,大夫、博士、御史、謁者、郎無」)。', }, // ── 郡 ── { id: 'junshou', name: '太守、郡守', aliases: ['太守', '郡守'], era: 'xihan', origin: '秦官曰郡守。景帝中二年更名太守', rank: '二千石', // ⚠ 是「二千石」,不是「中二千石」也不是「真二千石」 rankDerived: false, rankNote: '「二千石」——非中二千石、非真二千石、非比二千石。四者严格分开。', duty: '掌治其郡', quote: '郡守秦官。掌治其郡。秩二千石。有丞。邊郡又有長史。掌兵馬。秩皆六百石。景帝中二年更名太守。', source: SRC, confidence: '需核实', // 秩石的时代归属有编例上的歧义,见 caveat verified: V, caveat: '⚠ 时代归属存疑(【编例问题,不是抄写问题】——本轮 curl 目验确认原文就是这么写的,' + '两个见证一字不差,存疑的不是文字而是它的含义):「秩二千石」写在「郡守,秦官,掌治其郡」' + '这一句之内,字面无法断定它是【秦制之秩】还是【班固以汉表记汉制而顺带系于秦官名下】。' + '本表未作分别。本表按「汉表记汉制」标 era=xihan,但这是【编例判断,不是原文明说】。' + '做秦汉对照时此条两边都能挂,必须注明。', }, { id: 'juncheng', name: '郡丞', aliases: ['郡丞'], era: 'xihan', origin: '郡守属官', rank: '六百石', rankDerived: false, rankNote: '秩石出自「秩皆六百石」的「皆」字——该「皆」同时覆盖郡丞与边郡长史。', duty: '(本表未单记郡丞职掌。同句的「掌兵馬」是承边郡长史而言,不是郡丞的职掌)', quote: '有丞。邊郡又有長史。掌兵馬。秩皆六百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '⚠ 断句陷阱:「有丞,邊郡又有長史,掌兵馬,秩皆六百石」——「掌兵馬」紧承长史,' + '【不要读成郡丞掌兵马】;「秩皆六百石」的「皆」才是覆盖丞与长史两者的。' + '(本项目的断句作「有丞。邊郡又有長史。掌兵馬。秩皆六百石。」,责任在本项目。)', }, { id: 'bianjun_zhangshi', name: '边郡长史', aliases: ['边郡长史', '邊郡長史'], era: 'xihan', origin: '边郡特置,非诸郡皆有', rank: '六百石', rankDerived: false, rankNote: '', duty: '掌兵马', quote: '有丞。邊郡又有長史。掌兵馬。秩皆六百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '「邊郡【又】有長史」——只有边郡才置,不是诸郡通制。' + '⚠ 此「长史」秩六百石,与丞相长史/太尉长史/前后左右将军长史的「秩千石」不是一回事,别混。', }, { id: 'duwei', name: '都尉、郡尉', aliases: ['都尉', '郡尉'], era: 'xihan', origin: '秦官曰郡尉。景帝中二年更名都尉', rank: '比二千石', // ⚠ 太守二千石、都尉比二千石——差一级,别混 rankDerived: false, rankNote: '「比二千石」。⚠ 与太守的「二千石」差一级,不许混。', duty: '掌佐守典武职甲卒', quote: '郡尉秦官。掌佐守典武職甲卒。秩比二千石。有丞。秩皆六百石。景帝中二年更名都尉。', source: SRC, confidence: '原文明载', verified: V, caveat: '郡尉「比二千石」低于郡守「二千石」一级——「佐守」二字与秩石对得上,这是本表内部自洽的一处。' + '⚠ 本表另有关都尉、农都尉、属国都尉、水衡都尉、护军都尉、驸马都尉等,与郡都尉不是一官,别混。', }, { id: 'duwei_cheng', name: '郡尉丞、都尉丞', aliases: ['都尉丞', '郡尉丞'], era: 'xihan', origin: '郡尉属官', rank: '六百石', rankDerived: false, rankNote: '', duty: '(本表未记职掌)', quote: '郡尉秦官。掌佐守典武職甲卒。秩比二千石。有丞。秩皆六百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '本表未记职掌。⚠「秩皆六百石」的「皆」在郡尉条里只跟着一个「丞」,这个「皆」字是原文如此,不是抄错。', }, // ── 县 ── // ⚠⚠ 本产品踩过的坑就在这里:这两条是【西汉】制。 // 东汉制在《续汉书·百官志五》,作三等定值(令千石/长四百石/长三百石),是另一回事。 // test/shiliao.test.js 有回归断言守着:era='donghan' 的条目里不许出现这两个秩级。 { id: 'xianling', name: '县令', aliases: ['縣令', '县令'], era: 'xihan', // ⚠ 不许改成 donghan origin: '秦官(县令、长皆秦官)', rank: '千石至六百石', rankDerived: false, rankNote: '⚠【西汉】制。不许安到东汉头上。', duty: '掌治其县。万户以上为令', quote: '縣令、長皆秦官。掌治其縣。萬戶以上為令。秩千石至六百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '⚠⚠ 这是【西汉】制,本产品已经在此栽过一次。东汉县令的秩级在《续汉书·百官志五》,' + '作三等定值:「大者置令一人,千石;其次置長,四百石;小者置長,三百石」——与本表的' + '「千石至六百石」区间制【不是一回事,不可合并、不可互引】。dynasties.js 的东汉阶梯已明令禁用本条。' + '(本轮 curl 目验:两个见证均作「萬戶以上為令。秩千石至六百石」,一字不差。)', }, { id: 'xianzhang', name: '县长', aliases: ['縣長', '县长'], era: 'xihan', // ⚠ 不许改成 donghan origin: '秦官(县令、长皆秦官)', rank: '五百石至三百石', rankDerived: false, rankNote: '⚠【西汉】制。不许安到东汉头上。', duty: '掌治其县。减万户为长', quote: '減萬戶為長。秩五百石至三百石。', source: SRC, confidence: '原文明载', verified: V, caveat: '⚠ 原文是「【減】萬戶為長」,不是「萬戶以下」——本轮两个见证逐字确认一致。' + '同上:这是西汉制,东汉制另在《续汉书·百官志五》,不可合并。' + '⚠ 时限:本卷末明记「成帝陽朔二年除八百石、五百石秩」——故「五百石至三百石」是' + '【陽朔二年(前 23)以前】的写法。本表未在县长条重申这一点,是原文的编例,不是漏抄;' + '但拿这个区间去说成帝后期以后的县长,就是时代错置。', }, { id: 'xiancheng_xianwei', name: '县丞、县尉', aliases: ['县丞', '縣丞', '县尉', '縣尉', '长吏', '長吏'], era: 'xihan', origin: '县令、长属官。本表丞、尉同条并记,未分别立秩', rank: '四百石至二百石', rankDerived: false, rankNote: '本表丞、尉【同秩】并记,未分别立秩。不许替它们各拆一个秩。', duty: '(本表未分记丞、尉职掌)。丞、尉同为「长吏」', quote: '皆有丞、尉。秩四百石至二百石。是為長吏。', source: SRC, confidence: '原文明载', verified: V, caveat: '⚠ 本表【未记】县尉员额。「大县二人、小县一人」之说不出本表(本轮 curl 目验全卷确认无此文),' + '那是《续汉书·百官志》的写法,不许拿来充西汉。', }, { id: 'shaoli', name: '斗食、佐史', aliases: ['斗食', '佐史', '少吏'], era: 'xihan', origin: '县级百石以下之秩', rank: '百石以下', rankDerived: false, rankNote: '「百石以下」是本表原文的表述,不是一个具体秩名。', duty: '(本表未记职掌)。是为少吏', quote: '百石以下有斗食、佐史之秩。是為少吏。', source: SRC, confidence: '原文明载', verified: V, caveat: '长吏(丞尉,四百石至二百石)与少吏(斗食、佐史,百石以下)的分界,是本表明记的一条界线。' + '⚠ 斗食、佐史的【月俸斛数】(斗食月奉十一斛、佐史月奉八斛)出顏師古注引《汉官名秩簿》,' + '是唐人注引汉简式材料,【不是班固正文】,本表不收。', }, // ── 爵 ── { id: 'ershideng_jue', name: '二十等爵', aliases: ['爵', '二十等爵', '彻侯', '徹侯', '通侯', '列侯', '关内侯', '關內侯'], era: 'xihan', origin: '皆秦制,以赏功劳;西汉沿用。彻侯避武帝讳曰通侯,或曰列侯', rank: '', rankDerived: false, rankNote: '爵不是秩石。⚠ 秦汉是【爵—秩二元结构】,爵与秩是两套东西,不可换算、不可混为一谈。', duty: '以赏功劳', quote: '皆秦制。以賞功勞。徹侯金印紫綬。避武帝諱。曰通侯。或曰列侯。', // 二十等爵的名目——这是【事实数据】,不是引文,故不加标点、不作引文处理。 // ⚠ 第三级:两个见证【一致】作「三簪裊」,本表从之(scale 用简体作「簪袅」)。 // 上一版作「簪褭」并标「两轮核查不一致」——那是 WebFetch 时代的产物,已解决。 scale: [ '公士', '上造', '簪袅', '不更', '大夫', '官大夫', '公大夫', '公乘', '五大夫', '左庶长', '右庶长', '左更', '中更', '右更', '少上造', '大上造', '驷车庶长', '大庶长', '关内侯', '彻侯', ], source: SRC, confidence: '原文明载', // 二十级两个见证全部一致(上一版的「需核实」是 WebFetch 造成的,已解除) verified: V, caveat: '⚠ 爵不是秩石。秦汉是爵—秩二元结构,二十等爵才是跟人走的品位序列,秩石附丽于职位。两者不可换算。' + '⚠ 第三级用字:本项目所核【两个见证一致】作「簪裊」(见证 A 的顏師古注亦作「裊音乃了反」),' + 'scale 从之(简体作「簪袅」)。「簪褭」是常见的异体写法,本项目所核两本均未见——' + '这是【异体字问题,不是史实问题】,两者指同一级爵。上一版「两轮核查不一致、暂从簪褭」的说法已解除。' + '⚠ 时代:本条 era 标 xihan(本表记西汉沿用,且「避武帝諱」明属西汉),但原文明写「皆秦制」——' + '做秦汉对照时此条两边都能挂,须注明。', }, ]; // ── 索引 ── const BY_ERA = {}; for (const o of OFFICES) (BY_ERA[o.era] ||= []).push(o); // 官名规范化:去掉标点与空白,简繁不作转换(aliases 里两种都列了) const norm = (s) => String(s ?? '').replace(/[\s、,,..。]/g, ''); /** * 按朝代 + 官名查一条官制记录。 * name 可以是本名,也可以是异名/更名后的名(如「光禄勋」找得到「郎中令、光禄勋」)。 * 查不到返回 null —— 【不许猜】,查不到就是查不到。 */ export function findOffice(era, name) { const list = BY_ERA[era]; if (!list || !name) return null; const q = norm(name); if (!q) return null; // 先精确匹配 name / aliases / id,再退到「官名包含」的宽松匹配 for (const o of list) { if (o.id === q) return o; if (norm(o.name) === q) return o; if ((o.aliases || []).some((a) => norm(a) === q)) return o; } for (const o of list) { if (norm(o.name).includes(q)) return o; } return null; } /** * 按朝代 + 秩石查。rank 为原文用字,【精确匹配】。 * ⚠ 「二千石」不会匹配到「比二千石」/「中二千石」—— 这是【故意的】。 * 四个秩名严格分开,一个「比」字差一级。要模糊匹配请自己在调用点写清楚为什么。 */ export function officesByRank(era, rank) { const list = BY_ERA[era]; if (!list || !rank) return []; const q = norm(rank); return list.filter((o) => o.rank && norm(o.rank) === q); } /** * 「注」的数据源:给一条官,返回 {source, quote, caveat, confidence, rankDerived, variant}。 * * ⚠ caveat 是这个函数的全部价值所在——正文是推演,注是原文,而【限定语才是注的诚实】。 * 前端渲染时 caveat 不许省略;rankDerived=true 的条目尤其不许把推导链藏起来。 * ⚠ variant(两本异文)也【必须】显示:一条引文如果两个见证读法不同, * 把它当成定论展示出去,就是本表被封存过的那个毛病。故 variant 同时并进 caveat 串, * 即使前端只读 caveat 也漏不掉。 * 查不到返回 null。 */ export function citeOffice(era, name) { const o = findOffice(era, name); if (!o) return null; const parts = [o.caveat, o.rankNote, o.variant ? `【两本异文】${o.variant}` : ''].filter(Boolean); return { source: o.source, // 有 quoteRank(秩石另出总述句)的,把两处原文一并给出,别让前端以为秩石在本条里 quote: o.quoteRank ? `${o.quote}(秩石另见总述句:${o.quoteRank})` : o.quote, caveat: parts.join(' '), // 前端据此决定要不要打「需核实」的标,以及要不要显示推导链 confidence: o.confidence, rankDerived: !!o.rankDerived, variant: o.variant || '', verified: o.verified || '', }; } /** 列出某朝的全部官名(给前端做选择器用,不吐内部字段) */ export function listOffices(era) { return (BY_ERA[era] || []).map((o) => ({ id: o.id, name: o.name, rank: o.rank, duty: o.duty, confidence: o.confidence, rankDerived: !!o.rankDerived, })); } /** 本表出现过的秩石名目(原文用字),按高低【不排序】——秩石的高低不是本表的断言 */ export const RANK_NAMES = [...new Set(OFFICES.map((o) => o.rank).filter(Boolean))];