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
48 changes: 38 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
# Research Notes

Evidence-led writing on artificial intelligence, robotics, and technical
strategy by Theodore Ouyang. Every work is preserved as a complete Chinese
edition and a complete English edition; the reading site shows one language at
a time.
**A bilingual, evidence-led research archive by Theodore Ouyang.**

[中文阅读](https://research-notes-130u.jiligualapiqiu.chatgpt.site/) ·
[Read in English](https://research-notes-130u.jiligualapiqiu.chatgpt.site/?lang=en) ·
围绕人工智能、机器人与技术路径,把复杂问题整理成可审阅、可引用、可复核的判断。

Every work is preserved as a complete Chinese edition and a complete English edition, with its evidence boundary and audit trail kept close to the writing.

**[中文阅读](https://research-notes-130u.jiligualapiqiu.chatgpt.site/)** ·
**[Read in English](https://research-notes-130u.jiligualapiqiu.chatgpt.site/?lang=en)** ·
[Research](research/) · [Articles](articles/) · [Reflections](reflections/)

`Astro 7` `TypeScript` `Bilingual` `Evidence-led` `GitHub Pages disabled`

## At a glance

- **Three published works:** two research dossiers and one technical essay.
- **Complete bilingual editions:** language switching preserves the reader's position instead of replacing full works with summaries.
- **Reviewable provenance:** manifests, source ledgers, audit notes, and preserved research archives travel with the relevant work.
- **Independent reading surface:** the static Astro site is hosted separately from `theodoreoy.com` and from GitHub Pages.

## Work

<!-- portfolio:index:start -->
Expand All @@ -31,7 +41,16 @@ a time.
[中文全文](research/2026-08-03-manifold-world-model-landscape/README.zh-CN.md) · [English version](research/2026-08-03-manifold-world-model-landscape/README.en.md) · [Read on web](https://research-notes-130u.jiligualapiqiu.chatgpt.site/manifold-world-model-landscape/)
<!-- portfolio:index:end -->

## Repository
## What this repository demonstrates

| Layer | What is shown |
| --- | --- |
| Research | Source-led analysis with explicit separation between evidence, claims, explanation, and interpretation |
| Editorial | Complete Chinese and English editions with stable metadata and collection indexes |
| Product | A responsive reading interface with persistent language choice, accessible navigation, and compact-screen outlines |
| Engineering | Schema validation, deterministic index generation, static-site auditing, and a version-locked Astro build |

## Repository map

Each work lives in its own folder. The report, sources, audit trail, figures,
and any preserved research archive travel together instead of being scattered
Expand Down Expand Up @@ -59,14 +78,23 @@ Markdown inside each project folder is the canonical editable source. A
provenance for projects that need them. Generated HTML under `_site/` is
disposable.

## Maintenance
## Local verification

```powershell
npm ci
npm run check
npm run build
```

`npm run check` validates content manifests, generated indexes, and Astro types. The build then copies public source artifacts and audits the generated site.

## Maintenance and deployment boundary

The repository uses a version-locked Astro static build. Operational details
live in the [Publishing Standard](PUBLISHING_STANDARD.md); architectural
decisions live in [ADR-001](ARCHITECTURE.md).

GitHub Actions validates the archive, but GitHub Pages remains disabled. The
public reading site is hosted independently from the validated repository.
GitHub Actions validates the archive, but **GitHub Pages remains disabled**. The public reading site is hosted independently so this project cannot inherit or alter the custom-domain behavior of the separate personal-site repository.

## Rights

Expand Down
Binary file added public/og.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions src/components/PostCard.astro
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ const number = String(data.seriesNo).padStart(2, "0");
<p>{data.languages.en.summary}</p>
</div>
</div>
<footer class="note-card-signals">
{data.audit?.status === "passed" && (
<span class="status-chip"><span aria-hidden="true"></span><span data-content-lang="zh" lang="zh-CN">审计通过</span><span data-content-lang="en" lang="en">Audit passed</span></span>
)}
{data.topics.slice(0, 3).map((topic) => <span class="topic-chip">{topic}</span>)}
</footer>
</div>
</a>
</article>
19 changes: 12 additions & 7 deletions src/components/SiteHeader.astro
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,26 @@
import { collectionHref } from "../lib/site";

const home = import.meta.env.BASE_URL;
const pathname = Astro.url.pathname;
const isCollection = (path: string) => pathname.includes(`/${path}/`);
---

<header class="site-header">
<a class="wordmark" href={home} aria-label="Research Notes, home">Research Notes</a>
<a class="wordmark" href={home} aria-label="Theodore Ouyang Research Notes, home">
<span class="wordmark-mark" aria-hidden="true"></span>
<span class="wordmark-copy"><strong>Theodore Ouyang</strong><small>Research Notes</small></span>
</a>

<nav class="site-nav" aria-label="Primary / 主导航">
<a href={collectionHref("article")}>
<span data-content-lang="zh" lang="zh-CN">文章</span>
<span data-content-lang="en" lang="en">Articles</span>
</a>
<a href={collectionHref("research")}>
<a href={collectionHref("research")} aria-current={isCollection("research") ? "page" : undefined}>
<span data-content-lang="zh" lang="zh-CN">研究</span>
<span data-content-lang="en" lang="en">Research</span>
</a>
<a href={collectionHref("reflection")}>
<a href={collectionHref("article")} aria-current={isCollection("articles") ? "page" : undefined}>
<span data-content-lang="zh" lang="zh-CN">文章</span>
<span data-content-lang="en" lang="en">Articles</span>
</a>
<a href={collectionHref("reflection")} aria-current={isCollection("reflections") ? "page" : undefined}>
<span data-content-lang="zh" lang="zh-CN">思考</span>
<span data-content-lang="en" lang="en">Reflections</span>
</a>
Expand Down
19 changes: 14 additions & 5 deletions src/layouts/BaseLayout.astro
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const base = import.meta.env.BASE_URL;
const canonical = canonicalPath === null
? undefined
: new URL(`${base}${canonicalPath.replace(/^\/+/, "")}`, Astro.site ?? Astro.url).href;
const socialImage = new URL(`${base}og.png`, Astro.site ?? Astro.url).href;
const structuredData = article
? {
"@context": "https://schema.org",
Expand All @@ -54,7 +55,7 @@ const structuredData = article
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content={description} />
<meta name="color-scheme" content="light" />
<meta name="theme-color" content="#ffffff" />
<meta name="theme-color" content="#f5f2eb" />
{canonical && <link rel="canonical" href={canonical} />}
{noindex && <meta name="robots" content="noindex" />}
<link rel="alternate" type="application/rss+xml" title="Theodore Ouyang — Portfolio" href={`${base}rss.xml`} />
Expand All @@ -63,7 +64,9 @@ const structuredData = article
<meta property="og:description" content={description} />
{canonical && <meta property="og:url" content={canonical} />}
<meta property="og:site_name" content="Theodore Ouyang — Portfolio" />
<meta name="twitter:card" content="summary" />
<meta property="og:image" content={socialImage} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content={socialImage} />
<title>{title}</title>
<script is:inline>
(() => {
Expand All @@ -90,9 +93,15 @@ const structuredData = article
<SiteHeader />
<slot />
<footer class="site-footer">
<p data-content-lang="zh" lang="zh-CN">文章、研究与思考。</p>
<p data-content-lang="en" lang="en">Essays, research, and reflections.</p>
<p>© {new Date().getUTCFullYear()} Theodore Ouyang</p>
<div class="footer-intro">
<p data-content-lang="zh" lang="zh-CN">证据导向的人工智能、机器人与技术策略研究。</p>
<p data-content-lang="en" lang="en">Evidence-led research on AI, robotics, and technical strategy.</p>
<p class="footer-copyright">© {new Date().getUTCFullYear()} Theodore Ouyang</p>
</div>
<nav class="footer-links" aria-label="Footer / 页脚">
<a href={`${base}rss.xml`}>RSS</a>
<a href="https://github.com/130U/portfolio">GitHub <span aria-hidden="true">↗</span></a>
</nav>
</footer>
<script>
import "../scripts/site";
Expand Down
72 changes: 63 additions & 9 deletions src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
import { getCollection } from "astro:content";
import PostCard from "../components/PostCard.astro";
import BaseLayout from "../layouts/BaseLayout.astro";
import { collectionCopy, collectionHref, published } from "../lib/site";
import { articleHref, collectionCopy, collectionHref, published } from "../lib/site";

const posts = published(await getCollection("posts"));
const latest = posts.slice(0, 6);
const featured = posts.find((post) => post.data.featured) ?? posts[0];
const auditedCount = posts.filter((post) => post.data.audit?.status === "passed").length;
const counts = Object.fromEntries(
Object.keys(collectionCopy).map((collection) => [
collection,
Expand All @@ -20,16 +22,68 @@ const counts = Object.fromEntries(
>
<main id="main-content">
<section class="hero" aria-label="Portfolio introduction / 作品集介绍">
<div class="parallel-copy">
<div data-content-lang="zh" lang="zh-CN">
<h1>把复杂问题,写到真正看懂为止。</h1>
<p class="hero-deck">关于人工智能、机器人与技术路径的研究笔记:保留证据,也保留推理发生的过程。</p>
</div>
<div data-content-lang="en" lang="en">
<h1>Follow a difficult question until it becomes legible.</h1>
<p class="hero-deck">Research on AI, robotics, and technical strategy—preserving both the evidence and the reasoning that connects it.</p>
<div class="hero-layout">
<div class="parallel-copy">
<div data-content-lang="zh" lang="zh-CN">
<p class="hero-eyebrow"><span aria-hidden="true"></span>独立双语研究档案</p>
<h1>把复杂技术问题,做成可审阅的判断。</h1>
<p class="hero-deck">聚焦人工智能、机器人与技术路径。每篇作品同时保留完整中英文版本、证据边界与推理过程。</p>
<nav class="hero-actions" aria-label="首页快捷入口">
{featured && <a class="button button-primary" href={articleHref(featured.data.slug)}>阅读最新研究 <span aria-hidden="true">↗</span></a>}
<a class="button button-secondary" href={collectionHref("research")}>浏览研究档案</a>
</nav>
</div>
<div data-content-lang="en" lang="en">
<p class="hero-eyebrow"><span aria-hidden="true"></span>Independent bilingual research archive</p>
<h1>Turn complex technical questions into reviewable judgment.</h1>
<p class="hero-deck">Research on AI, robotics, and technical strategy. Every work preserves complete Chinese and English editions, evidence boundaries, and the reasoning in between.</p>
<nav class="hero-actions" aria-label="Homepage shortcuts">
{featured && <a class="button button-primary" href={articleHref(featured.data.slug)}>Read latest research <span aria-hidden="true">↗</span></a>}
<a class="button button-secondary" href={collectionHref("research")}>Browse research archive</a>
</nav>
</div>
</div>

<aside class="hero-method" aria-label="Research standard / 研究标准">
<header>
<p data-content-lang="zh" lang="zh-CN">研究标准</p>
<p data-content-lang="en" lang="en">Research standard</p>
<span>01—03</span>
</header>
<ol>
<li>
<span>01</span>
<div data-content-lang="zh" lang="zh-CN"><strong>证据先行</strong><p>区分事实、作者声明与分析判断。</p></div>
<div data-content-lang="en" lang="en"><strong>Evidence first</strong><p>Separate facts, claims, and interpretation.</p></div>
</li>
<li>
<span>02</span>
<div data-content-lang="zh" lang="zh-CN"><strong>推理透明</strong><p>让结论的形成过程可以被复核。</p></div>
<div data-content-lang="en" lang="en"><strong>Visible reasoning</strong><p>Keep the path to each conclusion reviewable.</p></div>
</li>
<li>
<span>03</span>
<div data-content-lang="zh" lang="zh-CN"><strong>双语完整</strong><p>中英文都是完整作品,而非摘要。</p></div>
<div data-content-lang="en" lang="en"><strong>Complete editions</strong><p>Chinese and English are full works, not excerpts.</p></div>
</li>
</ol>
</aside>
</div>

<dl class="hero-signals" aria-label="Archive signals / 档案概览">
<div>
<dt><span data-content-lang="zh" lang="zh-CN">已发布</span><span data-content-lang="en" lang="en">Published</span></dt>
<dd>{String(posts.length).padStart(2, "0")}</dd>
</div>
<div>
<dt><span data-content-lang="zh" lang="zh-CN">审计通过</span><span data-content-lang="en" lang="en">Audits passed</span></dt>
<dd>{String(auditedCount).padStart(2, "0")}</dd>
</div>
<div>
<dt><span data-content-lang="zh" lang="zh-CN">完整版本</span><span data-content-lang="en" lang="en">Full editions</span></dt>
<dd>中 / EN</dd>
</div>
</dl>
</section>

<section class="collection-strip" aria-label="Collections / 内容集合">
Expand Down
Loading