@@ -475,6 +475,10 @@ for (const [index, loop] of loops.entries()) {
475475 assert . deepEqual ( catalogLoop . steps , loop . steps ) ;
476476 assert . equal ( catalogLoop . why , loop . why ) ;
477477 assert . equal ( catalogLoop . implementationNote , loop . note ) ;
478+ assert . deepEqual (
479+ catalogLoop . contributorPlaybook ,
480+ loop . contributorPlaybook ,
481+ ) ;
478482 assert . deepEqual ( catalogLoop . keywords , loop . keywords ) ;
479483 assert . deepEqual (
480484 catalogLoop . related . map ( ( { slug } ) => slug ) ,
@@ -490,7 +494,7 @@ for (const [index, loop] of loops.entries()) {
490494 ( relatedSlug ) => `${ siteMeta . baseUrl } loops/${ relatedSlug } /` ,
491495 ) ,
492496 ) ;
493- assert . equal ( catalogLoop . sourceUrl , loop . sourceUrl ) ;
497+ assert . equal ( catalogLoop . sourceUrl , undefined ) ;
494498 assert ( loop . related . every ( ( relatedSlug ) => slugs . has ( relatedSlug ) ) ) ;
495499 assert ( html . includes ( loop . title ) ) ;
496500 assert ( normalizedHomepageRow . includes ( loop . prompt ) ) ;
@@ -501,6 +505,7 @@ for (const [index, loop] of loops.entries()) {
501505 ) ;
502506 assert ( ! homepageRow . includes ( 'class="cell-number"' ) ) ;
503507 assert ( homepageRow . includes ( `data-category="${ category . slug } "` ) ) ;
508+ assert ( homepageRow . includes ( `data-published="${ loop . published } "` ) ) ;
504509 assert (
505510 homepageRow . includes (
506511 `<span class="loop-category">${ category . label } </span>` ,
@@ -551,8 +556,8 @@ for (const [index, loop] of loops.entries()) {
551556 ) ,
552557 ) ;
553558 assert ( page . includes ( `rel="help" href="${ siteMeta . baseUrl } agents/"` ) ) ;
554- assert ( page . includes ( "../../styles.css?v=20260620-primary-nav " ) ) ;
555- assert ( page . includes ( "../../script.js?v=20260620-primary-nav " ) ) ;
559+ assert ( page . includes ( "../../styles.css?v=20260620-newest-first " ) ) ;
560+ assert ( page . includes ( "../../script.js?v=20260620-newest-first " ) ) ;
556561 assert ( page . includes ( `<meta property="og:image" content="${ imageUrl } "` ) ) ;
557562 assert ( page . includes ( `<meta property="og:image:secure_url" content="${ imageUrl } "` ) ) ;
558563 assert ( page . includes ( `<meta property="og:image:type" content="${ siteMeta . socialImageMimeType } "` ) ) ;
@@ -616,6 +621,22 @@ for (const [index, loop] of loops.entries()) {
616621 assert ( page . includes ( "How to run it" ) ) ;
617622 assert ( page . includes ( "Why it works" ) ) ;
618623 assert ( page . includes ( "Implementation note" ) ) ;
624+ if ( loop . contributorPlaybook ) {
625+ assert ( page . includes ( 'class="detail-more contributor-playbook"' ) ) ;
626+ assert ( page . includes ( "Contributor playbook" ) ) ;
627+ assert ( page . includes ( "Do not use this when" ) ) ;
628+ assert ( page . includes ( "Required outputs" ) ) ;
629+ assert ( page . includes ( "Match the method to the artifact" ) ) ;
630+ assert ( page . includes ( "Reviewer handoff" ) ) ;
631+ assert (
632+ Object . values ( loop . contributorPlaybook )
633+ . flat ( )
634+ . every ( ( item ) => page . includes ( escapeHtml ( item ) ) ) ,
635+ ) ;
636+ } else {
637+ assert . equal ( catalogLoop . contributorPlaybook , undefined ) ;
638+ assert ( ! page . includes ( 'class="detail-more contributor-playbook"' ) ) ;
639+ }
619640 assert ( ! page . includes ( "<h2>Topics</h2>" ) ) ;
620641 assert ( page . includes ( "Related loops" ) ) ;
621642 assert ( ! page . includes ( "<dt>Type</dt>" ) ) ;
@@ -695,17 +716,9 @@ for (const [index, loop] of loops.entries()) {
695716 escapeHtml ( loopBySlug . get ( relatedSlug ) . title ) ,
696717 ) ,
697718 ) ;
698- if ( loop . sourceUrl ) {
699- assert . equal ( article . isBasedOn , loop . sourceUrl ) ;
700- assert (
701- page . includes (
702- `<a class="detail-source-link" href="${ escapeHtml ( loop . sourceUrl ) } " target="_blank" rel="noopener noreferrer">Source</a>` ,
703- ) ,
704- ) ;
705- } else {
706- assert . equal ( article . isBasedOn , undefined ) ;
707- assert ( ! page . includes ( 'class="detail-source-link"' ) ) ;
708- }
719+ assert . equal ( article . isBasedOn , undefined ) ;
720+ assert ( ! page . includes ( 'class="detail-source-link"' ) ) ;
721+ assert ( ! loop . sourceUrl || ! page . includes ( loop . sourceUrl ) ) ;
709722 assert ( sitemap . includes ( `<loc>${ url } </loc>` ) ) ;
710723 assert ( sitemap . includes ( `<lastmod>${ loop . modified } </lastmod>` ) ) ;
711724 assert ( feed . includes ( `<id>${ url } </id>` ) ) ;
@@ -815,8 +828,10 @@ assert(!html.includes('data-type='));
815828assert ( ! html . includes ( 'class="cell-type"' ) ) ;
816829assert ( ! html . includes ( "type-badge" ) ) ;
817830assert ( ! html . includes ( '<th scope="col">Type</th>' ) ) ;
818- assert ( html . includes ( "./styles.css?v=20260620-primary-nav" ) ) ;
819- assert ( html . includes ( "./script.js?v=20260620-primary-nav" ) ) ;
831+ assert ( html . includes ( "./styles.css?v=20260620-newest-first" ) ) ;
832+ assert ( html . includes ( "./script.js?v=20260620-newest-first" ) ) ;
833+ assert ( script . includes ( "const publishedDifference = b.dataset.published.localeCompare(" ) ) ;
834+ assert ( script . includes ( "return loopRowPositions.get(b) - loopRowPositions.get(a);" ) ) ;
820835const homepagePostText =
821836 "Find Loops and create your own - Loop Library" ;
822837assert ( html . includes ( 'class="share-actions" aria-label="Share Loop Library"' ) ) ;
@@ -877,8 +892,8 @@ assert.equal(
877892 ( learnHtml . match ( / h r e f = " h t t p s : \/ \/ h e r e \. n o w \/ r \/ s i g n a l s " / g) || [ ] ) . length ,
878893 2 ,
879894) ;
880- assert ( learnHtml . includes ( "../styles.css?v=20260620-article-layout " ) ) ;
881- assert ( learnHtml . includes ( "../script.js?v=20260620-primary-nav " ) ) ;
895+ assert ( learnHtml . includes ( "../styles.css?v=20260620-newest-first " ) ) ;
896+ assert ( learnHtml . includes ( "../script.js?v=20260620-newest-first " ) ) ;
882897assert ( learnHtml . includes ( "How agent loops work" ) ) ;
883898assert ( learnHtml . includes ( '<meta name="robots" content="index, follow"' ) ) ;
884899assert ( learnHtml . includes ( "What makes a loop useful" ) ) ;
@@ -926,8 +941,8 @@ assert(agentHtml.includes("npx skills add Forward-Future/loop-library --skill lo
926941assert ( agentHtml . includes ( '<meta name="robots" content="index, follow"' ) ) ;
927942assert ( agentHtml . includes ( `href="${ siteMeta . baseUrl } catalog.json"` ) ) ;
928943assert ( agentHtml . includes ( `href="${ siteMeta . baseUrl } llms.txt"` ) ) ;
929- assert ( agentHtml . includes ( "../styles.css?v=20260620-article-layout " ) ) ;
930- assert ( agentHtml . includes ( "../script.js?v=20260620-primary-nav " ) ) ;
944+ assert ( agentHtml . includes ( "../styles.css?v=20260620-newest-first " ) ) ;
945+ assert ( agentHtml . includes ( "../script.js?v=20260620-newest-first " ) ) ;
931946assert ( html . includes ( "Repeatable AI Agent Workflows" ) ) ;
932947assert ( html . includes ( 'rel="sitemap"' ) ) ;
933948assert ( html . includes ( `href="${ siteMeta . baseUrl } catalog.json"` ) ) ;
0 commit comments