diff --git a/README.md b/README.md index dcaceb9..147938b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # miniCISO +[**Visit the MiniCISO project site →**](https://icidade.github.io/miniCISO/) + Agentic security staff for [Hermes Agent](https://github.com/NousResearch/hermes-agent), distributed as a reproducible overlay of profiles, prompts, templates, and operating policies. > This repository is **not a Hermes fork**. MiniCISO is a public overlay installed on top of a Hermes runtime pinned by version and commit in [`config/hermes-version.env`](config/hermes-version.env). diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ + diff --git a/docs/PUBLISHING.md b/docs/PUBLISHING.md new file mode 100644 index 0000000..44446ca --- /dev/null +++ b/docs/PUBLISHING.md @@ -0,0 +1,26 @@ +# Preview and publish the landing page + +The site is plain HTML, CSS, and JavaScript with no build step. + +## Preview locally + +From the repository root, run: + +```bash +python -m http.server 8000 --directory docs +``` + +Then open `http://localhost:8000/`. + +## Publish with GitHub Pages + +After this change is merged: + +1. Open **Settings → Pages** in the repository. +2. Under **Build and deployment**, choose **Deploy from a branch**. +3. Select the `main` branch and the `/docs` folder. +4. Save and verify `https://icidade.github.io/miniCISO/` after the deployment completes. + +GitHub Pages supports any source branch; `gh-pages` is a common convention, not a required branch. Keeping the source in `main/docs` makes content changes reviewable alongside the project documentation. + +All site assets use relative paths so the page works at the `/miniCISO/` project subpath. The canonical and social-preview URLs intentionally use the production URL. diff --git a/docs/assets/diagram.png b/docs/assets/diagram.png new file mode 100644 index 0000000..c5a5d47 Binary files /dev/null and b/docs/assets/diagram.png differ diff --git a/docs/assets/favicon.jpg b/docs/assets/favicon.jpg new file mode 100644 index 0000000..1f84330 Binary files /dev/null and b/docs/assets/favicon.jpg differ diff --git a/docs/assets/hero-illustration.png b/docs/assets/hero-illustration.png new file mode 100644 index 0000000..8112598 Binary files /dev/null and b/docs/assets/hero-illustration.png differ diff --git a/docs/assets/logo-dark.png b/docs/assets/logo-dark.png new file mode 100644 index 0000000..63cc699 Binary files /dev/null and b/docs/assets/logo-dark.png differ diff --git a/docs/assets/social-preview.png b/docs/assets/social-preview.png new file mode 100644 index 0000000..cb0acc7 Binary files /dev/null and b/docs/assets/social-preview.png differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..465f61a --- /dev/null +++ b/docs/index.html @@ -0,0 +1,128 @@ + + + + + + MiniCISO — Evidence-Driven Agentic Security Staff + + + + + + + + + + + + + + + + + + + + +
+
+
+

Open-source security orchestration

+

An evidence-driven security staff, orchestrated for real assessments.

+

MiniCISO coordinates specialized security agents for threat modeling, architecture, code review, AppSec, compliance, offensive validation, recon, and quality assurance—while keeping evidence, uncertainty, and human accountability visible.

+ +

Built for human-authorized, evidence-driven security work. Not a replacement for accountable professional judgment.

+
+
Evidence artifacts flow into a coordinator and specialist network, through a quality gate, and into a structured report.
Evidence inCoordinated analysisQA-reviewed output
+
+ +
+

01 / Why MiniCISO

Security work needs a chain of reasoning, not a pile of output.

Assessments break down when evidence is scattered, tools are disconnected, and early signals become premature conclusions. MiniCISO makes the operating discipline explicit.

+
+
01

Evidence before narrative

Claims start from traceable artifacts. Scanner output and recon remain inputs—not findings by default.

+
02

Specialists, not one generic prompt

The Chief of Staff delegates to focused SMEs whose scopes and boundaries are public.

+
03

Explicit validation gates

Conclusions pass through adversarial checks and mandatory Security QA before delivery.

+
04

Uncertainty stays visible

Assumptions, confidence, residual risk, and missing evidence remain part of the record.

+
05

Human accountability

Authorization and consequential judgment stay with accountable security professionals.

+
+
+ +
+

02 / How it works

One engagement. Nine disciplined stages.

The Chief of Staff scopes the work, selects the right specialists, correlates their analysis, and enforces QA before synthesis.

+
    +
  1. 01Intake & scope
  2. 02Evidence collection
  3. 03Hypothesis formation
  4. 04Selective retrieval
  5. 05SME analysis
  6. 06Cross-SME correlation
  7. 07Security QA
  8. 08Final synthesis
  9. 09Follow-up & lessons
  10. +
+
Evidence input flows through a central coordinator and eight specialized agent nodes, then through a mandatory QA gate into a structured assessment.
+
+ +
+

03 / Meet the security staff

Coordinated roles. Clear boundaries.

Each profile has a public mission, defined scope, mandatory assumptions, confidence, and residual-risk reporting.

+
+
Coordinator

Chief of Staff

Scopes engagements, delegates work, correlates evidence, and owns the final synthesis.

Who should investigate? What is ready to deliver?
+
Specialist

Threat Modeling

Maps assets, trust boundaries, threats, and mitigations.

What can go wrong? Where are the critical paths?
+
Specialist

Security Architecture

Reviews system design, boundaries, controls, and resilience.

Do controls fit the design? Where does trust accumulate?
+
Specialist

Code Review

Inspects implementation evidence for security-relevant defects.

Is the weakness reachable? What code proves the claim?
+
Specialist

AppSec Assessment

Examines application risk across design, code, and deployment context.

What is exploitable? What evidence is still needed?
+
Specialist

Compliance Mapper

Maps technical evidence to relevant control requirements.

Which controls apply? What supports compliance?
+
Specialist

Offensive Security

Performs explicitly authorized validation within defined boundaries.

Can the path be validated safely? Is impact demonstrated?
+
Specialist

Recon & Attack Surface

Prioritizes exposed surfaces without turning discovery into findings.

What is exposed? What deserves controlled validation?
+
Quality gate

Security QA

Challenges evidence, impact, confidence, and reporting quality.

Is the conclusion supported? What would invalidate it?
+
+

Meet the full staff

+
+ +
+

04 / The first assessment

Start with scope, evidence, and a clear objective.

A good first request names the target, boundaries, known constraints, available artifacts, and desired output. MiniCISO may pause to ask for what is missing.

+
+
Input

What should I provide?

  • Objective and success criteria
  • Scope boundaries and restrictions
  • Repository, diffs, architecture docs
  • Relevant screenshots, logs, or scan results
  • Deployment and threat context
+
Process

What will MiniCISO do?

  • Define scope and select SMEs
  • Inventory available evidence
  • Separate evidence from assumptions
  • Form and test hypotheses
  • Expose gaps and submit conclusions to QA
+
Output

What will I receive?

  • Scope and evidence inventory
  • Findings, observations, and hypotheses
  • Confidence, limitations, and residual risk
  • Traceable support and next actions
  • A QA-reviewed final synthesis
+
Boundary

What will it not do?

  • Treat every anomaly as a vulnerability
  • Hide missing evidence
  • Claim authorization not provided
  • Turn recon directly into a finding
  • Replace human review or decisions
+
+
Finding

A supported claim with sufficient evidence.

Observation

A useful condition without full impact closure.

Hypothesis

A candidate path still needing validation.

Missing evidence

The exact gap blocking a stronger conclusion.

+

See what to expect from your first assessment

+
+ +
+

05 / Evidence-driven by design

Fewer unsupported conclusions. More accountable decisions.

MiniCISO preserves the difference between what is known, what is inferred, and what still needs research.

+
+

Evidence ≠ inference

Source artifacts and analyst interpretation remain distinguishable and traceable.

GO / RESEARCH / NO-GO

Finding candidates advance, return for evidence, or stop based on explicit gates.

Recon is not a finding

Discovery prioritizes attack surface; validated evidence is required for a security claim.

Mandatory Security QA

An adversarial quality gate checks scope, impact, evidence sufficiency, and confidence.

Headroom

Structured artifact handling preserves provenance while controlling the context used for analysis.

KAG-oriented retrieval

Selective retrieval connects scope, vulnerability, evidence, and decision context when useful.

+
+

Read the finding validation model

+
+ +
+

06 / Architecture overview

The human operator stays outside—and above—the automated trust boundary.

MiniCISO is a public overlay installed on a pinned Hermes Agent runtime. It is not a Hermes fork. Profiles, policies, templates, and shared workspace coordination remain reproducible without publishing credentials or private runtime state.

+ +
+ +
+

07 / Open source & reproducible

An inspectable overlay, not a black box.

The repository packages profiles, prompts, templates, operating policies, bootstrap and validation scripts, public documentation, and sanitized configuration.

+
LicenseMIT
RuntimePinned Hermes dependency
Public stateSanitized by design
Private stateNever committed
+ +
+ +
+ +
MiniCISO network mark

About the project

Independent security engineering, built in public.

MiniCISO is an independent open-source security engineering project created by Irlan Cidade. It explores how specialized agents, explicit operating policies, evidence management, and human oversight can support more structured security assessments.

+
+ + + + diff --git a/docs/script.js b/docs/script.js new file mode 100644 index 0000000..99b515a --- /dev/null +++ b/docs/script.js @@ -0,0 +1,27 @@ +const toggle = document.querySelector('.nav-toggle'); +const links = document.querySelector('.nav-links'); + +toggle?.addEventListener('click', () => { + const open = toggle.getAttribute('aria-expanded') === 'true'; + toggle.setAttribute('aria-expanded', String(!open)); + links.classList.toggle('is-open', !open); +}); + +links?.addEventListener('click', event => { + if (event.target.closest('a')) { + toggle?.setAttribute('aria-expanded', 'false'); + links.classList.remove('is-open'); + } +}); + +if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + const observer = new IntersectionObserver(entries => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('is-visible'); + observer.unobserve(entry.target); + } + }); + }, { threshold: 0.12 }); + document.querySelectorAll('.reveal').forEach(element => observer.observe(element)); +} diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..ae144fe --- /dev/null +++ b/docs/styles.css @@ -0,0 +1,20 @@ +:root{--bg:#0d1419;--surface:#121c22;--surface-2:#17242b;--ink:#eff1e9;--muted:#9dabae;--line:#29383e;--accent:#71bdc6;--accent-2:#a5d9d9;--warm:#e4e4d9;--max:1180px;--radius:18px} +*{box-sizing:border-box} +html{scroll-behavior:smooth;scroll-padding-top:88px} +body{margin:0;background:var(--bg);color:var(--ink);font-family:Inter,"Segoe UI",system-ui,sans-serif;font-size:16px;line-height:1.65;overflow-x:hidden} +body:before{content:"";position:fixed;inset:0;pointer-events:none;z-index:-1;background-image:linear-gradient(rgba(113,189,198,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(113,189,198,.025) 1px,transparent 1px);background-size:48px 48px;mask-image:linear-gradient(to bottom,black,transparent 72%)} +a{color:inherit;text-decoration:none}img{max-width:100%;height:auto}button{font:inherit}.shell{width:min(calc(100% - 40px),var(--max));margin-inline:auto}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:fixed;top:8px;left:8px;z-index:100;background:var(--ink);color:var(--bg);padding:10px 14px;transform:translateY(-150%)}.skip-link:focus{transform:none}a:focus-visible,button:focus-visible{outline:3px solid var(--accent);outline-offset:4px;border-radius:4px} +.site-header{position:sticky;top:0;z-index:50;background:rgba(13,20,25,.82);border-bottom:1px solid rgba(113,189,198,.12);backdrop-filter:blur(18px)}.nav{height:72px;display:flex;align-items:center;justify-content:space-between}.brand{display:inline-flex;align-items:center;gap:10px;font-weight:700;font-size:20px;letter-spacing:-.04em}.brand img{border-radius:10px}.brand span span{color:var(--accent)}.nav-links{display:flex;align-items:center;gap:26px;font-size:13px;color:#c8d0ce}.nav-links>a:not(.button):hover{color:var(--accent)}.nav-toggle{display:none;background:none;border:0;color:var(--ink);padding:10px}.nav-toggle span:not(.sr-only){display:block;width:24px;height:1px;background:currentColor;margin:6px} +.button{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:48px;padding:0 21px;border:1px solid var(--accent);border-radius:7px;background:var(--accent);color:#0a1518;font-family:"DM Mono",monospace;font-weight:500;font-size:13px;transition:.2s ease}.button:hover{background:var(--accent-2);border-color:var(--accent-2);transform:translateY(-2px)}.button-small{min-height:38px;padding:0 15px;font-size:12px}.button-ghost{background:transparent;color:var(--ink);border-color:#506168}.button-ghost:hover{background:rgba(113,189,198,.08);border-color:var(--accent);color:var(--ink)}.text-link{font-family:"DM Mono",monospace;font-size:13px;color:var(--accent);border-bottom:1px solid transparent}.text-link:hover{border-color:var(--accent)}.actions{display:flex;align-items:center;flex-wrap:wrap;gap:14px} +.hero{min-height:calc(100vh - 72px);display:grid;grid-template-columns:1.05fr .95fr;gap:44px;align-items:center;padding-block:88px}.eyebrow,.kicker{font:500 11px/1.4 "DM Mono",monospace;text-transform:uppercase;letter-spacing:.16em;color:var(--accent)}.pulse{display:inline-block;width:7px;height:7px;background:var(--accent);border-radius:50%;margin-right:7px;box-shadow:0 0 0 5px rgba(113,189,198,.1)}h1,h2,h3,p{margin-top:0}h1{font-size:clamp(46px,5.3vw,76px);line-height:1.03;letter-spacing:-.055em;margin:24px 0 28px}h1 em{display:block;color:var(--accent-2);font-style:normal;font-weight:500}.lede{font-size:18px;color:#bac5c5;max-width:720px;margin-bottom:32px}.trust{max-width:650px;margin:29px 0 0;padding-top:20px;border-top:1px solid var(--line);font-size:12px;color:var(--muted)}.trust span{color:var(--accent);margin-right:7px}.hero-visual{margin:0;position:relative;background:radial-gradient(circle at 50% 50%,rgba(113,189,198,.08),transparent 65%);padding:20px}.hero-visual:before,.hero-visual:after{content:"";position:absolute;width:38px;height:38px;border-color:#41535a}.hero-visual:before{left:0;top:0;border-left:1px solid;border-top:1px solid}.hero-visual:after{right:0;bottom:0;border-right:1px solid;border-bottom:1px solid}.hero-visual figcaption{display:flex;justify-content:space-between;border-top:1px solid var(--line);padding-top:13px;color:#728287;font:10px "DM Mono",monospace;text-transform:uppercase;letter-spacing:.08em} +.section{padding-block:112px}.section-panel{background:linear-gradient(135deg,rgba(23,36,43,.96),rgba(13,20,25,.96));border-block:1px solid var(--line)}.section-heading{max-width:800px;margin-bottom:54px}.section-heading.split{max-width:none;display:grid;grid-template-columns:1.25fr .75fr;gap:80px;align-items:end}.section-heading h2,.about h2{font-size:clamp(36px,4vw,56px);line-height:1.08;letter-spacing:-.045em;margin:14px 0 20px}.section-heading>p:last-child,.section-heading.split>p,.about p{color:var(--muted);font-size:17px}.principles{display:grid;grid-template-columns:repeat(6,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}.principle{grid-column:span 2;background:var(--bg);padding:30px;min-height:235px}.principle:nth-child(4),.principle:nth-child(5){grid-column:span 3}.principle>span,.role,.assessment-grid article>span,.repo-strip span,.docs-grid>a>span{font:10px "DM Mono",monospace;text-transform:uppercase;letter-spacing:.13em;color:var(--accent)}h3{font-size:20px;line-height:1.25;letter-spacing:-.025em}.principle h3{margin:45px 0 12px}.principle p,.staff-card p,.operating-grid p,.docs-grid p{color:var(--muted);font-size:14px;margin:0} +.lifecycle{list-style:none;padding:0;margin:0 0 48px;display:grid;grid-template-columns:repeat(9,1fr);border-block:1px solid var(--line)}.lifecycle li{position:relative;min-height:130px;padding:20px 10px 18px;border-right:1px solid var(--line)}.lifecycle li:after{content:"→";position:absolute;right:-8px;top:58px;color:var(--accent);z-index:1}.lifecycle li:last-child{border:0}.lifecycle li:last-child:after{display:none}.lifecycle b{display:block;color:var(--accent);font:11px "DM Mono",monospace;margin-bottom:25px}.lifecycle span{font-size:12px;line-height:1.3;display:block}.lifecycle .gate{background:rgba(113,189,198,.1)}.diagram{margin:0;border:1px solid var(--line);background:#10171c}.diagram img{display:block;width:100%} +.staff-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:15px}.staff-card{border:1px solid var(--line);background:rgba(18,28,34,.64);padding:27px;min-height:230px;transition:.2s}.staff-card:hover{border-color:#486069;transform:translateY(-3px)}.staff-card h3{margin:36px 0 10px}.staff-card small{display:block;border-top:1px solid var(--line);padding-top:15px;margin-top:20px;color:#c7cfcd;font-size:12px}.staff-card.lead{border-color:var(--accent);background:linear-gradient(135deg,rgba(113,189,198,.15),rgba(18,28,34,.6))}.staff-card.qa{border-color:#d2d3c8}.staff-card.qa .role{color:var(--warm)}.center-action{text-align:center;margin:42px 0 0} +.assessment{background:var(--warm);color:#172126}.assessment .kicker{color:#447d85}.assessment .section-heading>p:last-child{color:#526064}.assessment-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:#a9b2ae;border:1px solid #a9b2ae}.assessment-grid article{background:#e9e9df;padding:35px}.assessment-grid article>span{color:#447d85}.assessment-grid h3{font-size:25px;margin:27px 0 18px}.assessment-grid ul{padding-left:20px;margin:0;color:#4d595c}.assessment-grid li{margin:7px 0}.classification{display:grid;grid-template-columns:repeat(4,1fr);margin-top:28px;background:#142026;color:var(--ink);border-radius:var(--radius);overflow:hidden}.classification div{padding:25px;border-right:1px solid #35454b}.classification div:last-child{border:0}.classification b{font:500 12px "DM Mono",monospace;color:var(--accent);text-transform:uppercase}.classification p{color:#aeb9b8;font-size:13px;margin:10px 0 0}.assessment .button{color:#0a1518} +.operating-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:15px;margin-bottom:30px}.operating-grid article{padding:28px;border-top:2px solid var(--accent);background:var(--surface);min-height:180px}.operating-grid h3{font-size:17px;margin-bottom:22px}.architecture-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:90px;align-items:center}.architecture-map{text-align:center;font:12px "DM Mono",monospace}.human,.output,.chief,.qa-node,.arch-row div{border:1px solid var(--line);padding:16px;background:var(--bg)}.human{border-color:var(--warm);width:55%;margin:auto}.human small{display:block;color:var(--muted);margin-top:5px}.flow{display:block;color:var(--accent);padding:9px}.boundary{border:1px dashed #54666c;padding:35px 24px 24px;position:relative}.boundary>span{position:absolute;top:-9px;left:18px;background:var(--surface);padding:0 8px;color:#75868a;font-size:10px}.chief{width:45%;margin:0 auto 16px;border-color:var(--accent)}.arch-row{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:16px}.qa-node{border-color:var(--warm)}.output{width:55%;margin:auto}.repo-strip{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line);margin-bottom:35px}.repo-strip>div{padding:26px;border-right:1px solid var(--line)}.repo-strip>div:last-child{border:0}.repo-strip span{display:block;margin-bottom:17px}.repo-strip b{font-size:14px} +.docs-section{background:var(--surface)}.docs-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}.docs-grid>a{background:var(--surface);padding:28px;min-height:200px}.docs-grid>a:hover{background:var(--surface-2)}.docs-grid h3{margin:44px 0 8px}.about{display:grid;grid-template-columns:220px 1fr;gap:80px;align-items:center;max-width:950px}.about>img{border-radius:35px;opacity:.85}.about h2{max-width:650px}.about p{max-width:700px} +footer{border-top:1px solid var(--line);padding:70px 0 24px;background:#091014}.footer-grid{display:grid;grid-template-columns:1fr 1fr;gap:80px}.footer-grid>div>p{color:var(--muted);font-size:13px;max-width:380px;margin-top:18px}.footer-links{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;font-size:13px;color:#bdc7c6}.footer-links a:hover{color:var(--accent)}.footer-bottom{display:flex;justify-content:space-between;margin-top:60px;padding-top:20px;border-top:1px solid var(--line);font:10px "DM Mono",monospace;text-transform:uppercase;letter-spacing:.1em;color:#6f7e82} +.reveal{opacity:0;transform:translateY(14px);transition:opacity .7s ease,transform .7s ease}.reveal.is-visible{opacity:1;transform:none} +@media (max-width:900px){.nav-toggle{display:block}.nav-links{display:none;position:absolute;top:72px;left:0;right:0;padding:22px 20px 28px;background:var(--surface);border-bottom:1px solid var(--line);align-items:stretch;flex-direction:column;gap:15px}.nav-links.is-open{display:flex}.hero{grid-template-columns:1fr;min-height:auto;padding-block:72px}.hero-visual{margin-top:18px}.section{padding-block:82px}.section-heading.split{grid-template-columns:1fr;gap:10px}.principles{grid-template-columns:1fr 1fr}.principle,.principle:nth-child(4),.principle:nth-child(5){grid-column:auto}.principle:last-child{grid-column:1/-1}.lifecycle{grid-template-columns:repeat(3,1fr)}.lifecycle li{border-bottom:1px solid var(--line)}.staff-grid,.operating-grid{grid-template-columns:repeat(2,1fr)}.classification,.repo-strip,.docs-grid{grid-template-columns:repeat(2,1fr)}.architecture-grid{grid-template-columns:1fr;gap:55px}.about{grid-template-columns:150px 1fr;gap:40px}} +@media (max-width:600px){.shell{width:min(calc(100% - 28px),var(--max))}h1{font-size:43px}.lede{font-size:16px}.hero .actions .button{width:100%}.hero .actions .text-link{margin:8px auto 0}.hero-visual{padding:5px}.hero-visual figcaption{font-size:8px}.principles,.staff-grid,.assessment-grid,.operating-grid,.classification,.repo-strip,.docs-grid{grid-template-columns:1fr}.principle,.principle:nth-child(4),.principle:nth-child(5){grid-column:auto;min-height:0}.classification div,.repo-strip>div{border-right:0;border-bottom:1px solid var(--line)}.lifecycle{grid-template-columns:repeat(2,1fr)}.lifecycle li:nth-child(2n){border-right:0}.diagram{overflow:auto}.diagram img{width:850px;max-width:none}.architecture-map{font-size:10px}.human,.output{width:80%}.chief{width:70%}.arch-row{grid-template-columns:1fr}.about{grid-template-columns:1fr}.about>img{width:100px}.footer-grid{grid-template-columns:1fr;gap:35px}.footer-bottom{align-items:flex-start;flex-direction:column;gap:8px}.section-heading h2,.about h2{font-size:36px}} +@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}.reveal{opacity:1;transform:none}}