Files
digital-me-history/digital-me-backend/src/shiliao.js
T
admin 0593ff7e62
nginx serve /uploads direct (audio speed) / patch-nginx (push) Failing after 1m34s
数字我 Digital Me:全量入库(大文件走 Git LFS)
2026-10-10 16:24:43 +08:00

1058 lines
61 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 史料表 —— 《汉书·百官公卿表上》的官制事实,抠成可查询的常量。
//
// 定位:与 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))];